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 | 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. | 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). |     (Flavio Medeiros). | ||||||
|   Corrected length written to uncompressed iTXt chunks (Samuli Suominen). |   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 | Send comments/corrections/commendations to png-mng-implement at lists.sf.net | ||||||
| (subscription required; visit | (subscription required; visit | ||||||
|  | |||||||
							
								
								
									
										4
									
								
								CHANGES
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								CHANGES
									
									
									
									
									
								
							| @ -4536,7 +4536,9 @@ Version 1.7.0beta07 [April 14, 2013] | |||||||
|     (Flavio Medeiros). |     (Flavio Medeiros). | ||||||
|   Corrected length written to uncompressed iTXt chunks (Samuli Suominen). |   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 | Send comments/corrections/commendations to png-mng-implement at lists.sf.net | ||||||
| (subscription required; visit | (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