1: | <?php
|
2: | |
3: | |
4: | |
5: | |
6: | |
7: | |
8: | |
9: | |
10: | |
11: | |
12: | |
13: | |
14: | |
15: | |
16: | |
17: | |
18: | |
19: | |
20: | |
21: | |
22: |
|
23: |
|
24: | |
25: | |
26: | |
27: | |
28: | |
29: | |
30: | |
31: | |
32: | |
33: | |
34: | |
35: | |
36: |
|
37: |
|
38: | namespace WideImage\vendor\de77;
|
39: |
|
40: | class TGA
|
41: | {
|
42: | public static function rle_decode($data, $datalen)
|
43: | {
|
44: | $len = strlen($data);
|
45: |
|
46: | $out = '';
|
47: |
|
48: | $i = 0;
|
49: | $k = 0;
|
50: |
|
51: | while ($i < $len) {
|
52: | static::dec_bits(ord($data[$i]), $type, $value);
|
53: |
|
54: | if ($k >= $datalen) {
|
55: | break;
|
56: | }
|
57: |
|
58: | $i++;
|
59: |
|
60: | if ($type == 0) {
|
61: | for ($j = 0; $j < (3 * $value); $j++) {
|
62: | $out .= $data[$j+$i];
|
63: | $k++;
|
64: | }
|
65: |
|
66: | $i += $value * 3;
|
67: | } else {
|
68: | for ($j = 0; $j < $value; $j++) {
|
69: | $out .= $data[$i] . $data[$i+1] . $data[$i+2];
|
70: | $k++;
|
71: | }
|
72: |
|
73: | $i += 3;
|
74: | }
|
75: | }
|
76: |
|
77: | return $out;
|
78: | }
|
79: |
|
80: | public static function dec_bits($byte, &$type, &$value)
|
81: | {
|
82: | $type = ($byte & 0x80) >> 7;
|
83: | $value = 1 + ($byte & 0x7F);
|
84: | }
|
85: |
|
86: | public static function imagecreatefromstring($bin_data)
|
87: | {
|
88: | if (!trim($bin_data)) {
|
89: | return false;
|
90: | }
|
91: |
|
92: | $bin_pos = 0;
|
93: | $header = substr($bin_data, $bin_pos, 18);
|
94: | $bin_pos += 18;
|
95: | $header = unpack( "cimage_id_len/ccolor_map_type/cimage_type/vcolor_map_origin/vcolor_map_len/" .
|
96: | "ccolor_map_entry_size/vx_origin/vy_origin/vwidth/vheight/" .
|
97: | "cpixel_size/cdescriptor", $header);
|
98: |
|
99: | switch ($header['image_type']) {
|
100: | case 2:
|
101: | case 10:
|
102: | break;
|
103: | default: return false;
|
104: | }
|
105: |
|
106: | if ($header['pixel_size'] != 24) {
|
107: | return false;
|
108: |
|
109: | }
|
110: |
|
111: | $bytes = $header['pixel_size'] / 8;
|
112: |
|
113: | if ($header['image_id_len'] > 0) {
|
114: | $header['image_id'] = substr($bin_data, $bin_pos, $header['image_id_len']);
|
115: | $bin_pos += $header['image_id_len'];
|
116: | } else {
|
117: | $header['image_id'] = '';
|
118: | }
|
119: |
|
120: | $im = imagecreatetruecolor($header['width'], $header['height']);
|
121: |
|
122: | $size = $header['width'] * $header['height'] * 3;
|
123: |
|
124: |
|
125: | $pos = $bin_pos;
|
126: | $bin_pos = strlen($bin_data) - 26;
|
127: | $newtga = substr($bin_data, $bin_pos, 26);
|
128: |
|
129: | if (substr($newtga, 8, 16) != 'TRUEVISION-XFILE') {
|
130: | $newtga = false;
|
131: | }
|
132: |
|
133: | $bin_pos = strlen($bin_data);
|
134: | $datasize = $bin_pos - $pos;
|
135: |
|
136: | if ($newtga) {
|
137: | $datasize -= 26;
|
138: | }
|
139: |
|
140: | $bin_pos = $pos;
|
141: |
|
142: |
|
143: | $data = substr($bin_data, $bin_pos, $datasize);
|
144: | $bin_pos += $datasize;
|
145: |
|
146: | if ($header['image_type'] == 10) {
|
147: | $data = self::rle_decode($data, $size);
|
148: | }
|
149: |
|
150: | $reverse = self::bit5($header['descriptor']) == 1;
|
151: | $pixels = str_split($data, 3);
|
152: |
|
153: | $i = 0;
|
154: |
|
155: |
|
156: | if ($reverse) {
|
157: | for ($y = 0; $y < $header['height']; $y++) {
|
158: | for ($x = 0; $x < $header['width']; $x++) {
|
159: | imagesetpixel($im, $x, $y, self::dwordize($pixels[$i]));
|
160: | $i++;
|
161: | }
|
162: | }
|
163: | } else {
|
164: | for ($y = $header['height']-1; $y >= 0; $y--) {
|
165: | for ($x=0; $x<$header['width']; $x++) {
|
166: | imagesetpixel($im, $x, $y, self::dwordize($pixels[$i]));
|
167: | $i++;
|
168: | }
|
169: | }
|
170: | }
|
171: |
|
172: | return $im;
|
173: | }
|
174: |
|
175: | public static function imagecreatefromtga($filename)
|
176: | {
|
177: | return self::imagecreatefromstring(file_get_contents($filename));
|
178: | }
|
179: |
|
180: | public static function dwordize($str)
|
181: | {
|
182: | $a = ord($str[0]);
|
183: | $b = ord($str[1]);
|
184: | $c = ord($str[2]);
|
185: |
|
186: | return $c*256*256 + $b*256 + $a;
|
187: | }
|
188: |
|
189: | public static function bit5($x)
|
190: | {
|
191: | return ($x & 32) >> 5;
|
192: | }
|
193: | }
|
194: | |