From 339ef1ec97f54a97a589946933f1cc6b0993fe21 Mon Sep 17 00:00:00 2001 From: Glenn Randers-Pehrson Date: Thu, 19 Dec 2013 09:04:52 -0600 Subject: [master] Imported from libpng-1.6.8.tar --- ANNOUNCE | 103 +++++++----------- CHANGES | 36 +++++++ CMakeLists.txt | 4 +- LICENSE | 4 +- README | 2 +- arm/filter_neon.S | 5 +- arm/filter_neon_intrinsics.c | 4 +- configure.ac | 6 +- contrib/conftest/README | 49 +++++++++ contrib/conftest/read.dfa | 58 ++++++++++ contrib/conftest/s_read.dfa | 35 ++++++ contrib/conftest/s_write.dfa | 33 ++++++ contrib/conftest/simple.dfa | 36 +++++++ contrib/conftest/write.dfa | 45 ++++++++ contrib/libtests/pngstest.c | 193 ++++++++++++++++++++++----------- contrib/libtests/pngvalid.c | 107 +++++++++++++------ contrib/pngminim/decoder/makefile | 2 +- contrib/pngminim/encoder/makefile | 2 +- contrib/pngminim/encoder/pngusr.dfa | 7 +- contrib/pngminim/preader/makefile | 2 +- contrib/tools/pngfix.c | 35 +++--- libpng-manual.txt | 33 +++--- libpng.3 | 49 +++++---- libpngpf.3 | 4 +- png.5 | 2 +- png.c | 49 ++++++--- png.h | 24 +++-- pngconf.h | 2 +- pngdebug.h | 21 ++-- pngerror.c | 25 ++++- pngmem.c | 8 +- pngpread.c | 6 +- pngpriv.h | 20 ++-- pngread.c | 206 +++++++++++++++++++----------------- pngrtran.c | 5 +- pngrutil.c | 8 +- pngset.c | 4 +- pngtest.c | 14 +-- pngwio.c | 4 +- pngwrite.c | 37 ++++--- projects/vstudio/readme.txt | 2 +- projects/vstudio/zlib.props | 2 +- scripts/README.txt | 12 +-- scripts/def.dfn | 2 +- scripts/libpng-config-head.in | 2 +- scripts/libpng.pc.in | 2 +- scripts/makefile.cegcc | 2 +- scripts/makefile.linux | 2 +- scripts/makefile.msys | 2 +- scripts/makefile.ne12bsd | 2 +- scripts/makefile.netbsd | 2 +- scripts/makefile.openbsd | 2 +- scripts/options.awk | 9 +- scripts/pnglibconf.dfa | 66 +++++++----- scripts/pnglibconf.h.prebuilt | 4 +- scripts/symbols.def | 2 +- 56 files changed, 945 insertions(+), 459 deletions(-) create mode 100644 contrib/conftest/README create mode 100644 contrib/conftest/read.dfa create mode 100644 contrib/conftest/s_read.dfa create mode 100644 contrib/conftest/s_write.dfa create mode 100644 contrib/conftest/simple.dfa create mode 100644 contrib/conftest/write.dfa diff --git a/ANNOUNCE b/ANNOUNCE index b29489ab5..d5e79ef1a 100644 --- a/ANNOUNCE +++ b/ANNOUNCE @@ -1,5 +1,5 @@ -Libpng 1.6.7 - November 14, 2013 +Libpng 1.6.8 - December 19, 2013 This is a public release of libpng, intended for use in production codes. @@ -8,81 +8,50 @@ Files available for download: Source files with LF line endings (for Unix/Linux) and with a "configure" script - libpng-1.6.7.tar.xz (LZMA-compressed, recommended) - libpng-1.6.7.tar.gz + libpng-1.6.8.tar.xz (LZMA-compressed, recommended) + libpng-1.6.8.tar.gz Source files with CRLF line endings (for Windows), without the "configure" script - lpng167.7z (LZMA-compressed, recommended) - lpng167.zip + lpng168.7z (LZMA-compressed, recommended) + lpng168.zip Other information: - libpng-1.6.7-README.txt - libpng-1.6.7-LICENSE.txt + libpng-1.6.8-README.txt + libpng-1.6.8-LICENSE.txt Gnupg/*.asc (PGP armored detached signatures) -Changes since the last public release (1.6.6): - - Revised unknown chunk code to correct several bugs in the NO_SAVE_/NO_WRITE - combination - Allow HANDLE_AS_UNKNOWN to work when other options are configured off. Also - fixed the pngminim makefiles to work when $(MAKEFLAGS) contains stuff - which terminates the make options (as by default in recent versions of - Gentoo). - Avoid up-cast warnings in pngvalid.c. On ARM the alignment requirements of - png_modifier are greater than that of png_store and as a consequence - compilation of pngvalid.c results in a warning about increased alignment - requirements because of the bare cast to (png_modifier*). The code is safe, - because the pointer is known to point to a stack allocated png_modifier, - but this change avoids the warning. - Fixed default behavior of ARM_NEON_API. If the ARM NEON API option was - compiled without the CHECK option it defaulted to on, not off. - Check user callback behavior in pngunknown.c. Previous versions compiled - if SAVE_UNKNOWN was not available but did nothing since the callback - was never implemented. - Merged pngunknown.c with 1.7 version and back ported 1.7 improvements/fixes - Made changes for compatibility with automake 1.14: - 1) Added the 'compile' program to the list of programs that must be cleaned - in autogen.sh - 2) Added 'subdir-objects' which causes .c files in sub-directories to be - compiled such that the corresponding .o files are also in the - sub-directory. This is because automake 1.14 warns that the - current behavior of compiling to the top level directory may be removed - in the future. - 3) Updated dependencies on pnglibconf.h to match the new .o locations and - added all the files in contrib/libtests and contrib/tools that depend - on pnglibconf.h - 4) Added 'BUILD_SOURCES = pnglibconf.h'; this is the automake recommended - way of handling the dependencies of sources that are machine generated; - unfortunately it only works if the user does 'make all' or 'make check', - so the dependencies (3) are still required. - Cleaned up (char*) casts of zlib messages. The latest version of the Intel C - compiler complains about casting a string literal as (char*), so copied the - treatment of z_const from the library code into pngfix.c - Simplified error message code in pngunknown. The simplification has the - useful side effect of avoiding a bogus warning generated by the latest - version of the Intel C compiler (it objects to - condition ? string-literal : string-literal). - Make autogen.sh work with automake 1.13 as well as 1.14. Do this by always - removing the 1.14 'compile' script but never checking for it. - Added ARMv8 support (James Yu ). Added file - arm/filter_neon_intrinsics.c; enable with -mfpu=neon. - Revised pngvalid to generate size images with as many filters as it can - manage, limited by the number of rows. - Cleaned up ARM NEON compilation handling. The tests are now in pngpriv.h - and detect the broken GCC compilers. - Allow clang derived from older GCC versions to use ARM intrinsics. This - causes all clang builds that use -mfpu=neon to use the intrinsics code, - not the assembler code. This has only been tested on iOS 7. It may be - necessary to exclude some earlier clang versions but this seems unlikely. - Changed NEON implementation selection mechanism. This allows assembler - or intrinsics to be turned on at compile time during the build by defining - PNG_ARM_NEON_IMPLEMENTATION to the correct value (2 or 1). This macro - is undefined by default and the build type is selected in pngpriv.h. - Fixed #include in filter_neon_intrinsics.c and ctype macros. The ctype char - checking macros take an unsigned char argument, not a signed char. +Changes since the last public release (1.6.7): + Changed #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED in pngpread.c to + #ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED to be consistent with + what is in pngpriv.h. + Moved prototype for png_handle_unknown() in pngpriv.h outside of + the #ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED/#endif block. + Added "-Wall" to CFLAGS in contrib/pngminim/*/makefile + Conditionally compile some unused functions reported by -Wall in + pngminim. + Fixed 'minimal' builds. Various obviously useful minimal configurations + don't build because of missing contrib/libtests test programs and + overly complex dependencies in scripts/pnglibconf.dfa. This change + adds contrib/conftest/*.dfa files that can be used in automatic build + scripts to ensure that these configurations continue to build. + Enabled WRITE_INVERT and WRITE_PACK in contrib/pngminim/encoder. + Fixed pngvalid 'fail' function declaration on the Intel C Compiler. + This reverts to the previous 'static' implementation and works round + the 'unused static function' warning by using PNG_UNUSED(). + Removed or marked PNG_UNUSED some harmless "dead assignments" reported + by clang scan-build. + Changed tabs to 3 spaces in png_debug macros and changed '"%s"m' + to '"%s" m' to improve portability among compilers. + Changed png_free_default() to free() in pngtest.c + Tidied up pngfix inits and fixed pngtest no-write builds. + Handle zero-length PLTE chunk or NULL palette with png_error() + instead of png_chunk_report(), which by default issues a warning + rather than an error, leading to later reading from a NULL pointer + (png_ptr->palette) in png_do_expand_palette(). This is CVE-2013-6954 + and VU#650142. Send comments/corrections/commendations to png-mng-implement at lists.sf.net (subscription required; visit diff --git a/CHANGES b/CHANGES index bde9a92e3..4913e25d0 100644 --- a/CHANGES +++ b/CHANGES @@ -4712,6 +4712,42 @@ Version 1.6.7rc02 [November 7, 2013] checking macros take an unsigned char argument, not a signed char. Version 1.6.7 [November 14, 2013] + No changes. + +Version 1.6.8beta01 [November 24, 2013] + Moved prototype for png_handle_unknown() in pngpriv.h outside of + the #ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED/#endif block. + Added "-Wall" to CFLAGS in contrib/pngminim/*/makefile + Conditionally compile some unused functions reported by -Wall in + pngminim. + Fixed 'minimal' builds. Various obviously useful minimal configurations + don't build because of missing contrib/libtests test programs and + overly complex dependencies in scripts/pnglibconf.dfa. This change + adds contrib/conftest/*.dfa files that can be used in automatic build + scripts to ensure that these configurations continue to build. + Enabled WRITE_INVERT and WRITE_PACK in contrib/pngminim/encoder. + Fixed pngvalid 'fail' function declaration on the Intel C Compiler. + This reverts to the previous 'static' implementation and works round + the 'unused static function' warning by using PNG_UNUSED(). + +Version 1.6.8beta02 [November 30, 2013] + Removed or marked PNG_UNUSED some harmless "dead assignments" reported + by clang scan-build. + Changed tabs to 3 spaces in png_debug macros and changed '"%s"m' + to '"%s" m' to improve portability among compilers. + Changed png_free_default() to free() in pngtest.c + +Version 1.6.8rc01 [December 12, 2013] + Tidied up pngfix inits and fixed pngtest no-write builds. + +Version 1.6.8rc02 [December 14, 2013] + Handle zero-length PLTE chunk or NULL palette with png_error() + instead of png_chunk_report(), which by default issues a warning + rather than an error, leading to later reading from a NULL pointer + (png_ptr->palette) in png_do_expand_palette(). This is CVE-2013-6954 + and VU#650142. + +Version 1.6.8 [December 19, 2013] Send comments/corrections/commendations to png-mng-implement at lists.sf.net (subscription required; visit diff --git a/CMakeLists.txt b/CMakeLists.txt index 4b4e74c07..ac628bdc1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,7 +16,7 @@ enable_testing() set(PNGLIB_MAJOR 1) set(PNGLIB_MINOR 6) -set(PNGLIB_RELEASE 7) +set(PNGLIB_RELEASE 8) set(PNGLIB_NAME libpng${PNGLIB_MAJOR}${PNGLIB_MINOR}) set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE}) @@ -252,7 +252,7 @@ endif(NOT WIN32 OR CYGWIN OR MINGW) # SET UP LINKS if(PNG_SHARED) set_target_properties(${PNG_LIB_NAME} PROPERTIES -# VERSION 16.${PNGLIB_RELEASE}.1.6.7 +# VERSION 16.${PNGLIB_RELEASE}.1.6.8 VERSION 16.${PNGLIB_RELEASE}.0 SOVERSION 16 CLEAN_DIRECT_OUTPUT 1) diff --git a/LICENSE b/LICENSE index b1b97ea57..ad4493b74 100644 --- a/LICENSE +++ b/LICENSE @@ -10,7 +10,7 @@ this sentence. This code is released under the libpng license. -libpng versions 1.2.6, August 15, 2004, through 1.6.7, November 14, 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 @@ -108,4 +108,4 @@ certification mark of the Open Source Initiative. Glenn Randers-Pehrson glennrp at users.sourceforge.net -November 14, 2013 +December 19, 2013 diff --git a/README b/README index 80fc574ad..840d6c3e0 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -README for libpng version 1.6.7 - November 14, 2013 (shared library 16.0) +README for libpng version 1.6.8 - December 19, 2013 (shared library 16.0) See the note about version numbers near the top of png.h See INSTALL for instructions on how to install libpng. diff --git a/arm/filter_neon.S b/arm/filter_neon.S index 3d1ccf505..40d97775d 100644 --- a/arm/filter_neon.S +++ b/arm/filter_neon.S @@ -3,7 +3,7 @@ * * Copyright (c) 2013 Glenn Randers-Pehrson * Written by Mans Rullgard, 2011. - * Last changed in libpng 1.6.7 [November 14, 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 @@ -11,7 +11,8 @@ */ /* This is required to get the symbol renames, which are #defines, and also - * includes the definition (or not) of PNG_ARM_NEON_OPT. + * includes the definition (or not) of PNG_ARM_NEON_OPT and + * PNG_ARM_NEON_IMPLEMENTATION. */ #define PNG_VERSION_INFO_ONLY #include "../pngpriv.h" diff --git a/arm/filter_neon_intrinsics.c b/arm/filter_neon_intrinsics.c index e6a0217ab..99e0a2cfa 100644 --- a/arm/filter_neon_intrinsics.c +++ b/arm/filter_neon_intrinsics.c @@ -5,7 +5,7 @@ * Written by James Yu , October 2013. * Based on filter_neon.S, written by Mans Rullgard, 2011. * - * Last changed in libpng 1.6.7 [November 14, 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 @@ -15,7 +15,7 @@ #include "../pngpriv.h" /* This code requires -mfpu=neon on the command line: */ -#if PNG_ARM_NEON_IMPLEMENTATION == 1 /* intrinsics code */ +#if PNG_ARM_NEON_IMPLEMENTATION == 1 /* intrinsics code from pngpriv.h */ #include diff --git a/configure.ac b/configure.ac index 28200c3f6..a458bbdf9 100644 --- a/configure.ac +++ b/configure.ac @@ -18,7 +18,7 @@ AC_PREREQ([2.68]) dnl Version number stuff here: -AC_INIT([libpng],[1.6.7],[png-mng-implement@lists.sourceforge.net]) +AC_INIT([libpng],[1.6.8],[png-mng-implement@lists.sourceforge.net]) AC_CONFIG_MACRO_DIR([scripts]) # libpng does not follow GNU file name conventions (hence 'foreign') @@ -39,10 +39,10 @@ dnl automake, so the following is not necessary (and is not defined anyway): dnl AM_PREREQ([1.11.2]) dnl stop configure from automagically running automake -PNGLIB_VERSION=1.6.7 +PNGLIB_VERSION=1.6.8 PNGLIB_MAJOR=1 PNGLIB_MINOR=6 -PNGLIB_RELEASE=7 +PNGLIB_RELEASE=8 dnl End of version number stuff diff --git a/contrib/conftest/README b/contrib/conftest/README new file mode 100644 index 000000000..0f472791f --- /dev/null +++ b/contrib/conftest/README @@ -0,0 +1,49 @@ +This directory contains test configuration files, currently always '.dfa' files +intended to be used in the build by setting the make macro DFA_XTRA to the name +of the file. + +These files are used in release validation of the 'configure' builds of libpng +by building 'make check', or 'make all-am' for cross-builds, with each .dfa +file. + +The files in this directory may change between minor releases, however +contributions describing specific builds of libpng are welcomed. There is no +guarantee that libpng will continue to build with such configurations; support +for given configurations can be, and has been, dropped between successive minor +releases. However if a .dfa file describing a configuration is not in this +directory it is very unlikely that it will be tested before a minor release! + +You can use these .dfa files as the basis of new configurations. Files in this +directory should not have any use restrictions or restrictive licenses. + +This directory is not included in the .zip and .7z distributions, which do +not contain 'configure' scripts. + +DOCUMENTATION +============= + +Examples: + ${srcdir}/pngusr.dfa + ${srcdir}/contrib/pngminim/*/pngusr.dfa + +Documentation of the options: + ${srcdir}/scripts/pnglibconf.dfa + +Documentation of the file format: + ${srcdir}/scripts/options.awk + +FILE NAMING +=========== + +File names in this directory may NOT contain any of the five characters: + + - , + * ? + +Neither may they contain any space character. + +While other characters may be used it is strongly suggested that file names be +limited to lower case Latiin alphabetic characters (a-z), digits (0-9) and, if +necessary the underscore (_) character. File names should be about 8 characters +long (excluding the .dfa extension). Submitted .dfa files should have names +between 7 and 16 characters long, shorter names (6 characters or less) are +reserved for standard tests. diff --git a/contrib/conftest/read.dfa b/contrib/conftest/read.dfa new file mode 100644 index 000000000..21e88d01a --- /dev/null +++ b/contrib/conftest/read.dfa @@ -0,0 +1,58 @@ +# read.dfa +# Build time configuration of libpng +# +# Author: John Bowler +# Copyright: (c) John Bowler, 2013 +# Usage rights: +# To the extent possible under law, the author has waived all copyright and +# related or neighboring rights to this work. This work is published from: +# United States. +# +# Build libpng with basic read support. This enables the lowest level libpng +# read API - the one where the calling code has to use a loop to read each row. +# At present this is the API used by most programs. +# +# Support is enabled only for those chunks and transformations that are +# typically required - others can be added easily. +# + +everything = off + +# The sequential read code is enabled here; the progressive code can be used +# instead but there is no point enabling both. + +option SEQUENTIAL_READ on + +# Likewise it is pointless enabling both fixed and floating point APIs. Choose +# one or the other for both the API and the internal math. + +#Fixed point: +#option FIXED_POINT on +#option FLOATING_ARITHMETIC off + +#Floating point: +option FLOATING_POINT on +option FLOATING_ARITHMETIC on + +# Basic error handling, IO and user memory support. The latter allows the +# application program to provide its own implementations of 'malloc' and 'free'. +option SETJMP on +option STDIO on +option USER_MEM on + +# To read the full set of PNG images correctly interlace, transparency and +# 16-bit support is required. The application can implement interlace itself, +# but very few do and it's no longer possible to disable it when READ is +# enabled. +option READ_tRNS on +option READ_16BIT on + +# Everything else is application dependent. This file assumes the app handles +# all the native PNG bit layouts, so it doesn't need any of layout change +# transforms, but needs libpng to perform gamma correction. It doesn't do any +# colorspace stuff and ignores the 'significant bit' information. +# +# If your app always expands the image to a limited set of bit layouts you +# probably want to consider using the simplified API instead of the low level +# one - see png.h and s_read.dfa. +option READ_GAMMA on diff --git a/contrib/conftest/s_read.dfa b/contrib/conftest/s_read.dfa new file mode 100644 index 000000000..cb1ce0ba6 --- /dev/null +++ b/contrib/conftest/s_read.dfa @@ -0,0 +1,35 @@ +# s_read.dfa +# Build time configuration of libpng +# +# Author: John Bowler +# Copyright: (c) John Bowler, 2013 +# Usage rights: +# To the extent possible under law, the author has waived all copyright and +# related or neighboring rights to this work. This work is published from: +# United States. +# +# Build libpng with simplified read support (only). This builds a minimal +# libpng able to read all PNG formats and convert them into a small number of +# well understood memory formats. +# + +everything = off + +option SIMPLIFIED_READ on + +# It isn't necessary to chose fixed or floating point for the APIs because the +# simplified API doesn't need fixed or floating point numbers. It is necessary +# to chose an internal math implementation. The default (because of 'everything +# = off') is fixed point - turn the floating point implementation on if you have +# hardware floating point or prefer your software floating point implementation. +option FLOATING_ARITHMETIC on + +# This is not strictly necessary, but without it the message strings in the API +# will not be filled in +option ERROR_TEXT on + +# Switching these options on enables the 'AFIRST' and 'BGR' formats - you don't +# need this if you don't use them, they just allow the in-memory layout to be +# changed to match common hardware formats. +option SIMPLIFIED_READ_AFIRST on +option SIMPLIFIED_READ_BGR on diff --git a/contrib/conftest/s_write.dfa b/contrib/conftest/s_write.dfa new file mode 100644 index 000000000..e540a46dc --- /dev/null +++ b/contrib/conftest/s_write.dfa @@ -0,0 +1,33 @@ +# s_write.dfa +# Build time configuration of libpng +# +# Author: John Bowler +# Copyright: (c) John Bowler, 2013 +# Usage rights: +# To the extent possible under law, the author has waived all copyright and +# related or neighboring rights to this work. This work is published from: +# United States. +# +# Build libpng with (just) simplified write support +# + +everything = off + +option SIMPLIFIED_WRITE on + +# It isn't necessary to chose fixed or floating point for the APIs because the +# simplified API doesn't need fixed or floating point numbers. It is necessary +# to chose an internal math implementation. The default (because of 'everything +# = off') is fixed point - turn the floating point implementation on if you have +# hardware floating point or prefer your software floating point implementation. +option FLOATING_ARITHMETIC on + +# This is not strictly necessary, but without it the message strings in the API +# will not be filled in +option ERROR_TEXT on + +# Switching these options on enables the 'AFIRST' and 'BGR' formats - you don't +# need this if you don't use them, they just allow the in-memory layout to be +# changed to match common hardware formats. +option SIMPLIFIED_WRITE_AFIRST on +option SIMPLIFIED_WRITE_BGR on diff --git a/contrib/conftest/simple.dfa b/contrib/conftest/simple.dfa new file mode 100644 index 000000000..041933344 --- /dev/null +++ b/contrib/conftest/simple.dfa @@ -0,0 +1,36 @@ +# simple.dfa +# Build time configuration of libpng +# +# Author: John Bowler +# Copyright: (c) John Bowler, 2013 +# Usage rights: +# To the extent possible under law, the author has waived all copyright and +# related or neighboring rights to this work. This work is published from: +# United States. +# +# Build libpng with just the simplified APIs (read and write). +# + +everything = off + +option SIMPLIFIED_WRITE on +option SIMPLIFIED_READ on + +# It isn't necessary to chose fixed or floating point for the APIs because the +# simplified API doesn't need fixed or floating point numbers. It is necessary +# to chose an internal math implementation. The default (because of 'everything +# = off') is fixed point - turn the floating point implementation on if you have +# hardware floating point or prefer your software floating point implementation. +option FLOATING_ARITHMETIC on + +# This is not strictly necessary, but without it the message strings in the API +# will not be filled in +option ERROR_TEXT on + +# Switching these options on enables the 'AFIRST' and 'BGR' formats - you don't +# need this if you don't use them, they just allow the in-memory layout to be +# changed to match common hardware formats. +option SIMPLIFIED_READ_AFIRST on +option SIMPLIFIED_READ_BGR on +option SIMPLIFIED_WRITE_AFIRST on +option SIMPLIFIED_WRITE_BGR on diff --git a/contrib/conftest/write.dfa b/contrib/conftest/write.dfa new file mode 100644 index 000000000..3319aabee --- /dev/null +++ b/contrib/conftest/write.dfa @@ -0,0 +1,45 @@ +# write.dfa +# Build time configuration of libpng +# +# Author: John Bowler +# Copyright: (c) John Bowler, 2013 +# Usage rights: +# To the extent possible under law, the author has waived all copyright and +# related or neighboring rights to this work. This work is published from: +# United States. +# +# Build libpng with no read support and minimal write support. +# + +everything = off + +# Switch on the write code - this makes a minimalist encoder + +option WRITE on + +# Choose fixed or floating point APIs and arithmetic. The choices are +# independent but normally they will match. It is typically better to use the +# floating point if you have floating point hardware. If you don't know, or +# (perhaps) to make libpng smaller used fixed point throughout. + +#Fixed point: +#option FIXED_POINT on +#option FLOATING_ARITHMETIC off + +#Floating point: +option FLOATING_POINT on +option FLOATING_ARITHMETIC on + +# Basic error handling, IO and user memory support. The latter allows the +# application program to provide its own implementations of 'malloc' and 'free'. +option SETJMP on +option STDIO on +option USER_MEM on + +# Everything else is optional. Unlike the read code in libpng the write code +# does not need to deal with arbitrary formats, so only add support for things +# you really do write! For example you might only write sRGB images, sometimes +# with transparency and never write 16 bit images, so: +option WRITE_sRGB on +option WRITE_tRNS on +#option WRITE_16BIT off (this is the default with 'everything = off') diff --git a/contrib/libtests/pngstest.c b/contrib/libtests/pngstest.c index 35e7c8779..d20e8f224 100644 --- a/contrib/libtests/pngstest.c +++ b/contrib/libtests/pngstest.c @@ -3,7 +3,7 @@ * * Copyright (c) 2013 John Cunningham Bowler * - * Last changed in libpng 1.6.1 [March 28, 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 @@ -517,14 +517,23 @@ static void format_default(format_list *pf, int redundant) for (f=0; fa = pp[1]; } +#ifdef PNG_FORMAT_AFIRST_SUPPORTED static void gp_ag8(Pixel *p, png_const_voidp pb) { @@ -794,6 +804,7 @@ gp_ag8(Pixel *p, png_const_voidp pb) p->r = p->g = p->b = pp[1]; p->a = pp[0]; } +#endif static void gp_rgb8(Pixel *p, png_const_voidp pb) @@ -806,6 +817,7 @@ gp_rgb8(Pixel *p, png_const_voidp pb) p->a = 255; } +#ifdef PNG_FORMAT_BGR_SUPPORTED static void gp_bgr8(Pixel *p, png_const_voidp pb) { @@ -816,6 +828,7 @@ gp_bgr8(Pixel *p, png_const_voidp pb) p->b = pp[0]; p->a = 255; } +#endif static void gp_rgba8(Pixel *p, png_const_voidp pb) @@ -828,6 +841,7 @@ gp_rgba8(Pixel *p, png_const_voidp pb) p->a = pp[3]; } +#ifdef PNG_FORMAT_BGR_SUPPORTED static void gp_bgra8(Pixel *p, png_const_voidp pb) { @@ -838,7 +852,9 @@ gp_bgra8(Pixel *p, png_const_voidp pb) p->b = pp[0]; p->a = pp[3]; } +#endif +#ifdef PNG_FORMAT_AFIRST_SUPPORTED static void gp_argb8(Pixel *p, png_const_voidp pb) { @@ -849,7 +865,9 @@ gp_argb8(Pixel *p, png_const_voidp pb) p->b = pp[3]; p->a = pp[0]; } +#endif +#if defined(PNG_FORMAT_AFIRST_SUPPORTED) && defined(PNG_FORMAT_BGR_SUPPORTED) static void gp_abgr8(Pixel *p, png_const_voidp pb) { @@ -860,6 +878,7 @@ gp_abgr8(Pixel *p, png_const_voidp pb) p->b = pp[1]; p->a = pp[0]; } +#endif static void gp_g16(Pixel *p, png_const_voidp pb) @@ -879,6 +898,7 @@ gp_ga16(Pixel *p, png_const_voidp pb) p->a = pp[1]; } +#ifdef PNG_FORMAT_AFIRST_SUPPORTED static void gp_ag16(Pixel *p, png_const_voidp pb) { @@ -887,6 +907,7 @@ gp_ag16(Pixel *p, png_const_voidp pb) p->r = p->g = p->b = pp[1]; p->a = pp[0]; } +#endif static void gp_rgb16(Pixel *p, png_const_voidp pb) @@ -899,6 +920,7 @@ gp_rgb16(Pixel *p, png_const_voidp pb) p->a = 65535; } +#ifdef PNG_FORMAT_BGR_SUPPORTED static void gp_bgr16(Pixel *p, png_const_voidp pb) { @@ -909,6 +931,7 @@ gp_bgr16(Pixel *p, png_const_voidp pb) p->b = pp[0]; p->a = 65535; } +#endif static void gp_rgba16(Pixel *p, png_const_voidp pb) @@ -921,6 +944,7 @@ gp_rgba16(Pixel *p, png_const_voidp pb) p->a = pp[3]; } +#ifdef PNG_FORMAT_BGR_SUPPORTED static void gp_bgra16(Pixel *p, png_const_voidp pb) { @@ -931,7 +955,9 @@ gp_bgra16(Pixel *p, png_const_voidp pb) p->b = pp[0]; p->a = pp[3]; } +#endif +#ifdef PNG_FORMAT_AFIRST_SUPPORTED static void gp_argb16(Pixel *p, png_const_voidp pb) { @@ -942,7 +968,9 @@ gp_argb16(Pixel *p, png_const_voidp pb) p->b = pp[3]; p->a = pp[0]; } +#endif +#if defined(PNG_FORMAT_AFIRST_SUPPORTED) && defined(PNG_FORMAT_BGR_SUPPORTED) static void gp_abgr16(Pixel *p, png_const_voidp pb) { @@ -953,6 +981,7 @@ gp_abgr16(Pixel *p, png_const_voidp pb) p->b = pp[1]; p->a = pp[0]; } +#endif /* Given a format, return the correct one of the above functions. */ static void (* @@ -966,29 +995,35 @@ get_pixel(png_uint_32 format))(Pixel *p, png_const_voidp pb) { if (format & PNG_FORMAT_FLAG_COLOR) { - if (format & PNG_FORMAT_FLAG_BGR) - { - if (format & PNG_FORMAT_FLAG_ALPHA) +# ifdef PNG_FORMAT_BGR_SUPPORTED + if (format & PNG_FORMAT_FLAG_BGR) { - if (format & PNG_FORMAT_FLAG_AFIRST) - return gp_abgr16; + if (format & PNG_FORMAT_FLAG_ALPHA) + { +# ifdef PNG_FORMAT_AFIRST_SUPPORTED + if (format & PNG_FORMAT_FLAG_AFIRST) + return gp_abgr16; + + else +# endif + return gp_bgra16; + } else - return gp_bgra16; + return gp_bgr16; } else - return gp_bgr16; - } - - else +# endif { if (format & PNG_FORMAT_FLAG_ALPHA) { - if (format & PNG_FORMAT_FLAG_AFIRST) - return gp_argb16; +# ifdef PNG_FORMAT_AFIRST_SUPPORTED + if (format & PNG_FORMAT_FLAG_AFIRST) + return gp_argb16; - else + else +# endif return gp_rgba16; } @@ -1001,10 +1036,12 @@ get_pixel(png_uint_32 format))(Pixel *p, png_const_voidp pb) { if (format & PNG_FORMAT_FLAG_ALPHA) { - if (format & PNG_FORMAT_FLAG_AFIRST) - return gp_ag16; +# ifdef PNG_FORMAT_AFIRST_SUPPORTED + if (format & PNG_FORMAT_FLAG_AFIRST) + return gp_ag16; - else + else +# endif return gp_ga16; } @@ -1017,29 +1054,35 @@ get_pixel(png_uint_32 format))(Pixel *p, png_const_voidp pb) { if (format & PNG_FORMAT_FLAG_COLOR) { - if (format & PNG_FORMAT_FLAG_BGR) - { - if (format & PNG_FORMAT_FLAG_ALPHA) +# ifdef PNG_FORMAT_BGR_SUPPORTED + if (format & PNG_FORMAT_FLAG_BGR) { - if (format & PNG_FORMAT_FLAG_AFIRST) - return gp_abgr8; + if (format & PNG_FORMAT_FLAG_ALPHA) + { +# ifdef PNG_FORMAT_AFIRST_SUPPORTED + if (format & PNG_FORMAT_FLAG_AFIRST) + return gp_abgr8; + + else +# endif + return gp_bgra8; + } else - return gp_bgra8; + return gp_bgr8; } else - return gp_bgr8; - } - - else +# endif { if (format & PNG_FORMAT_FLAG_ALPHA) { - if (format & PNG_FORMAT_FLAG_AFIRST) - return gp_argb8; +# ifdef PNG_FORMAT_AFIRST_SUPPORTED + if (format & PNG_FORMAT_FLAG_AFIRST) + return gp_argb8; - else + else +# endif return gp_rgba8; } @@ -1052,10 +1095,12 @@ get_pixel(png_uint_32 format))(Pixel *p, png_const_voidp pb) { if (format & PNG_FORMAT_FLAG_ALPHA) { - if (format & PNG_FORMAT_FLAG_AFIRST) - return gp_ag8; +# ifdef PNG_FORMAT_AFIRST_SUPPORTED + if (format & PNG_FORMAT_FLAG_AFIRST) + return gp_ag8; - else + else +# endif return gp_ga8; } @@ -2618,13 +2663,15 @@ component_loc(png_byte loc[4], png_uint_32 format) loc[2] = 1; - if (format & PNG_FORMAT_FLAG_BGR) - { - loc[1] = 2; - loc[3] = 0; - } +# ifdef PNG_FORMAT_BGR_SUPPORTED + if (format & PNG_FORMAT_FLAG_BGR) + { + loc[1] = 2; + loc[3] = 0; + } - else + else +# endif { loc[1] = 0; loc[3] = 2; @@ -2639,15 +2686,17 @@ component_loc(png_byte loc[4], png_uint_32 format) if (format & PNG_FORMAT_FLAG_ALPHA) { - if (format & PNG_FORMAT_FLAG_AFIRST) - { - loc[0] = 0; - ++loc[1]; - ++loc[2]; - ++loc[3]; - } +# ifdef PNG_FORMAT_AFIRST_SUPPORTED + if (format & PNG_FORMAT_FLAG_AFIRST) + { + loc[0] = 0; + ++loc[1]; + ++loc[2]; + ++loc[3]; + } - else + else +# endif loc[0] = channels; ++channels; @@ -3017,17 +3066,25 @@ read_file(Image *image, png_uint_32 format, png_const_colorp background) return logerror(image, "memory init: ", image->file_name, ""); } - else if (image->input_file != NULL) - { - if (!png_image_begin_read_from_stdio(&image->image, image->input_file)) - return logerror(image, "stdio init: ", image->file_name, ""); - } +# ifdef PNG_STDIO_SUPPORTED + else if (image->input_file != NULL) + { + if (!png_image_begin_read_from_stdio(&image->image, image->input_file)) + return logerror(image, "stdio init: ", image->file_name, ""); + } - else - { - if (!png_image_begin_read_from_file(&image->image, image->file_name)) - return logerror(image, "file init: ", image->file_name, ""); - } + else + { + if (!png_image_begin_read_from_file(&image->image, image->file_name)) + return logerror(image, "file init: ", image->file_name, ""); + } +# else + else + { + return logerror(image, "unsupported file/stdio init: ", + image->file_name, ""); + } +# endif /* This must be set after the begin_read call: */ if (image->opts & sRGB_16BIT) @@ -3466,11 +3523,19 @@ main(int argc, char **argv) memset(gpc_error_via_linear, 0, sizeof gpc_error_via_linear); } else if (strcmp(arg, "--file") == 0) - opts |= READ_FILE; +# ifdef PNG_STDIO_SUPPORTED + opts |= READ_FILE; +# else + return 77; /* skipped: no support */ +# endif else if (strcmp(arg, "--memory") == 0) opts &= ~READ_FILE; else if (strcmp(arg, "--stdio") == 0) - opts |= USE_STDIO; +# ifdef PNG_STDIO_SUPPORTED + opts |= USE_STDIO; +# else + return 77; /* skipped: no support */ +# endif else if (strcmp(arg, "--name") == 0) opts &= ~USE_STDIO; else if (strcmp(arg, "--verbose") == 0) diff --git a/contrib/libtests/pngvalid.c b/contrib/libtests/pngvalid.c index 55ec5af4f..4146c8480 100644 --- a/contrib/libtests/pngvalid.c +++ b/contrib/libtests/pngvalid.c @@ -1,7 +1,7 @@ /* pngvalid.c - validate libpng by constructing then reading png files. * - * Last changed in libpng 1.6.1 [March 28, 2013] + * Last changed in libpng 1.6.8 [December 19, 2013] * Copyright (c) 2013 Glenn Randers-Pehrson * Written by John Cunningham Bowler * @@ -43,7 +43,10 @@ # include "../../png.h" #endif -#ifdef PNG_WRITE_SUPPORTED /* else pngvalid can do nothing */ +/* pngvalid requires write support and one of the fixed or floating point APIs. + */ +#if defined(PNG_WRITE_SUPPORTED) &&\ + (defined(PNG_FIXED_POINT_SUPPORTED) || defined(PNG_FLOATING_POINT_SUPPORTED)) #if PNG_LIBPNG_VER < 10500 /* This deliberately lacks the PNG_CONST. */ @@ -106,6 +109,11 @@ typedef png_byte *png_const_bytep; # endif #endif +/* Fixups for various minimal builds */ +#ifndef PNG_ERROR_TEXT_SUPPORTED +# define png_error(a,b) png_err(a) +#endif + /***************************** EXCEPTION HANDLING *****************************/ #ifdef PNG_FREESTANDING_TESTS # include @@ -1263,6 +1271,7 @@ store_current_palette(png_store *ps, int *npalette) #endif /* PNG_READ_SUPPORTED */ /***************************** MEMORY MANAGEMENT*** ***************************/ +#ifdef PNG_USER_MEM_SUPPORTED /* A store_memory is simply the header for an allocated block of memory. The * pointer returned to libpng is just after the end of the header block, the * allocated memory is followed by a second copy of the 'mark'. @@ -1463,6 +1472,7 @@ store_free(png_structp ppIn, png_voidp memory) this->next = NULL; store_memory_free(pp, pool, this); } +#endif /* PNG_USER_MEM_SUPPORTED */ /* Setup functions. */ /* Cleanup when aborting a write or after storing the new file. */ @@ -1488,7 +1498,9 @@ store_write_reset(png_store *ps) /* And make sure that all the memory has been freed - this will output * spurious errors in the case of memory corruption above, but this is safe. */ - store_pool_delete(ps, &ps->write_memory_pool); +# ifdef PNG_USER_MEM_SUPPORTED + store_pool_delete(ps, &ps->write_memory_pool); +# endif store_freenew(ps); } @@ -1512,16 +1524,20 @@ set_store_for_write(png_store *ps, png_infopp ppi, store_write_reset(ps); safecat(ps->wname, sizeof ps->wname, 0, name); - /* Don't do the slow memory checks if doing a speed test. */ - if (ps->speed) + /* Don't do the slow memory checks if doing a speed test, also if user + * memory is not supported we can't do it anyway. + */ +# ifdef PNG_USER_MEM_SUPPORTED + if (!ps->speed) + ps->pwrite = png_create_write_struct_2(PNG_LIBPNG_VER_STRING, + ps, store_error, store_warning, &ps->write_memory_pool, + store_malloc, store_free); + + else +# endif ps->pwrite = png_create_write_struct(PNG_LIBPNG_VER_STRING, ps, store_error, store_warning); - else - ps->pwrite = png_create_write_struct_2(PNG_LIBPNG_VER_STRING, - ps, store_error, store_warning, &ps->write_memory_pool, - store_malloc, store_free); - png_set_write_fn(ps->pwrite, ps, store_write, store_flush); # ifdef PNG_SET_OPTION_SUPPORTED @@ -1569,8 +1585,10 @@ store_read_reset(png_store *ps) } # endif - /* Always do this to be safe. */ - store_pool_delete(ps, &ps->read_memory_pool); +# ifdef PNG_USER_MEM_SUPPORTED + /* Always do this to be safe. */ + store_pool_delete(ps, &ps->read_memory_pool); +# endif ps->current = NULL; ps->next = NULL; @@ -1630,14 +1648,16 @@ set_store_for_read(png_store *ps, png_infopp ppi, png_uint_32 id, * However, given that store_error works correctly in these circumstances * we don't ever expect NULL in this program. */ - if (ps->speed) - ps->pread = png_create_read_struct(PNG_LIBPNG_VER_STRING, ps, - store_error, store_warning); +# ifdef PNG_USER_MEM_SUPPORTED + if (!ps->speed) + ps->pread = png_create_read_struct_2(PNG_LIBPNG_VER_STRING, ps, + store_error, store_warning, &ps->read_memory_pool, store_malloc, + store_free); - else - ps->pread = png_create_read_struct_2(PNG_LIBPNG_VER_STRING, ps, - store_error, store_warning, &ps->read_memory_pool, store_malloc, - store_free); + else +# endif + ps->pread = png_create_read_struct(PNG_LIBPNG_VER_STRING, ps, store_error, + store_warning); if (ps->pread == NULL) { @@ -1934,7 +1954,7 @@ typedef struct png_modifier /* This returns true if the test should be stopped now because it has already * failed and it is running silently. - */ + */ static int fail(png_modifier *pm) { return !pm->log && !pm->this.verbose && (pm->this.nerrors > 0 || @@ -3109,8 +3129,10 @@ init_standard_palette(png_store *ps, png_structp pp, png_infop pi, int npalette, for (; i<256; ++i) tRNS[i] = 24; - if (j > 0) - png_set_tRNS(pp, pi, tRNS, j, 0/*color*/); +# ifdef PNG_WRITE_tRNS_SUPPORTED + if (j > 0) + png_set_tRNS(pp, pi, tRNS, j, 0/*color*/); +# endif } } @@ -3356,6 +3378,13 @@ transform_row(png_const_structp pp, png_byte buffer[TRANSFORM_ROWMAX], */ #define DEPTH(bd) ((png_byte)(1U << (bd))) +/* This is just a helper for compiling on minimal systems with no write + * interlacing support. + */ +#ifndef PNG_WRITE_INTERLACING_SUPPORTED +# define png_set_interlace_handling(a) (1) +#endif + /* Make a standardized image given a an image colour type, bit depth and * interlace type. The standard images have a very restricted range of * rows and heights and are used for testing transforms rather than image @@ -3509,8 +3538,12 @@ make_transform_images(png_store *ps) { int interlace_type; - for (interlace_type = PNG_INTERLACE_NONE; - interlace_type < PNG_INTERLACE_LAST; ++interlace_type) +# ifdef PNG_WRITE_INTERLACING_SUPPORTED + for (interlace_type = PNG_INTERLACE_NONE; + interlace_type < PNG_INTERLACE_LAST; ++interlace_type) +# else + interlace_type = PNG_INTERLACE_NONE; +# endif { char name[FILE_NAME_SIZE]; @@ -3666,7 +3699,9 @@ make_size_image(png_store* PNG_CONST ps, png_byte PNG_CONST colour_type, int npasses = npasses_from_interlace_type(pp, interlace_type); png_uint_32 y; int pass; - int nfilter = PNG_FILTER_VALUE_LAST; +# ifdef PNG_WRITE_FILTER_SUPPORTED + int nfilter = PNG_FILTER_VALUE_LAST; +# endif png_byte image[16][SIZE_ROWMAX]; /* To help consistent error detection make the parts of this buffer @@ -3720,6 +3755,7 @@ make_size_image(png_store* PNG_CONST ps, png_byte PNG_CONST colour_type, continue; } +# ifdef PNG_WRITE_FILTER_SUPPORTED /* Only get to here if the row has some pixels in it, set the * filters to 'all' for the very first row and thereafter to a * single filter. It isn't well documented, but png_set_filter @@ -3735,6 +3771,7 @@ make_size_image(png_store* PNG_CONST ps, png_byte PNG_CONST colour_type, if (nfilter-- == 0) nfilter = PNG_FILTER_VALUE_LAST-1; +# endif png_write_row(pp, row); } @@ -3802,8 +3839,10 @@ make_size(png_store* PNG_CONST ps, png_byte PNG_CONST colour_type, int bdlo, width, height, 0); make_size_image(ps, colour_type, DEPTH(bdlo), PNG_INTERLACE_NONE, width, height, 1); +# ifdef PNG_WRITE_INTERLACING_SUPPORTED make_size_image(ps, colour_type, DEPTH(bdlo), PNG_INTERLACE_ADAM7, width, height, 0); +# endif make_size_image(ps, colour_type, DEPTH(bdlo), PNG_INTERLACE_ADAM7, width, height, 1); } @@ -3998,8 +4037,12 @@ make_errors(png_modifier* PNG_CONST pm, png_byte PNG_CONST colour_type, { int interlace_type; - for (interlace_type = PNG_INTERLACE_NONE; - interlace_type < PNG_INTERLACE_LAST; ++interlace_type) +# ifdef PNG_WRITE_INTERLACING_SUPPORTED + for (interlace_type = PNG_INTERLACE_NONE; + interlace_type < PNG_INTERLACE_LAST; ++interlace_type) +# else + interlace_type = PNG_INTERLACE_NONE; +# endif { unsigned int test; char name[FILE_NAME_SIZE]; @@ -4020,7 +4063,7 @@ make_errors(png_modifier* PNG_CONST pm, png_byte PNG_CONST colour_type, return 1; /* keep going */ } -#endif +#endif /* PNG_WARNINGS_SUPPORTED */ static void perform_error_test(png_modifier *pm) @@ -10222,12 +10265,16 @@ int main(int argc, char **argv) } } + /* This is required because some very minimal configurations do not use it: + */ + UNUSED(fail) return 0; } -#else /* write not supported */ +#else /* write or low level APIs not supported */ int main(void) { - fprintf(stderr, "pngvalid: no write support in libpng, all tests skipped\n"); + fprintf(stderr, + "pngvalid: no low level write support in libpng, all tests skipped\n"); /* So the test is skipped: */ return 77; } diff --git a/contrib/pngminim/decoder/makefile b/contrib/pngminim/decoder/makefile index 7eb68dee4..23e8e5b85 100644 --- a/contrib/pngminim/decoder/makefile +++ b/contrib/pngminim/decoder/makefile @@ -15,7 +15,7 @@ RM=rm -f COPY=cp CPPFLAGS=-I. -DPNG_USER_CONFIG -DNO_GZCOMPRESS -DZ_SOLO -DNO_GZIP -CFLAGS=-O1 +CFLAGS=-O1 -Wall C=.c O=.o diff --git a/contrib/pngminim/encoder/makefile b/contrib/pngminim/encoder/makefile index cc2fddd1b..ce67a9623 100644 --- a/contrib/pngminim/encoder/makefile +++ b/contrib/pngminim/encoder/makefile @@ -15,7 +15,7 @@ RM=rm -f COPY=cp CPPFLAGS=-I. -DPNG_USER_CONFIG -DNO_GZCOMPRESS -DZ_SOLO -DNO_GZIP -CFLAGS=-O1 +CFLAGS=-O1 -Wall C=.c O=.o diff --git a/contrib/pngminim/encoder/pngusr.dfa b/contrib/pngminim/encoder/pngusr.dfa index 334d5e349..1fc24f3f2 100644 --- a/contrib/pngminim/encoder/pngusr.dfa +++ b/contrib/pngminim/encoder/pngusr.dfa @@ -13,9 +13,10 @@ everything = off # Switch on the write code - this makes a minimalist encoder option WRITE on -# These 2 options are required if you need to read PGM (P1 or P4) PGM files. -# option WRITE_INVERT on -# option WRITE_PACK on + +# These 2 options are required if you need to read PBM (P1 or P4) files. +option WRITE_INVERT on +option WRITE_PACK on # You must choose fixed or floating point arithmetic: # option FLOATING_POINT on diff --git a/contrib/pngminim/preader/makefile b/contrib/pngminim/preader/makefile index ffd0fe7f1..c6855e8ff 100644 --- a/contrib/pngminim/preader/makefile +++ b/contrib/pngminim/preader/makefile @@ -31,7 +31,7 @@ XLIB = -L/usr/X11R6/lib -lX11 LIBS = $(XLIB) -lm #platforms that need libm CPPFLAGS=-I. $(XINC) -DPNG_USER_CONFIG -DNO_GZCOMPRESS -DZ_SOLO -DNO_GZIP -CFLAGS=-O1 +CFLAGS=-O1 -Wall C=.c O=.o diff --git a/contrib/tools/pngfix.c b/contrib/tools/pngfix.c index 6409d1624..245adb6f2 100644 --- a/contrib/tools/pngfix.c +++ b/contrib/tools/pngfix.c @@ -2,7 +2,7 @@ * * Copyright (c) 2013 John Cunningham Bowler * - * 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 @@ -50,7 +50,7 @@ # error "pngfix will not work with libpng prior to 1.6.3" #endif -#ifdef PNG_READ_SUPPORTED +#if defined(PNG_READ_SUPPORTED) && defined(PNG_EASY_ACCESS_SUPPORTED) /* zlib.h defines the structure z_stream, an instance of which is included * in this structure and is required for decompressing the LZ compressed * data in PNG files. @@ -142,6 +142,11 @@ /* Is it safe to copy? */ #define SAFE_TO_COPY(chunk) (((chunk) & PNG_U32(0,0,0,32)) != 0) +/* Fix ups for builds with limited read support */ +#ifndef PNG_ERROR_TEXT_SUPPORTED +# define png_error(a,b) png_err(a) +#endif + /********************************* UTILITIES **********************************/ /* UNREACHED is a value to cause an assert to fail. Because of the way the * assert macro is written the string "UNREACHED" is produced in the error @@ -1570,7 +1575,7 @@ chunk_end(struct chunk **chunk_var) } static void -chunk_init(struct chunk *chunk, struct file *file) +chunk_init(struct chunk * const chunk, struct file * const file) /* When a chunk is initialized the file length/type/pos are copied into the * corresponding chunk fields and the new chunk is registered in the file * structure. There can only be one chunk at a time. @@ -1779,7 +1784,7 @@ IDAT_end(struct IDAT **idat_var) } static void -IDAT_init(struct IDAT *idat, struct file *file) +IDAT_init(struct IDAT * const idat, struct file * const file) /* When the chunk is png_IDAT instantiate an IDAT control structure in place * of a chunk control structure. The IDAT will instantiate a chunk control * structure using the file alloc routine. @@ -3318,6 +3323,8 @@ read_callback(png_structp png_ptr, png_bytep buffer, size_t count) else { + assert(chunk != NULL); + /* Set up for write, notice that repositioning the input stream * is only necessary if something is to be read from it. Also * notice that for the IDAT stream this must only happen once - @@ -3331,6 +3338,8 @@ read_callback(png_structp png_ptr, png_bytep buffer, size_t count) /* FALL THROUGH */ default: + assert(chunk != NULL); + /* NOTE: the arithmetic below overflows and gives a large positive * png_uint_32 value until the whole chunk data has been written. */ @@ -3536,22 +3545,14 @@ allocate(struct file *file, int allocate_idat) if (allocate_idat) { - struct IDAT *idat; - assert(file->idat == NULL); - idat = &control->idat; - IDAT_init(idat, file); - file->idat = idat; + IDAT_init(&control->idat, file); } else /* chunk */ { - struct chunk *chunk; - assert(file->chunk == NULL); - chunk = &control->chunk; - chunk_init(chunk, file); - file->chunk = chunk; + chunk_init(&control->chunk, file); } } @@ -3644,7 +3645,7 @@ read_png(struct control *control) return rc; } -static void +static int one_file(struct global *global, const char *file_name, const char *out_name) { int rc; @@ -3663,6 +3664,8 @@ one_file(struct global *global, const char *file_name, const char *out_name) rc = read_png(&control); rc |= control_end(&control); + + return rc; } static void @@ -4031,4 +4034,4 @@ main(void) fprintf(stderr, "pngfix does not work without read support\n"); return 77; } -#endif /* PNG_READ_SUPPORTED */ +#endif /* PNG_READ_SUPPORTED && PNG_EASY_ACCESS_SUPPORTED */ diff --git a/libpng-manual.txt b/libpng-manual.txt index bb1702f48..ac0ff1b49 100644 --- a/libpng-manual.txt +++ b/libpng-manual.txt @@ -1,6 +1,6 @@ libpng-manual.txt - A description on how to use and modify libpng - libpng version 1.6.7 - November 14, 2013 + libpng version 1.6.8 - December 19, 2013 Updated and distributed by Glenn Randers-Pehrson Copyright (c) 1998-2013 Glenn Randers-Pehrson @@ -11,7 +11,7 @@ libpng-manual.txt - A description on how to use and modify libpng Based on: - libpng versions 0.97, January 1998, through 1.6.7 - November 14, 2013 + libpng versions 0.97, January 1998, through 1.6.8 - December 19, 2013 Updated and distributed by Glenn Randers-Pehrson Copyright (c) 1998-2013 Glenn Randers-Pehrson @@ -4622,11 +4622,11 @@ XI. Changes to Libpng from version 1.4.x to 1.5.x From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the function) incorrectly returned a value of type png_uint_32. -Checking for invalid palette index on read or write was added at libpng -1.5.10. When an invalid index is found, libpng issues a benign error. -This is enabled by default because this condition is an error according -to the PNG specification, Clause 11.3.2, but the error can be ignored in -each png_ptr with +Checking for invalid palette index on write was added at libpng +1.5.10. If a pixel contains an invalid (out-of-range) index libpng issues +a benign error. This is enabled by default because this condition is an +error according to the PNG specification, Clause 11.3.2, but the error can +be ignored in each png_ptr with png_set_check_for_invalid_index(png_ptr, allowed); @@ -5051,18 +5051,19 @@ The machine-generated configure files are no longer included in branches libpng16 and later of the GIT repository. They continue to be included in the tarball releases, however. -Libpng-1.6.0 and later use the CMF bytes at the beginning of the IDAT stream -to set the size of the sliding window for reading instead of using the default -32-kbyte sliding window size. It was discovered that there are hundreds of PNG -files in the wild that have incorrect CMF bytes that cause libpng to now issue -a "too far back" error and reject the file. Libpng-1.6.3 provides a way to -revert to the libpng-1.5.x behavior (ignoring the CMF bytes and using a +Libpng-1.6.0 through 1.6.2 used the CMF bytes at the beginning of the IDAT +stream to set the size of the sliding window for reading instead of using the +default 32-kbyte sliding window size. It was discovered that there are +hundreds of PNG files in the wild that have incorrect CMF bytes that caused +libpng to issue a "too far back" error and reject the file. Libpng-1.6.3 and +later calculate their own safe CMF from the image dimensions, provide a way +to revert to the libpng-1.5.x behavior (ignoring the CMF bytes and using a 32-kbyte sliding window), by using png_set_option(png_ptr, PNG_MAXIMUM_INFLATE_WINDOW, PNG_OPTION_ON); -and provides a tool (contrib/tools/pngfix) for optimizing the CMF bytes +and provide a tool (contrib/tools/pngfix) for optimizing the CMF bytes correctly. Libpng-1.6.0 and libpng-1.6.1 wrote uncompressed iTXt chunks with the wrong @@ -5232,13 +5233,13 @@ Other rules can be inferred by inspecting the libpng source. XVI. Y2K Compliance in libpng -November 14, 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.7 are Y2K compliant. It is my belief that earlier +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 diff --git a/libpng.3 b/libpng.3 index 861bea61b..da9c93087 100644 --- a/libpng.3 +++ b/libpng.3 @@ -1,6 +1,6 @@ -.TH LIBPNG 3 "November 14, 2013" +.TH LIBPNG 3 "December 19, 2013" .SH NAME -libpng \- Portable Network Graphics (PNG) Reference Library 1.6.7 +libpng \- Portable Network Graphics (PNG) Reference Library 1.6.8 .SH SYNOPSIS \fB #include \fP @@ -504,7 +504,7 @@ Following is a copy of the libpng-manual.txt file that accompanies libpng. .SH LIBPNG.TXT libpng-manual.txt - A description on how to use and modify libpng - libpng version 1.6.7 - November 14, 2013 + libpng version 1.6.8 - December 19, 2013 Updated and distributed by Glenn Randers-Pehrson Copyright (c) 1998-2013 Glenn Randers-Pehrson @@ -515,7 +515,7 @@ libpng-manual.txt - A description on how to use and modify libpng Based on: - libpng versions 0.97, January 1998, through 1.6.7 - November 14, 2013 + libpng versions 0.97, January 1998, through 1.6.8 - December 19, 2013 Updated and distributed by Glenn Randers-Pehrson Copyright (c) 1998-2013 Glenn Randers-Pehrson @@ -5127,11 +5127,11 @@ We removed the trailing '.' from the warning and error messages. From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the function) incorrectly returned a value of type png_uint_32. -Checking for invalid palette index on read or write was added at libpng -1.5.10. When an invalid index is found, libpng issues a benign error. -This is enabled by default because this condition is an error according -to the PNG specification, Clause 11.3.2, but the error can be ignored in -each png_ptr with +Checking for invalid palette index on write was added at libpng +1.5.10. If a pixel contains an invalid (out-of-range) index libpng issues +a benign error. This is enabled by default because this condition is an +error according to the PNG specification, Clause 11.3.2, but the error can +be ignored in each png_ptr with png_set_check_for_invalid_index(png_ptr, allowed); @@ -5556,18 +5556,19 @@ The machine-generated configure files are no longer included in branches libpng16 and later of the GIT repository. They continue to be included in the tarball releases, however. -Libpng-1.6.0 and later use the CMF bytes at the beginning of the IDAT stream -to set the size of the sliding window for reading instead of using the default -32-kbyte sliding window size. It was discovered that there are hundreds of PNG -files in the wild that have incorrect CMF bytes that cause libpng to now issue -a "too far back" error and reject the file. Libpng-1.6.3 provides a way to -revert to the libpng-1.5.x behavior (ignoring the CMF bytes and using a +Libpng-1.6.0 through 1.6.2 used the CMF bytes at the beginning of the IDAT +stream to set the size of the sliding window for reading instead of using the +default 32-kbyte sliding window size. It was discovered that there are +hundreds of PNG files in the wild that have incorrect CMF bytes that caused +libpng to issue a "too far back" error and reject the file. Libpng-1.6.3 and +later calculate their own safe CMF from the image dimensions, provide a way +to revert to the libpng-1.5.x behavior (ignoring the CMF bytes and using a 32-kbyte sliding window), by using png_set_option(png_ptr, PNG_MAXIMUM_INFLATE_WINDOW, PNG_OPTION_ON); -and provides a tool (contrib/tools/pngfix) for optimizing the CMF bytes +and provide a tool (contrib/tools/pngfix) for optimizing the CMF bytes correctly. Libpng-1.6.0 and libpng-1.6.1 wrote uncompressed iTXt chunks with the wrong @@ -5737,13 +5738,13 @@ Other rules can be inferred by inspecting the libpng source. .SH XVI. Y2K Compliance in libpng -November 14, 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.7 are Y2K compliant. It is my belief that earlier +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 @@ -5966,7 +5967,11 @@ the first widely used release: 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.7rc01-02 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 minor and patch numbers; the shared-library major version number will be @@ -6023,7 +6028,7 @@ possible without all of you. Thanks to Frank J. T. Wojcik for helping with the documentation. -Libpng version 1.6.7 - November 14, 2013: +Libpng version 1.6.8 - December 19, 2013: Initially created in 1995 by Guy Eric Schalnat, then of Group 42, Inc. Currently maintained by Glenn Randers-Pehrson (glennrp at users.sourceforge.net). @@ -6046,7 +6051,7 @@ this sentence. This code is released under the libpng license. -libpng versions 1.2.6, August 15, 2004, through 1.6.7, November 14, 2013, are +libpng versions 1.2.6, August 15, 2004, through 1.6.8, December 19, 2013, are Copyright (c) 2004,2006-2007 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 @@ -6145,7 +6150,7 @@ certification mark of the Open Source Initiative. Glenn Randers-Pehrson glennrp at users.sourceforge.net -November 14, 2013 +December 19, 2013 .\" end of man page diff --git a/libpngpf.3 b/libpngpf.3 index 62ed7812c..38e82d94e 100644 --- a/libpngpf.3 +++ b/libpngpf.3 @@ -1,6 +1,6 @@ -.TH LIBPNGPF 3 "November 14, 2013" +.TH LIBPNGPF 3 "December 19, 2013" .SH NAME -libpng \- Portable Network Graphics (PNG) Reference Library 1.6.7 +libpng \- Portable Network Graphics (PNG) Reference Library 1.6.8 (private functions) .SH SYNOPSIS \fB#include \fI"pngpriv.h" diff --git a/png.5 b/png.5 index 978af1c11..c43a02ddc 100644 --- a/png.5 +++ b/png.5 @@ -1,4 +1,4 @@ -.TH PNG 5 "November 14, 2013" +.TH PNG 5 "December 19, 2013" .SH NAME png \- Portable Network Graphics (PNG) format .SH DESCRIPTION diff --git a/png.c b/png.c index efcc6eead..d77197a07 100644 --- a/png.c +++ b/png.c @@ -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_7 Your_png_h_is_not_version_1_6_7; +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.7 - November 14, 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.7 - November 14, 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."; @@ -1722,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 @@ -3091,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 @@ -3268,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 @@ -3593,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) { @@ -3603,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 @@ -3628,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) { @@ -3650,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 @@ -3663,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). @@ -3805,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 @@ -3833,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; @@ -3844,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) || \ @@ -3853,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; @@ -3875,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 */ } @@ -3920,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; @@ -3976,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) || \ @@ -4013,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 */ diff --git a/png.h b/png.h index 55095362b..00eddac0e 100644 --- a/png.h +++ b/png.h @@ -1,7 +1,7 @@ /* png.h - header file for PNG reference library * - * libpng version 1.6.7 - November 14, 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.7 - November 14, 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: @@ -185,6 +185,10 @@ * 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 @@ -216,7 +220,7 @@ * * This code is released under the libpng license. * - * libpng versions 1.2.6, August 15, 2004, through 1.6.7, November 14, 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: @@ -328,13 +332,13 @@ * Y2K compliance in libpng: * ========================= * - * November 14, 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.7 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 @@ -394,9 +398,9 @@ */ /* Version information for png.h - this should match the version in png.c */ -#define PNG_LIBPNG_VER_STRING "1.6.7" +#define PNG_LIBPNG_VER_STRING "1.6.8" #define PNG_HEADER_VERSION_STRING \ - " libpng version 1.6.7 - November 14, 2013\n" + " libpng version 1.6.8 - December 19, 2013\n" #define PNG_LIBPNG_VER_SONUM 16 #define PNG_LIBPNG_VER_DLLNUM 16 @@ -404,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 7 +#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: @@ -435,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 10607 /* 1.6.7 */ +#define PNG_LIBPNG_VER 10608 /* 1.6.8 */ /* Library configuration: these options cannot be changed after * the library has been built. @@ -540,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_7; +typedef char* png_libpng_version_1_6_8; /* Basic control structions. Read libpng-manual.txt or libpng.3 for more info. * diff --git a/pngconf.h b/pngconf.h index 8064194c0..587d0edc9 100644 --- a/pngconf.h +++ b/pngconf.h @@ -1,7 +1,7 @@ /* pngconf.h - machine configurable file for libpng * - * libpng version 1.6.7 - November 14, 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/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/pngmem.c b/pngmem.c index b9b3efb44..8ee0866f6 100644 --- a/pngmem.c +++ b/pngmem.c @@ -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) diff --git a/pngpriv.h b/pngpriv.h index 43b2ef4c5..eb792fc90 100644 --- a/pngpriv.h +++ b/pngpriv.h @@ -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.7 [November 14, 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 @@ -1218,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); @@ -1464,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_SET_UNKNOWN_CHUNKS_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' @@ -1474,14 +1479,13 @@ PNG_INTERNAL_FUNCTION(void,png_handle_unknown,(png_structrp png_ptr, */ #if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) ||\ - defined(PNG_HANDLE_AS_UNKNOWN_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 /* READ_UNKNOWN_CHUNKS || HANDLE_AS_UNKNOWN */ -#endif /* PNG_SET_UNKNOWN_CHUNKS_SUPPORTED */ /* Handle the transformations for reading and writing */ #ifdef PNG_READ_TRANSFORMS_SUPPORTED @@ -1900,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 diff --git a/pngread.c b/pngread.c index 8f96ca23e..4bd8c7c93 100644 --- a/pngread.c +++ b/pngread.c @@ -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 3b7d484fc..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 [August 21, 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 2438384dd..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.7 [November 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.) @@ -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 @@ -3871,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; } diff --git a/pngset.c b/pngset.c index 7e355d1f4..fd718c95c 100644 --- a/pngset.c +++ b/pngset.c @@ -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; } diff --git a/pngtest.c b/pngtest.c index c3fe3204d..b37b35856 100644 --- a/pngtest.c +++ b/pngtest.c @@ -1,7 +1,7 @@ /* pngtest.c - a simple test program to test libpng * - * 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.) @@ -573,7 +573,8 @@ png_debug_free(png_structp png_ptr, png_voidp ptr) /* We must free the list element too, but first kill the memory that is to be freed. */ memset(ptr, 0x55, pinfo->size); - png_free_default(png_ptr, pinfo); + if (pinfo) + free(pinfo); pinfo = NULL; break; } @@ -592,7 +593,8 @@ png_debug_free(png_structp png_ptr, png_voidp ptr) if (verbose) printf("Freeing %p\n", ptr); - png_free_default(png_ptr, ptr); + if (ptr) + free(ptr); ptr = NULL; } #endif /* PNG_USER_MEM_SUPPORTED && PNG_DEBUG */ @@ -1578,14 +1580,12 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) #ifdef PNG_WRITE_SUPPORTED /* else nothing was written */ { - int wrote_question = 0; - for (;;) { + static int wrote_question = 0; png_size_t num_in, num_out; char inbuf[256], outbuf[256]; - num_in = fread(inbuf, 1, sizeof inbuf, fpin); num_out = fread(outbuf, 1, sizeof outbuf, fpout); @@ -1970,4 +1970,4 @@ main(void) #endif /* Generate a compiler error if there is an old png.h in the search path. */ -typedef png_libpng_version_1_6_7 Your_png_h_is_not_version_1_6_7; +typedef png_libpng_version_1_6_8 Your_png_h_is_not_version_1_6_8; diff --git a/pngwio.c b/pngwio.c index e3289dfe4..4581b0802 100644 --- a/pngwio.c +++ b/pngwio.c @@ -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 diff --git a/projects/vstudio/readme.txt b/projects/vstudio/readme.txt index c8b1736b0..70ffa51c4 100644 --- a/projects/vstudio/readme.txt +++ b/projects/vstudio/readme.txt @@ -1,7 +1,7 @@ VisualStudio instructions -libpng version 1.6.7 - November 14, 2013 +libpng version 1.6.8 - December 19, 2013 Copyright (c) 1998-2010 Glenn Randers-Pehrson diff --git a/projects/vstudio/zlib.props b/projects/vstudio/zlib.props index c55d70ce1..c540c9501 100644 --- a/projects/vstudio/zlib.props +++ b/projects/vstudio/zlib.props @@ -2,7 +2,7 @@