mirror of
				https://git.code.sf.net/p/libpng/code.git
				synced 2025-07-10 18:04:09 +02:00 
			
		
		
		
	[libpng17] Added contrib/tools/fixitxt.c, to repair the erroneous iTXt
chunk length written by libpng-1.6.0 and 1.6.1.
This commit is contained in:
		
							parent
							
								
									25a116f97d
								
							
						
					
					
						commit
						8ef61c4693
					
				
							
								
								
									
										6
									
								
								ANNOUNCE
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								ANNOUNCE
									
									
									
									
									
								
							| @ -1,5 +1,5 @@ | ||||
| 
 | ||||
| Libpng 1.7.0beta08 - April 14, 2013 | ||||
| Libpng 1.7.0beta08 - April 17, 2013 | ||||
| 
 | ||||
| This is not intended to be a public release.  It will be replaced | ||||
| within a few weeks by a public version or by another test version. | ||||
| @ -249,7 +249,9 @@ Version 1.7.0beta07 [April 14, 2013] | ||||
|     (Flavio Medeiros). | ||||
|   Corrected length written to uncompressed iTXt chunks (Samuli Suominen). | ||||
| 
 | ||||
| Version 1.7.0beta08 [April 14, 2013] | ||||
| Version 1.7.0beta08 [April 17, 2013] | ||||
|   Added contrib/tools/fixitxt.c, to repair the erroneous iTXt chunk length | ||||
|     written by libpng-1.6.0 and 1.6.1. | ||||
| 
 | ||||
| Send comments/corrections/commendations to png-mng-implement at lists.sf.net | ||||
| (subscription required; visit | ||||
|  | ||||
							
								
								
									
										4
									
								
								CHANGES
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								CHANGES
									
									
									
									
									
								
							| @ -4536,7 +4536,9 @@ Version 1.7.0beta07 [April 14, 2013] | ||||
|     (Flavio Medeiros). | ||||
|   Corrected length written to uncompressed iTXt chunks (Samuli Suominen). | ||||
| 
 | ||||
| Version 1.7.0beta08 [April 14, 2013] | ||||
| Version 1.7.0beta08 [April 17, 2013] | ||||
|   Added contrib/tools/fixitxt.c, to repair the erroneous iTXt chunk length | ||||
|     written by libpng-1.6.0 and 1.6.1. | ||||
| 
 | ||||
| Send comments/corrections/commendations to png-mng-implement at lists.sf.net | ||||
| (subscription required; visit | ||||
|  | ||||
							
								
								
									
										140
									
								
								contrib/tools/fixitxt.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								contrib/tools/fixitxt.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,140 @@ | ||||
| #include <stdio.h> | ||||
| 
 | ||||
| /* fixitxt version 1.0.0
 | ||||
|  * | ||||
|  * Copyright 2013 Glenn Randers-Pehrson | ||||
|  * | ||||
|  * This code is released under the libpng license. | ||||
|  * For conditions of distribution and use, see the disclaimer | ||||
|  * and license in png.h | ||||
|  * | ||||
|  * Usage:             | ||||
|  * | ||||
|  *     fixitxt.exe < bad.png > good.png | ||||
|  * | ||||
|  * Fixes a PNG file written with libpng-1.6.0 or 1.6.1 that has one or more | ||||
|  * uncompressed iTXt chunks.  Assumes that the actual length is greater | ||||
|  * than or equal to the value in the length byte, and that the CRC is | ||||
|  * correct for the actual length.  This program hunts for the CRC and | ||||
|  * adjusts the length byte accordingly.  It is not an error to process a | ||||
|  * PNG file that has no iTXt chunks or one that has valid iTXt chunks; | ||||
|  * such files will simply be copied. | ||||
|  * | ||||
|  * Requires zlib (for crc32 and Z_NULL); build with | ||||
|  * | ||||
|  *     gcc -O -o fixitxt fixitxt.c -lz | ||||
|  */ | ||||
| 
 | ||||
| #define GETBREAK c=getchar(); if (c == EOF) break; | ||||
| #include <zlib.h> | ||||
| 
 | ||||
| main() | ||||
| { | ||||
|    unsigned int i; | ||||
|    unsigned char buf[100000]; | ||||
|    unsigned long crc; | ||||
|    unsigned int c; | ||||
| 
 | ||||
| /* Skip 8-byte signature */ | ||||
|    for (i=8; i; i--) | ||||
|    { | ||||
|       c=GETBREAK; | ||||
|       putchar(c); | ||||
|    } | ||||
| 
 | ||||
| if (c != EOF) | ||||
| for (;;) | ||||
|  { | ||||
|    /* Read the length */ | ||||
|    unsigned int length; | ||||
|    c=GETBREAK; buf[0] = c; | ||||
|    c=GETBREAK; buf[1] = c; | ||||
|    c=GETBREAK; buf[2] = c; | ||||
|    c=GETBREAK; buf[3] = c; | ||||
| 
 | ||||
|    length=buf[0]<<24 | buf[1]<<16 | buf[2] << 8 | buf[3]; | ||||
|    /* Read the chunkname */ | ||||
|    c=GETBREAK; buf[4] = c; | ||||
|    c=GETBREAK; buf[5] = c; | ||||
|    c=GETBREAK; buf[6] = c; | ||||
|    c=GETBREAK; buf[7] = c; | ||||
| 
 | ||||
| 
 | ||||
|    /* The iTXt chunk type expressed as integers is (105, 84, 88, 116) */ | ||||
|    if (buf[4] == 105 && buf[5] == 84 && buf[6] == 88 && buf[7] == 116) | ||||
|    { | ||||
|       /* Initialize the CRC */ | ||||
|       crc = crc32(0, Z_NULL, 0); | ||||
| 
 | ||||
|       /* Copy the data bytes */ | ||||
|       for (i=8; i < length + 12; i++) | ||||
|       { | ||||
|          c=GETBREAK; buf[i] = c; | ||||
|       } | ||||
| 
 | ||||
|       /* Calculate the CRC */ | ||||
|       crc = crc32(crc, buf+4, (uInt)length+4); | ||||
| 
 | ||||
|       for (;;) | ||||
|       { | ||||
|         /* Check the CRC */ | ||||
|         if (((crc >> 24) & 0xff) == buf[length+8] && | ||||
|             ((crc >> 16) & 0xff) == buf[length+9] && | ||||
|             ((crc >>  8) & 0xff) == buf[length+10] && | ||||
|             ((crc      ) & 0xff) == buf[length+11]) | ||||
|            break; | ||||
| 
 | ||||
|         length++; | ||||
| 
 | ||||
|         c=GETBREAK; | ||||
|         buf[length+11]=c; | ||||
| 
 | ||||
|         /* Update the CRC */ | ||||
|         crc = crc32(crc, buf+7+length, 1); | ||||
|       } | ||||
| 
 | ||||
|       /* Update length bytes */ | ||||
|         buf[0] = (length << 24) & 0xff; | ||||
|         buf[1] = (length << 16) & 0xff; | ||||
|         buf[2] = (length <<  8) & 0xff; | ||||
|         buf[3] = (length      ) & 0xff; | ||||
| 
 | ||||
|       /* Write the fixed iTXt chunk (length, name, data, crc) */ | ||||
|       for (i=0; i<length+12; i++) | ||||
|          putchar(buf[i]); | ||||
|    } | ||||
| 
 | ||||
|    else | ||||
|    { | ||||
|       /* Copy bytes that were already read (length and chunk name) */ | ||||
|       for (i=0; i<8; i++) | ||||
|          putchar(buf[i]); | ||||
| 
 | ||||
|       /* Copy data bytes and CRC */ | ||||
|       for (i=8; i< length+12; i++) | ||||
|       { | ||||
|          c=GETBREAK; | ||||
|          putchar(c); | ||||
|          buf[i]=c; | ||||
|       } | ||||
| 
 | ||||
|       crc = crc32(0, Z_NULL, 0); | ||||
|       crc = crc32(crc, buf+4, (uInt)length+4); | ||||
| 
 | ||||
|       if (c == EOF) | ||||
|       { | ||||
|          break; | ||||
|       } | ||||
| 
 | ||||
|    /* The IEND chunk type expressed as integers is (73, 69, 78, 68) */ | ||||
|       if (buf[4] == 73 && buf[5] == 69 && buf[6] == 78 && buf[7] == 68) | ||||
|          break; | ||||
|    } | ||||
| 
 | ||||
|    if (c == EOF) | ||||
|       break; | ||||
| 
 | ||||
|    if (buf[4] == 73 && buf[5] == 69 && buf[6] == 78 && buf[7] == 68) | ||||
|      break; | ||||
|  } | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Glenn Randers-Pehrson
						Glenn Randers-Pehrson