1 | <?php |
---|
2 | /** |
---|
3 | * @package com.jpexs.image.ico |
---|
4 | * |
---|
5 | * JPEXS ICO Image functions |
---|
6 | * @version 2.3 |
---|
7 | * @author JPEXS |
---|
8 | * @copyright (c) JPEXS 2004-2012 |
---|
9 | * |
---|
10 | * Webpage: http://www.jpexs.com |
---|
11 | * Email: jpexs@jpexs.com |
---|
12 | * |
---|
13 | * If you like my script, you can donate... visit my webpages or email me for more info. |
---|
14 | * |
---|
15 | * Version changes: |
---|
16 | * 2012-02-25 v2.3 - License changed to GNU/GPL v2 or v3 |
---|
17 | * 2012-02-18 v2.2 - License changed to GNU/GPL v3 |
---|
18 | * 2009-02-23 v2.1 - redesigned sourcecode, phpdoc included, all internal functions and global variables have prefix "jpexs_" |
---|
19 | * v2.0 - For icons with Alpha channel now you can set background color |
---|
20 | * - ImageCreateFromExeIco added |
---|
21 | * - Fixed ICO_MAX_SIZE and ICO_MAX_COLOR values |
---|
22 | * |
---|
23 | * TODO list: |
---|
24 | * - better error handling |
---|
25 | * - better internal function handling |
---|
26 | * - class encapsulation |
---|
27 | * |
---|
28 | * License: |
---|
29 | * This program is free software: you can redistribute it and/or modify |
---|
30 | * it under the terms of the GNU General Public License as published by |
---|
31 | * the Free Software Foundation, either version 2 or version 3 of the License, or |
---|
32 | * (at your option) any later version. |
---|
33 | * |
---|
34 | * This program is distributed in the hope that it will be useful, |
---|
35 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
36 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
37 | * GNU General Public License for more details. |
---|
38 | * |
---|
39 | * You should have received a copy of the GNU General Public License |
---|
40 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
---|
41 | */ |
---|
42 | |
---|
43 | /** TrueColor images constant */ |
---|
44 | define("ICO_TRUE_COLOR", 0x1000000); |
---|
45 | /** XPColor images constant (Alpha channel) */ |
---|
46 | define("ICO_XP_COLOR", 4294967296); |
---|
47 | /** Image with maximum colors */ |
---|
48 | define("ICO_MAX_COLOR", -2); |
---|
49 | /** Image with maximal size */ |
---|
50 | define("ICO_MAX_SIZE", -2); |
---|
51 | |
---|
52 | |
---|
53 | /** TrueColor images constant |
---|
54 | * @deprecated Deprecated since version 2.1, please use ICO_ constants |
---|
55 | */ |
---|
56 | define("TRUE_COLOR", 0x1000000); |
---|
57 | /** XPColor images constant (Alpha channel) |
---|
58 | * @deprecated Deprecated since version 2.1, please use ICO_ constants |
---|
59 | */ |
---|
60 | define("XP_COLOR", 4294967296); |
---|
61 | /** Image with maximum colors |
---|
62 | * @deprecated Deprecated since version 2.1, please use ICO_ constants |
---|
63 | */ |
---|
64 | define("MAX_COLOR", -2); |
---|
65 | /** Image with maximal size |
---|
66 | * @deprecated Deprecated since version 2.1, please use ICO_ constants |
---|
67 | */ |
---|
68 | define("MAX_SIZE", -2); |
---|
69 | |
---|
70 | |
---|
71 | /** |
---|
72 | * Reads image from a ICO file |
---|
73 | * |
---|
74 | * @param string $filename Target ico file to load |
---|
75 | * @param int $icoColorCount Icon color count (For multiple icons ico file) - 2,16,256, ICO_TRUE_COLOR, ICO_XP_COLOR or ICO_MAX_COLOR |
---|
76 | * @param int $icoSize Icon width (For multiple icons ico file) or ICO_MAX_SIZE |
---|
77 | * @param int $alphaBgR Background color R value for alpha-channel images (Default is White) |
---|
78 | * @param int $alphaBgG Background color G value for alpha-channel images (Default is White) |
---|
79 | * @param int $alphaBgB Background color B value for alpha-channel images (Default is White) |
---|
80 | * @return resource Image resource |
---|
81 | */ |
---|
82 | function imageCreateFromIco($filename,$icoColorCount=16,$icoSize=16,$alphaBgR=255,$alphaBgG=255,$alphaBgB=255) |
---|
83 | { |
---|
84 | $Ikona=jpexs_GetIconsInfo($filename); |
---|
85 | |
---|
86 | $IconID=-1; |
---|
87 | |
---|
88 | $ColMax=-1; |
---|
89 | $SizeMax=-1; |
---|
90 | |
---|
91 | for($p=0;$p<count($Ikona);$p++) |
---|
92 | { |
---|
93 | $Ikona[$p]["NumberOfColors"]=pow(2,$Ikona[$p]["Info"]["BitsPerPixel"]); |
---|
94 | }; |
---|
95 | |
---|
96 | |
---|
97 | for($p=0;$p<count($Ikona);$p++) |
---|
98 | { |
---|
99 | |
---|
100 | if(($ColMax==-1)or($Ikona[$p]["NumberOfColors"]>=$Ikona[$ColMax]["NumberOfColors"])) |
---|
101 | if(($icoSize==$Ikona[$p]["Width"])or($icoSize==ICO_MAX_SIZE)) |
---|
102 | { |
---|
103 | $ColMax=$p; |
---|
104 | }; |
---|
105 | |
---|
106 | if(($SizeMax==-1)or($Ikona[$p]["Width"]>=$Ikona[$SizeMax]["Width"])) |
---|
107 | if(($icoColorCount==$Ikona[$p]["NumberOfColors"])or($icoColorCount==ICO_MAX_COLOR)) |
---|
108 | { |
---|
109 | $SizeMax=$p; |
---|
110 | }; |
---|
111 | |
---|
112 | |
---|
113 | if($Ikona[$p]["NumberOfColors"]==$icoColorCount) |
---|
114 | if($Ikona[$p]["Width"]==$icoSize) |
---|
115 | { |
---|
116 | |
---|
117 | $IconID=$p; |
---|
118 | }; |
---|
119 | }; |
---|
120 | |
---|
121 | if($icoColorCount==ICO_MAX_COLOR) $IconID=$ColMax; |
---|
122 | if($icoSize==ICO_MAX_SIZE) $IconID=$SizeMax; |
---|
123 | |
---|
124 | $ColName=$icoColorCount; |
---|
125 | |
---|
126 | if($icoSize==ICO_MAX_SIZE) $icoSize="Max"; |
---|
127 | if($ColName==ICO_TRUE_COLOR) $ColName="True"; |
---|
128 | if($ColName==ICO_XP_COLOR) $ColName="XP"; |
---|
129 | if($ColName==ICO_MAX_COLOR) $ColName="Max"; |
---|
130 | if($IconID==-1) die("Icon with $ColName colors and $icoSize x $icoSize size doesn't exist in this file!"); |
---|
131 | |
---|
132 | |
---|
133 | jpexs_readIcon($filename,$IconID,$Ikona); |
---|
134 | |
---|
135 | $biBitCount=$Ikona[$IconID]["Info"]["BitsPerPixel"]; |
---|
136 | |
---|
137 | |
---|
138 | if($Ikona[$IconID]["Info"]["BitsPerPixel"]==0) |
---|
139 | { |
---|
140 | $Ikona[$IconID]["Info"]["BitsPerPixel"]=24; |
---|
141 | }; |
---|
142 | |
---|
143 | $biBitCount=$Ikona[$IconID]["Info"]["BitsPerPixel"]; |
---|
144 | if($biBitCount==0) $biBitCount=1; |
---|
145 | |
---|
146 | |
---|
147 | $Ikona[$IconID]["BitCount"]=$Ikona[$IconID]["Info"]["BitsPerPixel"]; |
---|
148 | |
---|
149 | |
---|
150 | |
---|
151 | if($Ikona[$IconID]["BitCount"]>=24) |
---|
152 | { |
---|
153 | $img=imagecreatetruecolor($Ikona[$IconID]["Width"],$Ikona[$IconID]["Height"]); |
---|
154 | if($Ikona[$IconID]["BitCount"]==32): |
---|
155 | $backcolor=imagecolorallocate($img,$alphaBgR,$alphaBgG,$alphaBgB); |
---|
156 | imagefilledrectangle($img,0,0,$Ikona[$IconID]["Width"]-1,$Ikona[$IconID]["Height"]-1,$backcolor); |
---|
157 | endif; |
---|
158 | for($y=0;$y<$Ikona[$IconID]["Height"];$y++) |
---|
159 | for($x=0;$x<$Ikona[$IconID]["Width"];$x++) |
---|
160 | { |
---|
161 | $R=$Ikona[$IconID]["Data"][$x][$y]["r"]; |
---|
162 | $G=$Ikona[$IconID]["Data"][$x][$y]["g"]; |
---|
163 | $B=$Ikona[$IconID]["Data"][$x][$y]["b"]; |
---|
164 | if($Ikona[$IconID]["BitCount"]==32) |
---|
165 | { |
---|
166 | $Alpha=127-round($Ikona[$IconID]["Data"][$x][$y]["alpha"]*127/255); |
---|
167 | if($Ikona[$IconID]["Maska"][$x][$y]==1) $Alpha=127; |
---|
168 | $color=imagecolorexactalpha($img,$R,$G,$B,$Alpha); |
---|
169 | if($color==-1) $color=imagecolorallocatealpha($img,$R,$G,$B,$Alpha); |
---|
170 | } |
---|
171 | else |
---|
172 | { |
---|
173 | $color=imagecolorexact($img,$R,$G,$B); |
---|
174 | if($color==-1) $color=imagecolorallocate($img,$R,$G,$B); |
---|
175 | }; |
---|
176 | |
---|
177 | imagesetpixel($img,$x,$y,$color); |
---|
178 | |
---|
179 | }; |
---|
180 | |
---|
181 | } |
---|
182 | else |
---|
183 | { |
---|
184 | $img=imagecreate($Ikona[$IconID]["Width"],$Ikona[$IconID]["Height"]); |
---|
185 | for($p=0;$p<count($Ikona[$IconID]["Paleta"]);$p++) |
---|
186 | $Paleta[$p]=imagecolorallocate($img,$Ikona[$IconID]["Paleta"][$p]["r"],$Ikona[$IconID]["Paleta"][$p]["g"],$Ikona[$IconID]["Paleta"][$p]["b"]); |
---|
187 | |
---|
188 | for($y=0;$y<$Ikona[$IconID]["Height"];$y++) |
---|
189 | for($x=0;$x<$Ikona[$IconID]["Width"];$x++) |
---|
190 | { |
---|
191 | imagesetpixel($img,$x,$y,$Paleta[$Ikona[$IconID]["Data"][$x][$y]]); |
---|
192 | }; |
---|
193 | }; |
---|
194 | $IsTransparent=false; |
---|
195 | for($y=0;$y<$Ikona[$IconID]["Height"];$y++) |
---|
196 | for($x=0;$x<$Ikona[$IconID]["Width"];$x++) |
---|
197 | if($Ikona[$IconID]["Maska"][$x][$y]==1) |
---|
198 | { |
---|
199 | $IsTransparent=true; |
---|
200 | break; |
---|
201 | }; |
---|
202 | if($Ikona[$IconID]["BitCount"]==32) |
---|
203 | { |
---|
204 | imagealphablending($img, false); |
---|
205 | if(function_exists("imagesavealpha")) |
---|
206 | imagesavealpha($img,true); |
---|
207 | }; |
---|
208 | |
---|
209 | if($IsTransparent) |
---|
210 | { |
---|
211 | if(($Ikona[$IconID]["BitCount"]>=24)or(imagecolorstotal($img)>=256)) |
---|
212 | { |
---|
213 | $img2=imagecreatetruecolor(imagesx($img),imagesy($img)); |
---|
214 | imagecopy($img2,$img,0,0,0,0,imagesx($img),imagesy($img)); |
---|
215 | imagedestroy($img); |
---|
216 | $img=$img2; |
---|
217 | imagetruecolortopalette($img,true,255); |
---|
218 | |
---|
219 | }; |
---|
220 | $Pruhledna=imagecolorallocate($img,0,0,0); |
---|
221 | for($y=0;$y<$Ikona[$IconID]["Height"];$y++) |
---|
222 | for($x=0;$x<$Ikona[$IconID]["Width"];$x++) |
---|
223 | if($Ikona[$IconID]["Maska"][$x][$y]==1) |
---|
224 | { |
---|
225 | imagesetpixel($img,$x,$y,$Pruhledna); |
---|
226 | }; |
---|
227 | imagecolortransparent($img,$Pruhledna); |
---|
228 | }; |
---|
229 | |
---|
230 | return $img; |
---|
231 | |
---|
232 | |
---|
233 | }; |
---|
234 | |
---|
235 | |
---|
236 | |
---|
237 | |
---|
238 | function jpexs_readIcon($filename,$id,&$Ikona) |
---|
239 | { |
---|
240 | global $jpexs_currentBit; |
---|
241 | |
---|
242 | $f=fopen($filename,"rb"); |
---|
243 | |
---|
244 | fseek($f,6+$id*16); |
---|
245 | $Width=jpexs_freadbyte($f); |
---|
246 | $Height=jpexs_freadbyte($f); |
---|
247 | fseek($f,6+$id*16+12); |
---|
248 | $OffSet=jpexs_freaddword($f); |
---|
249 | fseek($f,$OffSet); |
---|
250 | |
---|
251 | $p=$id; |
---|
252 | |
---|
253 | $Ikona[$p]["Info"]["HeaderSize"]=jpexs_freadlngint($f); |
---|
254 | $Ikona[$p]["Info"]["ImageWidth"]=jpexs_freadlngint($f); |
---|
255 | $Ikona[$p]["Info"]["ImageHeight"]=jpexs_freadlngint($f); |
---|
256 | $Ikona[$p]["Info"]["NumberOfImagePlanes"]=jpexs_freadword($f); |
---|
257 | $Ikona[$p]["Info"]["BitsPerPixel"]=jpexs_freadword($f); |
---|
258 | $Ikona[$p]["Info"]["CompressionMethod"]=jpexs_freadlngint($f); |
---|
259 | $Ikona[$p]["Info"]["SizeOfBitmap"]=jpexs_freadlngint($f); |
---|
260 | $Ikona[$p]["Info"]["HorzResolution"]=jpexs_freadlngint($f); |
---|
261 | $Ikona[$p]["Info"]["VertResolution"]=jpexs_freadlngint($f); |
---|
262 | $Ikona[$p]["Info"]["NumColorUsed"]=jpexs_freadlngint($f); |
---|
263 | $Ikona[$p]["Info"]["NumSignificantColors"]=jpexs_freadlngint($f); |
---|
264 | |
---|
265 | |
---|
266 | $biBitCount=$Ikona[$p]["Info"]["BitsPerPixel"]; |
---|
267 | |
---|
268 | if($Ikona[$p]["Info"]["BitsPerPixel"]<=8) |
---|
269 | { |
---|
270 | |
---|
271 | $barev=pow(2,$biBitCount); |
---|
272 | |
---|
273 | for($b=0;$b<$barev;$b++) |
---|
274 | { |
---|
275 | $Ikona[$p]["Paleta"][$b]["b"]=jpexs_freadbyte($f); |
---|
276 | $Ikona[$p]["Paleta"][$b]["g"]=jpexs_freadbyte($f); |
---|
277 | $Ikona[$p]["Paleta"][$b]["r"]=jpexs_freadbyte($f); |
---|
278 | jpexs_freadbyte($f); |
---|
279 | }; |
---|
280 | |
---|
281 | $Zbytek=(4-ceil(($Width/(8/$biBitCount)))%4)%4; |
---|
282 | |
---|
283 | |
---|
284 | for($y=$Height-1;$y>=0;$y--) |
---|
285 | { |
---|
286 | $jpexs_currentBit=0; |
---|
287 | for($x=0;$x<$Width;$x++) |
---|
288 | { |
---|
289 | $C=jpexs_freadbits($f,$biBitCount); |
---|
290 | $Ikona[$p]["Data"][$x][$y]=$C; |
---|
291 | }; |
---|
292 | |
---|
293 | if($jpexs_currentBit!=0) {jpexs_freadbyte($f);}; |
---|
294 | for($g=0;$g<$Zbytek;$g++) |
---|
295 | jpexs_freadbyte($f); |
---|
296 | }; |
---|
297 | |
---|
298 | } |
---|
299 | elseif($biBitCount==24) |
---|
300 | { |
---|
301 | $Zbytek=$Width%4; |
---|
302 | |
---|
303 | for($y=$Height-1;$y>=0;$y--) |
---|
304 | { |
---|
305 | for($x=0;$x<$Width;$x++) |
---|
306 | { |
---|
307 | $B=jpexs_freadbyte($f); |
---|
308 | $G=jpexs_freadbyte($f); |
---|
309 | $R=jpexs_freadbyte($f); |
---|
310 | $Ikona[$p]["Data"][$x][$y]["r"]=$R; |
---|
311 | $Ikona[$p]["Data"][$x][$y]["g"]=$G; |
---|
312 | $Ikona[$p]["Data"][$x][$y]["b"]=$B; |
---|
313 | } |
---|
314 | for($z=0;$z<$Zbytek;$z++) |
---|
315 | jpexs_freadbyte($f); |
---|
316 | }; |
---|
317 | } |
---|
318 | elseif($biBitCount==32) |
---|
319 | { |
---|
320 | $Zbytek=$Width%4; |
---|
321 | |
---|
322 | for($y=$Height-1;$y>=0;$y--) |
---|
323 | { |
---|
324 | for($x=0;$x<$Width;$x++) |
---|
325 | { |
---|
326 | $B=jpexs_freadbyte($f); |
---|
327 | $G=jpexs_freadbyte($f); |
---|
328 | $R=jpexs_freadbyte($f); |
---|
329 | $Alpha=jpexs_freadbyte($f); |
---|
330 | $Ikona[$p]["Data"][$x][$y]["r"]=$R; |
---|
331 | $Ikona[$p]["Data"][$x][$y]["g"]=$G; |
---|
332 | $Ikona[$p]["Data"][$x][$y]["b"]=$B; |
---|
333 | $Ikona[$p]["Data"][$x][$y]["alpha"]=$Alpha; |
---|
334 | } |
---|
335 | for($z=0;$z<$Zbytek;$z++) |
---|
336 | jpexs_freadbyte($f); |
---|
337 | }; |
---|
338 | }; |
---|
339 | |
---|
340 | |
---|
341 | //Maska |
---|
342 | $Zbytek=(4-ceil(($Width/(8)))%4)%4; |
---|
343 | for($y=$Height-1;$y>=0;$y--) |
---|
344 | { |
---|
345 | $jpexs_currentBit=0; |
---|
346 | for($x=0;$x<$Width;$x++) |
---|
347 | { |
---|
348 | $C=jpexs_freadbits($f,1); |
---|
349 | $Ikona[$p]["Maska"][$x][$y]=$C; |
---|
350 | }; |
---|
351 | if($jpexs_currentBit!=0) {jpexs_freadbyte($f);}; |
---|
352 | for($g=0;$g<$Zbytek;$g++) |
---|
353 | jpexs_freadbyte($f); |
---|
354 | }; |
---|
355 | //-------------- |
---|
356 | |
---|
357 | fclose($f); |
---|
358 | |
---|
359 | }; |
---|
360 | |
---|
361 | function jpexs_GetIconsInfo($filename) |
---|
362 | { |
---|
363 | global $jpexs_currentBit; |
---|
364 | |
---|
365 | $f=fopen($filename,"rb"); |
---|
366 | |
---|
367 | $Reserved=jpexs_freadword($f); |
---|
368 | $Type=jpexs_freadword($f); |
---|
369 | $Count=jpexs_freadword($f); |
---|
370 | for($p=0;$p<$Count;$p++) |
---|
371 | { |
---|
372 | $Ikona[$p]["Width"]=jpexs_freadbyte($f); |
---|
373 | $Ikona[$p]["Height"]=jpexs_freadbyte($f); |
---|
374 | $Ikona[$p]["ColorCount"]=jpexs_freadword($f); |
---|
375 | if($Ikona[$p]["ColorCount"]==0) $Ikona[$p]["ColorCount"]=256; |
---|
376 | $Ikona[$p]["Planes"]=jpexs_freadword($f); |
---|
377 | $Ikona[$p]["BitCount"]=jpexs_freadword($f); |
---|
378 | $Ikona[$p]["BytesInRes"]=jpexs_freaddword($f); |
---|
379 | $Ikona[$p]["ImageOffset"]=jpexs_freaddword($f); |
---|
380 | }; |
---|
381 | |
---|
382 | if(!feof($f)): |
---|
383 | for($p=0;$p<$Count;$p++) |
---|
384 | { |
---|
385 | fseek($f,$Ikona[$p]["ImageOffset"]+14); |
---|
386 | $Ikona[$p]["Info"]["BitsPerPixel"]=jpexs_freadword($f); |
---|
387 | }; |
---|
388 | endif; |
---|
389 | fclose($f); |
---|
390 | return $Ikona; |
---|
391 | }; |
---|
392 | |
---|
393 | |
---|
394 | |
---|
395 | |
---|
396 | /** |
---|
397 | * Reads image from a icon in exe file |
---|
398 | * @param string $filename Target exefile |
---|
399 | * @param int $icoIndex Index of the icon in exefile |
---|
400 | * @param int $icoColorCount Icon color count (For multiple icons ico file) - 2,16,256, ICO_TRUE_COLOR, ICO_XP_COLOR or ICO_MAX_COLOR |
---|
401 | * @param int $icoSize Icon width (For multiple icons ico file) or ICO_MAX_SIZE |
---|
402 | * @param int $alphaBgR Background color R value for alpha-channel images (Default is White) |
---|
403 | * @param int $alphaBgG Background color G value for alpha-channel images (Default is White) |
---|
404 | * @param int $alphaBgB Background color B value for alpha-channel images (Default is White) |
---|
405 | * @return resource Image resource or false on error |
---|
406 | */ |
---|
407 | function imageCreateFromExeIco($filename,$icoIndex,$icoColorCount=16,$icoSize=16,$alphaBgR=255,$alphaBgG=255,$alphaBgB=255) |
---|
408 | { |
---|
409 | $ok=saveExeIcon($filename,"icotemp.dat",$icoIndex); |
---|
410 | if(!$ok): |
---|
411 | $im=false; |
---|
412 | else: |
---|
413 | $im=imageCreateFromIco("icotemp.dat",$icoColorCount,$icoSize,$alphaBgR,$alphaBgG,$alphaBgB); |
---|
414 | unlink("icotemp.dat"); |
---|
415 | endif; |
---|
416 | return $im; |
---|
417 | }; |
---|
418 | |
---|
419 | |
---|
420 | /** |
---|
421 | * Saves icon(s) from the exe file |
---|
422 | * @global int $jpexs_StartOfRsrc Internal reserved variable |
---|
423 | * @global int $jpexs_ImageBase Internal reserved variable |
---|
424 | * @global int $jpexs_ResVirtualAddress Internal reserved variable |
---|
425 | * @param string $filename Target exefile |
---|
426 | * @param string $icoFileNameOrPath Filename to save ico or path (Default "") Path if you want more than 1 icon. If "", the filename is "$icoIndex.ico" |
---|
427 | * @param int|array $iconIndex Index(es) of the icon in exefile (Default -1) If -1, all icons are saved, Can be an array of indexes. |
---|
428 | * @return boolean True on successful save |
---|
429 | */ |
---|
430 | function saveExeIcon($filename,$icoFileNameOrPath="",$iconIndex=-1) /*-1 for all,or can be array*/ |
---|
431 | { |
---|
432 | global $jpexs_f,$jpexs_StartOfRsrc,$jpexs_ImageBase,$jpexs_ResVirtualAddress; |
---|
433 | $jpexs_f=fopen($filename,"r"); |
---|
434 | $MZ=fread($jpexs_f,2); |
---|
435 | if($MZ!="MZ") NotValidExe(); |
---|
436 | fseek($jpexs_f,60); |
---|
437 | $OffsetToNewHeader=jpexs_freaddword($jpexs_f); |
---|
438 | fseek($jpexs_f,$OffsetToNewHeader); |
---|
439 | $PE=fread($jpexs_f,2); |
---|
440 | if($PE!="PE") NotValidExe(); |
---|
441 | fread($jpexs_f,4); |
---|
442 | $NumberOfSections=jpexs_freadword($jpexs_f); |
---|
443 | fseek($jpexs_f,ftell($jpexs_f)+12); |
---|
444 | $SizeOfOptionalHeader=jpexs_freadword($jpexs_f); |
---|
445 | $PosMagic=ftell($jpexs_f)+2; |
---|
446 | fseek($jpexs_f,$PosMagic+$SizeOfOptionalHeader); |
---|
447 | |
---|
448 | for($p=0;$p<$NumberOfSections;$p++): |
---|
449 | $SectionName[$p]=trim(fread($jpexs_f,8)); |
---|
450 | $VirtualSize[$p]=jpexs_freaddword($jpexs_f); |
---|
451 | $VirtualAddress[$p]=jpexs_freaddword($jpexs_f); |
---|
452 | $PhysicalSize[$p]=jpexs_freaddword($jpexs_f); |
---|
453 | $PhysicalOffset[$p]=jpexs_freaddword($jpexs_f); |
---|
454 | fread($jpexs_f,16); |
---|
455 | if($SectionName[$p]==".rsrc"): |
---|
456 | $jpexs_ResVirtualAddress=$VirtualAddress[$p]; |
---|
457 | fseek($jpexs_f,$PhysicalOffset[$p]); |
---|
458 | $jpexs_StartOfRsrc=$PhysicalOffset[$p]; |
---|
459 | jpexs_readResDirectoryEntry($R,$PhysicalOffset[$p]); |
---|
460 | $IconCount=null; |
---|
461 | $Ikona=null; |
---|
462 | while (list ($key, $val) = each ($R["Subdir"])): |
---|
463 | if($key==14): |
---|
464 | $r=0; |
---|
465 | while (list ($key2, $val2) = each ($R["Subdir"][$key]["Subdir"])): |
---|
466 | while (list ($key3, $val3) = each ($R["Subdir"][$key]["Subdir"][$key2]["Subdir"])): |
---|
467 | fseek($jpexs_f,$val3["DataOffset"]); |
---|
468 | $Reserved=jpexs_freadword($jpexs_f); |
---|
469 | $Type=jpexs_freadword($jpexs_f); |
---|
470 | $ic=jpexs_freadword($jpexs_f); |
---|
471 | $IconCount[]=$ic; |
---|
472 | for($s=0;$s<$ic;$s++) |
---|
473 | { |
---|
474 | $Ikona[$r][$s]["Width"]=jpexs_freadbyte($jpexs_f); |
---|
475 | $Ikona[$r][$s]["Height"]=jpexs_freadbyte($jpexs_f); |
---|
476 | $Ikona[$r][$s]["ColorCount"]=jpexs_freadword($jpexs_f); |
---|
477 | $Ikona[$r][$s]["Planes"]=jpexs_freadword($jpexs_f); |
---|
478 | $Ikona[$r][$s]["BitCount"]=jpexs_freadword($jpexs_f); |
---|
479 | $Ikona[$r][$s]["BytesInRes"]=jpexs_freaddword($jpexs_f); |
---|
480 | $Ikona[$r][$s]["IconId"]=jpexs_freadword($jpexs_f); |
---|
481 | }; |
---|
482 | fseek($jpexs_f,$val3["DataOffset"]); |
---|
483 | $r++; |
---|
484 | endwhile; |
---|
485 | endwhile; |
---|
486 | endif; |
---|
487 | endwhile; |
---|
488 | |
---|
489 | reset ($R["Subdir"]); |
---|
490 | |
---|
491 | while (list ($key, $val) = each ($R["Subdir"])): |
---|
492 | if($key==3): |
---|
493 | while (list ($key2, $val2) = each ($R["Subdir"][$key]["Subdir"])): |
---|
494 | for($r=0;$r<count($Ikona);$r++): |
---|
495 | for($s=0;$s<count($Ikona[$r]);$s++): |
---|
496 | while (list ($key3, $val3) = each ($R["Subdir"][$key]["Subdir"][$Ikona[$r][$s]["IconId"]]["Subdir"])): |
---|
497 | if(($iconIndex==$r)or($iconIndex==-1)or((is_array($iconIndex))and(in_array($r,$iconIndex)))): |
---|
498 | fseek($jpexs_f,$val3["DataOffset"]); |
---|
499 | $Ikona[$r][$s]["Data"]=fread($jpexs_f,$val3["DataSize"]); |
---|
500 | $Ikona[$r][$s]["DataSize"]=$val3["DataSize"]; |
---|
501 | endif; |
---|
502 | endwhile; |
---|
503 | endfor; |
---|
504 | endfor; |
---|
505 | endwhile; |
---|
506 | endif; |
---|
507 | endwhile; |
---|
508 | $ok=false; |
---|
509 | for($r=0;$r<count($Ikona);$r++): |
---|
510 | if(($iconIndex==$r)or($iconIndex==-1)or((is_array($iconIndex))and(in_array($r,$iconIndex)))): |
---|
511 | $savefile=$icoFileNameOrPath; |
---|
512 | if($icoFileNameOrPath=="") |
---|
513 | { |
---|
514 | $savefile="$r.ico"; |
---|
515 | } |
---|
516 | else |
---|
517 | { |
---|
518 | if(($iconIndex==-1)or(is_array($iconIndex))) |
---|
519 | $savefile=$icoFileNameOrPath."$r.ico"; |
---|
520 | }; |
---|
521 | $f2=fopen($savefile,"w"); |
---|
522 | fwrite($f2,jpexs_inttoword(0)); |
---|
523 | fwrite($f2,jpexs_inttoword(1)); |
---|
524 | fwrite($f2,jpexs_inttoword(count($Ikona[$r]))); |
---|
525 | $Offset=6+16*count($Ikona[$r]); |
---|
526 | for($s=0;$s<count($Ikona[$r]);$s++): |
---|
527 | fwrite($f2,jpexs_inttobyte($Ikona[$r][$s]["Width"])); |
---|
528 | fwrite($f2,jpexs_inttobyte($Ikona[$r][$s]["Height"])); |
---|
529 | fwrite($f2,jpexs_inttoword($Ikona[$r][$s]["ColorCount"])); |
---|
530 | fwrite($f2,jpexs_inttoword($Ikona[$r][$s]["Planes"])); |
---|
531 | fwrite($f2,jpexs_inttoword($Ikona[$r][$s]["BitCount"])); |
---|
532 | fwrite($f2,jpexs_inttodword($Ikona[$r][$s]["BytesInRes"])); |
---|
533 | fwrite($f2,jpexs_inttodword($Offset)); |
---|
534 | $Offset+=$Ikona[$r][$s]["DataSize"]; |
---|
535 | endfor; |
---|
536 | for($s=0;$s<count($Ikona[$r]);$s++): |
---|
537 | fwrite($f2,$Ikona[$r][$s]["Data"]); |
---|
538 | endfor; |
---|
539 | fclose($f2); |
---|
540 | $ok=true; |
---|
541 | endif; |
---|
542 | endfor; |
---|
543 | return $ok; |
---|
544 | endif; |
---|
545 | endfor; |
---|
546 | |
---|
547 | fclose($jpexs_f); |
---|
548 | }; |
---|
549 | |
---|
550 | /** |
---|
551 | * Internal function for reading exe icons |
---|
552 | */ |
---|
553 | function jpexs_readResDirectoryEntry(&$parentRes,$offset) |
---|
554 | { |
---|
555 | global $jpexs_f,$jpexs_StartOfRsrc,$jpexs_ImageBase,$jpexs_ResVirtualAddress; |
---|
556 | $lastPos=ftell($jpexs_f); |
---|
557 | $Res=null; |
---|
558 | fseek($jpexs_f,$offset); |
---|
559 | //IMAGE_RESOURCE_DIRECTORY |
---|
560 | $Characteristics=jpexs_freaddword($jpexs_f); |
---|
561 | $TimeDateStamp=jpexs_freaddword($jpexs_f); |
---|
562 | $MajorVersion=jpexs_freadword($jpexs_f); |
---|
563 | $MinorVersion=jpexs_freadword($jpexs_f); |
---|
564 | $NumberOfNamedEntries=jpexs_freadword($jpexs_f); |
---|
565 | $NumberOfIdEntries=jpexs_freadword($jpexs_f); |
---|
566 | for($q=0;$q<$NumberOfNamedEntries+$NumberOfIdEntries;$q++): |
---|
567 | //IMAGE_RESOURCE_DIRECTORY_ENTRY |
---|
568 | $ResName=jpexs_freaddword($jpexs_f); |
---|
569 | $lastPos2=ftell($jpexs_f); |
---|
570 | if($ResName>=0x80000000): |
---|
571 | //String Name |
---|
572 | $ResNameOffset=$ResName-0x80000000; |
---|
573 | fseek($jpexs_f,$jpexs_StartOfRsrc+$ResNameOffset); |
---|
574 | $StringLength=jpexs_freadword($jpexs_f); |
---|
575 | $Identificator=(fread($jpexs_f,$StringLength*2)); |
---|
576 | fseek($jpexs_f,$lastPos2); |
---|
577 | else: |
---|
578 | //Integer Id |
---|
579 | $Identificator=$ResName; |
---|
580 | endif; |
---|
581 | |
---|
582 | $ResOffsetToData=jpexs_freaddword($jpexs_f); |
---|
583 | if($ResOffsetToData>=0x80000000): |
---|
584 | $SubResOffset=$ResOffsetToData-0x80000000; |
---|
585 | jpexs_readResDirectoryEntry($Res["$Identificator"],$jpexs_StartOfRsrc+$SubResOffset); |
---|
586 | else: |
---|
587 | $RawDataOffset=$ResOffsetToData; |
---|
588 | $lastPos2=ftell($jpexs_f); |
---|
589 | fseek($jpexs_f,$jpexs_StartOfRsrc+$RawDataOffset); |
---|
590 | //IMAGE_RESOURCE_DATA_ENTRY |
---|
591 | $OffsetToData=jpexs_freaddword($jpexs_f); |
---|
592 | $Res["$Identificator"]["DataOffset"]=$jpexs_StartOfRsrc-$jpexs_ResVirtualAddress+$OffsetToData; |
---|
593 | $Res["$Identificator"]["DataSize"]=jpexs_freaddword($jpexs_f); |
---|
594 | $CodePage=jpexs_freaddword($jpexs_f); |
---|
595 | $Reserved=jpexs_freaddword($jpexs_f); |
---|
596 | fseek($jpexs_f,$lastPos2); |
---|
597 | endif; |
---|
598 | endfor; |
---|
599 | fseek($jpexs_f,$lastPos); |
---|
600 | $parentRes["Subdir"]=$Res; |
---|
601 | }; |
---|
602 | |
---|
603 | /** |
---|
604 | * Creates ico file from image resource(s) |
---|
605 | * @param resource|array $images Target Image resource (Can be array of image resources) |
---|
606 | * @param string $filename Target ico file to save icon to, If ommited or "", image is written to snadard output - use header("Content-type: image/x-icon"); */ |
---|
607 | function imageIco($images,$filename="") |
---|
608 | { |
---|
609 | |
---|
610 | if(is_array($images)) |
---|
611 | { |
---|
612 | $ImageCount=count($images); |
---|
613 | $Image=$images; |
---|
614 | } |
---|
615 | else |
---|
616 | { |
---|
617 | $Image[0]=$images; |
---|
618 | $ImageCount=1; |
---|
619 | }; |
---|
620 | |
---|
621 | |
---|
622 | $WriteToFile=false; |
---|
623 | |
---|
624 | if($filename!="") |
---|
625 | { |
---|
626 | $WriteToFile=true; |
---|
627 | }; |
---|
628 | |
---|
629 | |
---|
630 | $ret=""; |
---|
631 | |
---|
632 | $ret.=jpexs_inttoword(0); //PASSWORD |
---|
633 | $ret.=jpexs_inttoword(1); //SOURCE |
---|
634 | $ret.=jpexs_inttoword($ImageCount); //ICONCOUNT |
---|
635 | |
---|
636 | |
---|
637 | for($q=0;$q<$ImageCount;$q++) |
---|
638 | { |
---|
639 | $img=$Image[$q]; |
---|
640 | |
---|
641 | $Width=imagesx($img); |
---|
642 | $Height=imagesy($img); |
---|
643 | |
---|
644 | $ColorCount=imagecolorstotal($img); |
---|
645 | |
---|
646 | $Transparent=imagecolortransparent($img); |
---|
647 | $IsTransparent=$Transparent!=-1; |
---|
648 | |
---|
649 | |
---|
650 | if($IsTransparent) $ColorCount--; |
---|
651 | |
---|
652 | if($ColorCount==0) {$ColorCount=0; $BitCount=24;}; |
---|
653 | if(($ColorCount>0)and($ColorCount<=2)) {$ColorCount=2; $BitCount=1;}; |
---|
654 | if(($ColorCount>2)and($ColorCount<=16)) { $ColorCount=16; $BitCount=4;}; |
---|
655 | if(($ColorCount>16)and($ColorCount<=256)) { $ColorCount=0; $BitCount=8;}; |
---|
656 | |
---|
657 | |
---|
658 | |
---|
659 | |
---|
660 | |
---|
661 | //ICONINFO: |
---|
662 | $ret.=jpexs_inttobyte($Width);// |
---|
663 | $ret.=jpexs_inttobyte($Height);// |
---|
664 | $ret.=jpexs_inttobyte($ColorCount);// |
---|
665 | $ret.=jpexs_inttobyte(0);//RESERVED |
---|
666 | |
---|
667 | $Planes=0; |
---|
668 | if($BitCount>=8) $Planes=1; |
---|
669 | |
---|
670 | $ret.=jpexs_inttoword($f,$Planes);//PLANES |
---|
671 | if($BitCount>=8) $WBitCount=$BitCount; |
---|
672 | if($BitCount==4) $WBitCount=0; |
---|
673 | if($BitCount==1) $WBitCount=0; |
---|
674 | $ret.=jpexs_inttoword($WBitCount);//BITS |
---|
675 | |
---|
676 | $Zbytek=(4-($Width/(8/$BitCount))%4)%4; |
---|
677 | $ZbytekMask=(4-($Width/8)%4)%4; |
---|
678 | |
---|
679 | $PalSize=0; |
---|
680 | |
---|
681 | $Size=40+($Width/(8/$BitCount)+$Zbytek)*$Height+(($Width/8+$ZbytekMask) * $Height); |
---|
682 | if($BitCount<24) |
---|
683 | $Size+=pow(2,$BitCount)*4; |
---|
684 | $IconId=1; |
---|
685 | $ret.=jpexs_inttodword($Size); //SIZE |
---|
686 | $OffSet=6+16*$ImageCount+$FullSize; |
---|
687 | $ret.=jpexs_inttodword(6+16*$ImageCount+$FullSize);//OFFSET |
---|
688 | $FullSize+=$Size; |
---|
689 | //------------- |
---|
690 | |
---|
691 | }; |
---|
692 | |
---|
693 | |
---|
694 | for($q=0;$q<$ImageCount;$q++) |
---|
695 | { |
---|
696 | $img=$Image[$q]; |
---|
697 | $Width=imagesx($img); |
---|
698 | $Height=imagesy($img); |
---|
699 | $ColorCount=imagecolorstotal($img); |
---|
700 | |
---|
701 | $Transparent=imagecolortransparent($img); |
---|
702 | $IsTransparent=$Transparent!=-1; |
---|
703 | |
---|
704 | if($IsTransparent) $ColorCount--; |
---|
705 | if($ColorCount==0) {$ColorCount=0; $BitCount=24;}; |
---|
706 | if(($ColorCount>0)and($ColorCount<=2)) {$ColorCount=2; $BitCount=1;}; |
---|
707 | if(($ColorCount>2)and($ColorCount<=16)) { $ColorCount=16; $BitCount=4;}; |
---|
708 | if(($ColorCount>16)and($ColorCount<=256)) { $ColorCount=0; $BitCount=8;}; |
---|
709 | |
---|
710 | |
---|
711 | |
---|
712 | //ICONS |
---|
713 | $ret.=jpexs_inttodword(40);//HEADSIZE |
---|
714 | $ret.=jpexs_inttodword($Width);// |
---|
715 | $ret.=jpexs_inttodword(2*$Height);// |
---|
716 | $ret.=jpexs_inttoword(1); //PLANES |
---|
717 | $ret.=jpexs_inttoword($BitCount); // |
---|
718 | $ret.=jpexs_inttodword(0);//Compress method |
---|
719 | |
---|
720 | |
---|
721 | $ZbytekMask=($Width/8)%4; |
---|
722 | |
---|
723 | $Zbytek=($Width/(8/$BitCount))%4; |
---|
724 | $Size=($Width/(8/$BitCount)+$Zbytek)*$Height+(($Width/8+$ZbytekMask) * $Height); |
---|
725 | |
---|
726 | $ret.=jpexs_inttodword($Size);//SIZE |
---|
727 | |
---|
728 | $ret.=jpexs_inttodword(0);//HPIXEL_M |
---|
729 | $ret.=jpexs_inttodword(0);//V_PIXEL_M |
---|
730 | $ret.=jpexs_inttodword($ColorCount); //UCOLORS |
---|
731 | $ret.=jpexs_inttodword(0); //DCOLORS |
---|
732 | //--------------- |
---|
733 | |
---|
734 | |
---|
735 | $CC=$ColorCount; |
---|
736 | if($CC==0) $CC=256; |
---|
737 | |
---|
738 | if($BitCount<24) |
---|
739 | { |
---|
740 | $ColorTotal=imagecolorstotal($img); |
---|
741 | if($IsTransparent) $ColorTotal--; |
---|
742 | |
---|
743 | for($p=0;$p<$ColorTotal;$p++) |
---|
744 | { |
---|
745 | $color=imagecolorsforindex($img,$p); |
---|
746 | $ret.=jpexs_inttobyte($color["blue"]); |
---|
747 | $ret.=jpexs_inttobyte($color["green"]); |
---|
748 | $ret.=jpexs_inttobyte($color["red"]); |
---|
749 | $ret.=jpexs_inttobyte(0); //RESERVED |
---|
750 | }; |
---|
751 | |
---|
752 | $CT=$ColorTotal; |
---|
753 | for($p=$ColorTotal;$p<$CC;$p++) |
---|
754 | { |
---|
755 | $ret.=jpexs_inttobyte(0); |
---|
756 | $ret.=jpexs_inttobyte(0); |
---|
757 | $ret.=jpexs_inttobyte(0); |
---|
758 | $ret.=jpexs_inttobyte(0); //RESERVED |
---|
759 | }; |
---|
760 | }; |
---|
761 | |
---|
762 | |
---|
763 | |
---|
764 | |
---|
765 | |
---|
766 | |
---|
767 | if($BitCount<=8) |
---|
768 | { |
---|
769 | |
---|
770 | for($y=$Height-1;$y>=0;$y--) |
---|
771 | { |
---|
772 | $bWrite=""; |
---|
773 | for($x=0;$x<$Width;$x++) |
---|
774 | { |
---|
775 | $color=imagecolorat($img,$x,$y); |
---|
776 | if($color==$Transparent) |
---|
777 | $color=imagecolorexact($img,0,0,0); |
---|
778 | if($color==-1) $color=0; |
---|
779 | if($color>pow(2,$BitCount)-1) $color=0; |
---|
780 | |
---|
781 | $bWrite.=jpexs_decbinx($color,$BitCount); |
---|
782 | if(strlen($bWrite)==8) |
---|
783 | { |
---|
784 | $ret.=jpexs_inttobyte(bindec($bWrite)); |
---|
785 | $bWrite=""; |
---|
786 | }; |
---|
787 | }; |
---|
788 | |
---|
789 | if((strlen($bWrite)<8)and(strlen($bWrite)!=0)) |
---|
790 | { |
---|
791 | $sl=strlen($bWrite); |
---|
792 | for($t=0;$t<8-$sl;$t++) |
---|
793 | $sl.="0"; |
---|
794 | $ret.=jpexs_inttobyte(bindec($bWrite)); |
---|
795 | }; |
---|
796 | for($z=0;$z<$Zbytek;$z++) |
---|
797 | $ret.=jpexs_inttobyte(0); |
---|
798 | }; |
---|
799 | }; |
---|
800 | |
---|
801 | |
---|
802 | |
---|
803 | if($BitCount>=24) |
---|
804 | { |
---|
805 | for($y=$Height-1;$y>=0;$y--) |
---|
806 | { |
---|
807 | for($x=0;$x<$Width;$x++) |
---|
808 | { |
---|
809 | $color=imagecolorsforindex($img,imagecolorat($img,$x,$y)); |
---|
810 | $ret.=jpexs_inttobyte($color["blue"]); |
---|
811 | $ret.=jpexs_inttobyte($color["green"]); |
---|
812 | $ret.=jpexs_inttobyte($color["red"]); |
---|
813 | if($BitCount==32) |
---|
814 | $ret.=jpexs_inttobyte(0);//Alpha for ICO_XP_COLORS |
---|
815 | }; |
---|
816 | for($z=0;$z<$Zbytek;$z++) |
---|
817 | $ret.=jpexs_inttobyte(0); |
---|
818 | }; |
---|
819 | }; |
---|
820 | |
---|
821 | |
---|
822 | //MASK |
---|
823 | |
---|
824 | for($y=$Height-1;$y>=0;$y--) |
---|
825 | { |
---|
826 | $byteCount=0; |
---|
827 | $bOut=""; |
---|
828 | for($x=0;$x<$Width;$x++) |
---|
829 | { |
---|
830 | if(($Transparent!=-1)and(imagecolorat($img,$x,$y)==$Transparent)) |
---|
831 | { |
---|
832 | $bOut.="1"; |
---|
833 | } |
---|
834 | else |
---|
835 | { |
---|
836 | $bOut.="0"; |
---|
837 | }; |
---|
838 | }; |
---|
839 | for($p=0;$p<strlen($bOut);$p+=8) |
---|
840 | { |
---|
841 | $byte=bindec(substr($bOut,$p,8)); |
---|
842 | $byteCount++; |
---|
843 | $ret.=jpexs_inttobyte($byte); |
---|
844 | }; |
---|
845 | $Zbytek=$byteCount%4; |
---|
846 | for($z=0;$z<$Zbytek;$z++) |
---|
847 | { |
---|
848 | $ret.=jpexs_inttobyte(0xff); |
---|
849 | }; |
---|
850 | }; |
---|
851 | |
---|
852 | //------------------ |
---|
853 | |
---|
854 | };//q |
---|
855 | |
---|
856 | |
---|
857 | |
---|
858 | |
---|
859 | |
---|
860 | if($WriteToFile) |
---|
861 | { |
---|
862 | $f=fopen($filename,"w"); |
---|
863 | fwrite($f,$ret); |
---|
864 | fclose($f); |
---|
865 | } |
---|
866 | else |
---|
867 | { |
---|
868 | echo $ret; |
---|
869 | }; |
---|
870 | |
---|
871 | }; |
---|
872 | |
---|
873 | |
---|
874 | |
---|
875 | |
---|
876 | /* |
---|
877 | * Internal functions: |
---|
878 | *------------------------- |
---|
879 | * jpexs_inttobyte($n) - returns chr(n) |
---|
880 | * jpexs_inttodword($n) - returns dword (n) |
---|
881 | * jpexs_inttoword($n) - returns word(n) |
---|
882 | * jpexs_freadbyte($file) - reads 1 byte from $file |
---|
883 | * jpexs_freadword($file) - reads 2 bytes (1 word) from $file |
---|
884 | * jpexs_freaddword($file) - reads 4 bytes (1 dword) from $file |
---|
885 | * jpexs_freadlngint($file) - same as freaddword($file) |
---|
886 | * jpexs_decbin8($d) - returns binary string of d zero filled to 8 |
---|
887 | * jpexs_RetBits($byte,$start,$len) - returns bits $start->$start+$len from $byte |
---|
888 | * jpexs_freadbits($file,$count) - reads next $count bits from $file |
---|
889 | */ |
---|
890 | |
---|
891 | |
---|
892 | function jpexs_decbin8($d) |
---|
893 | { |
---|
894 | return jpexs_decbinx($d,8); |
---|
895 | }; |
---|
896 | |
---|
897 | function jpexs_decbinx($d,$n) |
---|
898 | { |
---|
899 | $bin=decbin($d); |
---|
900 | $sbin=strlen($bin); |
---|
901 | for($j=0;$j<$n-$sbin;$j++) |
---|
902 | $bin="0$bin"; |
---|
903 | return $bin; |
---|
904 | }; |
---|
905 | |
---|
906 | function jpexs_retBits($byte,$start,$len) |
---|
907 | { |
---|
908 | $bin=jpexs_decbin8($byte); |
---|
909 | $r=bindec(substr($bin,$start,$len)); |
---|
910 | return $r; |
---|
911 | |
---|
912 | }; |
---|
913 | |
---|
914 | |
---|
915 | |
---|
916 | $jpexs_currentBit=0; |
---|
917 | function jpexs_freadbits($f,$count) |
---|
918 | { |
---|
919 | global $jpexs_currentBit,$jpexs_SMode; |
---|
920 | $Byte=jpexs_freadbyte($f); |
---|
921 | $LastCBit=$jpexs_currentBit; |
---|
922 | $jpexs_currentBit+=$count; |
---|
923 | if($jpexs_currentBit==8) |
---|
924 | { |
---|
925 | $jpexs_currentBit=0; |
---|
926 | } |
---|
927 | else |
---|
928 | { |
---|
929 | fseek($f,ftell($f)-1); |
---|
930 | }; |
---|
931 | return jpexs_retBits($Byte,$LastCBit,$count); |
---|
932 | }; |
---|
933 | |
---|
934 | |
---|
935 | function jpexs_freadbyte($f) |
---|
936 | { |
---|
937 | return ord(fread($f,1)); |
---|
938 | }; |
---|
939 | |
---|
940 | function jpexs_freadword($f) |
---|
941 | { |
---|
942 | $b1=jpexs_freadbyte($f); |
---|
943 | $b2=jpexs_freadbyte($f); |
---|
944 | return $b2*256+$b1; |
---|
945 | }; |
---|
946 | |
---|
947 | |
---|
948 | function jpexs_freadlngint($f) |
---|
949 | { |
---|
950 | return jpexs_freaddword($f); |
---|
951 | }; |
---|
952 | |
---|
953 | function jpexs_freaddword($f) |
---|
954 | { |
---|
955 | $b1=jpexs_freadword($f); |
---|
956 | $b2=jpexs_freadword($f); |
---|
957 | return $b2*65536+$b1; |
---|
958 | }; |
---|
959 | |
---|
960 | function jpexs_inttobyte($n) |
---|
961 | { |
---|
962 | return chr($n); |
---|
963 | }; |
---|
964 | |
---|
965 | function jpexs_inttodword($n) |
---|
966 | { |
---|
967 | return chr($n & 255).chr(($n >> 8) & 255).chr(($n >> 16) & 255).chr(($n >> 24) & 255); |
---|
968 | }; |
---|
969 | |
---|
970 | function jpexs_inttoword($n) |
---|
971 | { |
---|
972 | return chr($n & 255).chr(($n >> 8) & 255); |
---|
973 | }; |
---|
974 | |
---|
975 | ?> |
---|