diff --git a/README.txt b/README.txt index 254501241..19f5de99e 100644 --- a/README.txt +++ b/README.txt @@ -40,9 +40,7 @@ case of any discrepancy, the copy in pngcrush.c shall prevail): This is the output of "pngcrush" and "pngcrush -help": - - - | pngcrush 1.5.5, Copyright (C) 1998-2001 Glenn Randers-Pehrson + | pngcrush 1.5.6, Copyright (C) 1998-2001 Glenn Randers-Pehrson | This is a free, open-source program. Permission is irrevocably | granted to everyone to use this version of pngcrush without | payment of any fee. @@ -97,7 +95,7 @@ options: -p (pause) - | pngcrush 1.5.5, Copyright (C) 1998-2001 Glenn Randers-Pehrson + | pngcrush 1.5.6, Copyright (C) 1998-2001 Glenn Randers-Pehrson | This is a free, open-source program. Permission is irrevocably | granted to everyone to use this version of pngcrush without | payment of any fee. diff --git a/pngcrush.c b/pngcrush.c index aa03b1c21..e2e09f484 100644 --- a/pngcrush.c +++ b/pngcrush.c @@ -25,7 +25,7 @@ * */ -#define PNGCRUSH_VERSION "1.5.5" +#define PNGCRUSH_VERSION "1.5.6" /* #define PNGCRUSH_COUNT_COLORS @@ -66,6 +66,16 @@ */ /* Change log: + * + * Version 1.5.6 (built with libpng-1.0.12) + * + * Eliminated extra "Removed the cHNK chunk" messages generated by version + * 1.5.5 when "-rem alla" or "-rem allb" is used. + * + * All unknown chunks including safe-to-copy chunks are now removed in + * response to the "-rem alla" or "-rem allb" options. + * + * Issue a warning if the user tries "-cc" option when it is not supported. * * Version 1.5.5 (built with libpng-1.0.12) * @@ -934,6 +944,40 @@ static void setfiletype(const char *name) # define setfiletype(x) #endif +int keep_unknown_chunk(png_const_charp name, char *argv[]); + +int keep_unknown_chunk(png_const_charp name, char *argv[]) +{ + int i; + if(remove_chunks == 0) return 1; + for (i=1; i<=remove_chunks; i++) + { + if(!strncmp(argv[i],"-rem",4)) + { + int alla = 0; + int allb = 0; + i++; + if(!strncmp(argv[i],"alla",4)) alla++; /* all ancillaries */ + if(!strncmp(argv[i],"all",3)) allb++; /* all but gamma */ + if(!strncmp(argv[i],name,4) || + (!strncmp(name,"cHRM",4) && (!strncmp(argv[i],"chrm",4) || allb)) || + (!strncmp(name,"gIFg",4) && (!strncmp(argv[i],"gifg",4) || allb)) || + (!strncmp(name,"gIFt",4) && (!strncmp(argv[i],"gift",4) || allb)) || + (!strncmp(name,"gIFx",4) && (!strncmp(argv[i],"gifx",4) || allb)) || + (!strncmp(name,"hIST",4) && (!strncmp(argv[i],"hist",4) || allb)) || + (!strncmp(name,"iCCP",4) && (!strncmp(argv[i],"iccp",4) || allb)) || + (!strncmp(name,"pCAL",4) && (!strncmp(argv[i],"pcal",4) || allb)) || + (!strncmp(name,"sCAL",4) && (!strncmp(argv[i],"scal",4) || allb)) || + (!strncmp(name,"sPLT",4) && (!strncmp(argv[i],"splt",4) || allb)) || + (!strncmp(name,"tIME",4) && (!strncmp(argv[i],"time",4) || allb))) + { + return 0; + } + } + } + return 1; +} + int keep_chunk(png_const_charp name, char *argv[]); int keep_chunk(png_const_charp name, char *argv[]) @@ -1185,12 +1229,12 @@ main(int argc, char *argv[]) BUMP_I; force_output_bit_depth=atoi(argv[i]); } -#ifdef PNGCRUSH_COUNT_COLORS else if(!strncmp(argv[i],"-cc",3)) + { do_color_count=1; + } else if(!strncmp(argv[i],"-no_cc",6)) do_color_count=0; -#endif else if(!strncmp(argv[i],"-c",2)) { names++; @@ -2441,6 +2485,9 @@ main(int argc, char *argv[]) force_output_color_type = output_color_type; } } +#else + if (do_color_count) + printf(" color counting (-cc option) is disabled.\n"); #endif /* PNGCRUSH_COUNT_COLORS */ output_color_type=force_output_color_type; @@ -2729,47 +2776,51 @@ main(int argc, char *argv[]) #endif #endif /* PNG_USE_LOCAL_ARRAYS */ - png_set_keep_unknown_chunks(write_ptr, HANDLE_CHUNK_IF_SAFE, - (png_bytep)NULL, 0); + if(keep_unknown_chunk("alla",argv) && + keep_unknown_chunk("allb",argv)) + png_set_keep_unknown_chunks(write_ptr, HANDLE_CHUNK_IF_SAFE, + (png_bytep)NULL, 0); + else + png_set_keep_unknown_chunks(write_ptr, HANDLE_CHUNK_NEVER, + (png_bytep)NULL, 0); /* Process the following chunks as if safe-to-copy since it is known that recompressing the IDAT chunks has no effect on them */ #if !defined(PNG_cHRM_SUPPORTED) - if(keep_chunk("cHRM",argv)) + if(keep_unknown_chunk("cHRM",argv)) png_set_keep_unknown_chunks(write_ptr, HANDLE_CHUNK_ALWAYS, (png_bytep)png_cHRM, 1); #endif #if !defined(PNG_hIST_SUPPORTED) - if(keep_chunk("hIST",argv)) + if(keep_unknown_chunk("hIST",argv)) png_set_keep_unknown_chunks(write_ptr, HANDLE_CHUNK_ALWAYS, (png_bytep)png_hIST, 1); #endif #if !defined(PNG_iCCP_SUPPORTED) - if(keep_chunk("iCCP",argv)) + if(keep_unknown_chunk("iCCP",argv)) png_set_keep_unknown_chunks(write_ptr, HANDLE_CHUNK_ALWAYS, (png_bytep)png_iCCP, 1); #endif #if !defined(PNG_sCAL_SUPPORTED) - if(keep_chunk("sCAL",argv)) + if(keep_unknown_chunk("sCAL",argv)) png_set_keep_unknown_chunks(write_ptr, HANDLE_CHUNK_ALWAYS, (png_bytep)png_sCAL, 1); #endif #if !defined(PNG_pCAL_SUPPORTED) - if(keep_chunk("pCAL",argv)) + if(keep_unknown_chunk("pCAL",argv)) png_set_keep_unknown_chunks(write_ptr, HANDLE_CHUNK_ALWAYS, (png_bytep)png_pCAL, 1); #endif #if !defined(PNG_sPLT_SUPPORTED) - if(keep_chunk("sPLT",argv)) + if(keep_unknown_chunk("sPLT",argv)) png_set_keep_unknown_chunks(write_ptr, HANDLE_CHUNK_ALWAYS, (png_bytep)png_sPLT, 1); #endif #if !defined(PNG_tIME_SUPPORTED) - if(keep_chunk("tIME",argv)) + if(keep_unknown_chunk("tIME",argv)) png_set_keep_unknown_chunks(write_ptr, HANDLE_CHUNK_ALWAYS, (png_bytep)png_tIME, 1); #endif - #else /* PNG_UINT_IHDR is defined; we are using libpng newer than 1.0.6 */ #if !defined(PNG_cHRM_SUPPORTED) || !defined(PNG_hIST_SUPPORTED) || \ @@ -2780,10 +2831,16 @@ main(int argc, char *argv[]) chunk_name[4]='\0'; #endif - png_set_keep_unknown_chunks(write_ptr, HANDLE_CHUNK_IF_SAFE, - NULL, 0); + if(keep_unknown_chunk("alla",argv) && + keep_unknown_chunk("allb",argv)) + png_set_keep_unknown_chunks(write_ptr, HANDLE_CHUNK_IF_SAFE, + (png_bytep)NULL, 0); + else + png_set_keep_unknown_chunks(write_ptr, HANDLE_CHUNK_NEVER, + (png_bytep)NULL, 0); + #if !defined(PNG_cHRM_SUPPORTED) - if(keep_chunk("cHRM",argv)) + if(keep_unknown_chunk("cHRM",argv)) { png_save_uint_32(chunk_name, PNG_UINT_cHRM); png_set_keep_unknown_chunks(write_ptr, HANDLE_CHUNK_ALWAYS, @@ -2791,7 +2848,7 @@ main(int argc, char *argv[]) } #endif #if !defined(PNG_hIST_SUPPORTED) - if(keep_chunk("hIST",argv)) + if(keep_unknown_chunk("hIST",argv)) { png_save_uint_32(chunk_name, PNG_UINT_hIST); png_set_keep_unknown_chunks(write_ptr, HANDLE_CHUNK_ALWAYS, @@ -2799,7 +2856,7 @@ main(int argc, char *argv[]) } #endif #if !defined(PNG_iCCP_SUPPORTED) - if(keep_chunk("iCCP",argv)) + if(keep_unknown_chunk("iCCP",argv)) { png_save_uint_32(chunk_name, PNG_UINT_iCCP); png_set_keep_unknown_chunks(write_ptr, HANDLE_CHUNK_ALWAYS, @@ -2807,7 +2864,7 @@ main(int argc, char *argv[]) } #endif #if !defined(PNG_sCAL_SUPPORTED) - if(keep_chunk("sCAL",argv)) + if(keep_unknown_chunk("sCAL",argv)) { png_save_uint_32(chunk_name, PNG_UINT_sCAL); png_set_keep_unknown_chunks(write_ptr, HANDLE_CHUNK_ALWAYS, @@ -2815,7 +2872,7 @@ main(int argc, char *argv[]) } #endif #if !defined(PNG_pCAL_SUPPORTED) - if(keep_chunk("pCAL",argv)) + if(keep_unknown_chunk("pCAL",argv)) { png_save_uint_32(chunk_name, PNG_UINT_pCAL); png_set_keep_unknown_chunks(write_ptr, HANDLE_CHUNK_ALWAYS, @@ -2823,7 +2880,7 @@ main(int argc, char *argv[]) } #endif #if !defined(PNG_sPLT_SUPPORTED) - if(keep_chunk("sPLT",argv)) + if(keep_unknown_chunk("sPLT",argv)) { png_save_uint_32(chunk_name, PNG_UINT_sPLT); png_set_keep_unknown_chunks(write_ptr, HANDLE_CHUNK_ALWAYS, @@ -2831,7 +2888,7 @@ main(int argc, char *argv[]) } #endif #if !defined(PNG_tIME_SUPPORTED) - if(keep_chunk("tIME",argv)) + if(keep_unknown_chunk("tIME",argv)) { png_save_uint_32(chunk_name, PNG_UINT_tIME); png_set_keep_unknown_chunks(write_ptr, HANDLE_CHUNK_ALWAYS,