diff options
author | Glenn Randers-Pehrson <glennrp at users.sourceforge.net> | 2013-12-22 13:52:02 -0600 |
---|---|---|
committer | Glenn Randers-Pehrson <glennrp at users.sourceforge.net> | 2013-12-22 13:52:02 -0600 |
commit | 8b1263b201b8676d8d72bb90961b568380340970 (patch) | |
tree | b58875bfacdb8f732cb5dd1feaabde6a117c3fb4 | |
parent | 0b88c4a2a994e23c23aa8a7eec1329a2be2b47c5 (diff) | |
download | libpng-8b1263b201b8676d8d72bb90961b568380340970.tar.gz |
[pngcrush] Update libpng to version 1.6.8 and pngcrush to version 1.7.70v1.7.70
-rw-r--r-- | png.c | 54 | ||||
-rw-r--r-- | png.h | 29 | ||||
-rw-r--r-- | pngconf.h | 2 | ||||
-rw-r--r-- | pngcrush.c | 9 | ||||
-rw-r--r-- | pngcrush.h | 2 | ||||
-rw-r--r-- | pngdebug.h | 21 | ||||
-rw-r--r-- | pngerror.c | 25 | ||||
-rw-r--r-- | pnglibconf.h | 4 | ||||
-rw-r--r-- | pngmem.c | 8 | ||||
-rw-r--r-- | pngpread.c | 6 | ||||
-rw-r--r-- | pngpriv.h | 67 | ||||
-rw-r--r-- | pngread.c | 206 | ||||
-rw-r--r-- | pngrtran.c | 5 | ||||
-rw-r--r-- | pngrutil.c | 21 | ||||
-rw-r--r-- | pngset.c | 4 | ||||
-rw-r--r-- | pngwio.c | 4 | ||||
-rw-r--r-- | pngwrite.c | 37 |
17 files changed, 317 insertions, 187 deletions
@@ -1,7 +1,7 @@ /* png.c - location for general purpose libpng functions * - * Last changed in libpng 1.6.2 [April 25, 2013] + * Last changed in libpng 1.6.8 [December 19, 2013] * Copyright (c) 1998-2013 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -14,7 +14,7 @@ #include "pngpriv.h" /* Generate a compiler error if there is an old png.h in the search path. */ -typedef png_libpng_version_1_6_6 Your_png_h_is_not_version_1_6_6; +typedef png_libpng_version_1_6_8 Your_png_h_is_not_version_1_6_8; /* Tells libpng that we have already handled the first "num_bytes" bytes * of the PNG file signature. If the PNG data is embedded into another @@ -201,6 +201,7 @@ png_user_version_check(png_structrp png_ptr, png_const_charp user_png_ver) pos = png_safecat(m, (sizeof m), pos, user_png_ver); pos = png_safecat(m, (sizeof m), pos, " but running with "); pos = png_safecat(m, (sizeof m), pos, png_libpng_ver); + PNG_UNUSED(pos) png_warning(png_ptr, m); #endif @@ -259,6 +260,10 @@ png_create_png_struct,(png_const_charp user_png_ver, png_voidp error_ptr, */ # ifdef PNG_USER_MEM_SUPPORTED png_set_mem_fn(&create_struct, mem_ptr, malloc_fn, free_fn); +# else + PNG_UNUSED(mem_ptr) + PNG_UNUSED(malloc_fn) + PNG_UNUSED(free_fn) # endif /* (*error_fn) can return control to the caller after the error_ptr is set, @@ -768,13 +773,13 @@ png_get_copyright(png_const_structrp png_ptr) #else # ifdef __STDC__ return PNG_STRING_NEWLINE \ - "libpng version 1.6.6 - September 16, 2013" PNG_STRING_NEWLINE \ + "libpng version 1.6.8 - December 19, 2013" PNG_STRING_NEWLINE \ "Copyright (c) 1998-2013 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \ "Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \ "Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \ PNG_STRING_NEWLINE; # else - return "libpng version 1.6.6 - September 16, 2013\ + return "libpng version 1.6.8 - December 19, 2013\ Copyright (c) 1998-2013 Glenn Randers-Pehrson\ Copyright (c) 1996-1997 Andreas Dilger\ Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc."; @@ -855,7 +860,8 @@ png_handle_as_unknown(png_const_structrp png_ptr, png_const_bytep chunk_name) return PNG_HANDLE_CHUNK_AS_DEFAULT; } -#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED +#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) ||\ + defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED) int /* PRIVATE */ png_chunk_unknown_handling(png_const_structrp png_ptr, png_uint_32 chunk_name) { @@ -864,7 +870,7 @@ png_chunk_unknown_handling(png_const_structrp png_ptr, png_uint_32 chunk_name) PNG_CSTRING_FROM_CHUNK(chunk_string, chunk_name); return png_handle_as_unknown(png_ptr, chunk_string); } -#endif /* HANDLE_AS_UNKNOWN */ +#endif /* READ_UNKNOWN_CHUNKS || HANDLE_AS_UNKNOWN */ #endif /* SET_UNKNOWN_CHUNKS */ #ifdef PNG_READ_SUPPORTED @@ -1721,6 +1727,7 @@ png_icc_profile_error(png_const_structrp png_ptr, png_colorspacerp colorspace, # endif /* The 'reason' is an arbitrary message, allow +79 maximum 195 */ pos = png_safecat(message, (sizeof message), pos, reason); + PNG_UNUSED(pos) /* This is recoverable, but make it unconditionally an app_error on write to * avoid writing invalid ICC profiles into PNG files. (I.e. we handle them @@ -3090,11 +3097,15 @@ png_fixed(png_const_structrp png_ptr, double fp, png_const_charp text) if (r > 2147483647. || r < -2147483648.) png_fixed_error(png_ptr, text); +# ifndef PNG_ERROR_TEXT_SUPPORTED + PNG_UNUSED(text) +# endif + return (png_fixed_point)r; } #endif -#if defined(PNG_READ_GAMMA_SUPPORTED) || \ +#if defined(PNG_GAMMA_SUPPORTED) || defined(PNG_COLORSPACE_SUPPORTED) ||\ defined(PNG_INCH_CONVERSIONS_SUPPORTED) || defined(PNG_READ_pHYs_SUPPORTED) /* muldiv functions */ /* This API takes signed arguments and rounds the result to the nearest @@ -3267,27 +3278,29 @@ png_gamma_significant(png_fixed_point gamma_val) #endif #ifdef PNG_READ_GAMMA_SUPPORTED +# ifdef PNG_16BIT_SUPPORTED /* A local convenience routine. */ static png_fixed_point png_product2(png_fixed_point a, png_fixed_point b) { /* The required result is 1/a * 1/b; the following preserves accuracy. */ -#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED +# ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED double r = a * 1E-5; r *= b; r = floor(r+.5); if (r <= 2147483647. && r >= -2147483648.) return (png_fixed_point)r; -#else +# else png_fixed_point res; if (png_muldiv(&res, a, b, 100000)) return res; -#endif +# endif return 0; /* overflow */ } +# endif /* 16BIT */ /* The inverse of the above. */ png_fixed_point @@ -3592,6 +3605,7 @@ png_exp8bit(png_fixed_point lg2) return (png_byte)((x + 0x7fffffU) >> 24); } +#ifdef PNG_16BIT_SUPPORTED static png_uint_16 png_exp16bit(png_fixed_point lg2) { @@ -3602,6 +3616,7 @@ png_exp16bit(png_fixed_point lg2) x -= x >> 16; return (png_uint_16)((x + 32767U) >> 16); } +#endif /* 16BIT */ #endif /* FLOATING_ARITHMETIC */ png_byte @@ -3627,6 +3642,7 @@ png_gamma_8bit_correct(unsigned int value, png_fixed_point gamma_val) return (png_byte)value; } +#ifdef PNG_16BIT_SUPPORTED png_uint_16 png_gamma_16bit_correct(unsigned int value, png_fixed_point gamma_val) { @@ -3649,6 +3665,7 @@ png_gamma_16bit_correct(unsigned int value, png_fixed_point gamma_val) return (png_uint_16)value; } +#endif /* 16BIT */ /* This does the right thing based on the bit_depth field of the * png_struct, interpreting values as 8-bit or 16-bit. While the result @@ -3662,10 +3679,16 @@ png_gamma_correct(png_structrp png_ptr, unsigned int value, if (png_ptr->bit_depth == 8) return png_gamma_8bit_correct(value, gamma_val); +#ifdef PNG_16BIT_SUPPORTED else return png_gamma_16bit_correct(value, gamma_val); +#else + /* should not reach this */ + return 0; +#endif /* 16BIT */ } +#ifdef PNG_16BIT_SUPPORTED /* Internal function to build a single 16-bit table - the table consists of * 'num' 256 entry subtables, where 'num' is determined by 'shift' - the amount * to shift the input values right (or 16-number_of_signifiant_bits). @@ -3804,6 +3827,7 @@ png_build_16to8_table(png_structrp png_ptr, png_uint_16pp *ptable, last++; } } +#endif /* 16BIT */ /* Build a single 8-bit table: same as the 16-bit case but much simpler (and * typically much faster). Note that libpng currently does no sBIT processing @@ -3832,6 +3856,7 @@ png_destroy_gamma_table(png_structrp png_ptr) png_free(png_ptr, png_ptr->gamma_table); png_ptr->gamma_table = NULL; +#ifdef PNG_16BIT_SUPPORTED if (png_ptr->gamma_16_table != NULL) { int i; @@ -3843,6 +3868,7 @@ png_destroy_gamma_table(png_structrp png_ptr) png_free(png_ptr, png_ptr->gamma_16_table); png_ptr->gamma_16_table = NULL; } +#endif /* 16BIT */ #if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \ @@ -3852,6 +3878,7 @@ png_destroy_gamma_table(png_structrp png_ptr) png_free(png_ptr, png_ptr->gamma_to_1); png_ptr->gamma_to_1 = NULL; +#ifdef PNG_16BIT_SUPPORTED if (png_ptr->gamma_16_from_1 != NULL) { int i; @@ -3874,6 +3901,7 @@ png_destroy_gamma_table(png_structrp png_ptr) png_free(png_ptr, png_ptr->gamma_16_to_1); png_ptr->gamma_16_to_1 = NULL; } +#endif /* 16BIT */ #endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */ } @@ -3919,6 +3947,7 @@ png_build_gamma_table(png_structrp png_ptr, int bit_depth) } #endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */ } +#ifdef PNG_16BIT_SUPPORTED else { png_byte shift, sig_bit; @@ -3975,24 +4004,20 @@ png_build_gamma_table(png_structrp png_ptr, int bit_depth) png_ptr->gamma_shift = shift; -#ifdef PNG_16BIT_SUPPORTED /* NOTE: prior to 1.5.4 this test used to include PNG_BACKGROUND (now * PNG_COMPOSE). This effectively smashed the background calculation for * 16-bit output because the 8-bit table assumes the result will be reduced * to 8 bits. */ if (png_ptr->transformations & (PNG_16_TO_8 | PNG_SCALE_16_TO_8)) -#endif png_build_16to8_table(png_ptr, &png_ptr->gamma_16_table, shift, png_ptr->screen_gamma > 0 ? png_product2(png_ptr->colorspace.gamma, png_ptr->screen_gamma) : PNG_FP_1); -#ifdef PNG_16BIT_SUPPORTED else png_build_16bit_table(png_ptr, &png_ptr->gamma_16_table, shift, png_ptr->screen_gamma > 0 ? png_reciprocal2(png_ptr->colorspace.gamma, png_ptr->screen_gamma) : PNG_FP_1); -#endif #if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \ @@ -4012,6 +4037,7 @@ png_build_gamma_table(png_structrp png_ptr, int bit_depth) } #endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */ } +#endif /* 16BIT */ } #endif /* READ_GAMMA */ @@ -1,7 +1,7 @@ /* png.h - header file for PNG reference library * - * libpng version 1.6.6 - September 16, 2013 + * libpng version 1.6.8 - December 19, 2013 * Copyright (c) 1998-2013 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -11,7 +11,7 @@ * Authors and maintainers: * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat * libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger - * libpng versions 0.97, January 1998, through 1.6.6 - September 16, 2013: Glenn + * libpng versions 0.97, January 1998, through 1.6.8 - December 19, 2013: Glenn * See also "Contributing Authors", below. * * Note about libpng version numbers: @@ -183,6 +183,12 @@ * 1.6.4 16 10604 16.so.16.4[.0] * 1.6.5 16 10605 16.so.16.5[.0] * 1.6.6 16 10606 16.so.16.6[.0] + * 1.6.7beta01-04 16 10607 16.so.16.7[.0] + * 1.6.7rc01-03 16 10607 16.so.16.7[.0] + * 1.6.7 16 10607 16.so.16.7[.0] + * 1.6.8beta01-02 16 10608 16.so.16.8[.0] + * 1.6.8rc01-02 16 10608 16.so.16.8[.0] + * 1.6.8 16 10608 16.so.16.8[.0] * * Henceforth the source version will match the shared-library major * and minor numbers; the shared-library major version number will be @@ -214,7 +220,7 @@ * * This code is released under the libpng license. * - * libpng versions 1.2.6, August 15, 2004, through 1.6.6, September 16, 2013, are + * libpng versions 1.2.6, August 15, 2004, through 1.6.8, December 19, 2013, are * Copyright (c) 2004, 2006-2013 Glenn Randers-Pehrson, and are * distributed according to the same disclaimer and license as libpng-1.2.5 * with the following individual added to the list of Contributing Authors: @@ -326,13 +332,13 @@ * Y2K compliance in libpng: * ========================= * - * September 16, 2013 + * December 19, 2013 * * Since the PNG Development group is an ad-hoc body, we can't make * an official declaration. * * This is your unofficial assurance that libpng from version 0.71 and - * upward through 1.6.6 are Y2K compliant. It is my belief that + * upward through 1.6.8 are Y2K compliant. It is my belief that * earlier versions were also Y2K compliant. * * Libpng only has two year fields. One is a 2-byte unsigned integer @@ -392,9 +398,9 @@ */ /* Version information for png.h - this should match the version in png.c */ -#define PNG_LIBPNG_VER_STRING "1.6.6" +#define PNG_LIBPNG_VER_STRING "1.6.8" #define PNG_HEADER_VERSION_STRING \ - " libpng version 1.6.6 - September 16, 2013\n" + " libpng version 1.6.8 - December 19, 2013\n" #define PNG_LIBPNG_VER_SONUM 16 #define PNG_LIBPNG_VER_DLLNUM 16 @@ -402,7 +408,7 @@ /* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */ #define PNG_LIBPNG_VER_MAJOR 1 #define PNG_LIBPNG_VER_MINOR 6 -#define PNG_LIBPNG_VER_RELEASE 6 +#define PNG_LIBPNG_VER_RELEASE 8 /* This should match the numeric part of the final component of * PNG_LIBPNG_VER_STRING, omitting any leading zero: @@ -433,7 +439,7 @@ * version 1.0.0 was mis-numbered 100 instead of 10000). From * version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release */ -#define PNG_LIBPNG_VER 10606 /* 1.6.6 */ +#define PNG_LIBPNG_VER 10608 /* 1.6.8 */ /* Library configuration: these options cannot be changed after * the library has been built. @@ -538,7 +544,7 @@ extern "C" { /* This triggers a compiler error in png.c, if png.c and png.h * do not agree upon the version number. */ -typedef char* png_libpng_version_1_6_6; +typedef char* png_libpng_version_1_6_8; /* Basic control structions. Read libpng-manual.txt or libpng.3 for more info. * @@ -720,7 +726,8 @@ typedef png_time * png_timep; typedef const png_time * png_const_timep; typedef png_time * * png_timepp; -#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED +#if defined(PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED) ||\ + defined(PNG_USER_CHUNKS_SUPPORTED) /* png_unknown_chunk is a structure to hold queued chunks for which there is * no specific support. The idea is that we can use this to queue * up private chunks for output even though the library doesn't actually @@ -1,7 +1,7 @@ /* pngconf.h - machine configurable file for libpng * - * libpng version 1.6.6 - September 16, 2013 + * libpng version 1.6.8 - December 19, 2013 * * Copyright (c) 1998-2013 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) diff --git a/pngcrush.c b/pngcrush.c index 0da00bcd3..1a3ff5dc0 100644 --- a/pngcrush.c +++ b/pngcrush.c @@ -80,7 +80,7 @@ * */ -#define PNGCRUSH_VERSION "1.7.68" +#define PNGCRUSH_VERSION "1.7.70" /* Experimental: define these if you wish, but, good luck. #define PNGCRUSH_COUNT_COLORS @@ -308,7 +308,10 @@ Change log: +Version 1.7.70 (built with libpng-1.6.8 and zlib-1.2.8) + Version 1.7.69 (built with libpng-1.6.6 and zlib-1.2.8) + Updated libpng to version 1.6.6. Version 1.7.68 (built with libpng-1.6.4 and zlib-1.2.8) Check for NULL return from malloc(). @@ -7747,9 +7750,9 @@ struct options_help pngcrush_options[] = { {2, ""}, #ifdef Z_RLE - {0, " -brute (use brute-force: try 138 different methods [11-148])"}, + {0, " -brute (use brute-force: try 148 different methods)"}, #else - {0, " -brute (use brute-force: try 126 different methods [11-136])"}, + {0, " -brute (use brute-force: try 136 different methods)"}, #endif {2, ""}, {2, " Very time-consuming and generally not worthwhile."}, diff --git a/pngcrush.h b/pngcrush.h index 7af2373bd..80cc11418 100644 --- a/pngcrush.h +++ b/pngcrush.h @@ -5,7 +5,7 @@ * license (see LICENSE, in pngcrush.c). */ -/* Special defines for pngcrush version 1.7.69 */ +/* Special defines for pngcrush version 1.7.70 */ #ifndef PNGCRUSH_H #define PNGCRUSH_H diff --git a/pngdebug.h b/pngdebug.h index 16f81fdd1..b43c59cde 100644 --- a/pngdebug.h +++ b/pngdebug.h @@ -1,11 +1,11 @@ /* pngdebug.h - Debugging macros for libpng, also used in pngtest.c * - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Copyright (c) 1998-2013 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * - * Last changed in libpng 1.5.0 [January 6, 2011] + * Last changed in libpng 1.6.8 [December 19, 2013] * * This code is released under the libpng license. * For conditions of distribution and use, see the disclaimer @@ -25,7 +25,7 @@ * (actually ((void)0)). * * level: level of detail of message, starting at 0. A level 'n' - * message is preceded by 'n' tab characters (not implemented + * message is preceded by 'n' 3-space indentations (not implemented * on Microsoft compilers unless PNG_DEBUG_FILE is also * defined, to allow debug DLL compilation with no standard IO). * message: a printf(3) style text string. A trailing '\n' is added @@ -77,32 +77,29 @@ # endif /* PNG_DEBUG_FILE */ # if (PNG_DEBUG > 1) -/* Note: ["%s"m PNG_STRING_NEWLINE] probably does not work on - * non-ISO compilers - */ # ifdef __STDC__ # ifndef png_debug # define png_debug(l,m) \ do { \ int num_tabs=l; \ - fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ - (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \ + fprintf(PNG_DEBUG_FILE,"%s" m PNG_STRING_NEWLINE,(num_tabs==1 ? " " : \ + (num_tabs==2 ? " " : (num_tabs>2 ? " " : "")))); \ } while (0) # endif # ifndef png_debug1 # define png_debug1(l,m,p1) \ do { \ int num_tabs=l; \ - fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ - (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \ + fprintf(PNG_DEBUG_FILE,"%s" m PNG_STRING_NEWLINE,(num_tabs==1 ? " " : \ + (num_tabs==2 ? " " : (num_tabs>2 ? " " : ""))),p1); \ } while (0) # endif # ifndef png_debug2 # define png_debug2(l,m,p1,p2) \ do { \ int num_tabs=l; \ - fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ - (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \ + fprintf(PNG_DEBUG_FILE,"%s" m PNG_STRING_NEWLINE,(num_tabs==1 ? " " : \ + (num_tabs==2 ? " " : (num_tabs>2 ? " " : ""))),p1,p2);\ } while (0) # endif # else /* __STDC __ */ diff --git a/pngerror.c b/pngerror.c index f469206ee..b46d28f19 100644 --- a/pngerror.c +++ b/pngerror.c @@ -1,7 +1,7 @@ /* pngerror.c - stub functions for i/o and memory allocation * - * Last changed in libpng 1.6.1 [March 28, 2013] + * Last changed in libpng 1.6.8 [December 19, 2013] * Copyright (c) 1998-2013 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -382,6 +382,10 @@ png_benign_error(png_const_structrp png_ptr, png_const_charp error_message) # endif png_error(png_ptr, error_message); } + +# ifndef PNG_ERROR_TEXT_SUPPORTED + PNG_UNUSED(error_message) +# endif } void /* PRIVATE */ @@ -391,6 +395,10 @@ png_app_warning(png_const_structrp png_ptr, png_const_charp error_message) png_warning(png_ptr, error_message); else png_error(png_ptr, error_message); + +# ifndef PNG_ERROR_TEXT_SUPPORTED + PNG_UNUSED(error_message) +# endif } void /* PRIVATE */ @@ -400,6 +408,10 @@ png_app_error(png_const_structrp png_ptr, png_const_charp error_message) png_warning(png_ptr, error_message); else png_error(png_ptr, error_message); + +# ifndef PNG_ERROR_TEXT_SUPPORTED + PNG_UNUSED(error_message) +# endif } #endif /* BENIGN_ERRORS */ @@ -416,7 +428,8 @@ static PNG_CONST char png_digit[16] = { }; #define PNG_MAX_ERROR_TEXT 196 /* Currently limited be profile_error in png.c */ -#if defined(PNG_WARNINGS_SUPPORTED) || defined(PNG_ERROR_TEXT_SUPPORTED) +#if defined(PNG_WARNINGS_SUPPORTED) || \ + (defined(PNG_READ_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED)) static void /* PRIVATE */ png_format_buffer(png_const_structrp png_ptr, png_charp buffer, png_const_charp error_message) @@ -506,6 +519,10 @@ png_chunk_benign_error(png_const_structrp png_ptr, png_const_charp else png_chunk_error(png_ptr, error_message); + +# ifndef PNG_ERROR_TEXT_SUPPORTED + PNG_UNUSED(error_message) +# endif } #endif #endif /* PNG_READ_SUPPORTED */ @@ -513,6 +530,10 @@ png_chunk_benign_error(png_const_structrp png_ptr, png_const_charp void /* PRIVATE */ png_chunk_report(png_const_structrp png_ptr, png_const_charp message, int error) { +# ifndef PNG_WARNINGS_SUPPORTED + PNG_UNUSED(message) +# endif + /* This is always supported, but for just read or just write it * unconditionally does the right thing. */ diff --git a/pnglibconf.h b/pnglibconf.h index e31ff3dec..cb0f133c4 100644 --- a/pnglibconf.h +++ b/pnglibconf.h @@ -1,8 +1,8 @@ -/* libpng 1.6.6 STANDARD API DEFINITION */ +/* libpng 1.6.8 STANDARD API DEFINITION */ /* pnglibconf.h - library build configuration */ -/* Libpng version 1.6.6 - September 16, 2013 */ +/* Libpng version 1.6.8 - December 19, 2013 */ /* Copyright (c) 1998-2013 Glenn Randers-Pehrson */ @@ -1,7 +1,7 @@ /* pngmem.c - stub functions for memory allocation * - * Last changed in libpng 1.6.0 [February 14, 2013] + * Last changed in libpng 1.6.8 [December 19, 2013] * Copyright (c) 1998-2013 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -73,9 +73,10 @@ png_malloc_base,(png_const_structrp png_ptr, png_alloc_size_t size), * to implement a user memory handler. This checks to be sure it isn't * called with big numbers. */ -#ifdef PNG_USER_MEM_SUPPORTED +#ifndef PNG_USER_MEM_SUPPORTED PNG_UNUSED(png_ptr) #endif + if (size > 0 && size <= PNG_SIZE_MAX # ifdef PNG_MAX_MALLOC_64K && size <= 65536U @@ -95,6 +96,8 @@ png_malloc_base,(png_const_structrp png_ptr, png_alloc_size_t size), return NULL; } +#if defined(PNG_TEXT_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) ||\ + defined(PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED) /* This is really here only to work round a spurious warning in GCC 4.6 and 4.7 * that arises because of the checks in png_realloc_array that are repeated in * png_malloc_array. @@ -156,6 +159,7 @@ png_realloc_array,(png_const_structrp png_ptr, png_const_voidp old_array, return NULL; /* error */ } +#endif /* TEXT || sPLT || STORE_UNKNOWN_CHUNKS */ /* Various functions that have different error handling are derived from this. * png_malloc always exists, but if PNG_USER_MEM_SUPPORTED is defined a separate diff --git a/pngpread.c b/pngpread.c index 0169ecb2c..94856e90f 100644 --- a/pngpread.c +++ b/pngpread.c @@ -1,7 +1,7 @@ /* pngpread.c - read a png file in push mode * - * Last changed in libpng 1.6.0 [February 14, 2013] + * Last changed in libpng 1.6.8 [December 19, 2013] * Copyright (c) 1998-2013 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -285,8 +285,8 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) if (chunk_name == png_PLTE) png_ptr->mode |= PNG_HAVE_PLTE; } - #endif + else if (chunk_name == png_PLTE) { if (png_ptr->push_length + 4 > png_ptr->buffer_size) @@ -528,8 +528,8 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) png_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); } - #endif + else { if (png_ptr->push_length + 4 > png_ptr->buffer_size) @@ -6,7 +6,7 @@ * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * - * Last changed in libpng 1.6.3 [July 18, 2013] + * Last changed in libpng 1.6.8 [December 19, 2013] * * This code is released under the libpng license. * For conditions of distribution and use, see the disclaimer @@ -112,9 +112,15 @@ * typically the target FPU. If the FPU has been set to NEON (-mfpu=neon * with GCC) then the compiler will define __ARM_NEON__ and we can rely * unconditionally on NEON instructions not crashing, otherwise we must - * disable use of NEON instructions: + * disable use of NEON instructions. + * + * NOTE: at present these optimizations depend on 'ALIGNED_MEMORY', so they + * can only be turned on automatically if that is supported too. If + * PNG_ARM_NEON_OPT is set in CPPFLAGS (to >0) then arm/arm_init.c will fail + * to compile with an appropriate #error if ALIGNED_MEMORY has been turned + * off. */ -# ifdef __ARM_NEON__ +# if defined(__ARM_NEON__) && defined(PNG_ALIGNED_MEMORY_SUPPORTED) # define PNG_ARM_NEON_OPT 2 # else # define PNG_ARM_NEON_OPT 0 @@ -126,7 +132,49 @@ * callbacks to do this. */ # define PNG_FILTER_OPTIMIZATIONS png_init_filter_functions_neon -#endif + + /* By default the 'intrinsics' code in arm/filter_neon_intrinsics.c is used + * if possible - if __ARM_NEON__ is set and the compiler version is not known + * to be broken. This is control by PNG_ARM_NEON_IMPLEMENTATION which can + * be: + * + * 1 The intrinsics code (the default with __ARM_NEON__) + * 2 The hand coded assembler (the default without __ARM_NEON__) + * + * It is possible to set PNG_ARM_NEON_IMPLEMENTATION in CPPFLAGS, however + * this is *NOT* supported and may cease to work even after a minor revision + * to libpng. It *is* valid to do this for testing purposes, e.g. speed + * testing or a new compiler, but the results should be communicated to the + * libpng implementation list for incorporation in the next minor release. + */ +# ifndef PNG_ARM_NEON_IMPLEMENTATION +# ifdef __ARM_NEON__ +# if defined(__clang__) + /* At present it is unknown by the libpng developers which versions + * of clang support the intrinsics, however some or perhaps all + * versions do not work with the assembler so this may be + * irrelevant, so just use the default (do nothing here.) + */ +# elif defined(__GNUC__) + /* GCC 4.5.4 NEON support is known to be broken. 4.6.3 is known to + * work, so if this *is* GCC, or G++, look for a version >4.5 + */ +# if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 6) +# define PNG_ARM_NEON_IMPLEMENTATION 2 +# endif /* no GNUC support */ +# endif /* __GNUC__ */ +# else /* !defined __ARM_NEON__ */ + /* The 'intrinsics' code simply won't compile without this -mfpu=neon: + */ +# define PNG_ARM_NEON_IMPLEMENTATION 2 +# endif /* __ARM_NEON__ */ +# endif /* !defined PNG_ARM_NEON_IMPLEMENTATION */ + +# ifndef PNG_ARM_NEON_IMPLEMENTATION + /* Use the intrinsics code by default. */ +# define PNG_ARM_NEON_IMPLEMENTATION 1 +# endif +#endif /* PNG_ARM_NEON_OPT > 0 */ /* Is this a build of a DLL where compilation of the object modules requires * different preprocessor settings to those required for a simple library? If @@ -1176,7 +1224,7 @@ PNG_INTERNAL_FUNCTION(void,png_read_finish_IDAT,(png_structrp png_ptr), PNG_INTERNAL_FUNCTION(void,png_read_finish_row,(png_structrp png_ptr), PNG_EMPTY); /* Finish a row while reading, dealing with interlacing passes, etc. */ -#endif +#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ /* Initialize the row buffers, etc. */ PNG_INTERNAL_FUNCTION(void,png_read_start_row,(png_structrp png_ptr),PNG_EMPTY); @@ -1422,7 +1470,6 @@ PNG_INTERNAL_FUNCTION(void,png_handle_zTXt,(png_structrp png_ptr, PNG_INTERNAL_FUNCTION(void,png_check_chunk_name,(png_structrp png_ptr, png_uint_32 chunk_name),PNG_EMPTY); -#ifdef PNG_READ_SUPPORTED PNG_INTERNAL_FUNCTION(void,png_handle_unknown,(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length, int keep),PNG_EMPTY); /* This is the function that gets called for unknown chunks. The 'keep' @@ -1431,14 +1478,14 @@ PNG_INTERNAL_FUNCTION(void,png_handle_unknown,(png_structrp png_ptr, * just skips the chunk or errors out if it is critical. */ -#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED +#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) ||\ + defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED) PNG_INTERNAL_FUNCTION(int,png_chunk_unknown_handling, (png_const_structrp png_ptr, png_uint_32 chunk_name),PNG_EMPTY); /* Exactly as the API png_handle_as_unknown() except that the argument is a * 32-bit chunk name, not a string. */ -#endif /* PNG_HANDLE_AS_UNKNOWN_SUPPORTED */ -#endif /* PNG_READ_SUPPORTED */ +#endif /* READ_UNKNOWN_CHUNKS || HANDLE_AS_UNKNOWN */ /* Handle the transformations for reading and writing */ #ifdef PNG_READ_TRANSFORMS_SUPPORTED @@ -1857,7 +1904,7 @@ PNG_INTERNAL_FUNCTION(int,png_check_fp_string,(png_const_charp string, png_size_t size),PNG_EMPTY); #endif /* pCAL || sCAL */ -#if defined(PNG_READ_GAMMA_SUPPORTED) ||\ +#if defined(PNG_GAMMA_SUPPORTED) ||\ defined(PNG_INCH_CONVERSIONS_SUPPORTED) || defined(PNG_READ_pHYs_SUPPORTED) /* Added at libpng version 1.5.0 */ /* This is a utility to provide a*times/div (rounded) and indicate @@ -1,7 +1,7 @@ /* pngread.c - read a PNG file * - * Last changed in libpng 1.6.1 [March 28, 2013] + * Last changed in libpng 1.6.8 [December 19, 2013] * Copyright (c) 1998-2013 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -1125,12 +1125,11 @@ png_read_png(png_structrp png_ptr, png_inforp info_ptr, /* Arguments to png_image_finish_read: */ /* Encoding of PNG data (used by the color-map code) */ -/* TODO: change these, dang, ANSI-C reserves the 'E' namespace. */ -# define E_NOTSET 0 /* File encoding not yet known */ -# define E_sRGB 1 /* 8-bit encoded to sRGB gamma */ -# define E_LINEAR 2 /* 16-bit linear: not encoded, NOT pre-multiplied! */ -# define E_FILE 3 /* 8-bit encoded to file gamma, not sRGB or linear */ -# define E_LINEAR8 4 /* 8-bit linear: only from a file value */ +# define P_NOTSET 0 /* File encoding not yet known */ +# define P_sRGB 1 /* 8-bit encoded to sRGB gamma */ +# define P_LINEAR 2 /* 16-bit linear: not encoded, NOT pre-multiplied! */ +# define P_FILE 3 /* 8-bit encoded to file gamma, not sRGB or linear */ +# define P_LINEAR8 4 /* 8-bit linear: only from a file value */ /* Color-map processing: after libpng has run on the PNG image further * processing may be needed to conver the data to color-map indicies. @@ -1161,7 +1160,7 @@ typedef struct png_voidp first_row; ptrdiff_t row_bytes; /* step between rows */ int file_encoding; /* E_ values above */ - png_fixed_point gamma_to_linear; /* For E_FILE, reciprocal of gamma */ + png_fixed_point gamma_to_linear; /* For P_FILE, reciprocal of gamma */ int colormap_processing; /* PNG_CMAP_ values above */ } png_image_read_control; @@ -1293,7 +1292,7 @@ png_image_read_header(png_voidp argument) #ifdef PNG_COLORSPACE_SUPPORTED /* Does the colorspace match sRGB? If there is no color endpoint * (colorant) information assume yes, otherwise require the - * 'ENDPOINTS_MATCHE_sRGB' colorspace flag to have been set. If the + * 'ENDPOINTS_MATCHP_sRGB' colorspace flag to have been set. If the * colorspace has been determined to be invalid ignore it. */ if ((format & PNG_FORMAT_FLAG_COLOR) != 0 && ((png_ptr->colorspace.flags @@ -1482,17 +1481,24 @@ png_image_skip_unused_chunks(png_structrp png_ptr) * * Or image data handling: * - * tRNS, bKGD, gAMA, cHRM, sRGB, iCCP and sBIT. + * tRNS, bKGD, gAMA, cHRM, sRGB, [iCCP] and sBIT. * * This provides a small performance improvement and eliminates any * potential vulnerability to security problems in the unused chunks. + * + * At present the iCCP chunk data isn't used, so iCCP chunk can be ignored + * too. This allows the simplified API to be compiled without iCCP support, + * however if the support is there the chunk is still checked to detect + * errors (which are unfortunately quite common.) */ { static PNG_CONST png_byte chunks_to_process[] = { 98, 75, 71, 68, '\0', /* bKGD */ 99, 72, 82, 77, '\0', /* cHRM */ 103, 65, 77, 65, '\0', /* gAMA */ +# ifdef PNG_READ_iCCP_SUPPORTED 105, 67, 67, 80, '\0', /* iCCP */ +# endif 115, 66, 73, 84, '\0', /* sBIT */ 115, 82, 71, 66, '\0', /* sRGB */ }; @@ -1529,25 +1535,25 @@ set_file_encoding(png_image_read_control *display) { if (png_gamma_not_sRGB(g)) { - display->file_encoding = E_FILE; + display->file_encoding = P_FILE; display->gamma_to_linear = png_reciprocal(g); } else - display->file_encoding = E_sRGB; + display->file_encoding = P_sRGB; } else - display->file_encoding = E_LINEAR8; + display->file_encoding = P_LINEAR8; } static unsigned int decode_gamma(png_image_read_control *display, png_uint_32 value, int encoding) { - if (encoding == E_FILE) /* double check */ + if (encoding == P_FILE) /* double check */ encoding = display->file_encoding; - if (encoding == E_NOTSET) /* must be the file encoding */ + if (encoding == P_NOTSET) /* must be the file encoding */ { set_file_encoding(display); encoding = display->file_encoding; @@ -1555,18 +1561,18 @@ decode_gamma(png_image_read_control *display, png_uint_32 value, int encoding) switch (encoding) { - case E_FILE: + case P_FILE: value = png_gamma_16bit_correct(value*257, display->gamma_to_linear); break; - case E_sRGB: + case P_sRGB: value = png_sRGB_table[value]; break; - case E_LINEAR: + case P_LINEAR: break; - case E_LINEAR8: + case P_LINEAR8: value *= 257; break; @@ -1585,9 +1591,9 @@ png_colormap_compose(png_image_read_control *display, png_uint_32 background, int encoding) { /* The file value is composed on the background, the background has the given - * encoding and so does the result, the file is encoded with E_FILE and the + * encoding and so does the result, the file is encoded with P_FILE and the * file and alpha are 8-bit values. The (output) encoding will always be - * E_LINEAR or E_sRGB. + * P_LINEAR or P_sRGB. */ png_uint_32 f = decode_gamma(display, foreground, foreground_encoding); png_uint_32 b = decode_gamma(display, background, encoding); @@ -1597,7 +1603,7 @@ png_colormap_compose(png_image_read_control *display, */ f = f * alpha + b * (255-alpha); - if (encoding == E_LINEAR) + if (encoding == P_LINEAR) { /* Scale to 65535; divide by 255, approximately (in fact this is extremely * accurate, it divides by 255.00000005937181414556, with no overflow.) @@ -1607,13 +1613,13 @@ png_colormap_compose(png_image_read_control *display, f = (f+32768) >> 16; } - else /* E_sRGB */ + else /* P_sRGB */ f = PNG_sRGB_FROM_LINEAR(f); return f; } -/* NOTE: E_LINEAR values to this routine must be 16-bit, but E_FILE values must +/* NOTE: P_LINEAR values to this routine must be 16-bit, but P_FILE values must * be 8-bit. */ static void @@ -1623,7 +1629,7 @@ png_create_colormap_entry(png_image_read_control *display, { png_imagep image = display->image; const int output_encoding = (image->format & PNG_FORMAT_FLAG_LINEAR) ? - E_LINEAR : E_sRGB; + P_LINEAR : P_sRGB; const int convert_to_Y = (image->format & PNG_FORMAT_FLAG_COLOR) == 0 && (red != green || green != blue); @@ -1633,18 +1639,18 @@ png_create_colormap_entry(png_image_read_control *display, /* Update the cache with whether the file gamma is significantly different * from sRGB. */ - if (encoding == E_FILE) + if (encoding == P_FILE) { - if (display->file_encoding == E_NOTSET) + if (display->file_encoding == P_NOTSET) set_file_encoding(display); - /* Note that the cached value may be E_FILE too, but if it is then the + /* Note that the cached value may be P_FILE too, but if it is then the * gamma_to_linear member has been set. */ encoding = display->file_encoding; } - if (encoding == E_FILE) + if (encoding == P_FILE) { png_fixed_point g = display->gamma_to_linear; @@ -1652,10 +1658,10 @@ png_create_colormap_entry(png_image_read_control *display, green = png_gamma_16bit_correct(green*257, g); blue = png_gamma_16bit_correct(blue*257, g); - if (convert_to_Y || output_encoding == E_LINEAR) + if (convert_to_Y || output_encoding == P_LINEAR) { alpha *= 257; - encoding = E_LINEAR; + encoding = P_LINEAR; } else @@ -1663,11 +1669,11 @@ png_create_colormap_entry(png_image_read_control *display, red = PNG_sRGB_FROM_LINEAR(red * 255); green = PNG_sRGB_FROM_LINEAR(green * 255); blue = PNG_sRGB_FROM_LINEAR(blue * 255); - encoding = E_sRGB; + encoding = P_sRGB; } } - else if (encoding == E_LINEAR8) + else if (encoding == P_LINEAR8) { /* This encoding occurs quite frequently in test cases because PngSuite * includes a gAMA 1.0 chunk with most images. @@ -1676,10 +1682,10 @@ png_create_colormap_entry(png_image_read_control *display, green *= 257; blue *= 257; alpha *= 257; - encoding = E_LINEAR; + encoding = P_LINEAR; } - else if (encoding == E_sRGB && (convert_to_Y || output_encoding == E_LINEAR)) + else if (encoding == P_sRGB && (convert_to_Y || output_encoding == P_LINEAR)) { /* The values are 8-bit sRGB values, but must be converted to 16-bit * linear. @@ -1688,11 +1694,11 @@ png_create_colormap_entry(png_image_read_control *display, green = png_sRGB_table[green]; blue = png_sRGB_table[blue]; alpha *= 257; - encoding = E_LINEAR; + encoding = P_LINEAR; } /* This is set if the color isn't gray but the output is. */ - if (encoding == E_LINEAR) + if (encoding == P_LINEAR) { if (convert_to_Y) { @@ -1700,7 +1706,7 @@ png_create_colormap_entry(png_image_read_control *display, png_uint_32 y = (png_uint_32)6968 * red + (png_uint_32)23434 * green + (png_uint_32)2366 * blue; - if (output_encoding == E_LINEAR) + if (output_encoding == P_LINEAR) y = (y + 16384) >> 15; else @@ -1709,19 +1715,19 @@ png_create_colormap_entry(png_image_read_control *display, y = (y + 128) >> 8; y *= 255; y = PNG_sRGB_FROM_LINEAR((y + 64) >> 7); - encoding = E_sRGB; + encoding = P_sRGB; } blue = red = green = y; } - else if (output_encoding == E_sRGB) + else if (output_encoding == P_sRGB) { red = PNG_sRGB_FROM_LINEAR(red * 255); green = PNG_sRGB_FROM_LINEAR(green * 255); blue = PNG_sRGB_FROM_LINEAR(blue * 255); alpha = PNG_DIV257(alpha); - encoding = E_sRGB; + encoding = P_sRGB; } } @@ -1730,7 +1736,7 @@ png_create_colormap_entry(png_image_read_control *display, /* Store the value. */ { -# ifdef PNG_FORMAT_BGR_SUPPORTED +# ifdef PNG_FORMAT_AFIRST_SUPPORTED const int afirst = (image->format & PNG_FORMAT_FLAG_AFIRST) != 0 && (image->format & PNG_FORMAT_FLAG_ALPHA) != 0; # else @@ -1742,7 +1748,7 @@ png_create_colormap_entry(png_image_read_control *display, # define bgr 0 # endif - if (output_encoding == E_LINEAR) + if (output_encoding == P_LINEAR) { png_uint_16p entry = png_voidcast(png_uint_16p, display->colormap); @@ -1797,7 +1803,7 @@ png_create_colormap_entry(png_image_read_control *display, } } - else /* output encoding is E_sRGB */ + else /* output encoding is P_sRGB */ { png_bytep entry = png_voidcast(png_bytep, display->colormap); @@ -1839,7 +1845,7 @@ make_gray_file_colormap(png_image_read_control *display) unsigned int i; for (i=0; i<256; ++i) - png_create_colormap_entry(display, i, i, i, i, 255, E_FILE); + png_create_colormap_entry(display, i, i, i, i, 255, P_FILE); return i; } @@ -1850,7 +1856,7 @@ make_gray_colormap(png_image_read_control *display) unsigned int i; for (i=0; i<256; ++i) - png_create_colormap_entry(display, i, i, i, i, 255, E_sRGB); + png_create_colormap_entry(display, i, i, i, i, 255, P_sRGB); return i; } @@ -1889,13 +1895,13 @@ make_ga_colormap(png_image_read_control *display) while (i < 231) { unsigned int gray = (i * 256 + 115) / 231; - png_create_colormap_entry(display, i++, gray, gray, gray, 255, E_sRGB); + png_create_colormap_entry(display, i++, gray, gray, gray, 255, P_sRGB); } /* 255 is used here for the component values for consistency with the code * that undoes premultiplication in pngwrite.c. */ - png_create_colormap_entry(display, i++, 255, 255, 255, 0, E_sRGB); + png_create_colormap_entry(display, i++, 255, 255, 255, 0, P_sRGB); for (a=1; a<5; ++a) { @@ -1903,7 +1909,7 @@ make_ga_colormap(png_image_read_control *display) for (g=0; g<6; ++g) png_create_colormap_entry(display, i++, g*51, g*51, g*51, a*51, - E_sRGB); + P_sRGB); } return i; @@ -1927,7 +1933,7 @@ make_rgb_colormap(png_image_read_control *display) for (b=0; b<6; ++b) png_create_colormap_entry(display, i++, r*51, g*51, b*51, 255, - E_sRGB); + P_sRGB); } } @@ -1950,11 +1956,11 @@ png_image_read_colormap(png_voidp argument) const png_structrp png_ptr = image->opaque->png_ptr; const png_uint_32 output_format = image->format; const int output_encoding = (output_format & PNG_FORMAT_FLAG_LINEAR) ? - E_LINEAR : E_sRGB; + P_LINEAR : P_sRGB; unsigned int cmap_entries; unsigned int output_processing; /* Output processing option */ - unsigned int data_encoding = E_NOTSET; /* Encoding libpng must produce */ + unsigned int data_encoding = P_NOTSET; /* Encoding libpng must produce */ /* Background information; the background color and the index of this color * in the color-map if it exists (else 256). @@ -1974,7 +1980,7 @@ png_image_read_colormap(png_voidp argument) png_ptr->num_trans > 0) /* alpha in input */ && ((output_format & PNG_FORMAT_FLAG_ALPHA) == 0) /* no alpha in output */) { - if (output_encoding == E_LINEAR) /* compose on black */ + if (output_encoding == P_LINEAR) /* compose on black */ back_b = back_g = back_r = 0; else if (display->background == NULL /* no way to remove it */) @@ -1998,7 +2004,7 @@ png_image_read_colormap(png_voidp argument) } } - else if (output_encoding == E_LINEAR) + else if (output_encoding == P_LINEAR) back_b = back_r = back_g = 65535; else @@ -2056,7 +2062,7 @@ png_image_read_colormap(png_voidp argument) trans = png_ptr->trans_color.gray; if ((output_format & PNG_FORMAT_FLAG_ALPHA) == 0) - back_alpha = output_encoding == E_LINEAR ? 65535 : 255; + back_alpha = output_encoding == P_LINEAR ? 65535 : 255; } /* png_create_colormap_entry just takes an RGBA and writes the @@ -2074,7 +2080,7 @@ png_image_read_colormap(png_voidp argument) */ if (i != trans) png_create_colormap_entry(display, i, val, val, val, 255, - E_FILE/*8-bit with file gamma*/); + P_FILE/*8-bit with file gamma*/); /* Else this entry is transparent. The colors don't matter if * there is an alpha channel (back_alpha == 0), but it does no @@ -2090,7 +2096,7 @@ png_image_read_colormap(png_voidp argument) } /* We need libpng to preserve the original encoding. */ - data_encoding = E_FILE; + data_encoding = P_FILE; /* The rows from libpng, while technically gray values, are now also * color-map indicies; however, they may need to be expanded to 1 @@ -2119,7 +2125,7 @@ png_image_read_colormap(png_voidp argument) * ensuring that the corresponding gray level matches the background * color exactly. */ - data_encoding = E_sRGB; + data_encoding = P_sRGB; if (PNG_GRAY_COLORMAP_ENTRIES > image->colormap_entries) png_error(png_ptr, "gray[16] color-map: too few entries"); @@ -2143,7 +2149,7 @@ png_image_read_colormap(png_voidp argument) png_color_16 c; png_uint_32 gray = back_g; - if (output_encoding == E_LINEAR) + if (output_encoding == P_LINEAR) { gray = PNG_sRGB_FROM_LINEAR(gray * 255); @@ -2151,7 +2157,7 @@ png_image_read_colormap(png_voidp argument) * matches. */ png_create_colormap_entry(display, gray, back_g, back_g, - back_g, 65535, E_LINEAR); + back_g, 65535, P_LINEAR); } /* The background passed to libpng, however, must be the @@ -2172,7 +2178,7 @@ png_image_read_colormap(png_voidp argument) break; } - back_alpha = output_encoding == E_LINEAR ? 65535 : 255; + back_alpha = output_encoding == P_LINEAR ? 65535 : 255; } /* output_processing means that the libpng-processed row will be @@ -2209,7 +2215,7 @@ png_image_read_colormap(png_voidp argument) * worry about tRNS matching - tRNS is ignored if there is an alpha * channel. */ - data_encoding = E_sRGB; + data_encoding = P_sRGB; if (output_format & PNG_FORMAT_FLAG_ALPHA) { @@ -2252,13 +2258,13 @@ png_image_read_colormap(png_voidp argument) cmap_entries = make_gray_colormap(display); - if (output_encoding == E_LINEAR) + if (output_encoding == P_LINEAR) { gray = PNG_sRGB_FROM_LINEAR(gray * 255); /* And make sure the corresponding palette entry matches. */ png_create_colormap_entry(display, gray, back_g, back_g, - back_g, 65535, E_LINEAR); + back_g, 65535, P_LINEAR); } /* The background passed to libpng, however, must be the sRGB @@ -2289,7 +2295,7 @@ png_image_read_colormap(png_voidp argument) { png_uint_32 gray = (i * 256 + 115) / 231; png_create_colormap_entry(display, i++, gray, gray, gray, - 255, E_sRGB); + 255, P_sRGB); } /* NOTE: this preserves the full precision of the application @@ -2297,7 +2303,7 @@ png_image_read_colormap(png_voidp argument) */ background_index = i; png_create_colormap_entry(display, i++, back_r, back_g, back_b, - output_encoding == E_LINEAR ? 65535U : 255U, output_encoding); + output_encoding == P_LINEAR ? 65535U : 255U, output_encoding); /* For non-opaque input composite on the sRGB background - this * requires inverting the encoding for each component. The input @@ -2307,7 +2313,7 @@ png_image_read_colormap(png_voidp argument) * represents. Consequently 'G' is always sRGB encoded, while * 'A' is linear. We need the linear background colors. */ - if (output_encoding == E_sRGB) /* else already linear */ + if (output_encoding == P_sRGB) /* else already linear */ { /* This may produce a value not exactly matching the * background, but that's ok because these numbers are only @@ -2337,7 +2343,7 @@ png_image_read_colormap(png_voidp argument) png_create_colormap_entry(display, i++, PNG_sRGB_FROM_LINEAR(gray + back_rx), PNG_sRGB_FROM_LINEAR(gray + back_gx), - PNG_sRGB_FROM_LINEAR(gray + back_bx), 255, E_sRGB); + PNG_sRGB_FROM_LINEAR(gray + back_bx), 255, P_sRGB); } } @@ -2364,7 +2370,7 @@ png_image_read_colormap(png_voidp argument) */ png_set_rgb_to_gray_fixed(png_ptr, PNG_ERROR_ACTION_NONE, -1, -1); - data_encoding = E_sRGB; + data_encoding = P_sRGB; /* The output will now be one or two 8-bit gray or gray+alpha * channels. The more complex case arises when the input has alpha. @@ -2409,7 +2415,7 @@ png_image_read_colormap(png_voidp argument) png_gamma_not_sRGB(png_ptr->colorspace.gamma)) { cmap_entries = make_gray_file_colormap(display); - data_encoding = E_FILE; + data_encoding = P_FILE; } else @@ -2428,18 +2434,18 @@ png_image_read_colormap(png_voidp argument) * it. Achieve this simply by ensuring that the entry * selected for the background really is the background color. */ - if (data_encoding == E_FILE) /* from the fixup above */ + if (data_encoding == P_FILE) /* from the fixup above */ { /* The app supplied a gray which is in output_encoding, we - * need to convert it to a value of the input (E_FILE) + * need to convert it to a value of the input (P_FILE) * encoding then set this palette entry to the required * output encoding. */ - if (output_encoding == E_sRGB) - gray = png_sRGB_table[gray]; /* now E_LINEAR */ + if (output_encoding == P_sRGB) + gray = png_sRGB_table[gray]; /* now P_LINEAR */ gray = PNG_DIV257(png_gamma_16bit_correct(gray, - png_ptr->colorspace.gamma)); /* now E_FILE */ + png_ptr->colorspace.gamma)); /* now P_FILE */ /* And make sure the corresponding palette entry contains * exactly the required sRGB value. @@ -2448,14 +2454,14 @@ png_image_read_colormap(png_voidp argument) back_g, 0/*unused*/, output_encoding); } - else if (output_encoding == E_LINEAR) + else if (output_encoding == P_LINEAR) { gray = PNG_sRGB_FROM_LINEAR(gray * 255); /* And make sure the corresponding palette entry matches. */ png_create_colormap_entry(display, gray, back_g, back_g, - back_g, 0/*unused*/, E_LINEAR); + back_g, 0/*unused*/, P_LINEAR); } /* The background passed to libpng, however, must be the @@ -2485,7 +2491,7 @@ png_image_read_colormap(png_voidp argument) * to do it once and using PNG_DIV51 on the 6x6x6 reduced RGB cube. * Consequently we always want libpng to produce sRGB data. */ - data_encoding = E_sRGB; + data_encoding = P_sRGB; /* Is there any transparency or alpha? */ if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA || @@ -2505,7 +2511,7 @@ png_image_read_colormap(png_voidp argument) /* Add a transparent entry. */ png_create_colormap_entry(display, cmap_entries, 255, 255, - 255, 0, E_sRGB); + 255, 0, P_sRGB); /* This is stored as the background index for the processing * algorithm. @@ -2526,7 +2532,7 @@ png_image_read_colormap(png_voidp argument) */ for (b=0; b<256; b = (b << 1) | 0x7f) png_create_colormap_entry(display, cmap_entries++, - r, g, b, 128, E_sRGB); + r, g, b, 128, P_sRGB); } } @@ -2555,7 +2561,7 @@ png_image_read_colormap(png_voidp argument) png_create_colormap_entry(display, cmap_entries, back_r, back_g, back_b, 0/*unused*/, output_encoding); - if (output_encoding == E_LINEAR) + if (output_encoding == P_LINEAR) { r = PNG_sRGB_FROM_LINEAR(back_r * 255); g = PNG_sRGB_FROM_LINEAR(back_g * 255); @@ -2595,11 +2601,11 @@ png_image_read_colormap(png_voidp argument) */ for (b=0; b<256; b = (b << 1) | 0x7f) png_create_colormap_entry(display, cmap_entries++, - png_colormap_compose(display, r, E_sRGB, 128, + png_colormap_compose(display, r, P_sRGB, 128, back_r, output_encoding), - png_colormap_compose(display, g, E_sRGB, 128, + png_colormap_compose(display, g, P_sRGB, 128, back_g, output_encoding), - png_colormap_compose(display, b, E_sRGB, 128, + png_colormap_compose(display, b, P_sRGB, 128, back_b, output_encoding), 0/*unused*/, output_encoding); } @@ -2658,7 +2664,7 @@ png_image_read_colormap(png_voidp argument) num_trans = 0; output_processing = PNG_CMAP_NONE; - data_encoding = E_FILE; /* Don't change from color-map indicies */ + data_encoding = P_FILE; /* Don't change from color-map indicies */ cmap_entries = png_ptr->num_palette; if (cmap_entries > 256) cmap_entries = 256; @@ -2680,13 +2686,13 @@ png_image_read_colormap(png_voidp argument) * on the sRGB color in 'back'. */ png_create_colormap_entry(display, i, - png_colormap_compose(display, colormap[i].red, E_FILE, + png_colormap_compose(display, colormap[i].red, P_FILE, trans[i], back_r, output_encoding), - png_colormap_compose(display, colormap[i].green, E_FILE, + png_colormap_compose(display, colormap[i].green, P_FILE, trans[i], back_g, output_encoding), - png_colormap_compose(display, colormap[i].blue, E_FILE, + png_colormap_compose(display, colormap[i].blue, P_FILE, trans[i], back_b, output_encoding), - output_encoding == E_LINEAR ? trans[i] * 257U : + output_encoding == P_LINEAR ? trans[i] * 257U : trans[i], output_encoding); } @@ -2695,7 +2701,7 @@ png_image_read_colormap(png_voidp argument) else png_create_colormap_entry(display, i, colormap[i].red, colormap[i].green, colormap[i].blue, - i < num_trans ? trans[i] : 255U, E_FILE/*8-bit*/); + i < num_trans ? trans[i] : 255U, P_FILE/*8-bit*/); } /* The PNG data may have indicies packed in fewer than 8 bits, it @@ -2723,12 +2729,12 @@ png_image_read_colormap(png_voidp argument) png_error(png_ptr, "bad data option (internal error)"); break; - case E_sRGB: + case P_sRGB: /* Change to 8-bit sRGB */ png_set_alpha_mode_fixed(png_ptr, PNG_ALPHA_PNG, PNG_GAMMA_sRGB); /* FALL THROUGH */ - case E_FILE: + case P_FILE: if (png_ptr->bit_depth > 8) png_set_scale_16(png_ptr); break; @@ -2805,7 +2811,6 @@ png_image_read_and_map(png_voidp argument) break; default: - passes = 0; png_error(png_ptr, "unknown interlace type"); } @@ -3124,7 +3129,6 @@ png_image_read_composite(png_voidp argument) break; default: - passes = 0; png_error(png_ptr, "unknown interlace type"); } @@ -3273,11 +3277,15 @@ png_image_read_background(png_voidp argument) break; default: - passes = 0; png_error(png_ptr, "unknown interlace type"); } - switch (png_get_bit_depth(png_ptr, info_ptr)) + /* Use direct access to info_ptr here because otherwise the simplified API + * would require PNG_EASY_ACCESS_SUPPORTED (just for this.) Note this is + * checking the value after libpng expansions, not the original value in the + * PNG. + */ + switch (info_ptr->bit_depth) { default: png_error(png_ptr, "unexpected bit depth"); @@ -3425,8 +3433,10 @@ png_image_read_background(png_voidp argument) unsigned int outchannels = 1+preserve_alpha; int swap_alpha = 0; - if (preserve_alpha && (image->format & PNG_FORMAT_FLAG_AFIRST)) - swap_alpha = 1; +# ifdef PNG_SIMPLIFIED_READ_AFIRST_SUPPORTED + if (preserve_alpha && (image->format & PNG_FORMAT_FLAG_AFIRST)) + swap_alpha = 1; +# endif for (pass = 0; pass < passes; ++pass) { diff --git a/pngrtran.c b/pngrtran.c index 5c6bbd316..d67e25d9d 100644 --- a/pngrtran.c +++ b/pngrtran.c @@ -1,7 +1,7 @@ /* pngrtran.c - transforms the data in a row for PNG readers * - * Last changed in libpng 1.6.4 [September 16, 2013] + * Last changed in libpng 1.6.8 [December 19, 2013] * Copyright (c) 1998-2013 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -1942,6 +1942,9 @@ png_read_transform_info(png_structrp png_ptr, png_inforp info_ptr) info_ptr->bit_depth = 8; info_ptr->num_trans = 0; + + if (png_ptr->palette == NULL) + png_error (png_ptr, "Palette is NULL in indexed image"); } else { diff --git a/pngrutil.c b/pngrutil.c index a0d324f5a..062f287ed 100644 --- a/pngrutil.c +++ b/pngrutil.c @@ -1,7 +1,7 @@ /* pngrutil.c - utilities to read a PNG file * - * Last changed in libpng 1.6.4 [September 16, 2013] + * Last changed in libpng 1.6.8 [December 19, 2013] * Copyright (c) 1998-2013 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -278,6 +278,10 @@ png_crc_error(png_structrp png_ptr) return (0); } +#if defined(PNG_READ_iCCP_SUPPORTED) || defined(PNG_READ_iTXt_SUPPORTED) ||\ + defined(PNG_READ_pCAL_SUPPORTED) || defined(PNG_READ_sCAL_SUPPORTED) ||\ + defined(PNG_READ_sPLT_SUPPORTED) || defined(PNG_READ_tEXt_SUPPORTED) ||\ + defined(PNG_READ_zTXt_SUPPORTED) || defined(PNG_SEQUENTIAL_READ_SUPPORTED) /* Manage the read buffer; this simply reallocates the buffer if it is not small * enough (or if it is not allocated). The routine returns a pointer to the * buffer; if an error occurs and 'warn' is set the routine returns NULL, else @@ -325,6 +329,7 @@ png_read_buffer(png_structrp png_ptr, png_alloc_size_t new_size, int warn) return buffer; } +#endif /* PNG_READ_iCCP|iTXt|pCAL|sCAL|sPLT|tEXt|zTXt|SEQUENTIAL_READ */ /* png_inflate_claim: claim the zstream for some nefarious purpose that involves * decompression. Returns Z_OK on success, else a zlib error code. It checks @@ -2764,6 +2769,7 @@ png_handle_unknown(png_structrp png_ptr, png_inforp info_ptr, png_debug(1, "in png_handle_unknown"); +#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED /* NOTE: this code is based on the code in libpng-1.4.12 except for fixing * the bug which meant that setting a non-default behavior for a specific * chunk would be ignored (the default was always used unless a user @@ -2775,15 +2781,16 @@ png_handle_unknown(png_structrp png_ptr, png_inforp info_ptr, * This is just an optimization to avoid multiple calls to the lookup * function. */ -# ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED - keep = png_chunk_unknown_handling(png_ptr, png_ptr->chunk_name); +# ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED +# ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED + keep = png_chunk_unknown_handling(png_ptr, png_ptr->chunk_name); +# endif # endif /* One of the following methods will read the chunk or skip it (at least one * of these is always defined because this is the only way to switch on * PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) */ -#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED # ifdef PNG_READ_USER_CHUNKS_SUPPORTED /* The user callback takes precedence over the chunk keep value, but the * keep value is still required to validate a save of a critical chunk. @@ -2891,7 +2898,7 @@ png_handle_unknown(png_structrp png_ptr, png_inforp info_ptr, png_crc_finish(png_ptr, length); } -# endif /* PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED */ +# endif # ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED /* Now store the chunk in the chunk list if appropriate, and if the limits @@ -2930,9 +2937,8 @@ png_handle_unknown(png_structrp png_ptr, png_inforp info_ptr, } # endif } -# else /* no store support! */ +# else /* no store support: the chunk must be handled by the user callback */ PNG_UNUSED(info_ptr) -# error untested code (reading unknown chunks with no store support) # endif /* Regardless of the error handling below the cached data (if any) can be @@ -3870,7 +3876,6 @@ png_read_filter_row_paeth_multibyte_pixel(png_row_infop row_info, png_bytep row, if (pb < pa) pa = pb, a = b; if (pc < pa) a = c; - c = b; a += *row; *row++ = (png_byte)a; } @@ -1,7 +1,7 @@ /* pngset.c - storage of image information into info struct * - * Last changed in libpng 1.6.3 [July 18, 2013] + * Last changed in libpng 1.6.8 [December 19, 2013] * Copyright (c) 1998-2013 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -527,7 +527,7 @@ png_set_PLTE(png_structrp png_ptr, png_inforp info_ptr, # endif )) { - png_chunk_report(png_ptr, "Invalid palette", PNG_CHUNK_ERROR); + png_error(png_ptr, "Invalid palette"); return; } @@ -1,7 +1,7 @@ /* pngwio.c - functions for data output * - * Last changed in libpng 1.6.0 [February 14, 2013] + * Last changed in libpng 1.6.8 [December 19, 2013] * Copyright (c) 1998-2013 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -149,6 +149,8 @@ png_set_write_fn(png_structrp png_ptr, png_voidp io_ptr, # else png_ptr->output_flush_fn = output_flush_fn; # endif +#else + PNG_UNUSED(output_flush_fn) #endif /* PNG_WRITE_FLUSH_SUPPORTED */ /* It is an error to read while writing a png file */ diff --git a/pngwrite.c b/pngwrite.c index b71a3d345..8f6df68b2 100644 --- a/pngwrite.c +++ b/pngwrite.c @@ -1,7 +1,7 @@ /* pngwrite.c - general routines to write a PNG file * - * Last changed in libpng 1.6.2 [April 25, 2013] + * Last changed in libpng 1.6.8 [December 19, 2013] * Copyright (c) 1998-2013 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -1638,14 +1638,16 @@ png_write_image_16bit(png_voidp argument) if (image->format & PNG_FORMAT_FLAG_ALPHA) { - if (image->format & PNG_FORMAT_FLAG_AFIRST) - { - aindex = -1; - ++input_row; /* To point to the first component */ - ++output_row; - } +# ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED + if (image->format & PNG_FORMAT_FLAG_AFIRST) + { + aindex = -1; + ++input_row; /* To point to the first component */ + ++output_row; + } - else + else +# endif aindex = channels; } @@ -1794,14 +1796,16 @@ png_write_image_8bit(png_voidp argument) png_bytep row_end; int aindex; - if (image->format & PNG_FORMAT_FLAG_AFIRST) - { - aindex = -1; - ++input_row; /* To point to the first component */ - ++output_row; - } +# ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED + if (image->format & PNG_FORMAT_FLAG_AFIRST) + { + aindex = -1; + ++input_row; /* To point to the first component */ + ++output_row; + } - else + else +# endif aindex = channels; /* Use row_end in place of a loop counter: */ @@ -1881,7 +1885,8 @@ png_image_set_PLTE(png_image_write_control *display) const png_uint_32 format = image->format; const int channels = PNG_IMAGE_SAMPLE_CHANNELS(format); -# ifdef PNG_FORMAT_BGR_SUPPORTED +# if defined(PNG_FORMAT_BGR_SUPPORTED) &&\ + defined(PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED) const int afirst = (format & PNG_FORMAT_FLAG_AFIRST) != 0 && (format & PNG_FORMAT_FLAG_ALPHA) != 0; # else |