
Libpng 1.7.0beta90 - August 28, 2017

This is not intended to be a public release.  It will be replaced
within a few weeks by a public version or by another test version.

Files available for download:

Source files with LF line endings (for Unix/Linux) and with a
"configure" script

   1.7.0beta90.tar.xz (LZMA-compressed, recommended)
   1.7.0beta90.tar.gz

Source files with CRLF line endings (for Windows), without the
"configure" script

   /scratch/glennrp/Libpng17/lp170b90.7z  (LZMA-compressed, recommended)
   /scratch/glennrp/Libpng17/lp170b90.zip

Other information:

   1.7.0beta90-README.txt
   1.7.0beta90-LICENSE.txt
   libpng-1.7.0beta90-*.asc (armored detached GPG signatures)

Changes since the last public release (1.6.0):

Version 1.7.0alpha01 [December 15, 2012]
  Started 1.7.0 branch from libpng-1.6.0beta33.
  Made 8-bit compose and rgb_to_grayscale accuracy improvements.  These
    changes cause 16-bit arithmetic to be used for 8-bit data in the gamma
    corrected compose and grayscale operations.  The arithmetic errors have
    three sources all of which are fixed in this commit:
    1) 8-bit linear calculations produce massive errors for lower intensity
       values.
    2) The old 16-bit "16 to 8" gamma table code erroneously wrote the lowest
       output value into a table entry which corresponded to multiple output
       values (so where the value written should have been the closest to the
       transformed input value.)
    3) In a number of cases the code to access the 16-bit table did not round;
       it did a simple shift, which was wrong and made the side effects of (2)
       even worse.
  The new gamma code does not have the 16-to-8 problem at the cost of slightly
    more calculations and the algorithm used to minimize the number of
    calculations has been extended to all the 16-bit tables; it has advantages
    for any significant gamma correction.
  Rearranged png_struct, remove unused members, change png_set_filter handling
    png_struct members rearranged - partly to reorder to avoid packing, partly
    to put frequently accessed members at the start and partly to make
    the grouping more clear. png_set_filter code has been rewritten and the
    code shared with png_write_start_row moved to a common function.  Comments
    in png.h have been made more clear. Minor fixes to
    contrib/libtests/timepng.c and some of the png_*_tRNS logic, including
    more error detection in png_set_tRNS.
  Cleaned up USER_LIMITS feature, removing members from png_struct when not
    required.
  Rearranged ARM-NEON optimizations to isolate the machine specific code to
    the hardware subdirectory, and add comments to pngrutil.c so that
    implementors of other optimizations will know what to do.
  Fixed cases of unquoted DESTDIR in Makefile.am.
  Rebuilt Makefile.in, configure, etc., with autoconf-2.69 and automake-1.12.5.

Version 1.7.0alpha02 [December 17, 2012]
  Removed functions that were deprecated in libpng-1.6.0:
    png_reset_zstream(), png_info_init_3(), and png_data_freer() and its
    associated flags.
  Removed some duplicated lines from contrib/tools/scale.c and png.c.
  Changed some instances of png_warning() to png_app_error().
  Updated some left over "1.6.0beta32" in code sources.
  Fixed a "png_structp" prototype (should be png_structrp) in arm_init.c
  Updated the version-number hack in pngvalid.c

Version 1.7.0alpha03 [December 19, 2012]
  Cleaned up and enhanced the configure option; libpng now correctly
    links and tests against zlib with a prefix; tests have been clarified; and
    irrelevant or obsolete things (as defined by the autotools man page) have
    been removed.
  Documented new PNG_ABORT behavior in the manual and commentary in pngerror.c
  Cleaned up whitespace in the synopsis portion of the manpage "libpng.3"
  Fixed previous support for Z_PREFIX in configure builds, corrected sCAL APIs;
    some of these use floating point arithmetic so they need to be disabled if
    floating point arithmetic is switched off.  This is a quiet API change -
    previously it appeared that the APIs were supported if fixed point
    arithmetic was used internally, however they required certain APIs (floor,
    modf, frexp, atof) that are part of C floating point support. Changed
    png_fixed and the gamma code specific version of the same to avoid floor(),
    which may be a library function (not an intrinsic). Removed unused #if 0
    code.
  Disassembled the version number in scripts/options.awk (necessary for
    building on SunOs).

Version 1.7.0alpha04 [December 23, 2012]
  Added scripts/makefile.msys contributed by Christopher M. Wheeler
  Made default Zlib compression settings be configurable. This adds #defines to
    pnglibconf.h to control the defaults.
  Fixed Windows build issues, enabled ARM compilation. Various warnings issued
    by earlier versions of GCC fixed for Cygwin and Min/GW (which both use old
    GCCs.) ARM support is enabled by default in zlib.props (unsupported by
    Microsoft) and ARM compilation is made possible by deleting the check for
    x86. The test programs cannot be run because they are not signed.

Version 1.7.0alpha05 [December 24, 2012]
  Discontinued distributing libpng-1.x.x.tar.bz2.
  Discontinued distributing libpng-1.7.0-1.6.0-diff.txt and similar.

Version 1.7.0alpha06 [January 1, 2013]
  Fixed 'make distcheck' on SUN OS - libpng.so was not being removed

Version 1.7.0alpha07 [January 10, 2013]
  Fixed conceivable but difficult to repro overflow. Also added two test
    programs to generate and test a PNG which should have the problem.

Version 1.7.0alpha08 [January 17, 2013]
  Corrected previous attempt at overflow detection in png_set_unknown_chunks()
  (CVE-2013-7353).  Added overflow detection in png_set_sPLT() and
  png_set_text_2() (CVE-2013-7354).

Version 1.7.0alpha09 [January 21, 2013]
  Pulled changes to multi-chunk handling from libpng-1.6.0beta40.

Version 1.7.0alpha10 [February 5, 2013]
  Make symbol prefixing work with the ARM neon optimizations. Also
    allow pngpriv.h to be included for preprocessor definitions only, so
    it can be used in non-C/C++ files.
  Added png_get_palette_max() function.
  Changed png_size_t to size_t throughout headers, make sRGB check numbers
    consistent.
  Fixed ARM support (Mans Rullgard).
  Removed stray out-of-order #endif and #ifdef (Mans Rullgard).
  Ported libpng 1.5 options.awk/dfn file handling to 1.7, fixed one bug.
  Rebuilt Makefile.in, configure, etc., with autoconf-2.69 and automake-1.13.
  Minor fixes to assembler changes, verified with a dummy .S file
  Removed cc -E workround, corrected png_get_palette_max API. Tested on
    SUN OS cc 5.9, which demonstrates the tokenization problem previously
    avoided by using /lib/cpp.  Since all .dfn output is now protected
    in double quotes unless it is to be macro substituted the fix should work
    everywhere.

Version 1.7.0beta01 [February 15, 2013]
  Enable parallel tests and rearrange TESTS order to take advantage of
    the massive speed improvements use a make capable of parallel builds
    on a multi-CPU machine and pass the right arguments to make (-j10000
    for GNU make) to get the build to run in parallel.
  Fixed previous support for Z_PREFIX in configure builds, corrected
    sCAL APIs; some of these use floating point arithmetic so need to be
    disabled if floating point arithmetic is switched off.  This is a quiet API
    change - previously it appeared that the APIs were supported if fixed point
    arithmetic was used internally, however they required certain APIs (floor,
    modf, frexp, atof) that are part of C floating point support. Changed
    png_fixed and the gamma code specific version of the same to avoid floor(),
    which may be a library function (not an intrinsic). Removed unused #if 0
    code.
  Fixed make distcheck to skip over the test result files. They were
    being included because the whole of the 'tests' directory is included,
    fixed to just include the actual test files and tests/pngstest.  Also
    reverted the previous erroneous change to remove the ${srcdir} from the
    front of contrib, scripts, projects and added an explanation of what is
    going on to Makefile.am
  Fixed missing dependency in --prefix builds. The intermediate
    internal 'prefix.h' file can only be generated correctly after pnglibconf.h,
    however the dependency was not in Makefile.am.  The symptoms are
    unpredictable depending on the order make chooses to build pngprefix.h and
    pnglibconf.h, often the error goes unnoticed because there is a system
    pnglibconf.h to use instead.
  Accept "," as a separator in pnglibconf.dfa and allow for
    continuation lines. This adds to the syntax of "option" and "chunk" lines,
    allowing the elements to be separated by a "," at the end of an element and
    interpreting a "," at end of line as a continuation - so the following line
    is read.  The new syntax is optional and solely provided for readability.
  Enclosed the new png_get_palette_max in #ifdef PNG_GET_PALETTE_MAX_SUPPORTED
    block, and revised pnglibconf.h and pnglibconf.h.prebuilt accordingly.

Version 1.7.0beta02 [February 18, 2013]
  Fixed a race condition in the creation of the build 'scripts' directory
    while building with a parallel make.
  Use approved/supported Android method to check for NEON, use Linux/POSIX
    1003.1 API to check /proc/self/auxv avoiding buffer allocation and other
    library calls (ported from libpng15).
  Use parentheses more consistently in "#if defined(MACRO)" tests.
  Folded long lines.

Version 1.7.0beta03 [February 22, 2013]
  Reenabled code to allow zero length PLTE chunks for MNG.
  Fixed ALIGNED_MEMORY support.
  Allow run-time ARM NEON checking to be disabled. A new configure option:
    --enable-arm-neon=always will stop the run-time checks. New checks
    within arm/arm_init.c will cause the code not to be compiled unless
    __ARM_NEON__ is set. This should make it fail safe (if someone asks
    for it on then the build will fail if it can't be done.)
  Updated the INSTALL document.

Version 1.7.0beta04 [February 27, 2013]
  Revised INSTALL to recommend using CPPFLAGS instead of INCLUDES.
  Revised scripts/makefile.freebsd to respect ZLIBLIB and ZLIBINC.
  Revised scripts/dfn.awk to work with the buggy MSYS awk that has trouble
    with CRLF line endings.

Version 1.7.0beta05 [March 5, 2013]
  Avoid a possible memory leak in contrib/gregbook/readpng.c
  Changed user chunk callback API to respect global and per chunk defaults.
    Previously a return of 0 from a user chunk callback would result in the
    chunk being saved (if this was safe, even if the chunk was unsafe-to-copy);
    this change respects the defaults set by the application, so unknown chunks
    can be discarded by default and known-safe ones preserved.
  Corrected Android builds and corrected libpng.vers with symbol
    prefixing. This adds an API to set optimization options externally,
    providing an alternative and general solution for the non-portable
    run-time tests used by the ARM Neon code.  It also makes those tests
    compile and link on Android.  The order of settings vs options in
    pnglibconf.h is reversed to allow settings to depend on options and
    options can now set (or override) the defaults for settings.

Version 1.7.0beta06 [March 13, 2013]
  Corrected simplified API default gamma for color-mapped output, added
    a flag to change default. In 1.6.0 when the simplified API was used
    to produce color-mapped output from an input image with no gamma
    information the gamma assumed for the input could be different from
    that assumed for non-color-mapped output.  In particular 16-bit depth
    input files were assumed to be sRGB encoded, whereas in the 'direct'
    case they were assumed to have linear data.  This was an error.  The
    fix makes the simplified API treat all input files the same way and
    adds a new flag to the png_image::flags member to allow the
    application/user to specify that 16-bit files contain sRGB data
    rather than the default linear.
  Fixed bugs in the pngpixel and makepng test programs.
  Fixed CMakelists.txt to allow building a single variant of the library
    (Claudio Bley):
  Introduced a PNG_LIB_TARGETS variable that lists all activated library
    targets.  It is an error if this variable ends up empty, ie. you have
    to build at least one library variant.
  Made the *_COPY targets only depend on library targets actually being build.
  Use PNG_LIB_TARGETS to unify a code path.
  Changed the CREATE_SYMLINK macro to expect the full path to a file as the
    first argument. When symlinking the filename component of that path is
    determined and used as the link target.
  Use copy_if_different in the CREATE_SYMLINK macro.
  Eliminated two warnings from the Intel C compiler. The warnings are
    technically valid, although a reasonable treatment of division would
    show it to be incorrect.

Version 1.7.0beta07 [April 14, 2013]
  Updated documentation of 1.5.x to 1.6.x changes in iCCP chunk handling.
  Fixed incorrect warning of excess deflate data. End condition - the
    warning would be produced if the end of the deflate stream wasn't read
    in the last row.  The warning is harmless.
  Corrected the test on user transform changes on read. It was in the
    png_set of the transform function, but that doesn't matter unless the
    transform function changes the rowbuf size, and that is only valid if
    transform_info is called.
  Corrected a misplaced closing bracket in contrib/libtests/pngvalid.c
    (Flavio Medeiros).
  Corrected length written to uncompressed iTXt chunks (Samuli Suominen).

Version 1.7.0beta08 [April 18, 2013]
  Added contrib/tools/fixitxt.c, to repair the erroneous iTXt chunk length
    written by libpng-1.6.0 and 1.6.1.
  Disallow storing sRGB information when the sRGB is not supported.

Version 1.7.0beta09 [April 24, 2013]
  Exposed PNG chunk types in png.h
  Modified png_uint_32 macros/code to make as few assumptions as possible
  Revised stack marking in arm/filter_neon.S and configure.ac
  Ensure that NEON filter stuff is completely disabled when switched 'off'.
    Previously the ARM NEON specific files were still built if the option
    was switched 'off' as opposed to being explicitly disabled.

Version 1.7.0beta10 [April 24, 2013]
  Attempt to fix the PNG_ARM_NEON configuration mess.

Version 1.7.0beta11 [April 26, 2013]
  Test for 'arm*', not just 'arm' in the host_cpu configure variable.

Version 1.7.0beta12 [April 30, 2013]
  Added png_app_warning for out-of-range unknown chunk index in
    png_set_unknown_chunk_location().
  Expanded manual paragraph about writing private chunks.
  Avoid dereferencing NULL pointer possibly returned from
     png_create_write_struct() (Andrew Church).

Version 1.7.0beta13 [May 12, 2013]
  Revised contrib/pngminim/*/makefile to generate pnglibconf.h with the
    right zlib header files.
  Separated CPPFLAGS and CFLAGS in contrib/pngminim/*/makefile
  Updated contrib/pngminus/pnm2png.c (Paul Stewart):
    Check for EOF
    Ignore "#" delimited comments in input file to pnm2png.c.
    Fixed whitespace handling
    Added a call to png_set_packing()
    Initialize dimension values so if sscanf fails at least we have known
      invalid values.
  Calculate our own zlib windowBits when decoding rather than trusting the
    CMF bytes in the PNG datastream.
  Added an option to force maximum window size for inflating, which was
    the behavior of libpng15 and earlier.
  Added png-fix-itxt and png-fix-too-far-back to the built programs and
    removed warnings from the source code and timepng that are revealed as
    a result.
  Detect wrong libpng versions linked to png-fix-too-far-back, which currently
    only works with libpng versions that can be made to reliably fail when
    the deflate data contains an out-of-window reference.  This means only
    1.6 and later.
  Attempt to detect configuration issues with png-fix-too-far-back, which
    requires both the correct libpng and the correct zlib to function
    correctly.
  Check ZLIB_VERNUM for mismatches, enclose #error in quotes
  Added information in the documentation about problems with and fixes for
    the bad CRC and bad iTXt chunk situations.

Version 1.7.0beta14 [June 8, 2013]
  Removed a redundant test in png_set_IHDR().
  Added set(CMAKE_CONFIGURATION_TYPES ...) to CMakeLists.txt (Andrew Hundt)
  Deleted set(CMAKE_BUILD_TYPE) block from CMakeLists.txt
  Enclose the prototypes for the simplified write API in #ifdef STDIO/#endif
  Make ARM NEON support work at compile time (not just configure time).
    This moves the test on __ARM_NEON__ into pngconf.h to avoid issues when
    using a compiler that compiles for multiple architectures at one time.
  Removed PNG_FILTER_OPTIMIZATIONS and PNG_ARM_NEON_SUPPORTED from
    pnglibconf.h, allowing more of the decisions to be made internally
    (pngpriv.h) during the compile.  Without this, symbol prefixing is broken
    under certain circumstances on ARM platforms.  Now only the API parts of
    the optimizations ('check' vs 'api') are exposed in the public header files
    except that the new setting PNG_ARM_NEON_OPT documents how libpng makes the
    decision about whether or not to use the optimizations.
  Protect symbol prefixing against CC/CPPFLAGS/CFLAGS useage.
    Previous iOS/Xcode fixes for the ARM NEON optimizations moved the test
    on __ARM_NEON__ from configure time to compile time.  This breaks symbol
    prefixing because the definition of the special png_init_filter_functions
    call was hidden at configure time if the relevant compiler arguments are
    passed in CFLAGS as opposed to CC.  This change attempts to avoid all
    the confusion that would result by declaring the init function even when
    it is not used, so that it will always get prefixed.

Version 1.7.0beta15 [June 18, 2013]
  Revised libpng.3 so that "doclifter" can process it.

Version 1.7.0beta16 [July 5, 2013]
  Revised example.c to illustrate use of PNG_DEFAULT_sRGB and PNG_GAMMA_MAC_18
    as parameters for png_set_gamma().  These have been available since
    libpng-1.5.4.
  Renamed contrib/tools/png-fix-too-far-back.c to pngfix.c and revised it
    to check all compressed chunks known to libpng.
  Updated documentation to show default behavior of benign errors correctly.
  Added perfect hash code generation for lists of PNG chunks. This is
    a work in progress; checked in for use in pngfix.c
  Ported ARM no-read patch from libpng16.
  Ported pngfix.c patches from libpng16.

Version 1.7.0beta17 [August 21, 2013]
  Revised manual about changes in iTXt chunk handling made in libpng-1.6.0.
  Added "/* SAFE */" comments in pngrutil.c and pngrtran.c where warnings
    may be erroneously issued by code-checking applications.
  Added information about png_set_options() to the manual.
  Delay calling png_init_filter_functions() until a row with nonzero filter
    is found.

Version 1.7.0beta18 [September 16, 2013]
  Fixed inconsistent conditional compilation of png_chunk_unknown_handling()
    prototype, definition, and usage.  Made it depend on
    PNG_HANDLE_AS_UNKNOWN_SUPPORTED everywhere.

Version 1.7.0beta19 [September 30, 2013]
  Reverted the change to unknown handling #defines; the change breaks 'NOREAD'
    builds.
  Fixed default behavior of ARM_NEON_API. If the ARM NEON API option is
    compiled without the CHECK option it defaulted to on, not off.
  Catch up with recent libpng16 changes; unknown handling and spelling
    corrections
  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 some grammatical changes and updated the png chunks list.

Version 1.7.0beta20 [October 13, 2013]
  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.

Version 1.7.0beta21 [November 2, 2013]
  Added ARMv8 support (James Yu <james.yu at linaro.org>).  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.

Version 1.7.0beta22 [November 7, 2013]
  Fixed #include in filter_neon_intrinsics.c and ctype macros. The ctype char
    checking macros take an unsigned char argument, not a signed char.

Version 1.7.0beta23 [November 24, 2013]
  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().

Version 1.7.0beta24 [December 15, 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
  Tidied up pngfix inits and fixed pngtest no-write builds.
  Bookkeeping: Moved functions around (no changes). Moved transform
    function definitions before the place where they are called so that
    they can be made static. Move the intrapixel functions and the
    grayscale palette builder out of the png?tran.c files. The latter
    isn't a transform function and is no longer used internally, and the
    former MNG specific functions are better placed in pngread/pngwrite.c
  Made transform implementation functions static. This makes the internal
    functions called by png_do_{read|write}_transformations static. On an
    x86-64 DLL build (Gentoo Linux) this reduces the size of the text
    segment of the DLL by 1208 bytes, about 0.6%. It also simplifies
    maintenance by removing the declarations from pngpriv.h and allowing
    easier changes to the internal interfaces.
  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.  Libpng-1.6.1 through 1.6.7 and libpng-1.7.0beta03
    through 1.7.0beta23 are vulnerable.  Libpng-1.6.0 and earlier do not
    have the bug.

Version 1.7.0beta25 [December 26, 2013]
  Merged files with version 1.6.8 that have not changed since then.
  Rebuilt configure scripts with automake-1.14.1 and autoconf-2.69

Version 1.7.0beta26 [January 1, 2014]
  Added libpng 1.5 checks to pngvalid.c
  Merged with 1.5 and 1.6 changes to create a single pngvalid.c
  Added dSIG to chunk list in png.h
  Removed #error macro from contrib/tools/pngfix.c (Thomas Klausner).
  Merged pngrio.c, pngtrans.c, and pngwio.c with libpng-1.6.9
  Fixed test programs for interlace options. Made pngvalid.c and
    pngtest.c work correctly when READ_INTERLACING and/or WRITE_INTERLACING
    are switched off.
  Changed pngvalid.c to support libpng 1.5, which does not support
    the PNG_MAXIMUM_INFLATE_WINDOW option, so #define it out when
    appropriate in pngvalid.c
  Allow unversioned links created on install to be disabled in configure.
    In configure builds 'make install' changes/adds links like png.h
    and libpng.a to point to the newly installed, versioned, files (e.g.
    libpng17/png.h and libpng17.a). Three new configure options and some
    rearrangement of Makefile.am allow creation of these links to be disabled.

Version 1.7.0beta27 [January 10, 2014]
  Removed potentially misleading warning from png_check_IHDR().

Version 1.7.0beta28 [January 20, 2014]
  Updated scripts/makefile.* to use CPPFLAGS (Cosmin).
  Added clang attribute support (Cosmin).

Version 1.7.0beta29 [January 30, 2014]
  Quiet an uninitialized memory warning from VS2013 in png_get_png().

Version 1.7.0beta30 [February 2, 2014]
  Fixed a large number of instances where PNGCBAPI was omitted from
    function definitions.
  Added pngimage test program for png_read_png and png_write_png. This
    is a work-in-progress; no tests are run automatically at present and
    the program by virtue of exhaustively testing all the transforms is
    very slow.

Version 1.7.0beta31 [February 6, 2014]
  Make png_read_png() and png_write_png() prototypes in png.h depend
    upon PNG_READ_SUPPORTED and PNG_WRITE_SUPPORTED.
  Removed dependence on !PNG_READ_EXPAND_SUPPORTED for calling
    png_set_packing() in png_read_png().
  Completed full working pngimage test program and added two test scripts.
  Fixed combination of ~alpha with shift. On read invert alpha, processing
    occurred after shift processing, which causes the final values to be
    outside the range that should be produced by the shift. Reversing the
    order on read makes the two transforms work together correctly and mirrors
    the order used on write.
  Do not read invalid sBIT chunks. Previously libpng only checked sBIT
    values on write, so a malicious PNG writer could therefore cause
    the read code to return an invalid sBIT chunk, which might lead to
    application errors or crashes.  Such chunks are now skipped (with
    chunk_benign_error).
  Restored a line, "c = b;", that was inadvertently deleted from the
    PAETH filtering code from libpng-1.7.0beta24/pngrutil.c. Deleted
    the other instance of "c = b;" which is the one that triggered a
    scan-build warning.
  Support builds with unsupported PNG_TRANSFORM_* values.  All of the
    PNG_TRANSFORM_* values are always defined in png.h and, because they
    are used for both read and write in some cases, it is not reliable
    to #if out ones that are totally unsupported. This change adds error
    detection in png_read_image() and png_write_image() to do a
    png_app_error() if the app requests something that cannot be done
    and it adds corresponding code to pngimage.c to handle such options
    by not attempting to test them.

Version 1.7.0beta32 [February 26, 2014]
  Moved redefines of png_error(), png_warning(), png_chunk_error(),
    and png_chunk_warning() from pngpriv.h to png.h to make them visible
    to libpng-calling applications.
  Moved OS dependent code from arm/arm_init.c, to allow the included
    implementation of the ARM NEON discovery function to be set at
    build-time and provide sample implementations from the current code in the
    contrib/arm-neon subdirectory. The __linux__ code has also been changed to
    compile and link on Android by using /proc/cpuinfo, and the old linux code
    is in contrib/arm-neon/linux-auxv.c.  The new code avoids POSIX and Linux
    dependencies apart from opening /proc/cpuinfo and is C90 compliant.
  Check for info_ptr == NULL early in png_read_end() so we don't need to
    run all the png_handle_*() and depend on them to return if info_ptr == NULL.
    This improves the performance of png_read_end(png_ptr, NULL) and makes
    it more robust against future programming errors.
  Check for __has_extension before using it in pngconf.h, to
    support older Clang versions (Jeremy Sequoia).
  Use a user warning handler in contrib/gregbook/readpng2.c instead of default,
    so warnings will be put on stderr even if libpng has CONSOLE_IO disabled.
  Added png_ptr->process_mode = PNG_READ_IDAT_MODE in png_push_read_chunk
    after recognizing the IDAT chunk, which avoids an infinite loop while
    reading a datastream whose first IDAT chunk is of zero-length.
    This fixes CERT VU#684412 and CVE-2014-0333.
  Don't recognize known sRGB profiles as sRGB if they have been hacked,
    but don't reject them and don't issue a copyright violation warning.
  Minor editing of contrib/arm-neon/README and contrib/examples/*.c
  Moved some documentation from png.h to libpng.3 and libpng-manual.txt

Version 1.7.0beta33 [February 27, 2014]
  Fixed typos in the manual and in scripts/pnglibconf.dfa (CFLAGS -> CPPFLAGS
    and PNG_USR_CONFIG -> PNG_USER_CONFIG).

Version 1.7.0beta34 [March 17, 2014]
  Treat CRC error handling with png_set_crc_action(), instead of with
    png_set_benign_errors(), which has been the case since libpng-1.6.0beta18.
  Use "if (value != 0)" instead of "if (value)" consistently.
  Changed ZlibSrcDir from 1.2.5 to 1.2.8 in projects/vstudio.
  Moved configuration information from the manual to the INSTALL file.

Version 1.7.0beta35 [August 6, 2014]
  Removed #if/#else/#endif from inside two pow() calls in pngvalid.c because
    they were handled improperly by Portland Group's PGI-14.1 - PGI-14.3
    when using its "__builtin_pow()" function.
  Silence 'unused parameter' build warnings (Cosmin).
  $(CP) is now used alongside $(RM_F).  Also, use 'copy' instead
    of 'cp' where applicable, and applied other minor makefile changes.
  Don't warn about invalid dimensions exceeding user limits.
  Allow an easy replacement of the default pre-built configuration
    header with a custom header, via the make PNGLIBCONF_H_PREBUILT
    macro.
  Fixed a typo in pngrutil.c, introduced in libpng-1.5.6, that interferes
    with "blocky" expansion of sub-8-bit interlaced PNG files (Eric Huss).
  Removed scripts/makefile.elf. It has not worked since libpng-1.5.0beta14
    due to elimination of the PNG_FUNCTION_EXPORT and PNG_DATA_EXPORT
    definitions from pngconf.h.
  Ensure that CMakeLists.txt makes the target "lib" directory before making
    symbolic link into it (SourceForge bug report #226 by Rolf Timmermans).
  Added opinion that the ECCN (Export Control Classification Number) for
    libpng is EAR99 to the README file.

Version 1.7.0beta36 [September 27, 2014]
  Updated scripts/makefiles from libpng-1.6.13beta04.
  Minor updates to the manual from libpng-1.6.14beta04.
  Fixed incorrect handling of the iTXt compression flag in pngrutil.c
    (bug report by Shunsaku Hirata).  Bug was introduced in libpng-1.6.0.

Version 1.7.0beta37 [September 28, 2014]
  Merged scripts/*, pngvalid.c and pngfix.c with libpng-1.6.14beta04.

Version 1.7.0beta38 [October 17, 2014]
  Added "option READ_iCCP enables READ_COMPRESSED_TEXT" to pnglibconf.dfa
  Removed unused "text_len" parameter from private function png_write_zTXt().
  Conditionally compile some code in png_deflate_claim(), when
    PNG_WARNINGS_SUPPORTED and PNG_ERROR_TEXT_SUPPORTED are disabled.
  Replaced repeated code in pngpread.c with PNG_PUSH_SAVE_BUFFER_IF_FULL.
  Added "chunk iTXt enables TEXT" and "chunk zTXt enables TEXT"
    to pnglibconf.dfa.
  Removed "option READ_COMPRESSED_TEXT enables READ_TEXT" from pnglibconf.dfa,
    to make it possible to configure a libpng that supports iCCP but not TEXT.
  Removed "option WRITE_COMPRESSED_TEXT enables WRITE_TEXT" from pnglibconf.dfa
  Only mark text chunks as written after successfully writing them.

Version 1.7.0beta39 [November 1, 2014]
  Ported cosmetic changes from libpng-1.6.15beta02.

Version 1.7.0beta40 [November 6, 2014]
  Made a one-line revision to configure.ac to support ARM on aarch64
    (bug report by Marcin Juszkiewicz, fix by John Bowler).
  Use png_get_libpng_ver(NULL) instead of PNG_LIBPNG_VER_STRING in
    example.c, pngtest.c, and applications in the contrib directory.
  Avoid out-of-bounds memory access in png_user_version_check().
  Simplified and future-proofed png_user_version_check().
  Fixed GCC unsigned int->float warnings. Various versions of GCC
    seem to generate warnings when an unsigned value is implicitly
    converted to double. This is probably a GCC bug but this change
    avoids the issue by explicitly converting to (int) where safe.
  Free all allocated memory in pngimage. The file buffer cache was left
    allocated at the end of the program, harmless but it causes memory
    leak reports from clang.
  Fixed array size calculations to avoid warnings. At various points
    in the code the number of elements in an array is calculated using
    sizeof.  This generates a compile time constant of type (size_t) which
    is then typically assigned to an (unsigned int) or (int). Some versions
    of GCC on 64-bit systems warn about the apparent narrowing, even though
    the same compiler does apparently generate the correct, in-range,
    numeric constant.  This adds appropriate, safe, casts to make the
    warnings go away.

Version 1.7.0beta41 [November 7, 2014]
  Added #ifdef PNG_16BIT_SUPPORTED/#endif around png_log16bit() and
    png_do_swap().
  Changed all "#endif /* PNG_FEATURE_SUPPORTED */" to "#endif /* FEATURE */"

Version 1.7.0beta42 [November 20, 2014]
  The macros passed in the command line to Borland make were ignored if
    similarly-named macros were already defined in makefiles. This behavior
    is different from POSIX make and other make programs.  Surround the
    macro definitions with ifndef guards (Cosmin).
  Added "-D_CRT_SECURE_NO_WARNINGS" to CFLAGS in scripts/makefile.vcwin32.
  Removed the obsolete $ARCH variable from scripts/makefile.darwin.
  Merged clang no-warning fix from libpng-1.6.13: png_digit was defined
    but never used in pngerror.c.

Version 1.7.0beta43 [December 18, 2014]
  Added ".align 2" to arm/filter_neon.S to support old GAS assemblers that
    don't do alignment correctly.
  Revised Makefile.am and scripts/*.dfn to work with MinGW/MSYS;
    renamed scripts/*.dfn to scripts/*.c (Bob Friesenhahn and John Bowler).
  Quiet a "comparison always true" warning in pngstest.c (John Bowler).

Version 1.7.0beta44 [December 23, 2014]
  Restored a test on width that was removed from png.c at libpng-1.6.9
    (Bug report by Alex Eubanks, CVE-2015-0973).
  Fixed an overflow in png_combine_row() with very wide interlaced images
    (Bug report and fix by John Bowler, CVE-2014-9495).
  Corrected the width limit calculation in png_check_IHDR().
  Removed extraneous handling of PNG_SAFE_LIMITS_SUPPORTED from pngconf.h

Version 1.7.0beta45 [December 28, 2014]
  Eliminated the PNG_SAFE_LIMITS macro and restored the 1-million-column
    and 1-million-row default limits in pnglibconf.dfa, that can be reset
    by the user at build time or run time.  This provides a more robust
    defense against DOS and as-yet undiscovered overflows.
  Removed user limits from pngfix. Also pass NULL pointers to
    png_read_row to skip the unnecessary row de-interlace stuff.
  Added testing of png_set_packing() to pngvalid.c

Version 1.7.0beta46 [January 2, 2015]
  Regenerated configure scripts in the tar distributions with libtool-2.4.4
  Implement previously untested cases of libpng transforms in pngvalid.c
  Fixed byte order in 2-byte filler, in png_do_read_filler().
  Allow user to call png_get_IHDR() with NULL arguments (Reuben Hawkins).

Version 1.7.0beta47 [January 29, 2015]
  Made the check for out-of-range values in png_set_tRNS() detect
    values that are exactly 2^bit_depth, and work on 16-bit platforms.
  Added PNG_SKIP_sRGB_CHECK_PROFILE choice for png_set_option().
  Report all IHDR errors before exiting png_check_IHDR().
  Merged some parts of libpng-1.6.17beta01 and libpng-1.7.0beta47.
  Added #ifndef __COVERITY__ where needed in png.c, pngrutil.c and
    pngset.c to avoid warnings about dead code.

Version 1.7.0beta48 [February 7, 2015]
  Work around one more Coverity-scan dead-code warning.
  Do not build png_product2() when it is unused.

Version 1.7.0beta49 [February 11, 2015]
  Combined sub_row, up_row, avg_row, and paeth_row buffers into a
    single try_row buffer.
  Added PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED macro, on by default.
  Consolidated redundant code in pngwutil.c
  Deal with integer overflow of sum in pngwutil.c

Version 1.7.0beta50 [February 15, 2015]
  Combined sub_row, up_row, avg_row, and paeth_row buffers into a
    single try_row buffer and in cases where two or more of those are
    being tested, a second tst_row buffer.  This improves CPU speed
    over that achieved by libpng-1.7.0beta49.

Version 1.7.0beta51 [February 17, 2015]
  Combined similar parts of png_write_find_filter() into a png_increase_lmins()
    function.
  Display user limits in the output from pngtest.
  Replaced test for harmless integer overflow (wraparound) in pngwutil.c
    with a method that prevents overflow and does not increase cpu usage
    significantly.

Version 1.7.0beta52 [February 21, 2015]
  Added information about setjmp/simplified API interaction in the
    manual page and INSTALL file. Added information about using
    row_pointers with a single height*width*bpp allocated block
  Rebuilt configure scripts with automake-1.15 and libtool-2.4.6

Version 1.7.0beta53 [February 23, 2015]
  Restored compiling of png_reciprocal2 with PNG_NO_16BIT.

Version 1.7.0beta54 [March 4, 2015]
  Moved png_set_filter() prototype into a PNG_WRITE_SUPPORTED block
    of png.h.
  Conditionally compile a small amount of code in pngwutil.c
  Avoid runtime checks when converting integer to png_byte with
    Visual Studio (Sergey Kosarevsky)
  Merged pngwrite.c with libpng-1.6.17beta06/pngwrite.c

Version 1.7.0beta55 [March 9, 2015]
  Removed some comments that the configure script did not handle
    properly from scripts/pnglibconf.dfa and pnglibconf.h.prebuilt.
  Spelling fixes ("then", "occured") reported by Lauri Nurmi.
  Added more error reporting in png_default_read_data().
  Merged png_free_data() with libpng-1.6.17rc02.

Version 1.7.0beta56 [March 11, 2015]
  Updated CMakeLists.txt to add OSX framework, change YES/NO to ON/OFF
    for consistency, and remove some useless tests (Alexey Petruchik).

Version 1.7.0beta57 [March 16, 2015]
  Remove pnglibconf.h, pnglibconf.c, and pnglibconf.out instead of
    pnglibconf.* in "make clean" (Cosmin).
  Fix bug in calculation of maxbits, in png_write_sBIT, introduced
    in libpng-1.6.17beta01 (John Bowler).
  Revert change to png_default_read_data() made in libpng-1.7.0beta55.

Version 1.7.0beta58 [March 25, 2015]
  Implemented affirm() support and usage.
  Remove pnglibconf.dfn and pnglibconf.pre with "make clean".
  Added byte, short and other overflow checking
  Added 'affirm' based overflow checking for debug builds for char
    and short assignments. Simply ignore the error in release builds
    (a truncated value will be used without warning). Controlled by
    PNG_RANGE_CHECK_SUPPORTED.
  Improved some overflow handling. PNG_RELEASE_BUILD replaces tests
    where the code depended on the build base type and can be defined on
    the command line, allowing testing in beta builds.  Overflows previously
    handled by png_warning in png.c have been changed to use new
    macros/affirm functions so that beta builds will abort on overflow and
    release builds will quietly ignore it.  This avoids release builds
    producing warnings that are of no use to end users.
  Check (png_uint_16) casts for overflow. Also removed png_muldiv_warn,
    added RELEASE/!RELEASE convenience macros. png_muldiv_warn was used in
    only one place, and the overflow condition is a genuine warning not
    an internal error.  Four macros allow code or function parameters to be
    condition on RELEASE (or not) builds and tidy up the #ifdef handling of
    functions.

Version 1.7.0beta59 [April 19, 2015]
  Transformed rewrite: changed row_info, added checks. This introduces an
    internal struct (png_transform_control) to replace row_info and uses
    that to implement affirms correctly.  The change also adds checks on
    the rowbytes calculation and additional checks on most transform
    implementations.
  Added png_uint_16 range checking, pngvalid tRNS, fixed png_uint_16:
    review of previous checks, removal of some where SAFE. pngvalid: add
    testing of tRNS for better code coverage pngvalid: correct rgb-to-gray
    error calculations. Code coverage is still incomplete: see /*UNTESTED*/
    in pngrtran.c. This fixes some arithmetic errors that caused some tests
    to fail on some 32-bit platforms (Bug reports by Peter Breitenlohner [i686]
    and Petr Gajdos [i586]).
  Suppressed some warnings from the Borland C++ 5.5.1/5.82 compiler
    (Bug report by Viktor Szaka'ts).

Version 1.7.0beta60 [May 6, 2015]
  Replaced "unexpected" with an integer (0xabadca11) in pngset.c
    where a long was expected, to avoid a compiler warning when PNG_DEBUG > 1.

Version 1.7.0beta61 [May 31, 2015]
  Avoid Coverity issue 80858 (REVERSE NULL) in pngtest.c
  Avoid a harmless potential integer overflow in png_XYZ_from_xy() (Bug
    report from Christopher Ferris).
  Changed png_voidcast(), etc., to voidcast(), etc., in contrib/tools/pngfix.c
    to avoid confusion with the libpng private macros.
  Fixed old cut&paste bug in the weighted filter selection code in
    pngwutil.c, introduced in libpng-0.95, March 1997.

Version 1.7.0beta62 [June 1, 2015]
  Removed the experimental WRITE_WEIGHTED_FILTERED code, to save a few
    kbytes of the compiled library size. It never worked properly and as
    far as we can tell, no one uses it. The png_set_filter_heuristics() and
    png_set_filter_heuristics_fixed() APIs are retained but deprecated.

Version 1.7.0beta63 [June 6, 2015]
  Quieted some Coverity issues in pngfix.c, png-fix-itxt.c, pngvalid.c,
    pngstest.c, and pngimage.c. Most seem harmless, but png-fix-itxt
    would only work with iTXt chunks with length 255 or less.
  Fixed cexcept.h in which GCC 5 reported that one of the auto
    variables in the Try macro needs to be volatile to prevent value
    being lost over the setjmp, and fixed g++ build breaks (John Bowler).
  Moved READ_GAMMA to pngrtran.c. This makes everything in pngrtrans.c
    depend on READ_TRANSFORMS and moves all the transform gamma (READ_GAMMA)
    code from elsewhere to png_tran.c.  There are no code changes. 
    There is one remaining use of the gamma (16-bit) code in the simplified
    API in pngread.c but that is because of a long-standing libpng bug,
    namely that the gamma corrected palette is no produced by
    png_read_update_info (John Bowler).
  Completed AArch64 support. The previous change to recognize __ARM_NEON
    didn't touch all the required preprocessor lines. This change removes
    support for __ARM_NEON__ completely and makes this consistent.
  Added #ifdef's to contrib/examples programs so people don't try
    to compile them without the minimum required support enabled
    (suggested by Flavio Medeiros).

Version 1.7.0beta64 [July 26, 2015]
  Removed non-working progressive reader 'skip' function. This
    function has apparently never been used. It was implemented
    to support back-door modification of png_struct in libpng-1.4.x
    but (because it does nothing and cannot do anything) was apparently
    never tested (John Bowler).
  Eliminated the final two Coverity defects (insecure temporary file
    handling in contrib/libtests/pngstest.c; possible overflow of
    unsigned char in contrib/tools/png-fix-itxt.c). To use the "secure"
    file handling, define PNG_USE_MKSTEMP, otherwise "tmpfile()" will
    be used.
  Removed some unused WEIGHTED_FILTER macros from png.h and pngstruct.h
  Rearranged png.h to put the major sections in the same order as
    in libpng16.
  Belatedly added Mans Rullgard and James Yu to the list of Contributing
    Authors.

Version 1.7.0beta65 [September 16, 2015]
  Use nanosleep() instead of usleep() in contrib/gregbook/rpng2-x.c
    because usleep() is deprecated (port from libpng16).
  Fixed potential leak of png_pixels in contrib/pngminus/pnm2png.c
  Fixed uninitialized variable in contrib/gregbook/rpng2-x.c
  Moved config.h.in~ from the "libpng_autotools_files" list to the
    "libpng_autotools_extra" list in autogen.sh because it was causing a
    false positive for missing files (bug report by Robert C. Seacord).
  Fixed some bad links in the man page.
  Renamed the arm subdirectory to contrib/neon.
  Made minor fixes to the test scripts:
    pngimage: add --list-combos pngunknown: add --strict to catch warnings
    pngvalid-standard: remove the spurious --progressive read (compare with
    pngvalid-progressive-standard!) (John Bowler).
  Implemented a new chunk parse implementation that can be shared. It
    is currently shared by the progressive reader and the sequential one
    (but not yet by the writer) (John Bowler).
  Implemented shared transform handling that is used throughout (John Bowler).

Version 1.7.0beta66 [October 2, 2015]
  Enabled the low-bit-depth gray tests that were disabled in prior versions
    of libpng because of problems that should have been fixed by the recent
    changes to libpng17. Enabling the tests revealed bugs in those changes
    which are now corrected.
  Replaced the memcpy of png_transform_background with a structure copy
    which is safer since it doesn't depend on knowing the first member to
    be copied, also the copies are improved to copy the transform args too;
    not required at present but it may prevent a bug being introduced in
    the future.
  Fixed some new Coverity defects that were introduced in 1.7.0beta65.
  Fixed makepng.c so that it compiles with GCC 5.1.0.
  Added contrib/testspngs/: a directory for additional test png files
    generated by makepng.
  Fixed dead code reported by Coverity (John Bowler).
  Limit the calls to crc32 to ZLIB_IO_MAX, although it is not clear that
    this is optimal (John Bowler).
  Make pngstest error limits version specific. Splitting the machine
    generated error structs out to a file allows the values to be updated
    without changing pngstest.c itself. Since libpng 1.6 and 1.7 have
    slightly different error limits this simplifies maintenance. The
    makepngs.sh script has also been updated to more accurately reflect
    current problems in libpng 1.7 (John Bowler).
  Fixed gamma-handling issues. One serious bug is that 8 was forced
    as a bit depth when caching a palette, even though the palette had been
    expanded.  One less serious bug, the optimization for avoiding gamma
    correction introduced significant errors if the app subsequently
    did further corrections, only shown by using files with gAMA 1/1.52 in
    pngstest (John Bowler).
  Suppressed bogus Coverity issues in pngrutil.c and pngwutil.c.
  Corrected sRGB gamma handling in the Simplified API (John Bowler).
    If a gamma encoded file that has a gamma not matching that of sRGB is
    passed to the simplified API the previous code simply interpreted it as
    a power law encoding.  However old Mac files had a power law correction
    of 1.45 built in to the encoding, even though the display devices were
    consistent with sRGB.  Assuming a power law encoding results in
    substantial differences in the interpretation of low 8-bit values;
    below 10.  For example an Apple '5' which is equivalent to an sRGB '17'
    ends up as the value '8'.  This patch provides some measure of correction
    for this by making the gamma correction done within the simplified API
    assume that any encoded data is encoded relative to an sRGB-like transfer
    function; the data is corrected back to the PNG-nominal 2.2 value then
    decoded to linear (if required) using the sRGB transfer function.
    This reduces the errors reported by pngstest for such files (colormapped
    ones) but still leaves the issue with files where the standard libpng
    code does the gamma decoding.  To cope with the latter cases there is a
    new pngstest-errors which allows the result; however, this is still a
    work-in-progress; a better solution is possible.
  Added a '--small' option to 'makepng' to allow the generation of smaller
    images that also give better test case coverage.  Also added copyright
    and licence to the generated images, reflecting the fact that they are
    original works of the author of the code.  The licence used is the
    Creative Commons Public Domain (CC0-1.0) one, which is appropriate
    for non-source-code works.  The resultant images were used to generate
    the recently-updated pngstest-errors.h file (John Bowler).
  Added test files generated by "contrib/testpngs/makepngs.sh --small"
    with MAKEPNG set to the makepng compiled from the current
    contrib/libtests/makepngs.sh, to the "contrib/testpngs" directory.
  Made png_rgb_to_gray() optimization fixes.  This fixes the code
    that optimizes RGB to Gray transformations that only selected on
    channel and clarifies the handling of max_depth in the transform
    code (John Bowler).
  Incorporated new test PNG files into make check.  tests/pngstest-*
    are changed so that the new test files are divided into 8 groups by
    gamma and alpha channel.  These tests have considerably better code
    and pixel-value coverage than contrib/pngsuite; however,coverage is
    still incomplete (John Bowler).
  Fixed png_set_tRNS_to_alpha for low-bit-depth gray and enabled
    low-bit-depth gray tests in pngvalid (John Bowler).
  Fixed sBIT handling in the low-bit-depth gray and pngstest cases,
    extended sBIT handling to the colormap code in the simplified API
    which is separately implemented in pngread.c (John Bowler).

Version 1.7.0beta67 [November 3, 2015]
  Fixed 'pow' macros in pngvalid.c. It is legal for 'pow' to be a
    macro, therefore the argument list cannot contain preprocessing
    directives.  Make sure pow is a function where this happens. This is
    a minimal safe fix, the issue only arises in non-performance-critical
    code (bug report by Curtis Leach, fix by John Bowler).
  Added sPLT chunk support to pngtest.c
  Prevent setting or writing over-length PLTE chunk (bug report by
    Cosmin Truta) (CVE-2015-8126).
  Silently truncate over-length PLTE chunk while reading.
  Fixed some inconsequential cut-and-paste typos in png_set_cHRM_XYZ_fixed().
  Clarified COPYRIGHT information to state explicitly that versions
    are derived from previous versions.
  Removed much of the long list of previous versions from png.h and
    libpng.3.

Version 1.7.0beta68 [November 12, 2015]
  Fixed new bug with CRC error after reading an over-length palette
    (bug report by Cosmin Truta).
  Cleaned up coding style in png_handle_PLTE().

Version 1.7.0beta69 [November 24, 2015]
  Avoid potential pointer overflow/underflow in png_handle_sPLT() and
    png_handle_pCAL() (Bug report by John Regehr).
  Avoid conditionally compiling parts of statements in png.c (suggested
    by flaviommedeiros).
  Fixed incorrect implementation of png_set_PLTE() that uses png_ptr
    not info_ptr, that left png_set_PLTE() open to the CVE-2015-8126
    vulnerability.
  Added pngvalid --transform --interlace test. This increases code
    coverage by generating test cases with smaller length rows as a
    result of the interlacing.  Without this packswap handling was
    incompletely tested.
  Fixed NO_WRITE_INTERLACE in pngvalid.c.  The support for writing
    interlaced images directly from libpng 1.7 was unintentionally
    disabled (INTERLACE_LAST was defined incorrectly, excluding the
    interlaced images).  This obscured the fact that the transform and
    error test case generators lacked the support for writing interlaced
    images from libpng.
  Transform rewrite: perform transforms in small chunks.  The intent
    of this change is to reduce the memory footprint during transform
    sequences by performing transforms in fixed (small) sized blocks of
    pixels.  The change is incomplete; the filter code still works
    row-by-row, so the whole tranform also works row-by-row. The intent
    is to fix this so that everything works in small(ish) chunks.
    At present the change has no discernable effect on pngvalid --speed
    or pngstest with (e.g.) rgb-8-1.8.png; user time and (minor) page
    faults are the same in old and new versions.  The same applies to
    real-world 15MP PNG images; even on these the presence of the filter
    code causes a cyclical progress through memory which will interfere
    with any caching otherwise possible (useful word, 'otherwise'.) 
  Read row buffer changes.  The read code now allocates one row buffer
    of the size of the input PNG row and, only if required, one buffer of
    the size of the output.  The output buffer is required for the
    progressive reader (always) and for the sequential reader if libpng
    is de-interlacing an image (because the output row is used multiple
    times if png_read_row is called with a display row parameter.) This
    should reduce memory utilization by libpng significantly, but it has no
    detectable effect on overall performance figures of the test programs;
    these are probably dominated by memory allocations for the whole image
    within the test programs.
  Now that the code works consistently so that these just switch off
    the support for having libpng do the interlace/deinterlace, the old
    names make more sense. Restoring them avoids cruft in the configuration
    file and avoids an unnecessary version specific change.
  The reliance of png_read_png on interlace handling and some minor
    issues in the test programs where they failed to correctly check for
    interlace handling were exposed by the ability to write interlaced
    images even if WRITE_INTERLACING is turned off.  This is fixed here.
  Changed the detection of invalid application behavior (too many
    calls to png_read_row) from an affirm to a png_app_error.
  Fixed the PNG_MAX_GAMMA_8 handling and png_set_rgb_to_gray, which
    had bugs which were likely to expose end cases of rgb-to-gray conversion
    errors. This might possibly explain some of the machine math dependencies
    we are seeing.
  Temporarily disabled filter selection while writing, and temporarily
    replaced pngtest.png accordingly.

Version 1.7.0beta70 [December 3, 2015]
  Fixed a simple bracket problem that prevented reading non-interlaced
    PNG files with height == 1.
  The code failed to zero out the row buffer at the start of a pass where
    the AVG filter is used because 'row_number' is not always zero (on
    interlaced images) and, apparently, the assertion that the buffer had
    been zeroed when allocated was not always correct for non-interlaced
    images.  Revealed by pngvalid --size with a hack to make it always
    use AVG.
  Fixed an error in handling of bad zlib CMINFO field in pngfix, found by
    American Fuzzy Lop, reported by Brian Carpenter.  inflate() doesn't
    immediately fault a bad CMINFO field; instead a 'too far back' error
    happens later (at least some times).  pngfix failed to limit CMINFO to
    the allowed values but then assumed that window_bits was in range,
    triggering an assert. The bug is mostly harmless; the PNG file cannot
    be fixed.
  Test the 'size' images in the sequential reader. The existing test
    case only uses the progressive reader which means that important parts of
    the filter code never got tested.
  Improved pngvalid coverage of filter combinations, remove the (new in 1.7)
    code which disabled previous-row filters on the first row of an image in
    some cases.
  Removed all trailing spaces from source files in contrib
  Moved code round and changed the filter write interfaces that took
    png_uint_32 buffer pixel counts to unsigned int.  Also moved compression
    code and definitions into pngwutil.c so that the compression code is
    isolated from other definitions.
  Unified the compression code so that inflate calls are localized to a common
    routine.  Ground work for filter selection support. Minor API changes to
    use void* not byte* for data parameters. Unification of some of the
    compression code with the decompression code; IDAT_size replaces
    IDAT_read_size and zbuffer_size, IDAT reading and writing is no longer
    controlled by the size of the compression buffer.
  Separated png_compress_IDAT into write/compress, removed some
    trailing spaces and cleaned up pnglibconf.
  Removed the side-effect on the png_struct palette of calling png_set_PLTE()
    or png_set_tRNS(). This is a quiet API change; it was previously possible
    to alter the palette on a PNG image by using png_set_PLTE, but this was
    unintended and inconsistent with the other png_set APIs. This fixes
    CVE-2015-8472.
  Fixed a bug in palette index checking; png_struct::num_palette could, in
    principle, get changed by the transformations (e.g. png_set_quantize)
    and this would invalidate the check.  The palette checking init function
    now makes a copy of png_struct::num_palette.
  Fixed a bug in pngvalid error handling.  A png_error in png_write_info is
    not continuable (a valid image cannot necessarily be written afterward)
    because the png_error aborts the write of subsequent pre-IDAT chunks.
    In particular an abort as a result of a bogus colorspace information
   (gAMA, cHRM, sBIT etc) prevents the write of the PLTE chunk.

Version 1.7.0beta71 [omitted]
Version 1.7.0beta72 [December 7, 2015]
  Implemented new filter selection heuristic.
  Attempted to make the selection options more intuitive.
  Fixed a build break in no-write-filters cases.
  Re-applied some recent patches to libpng-1.7.0beta70 that were
    accidentally lost while publishing the beta70 tar distribution.
  Fixed g++ builds, where enums (int), G++ objects (int) and (unsigned)
    were being used together in ?:
  Fixed stack smashing problem in write png_copy_row that was introduced
    in libpng-1.7.0beta70.  This also resulted in PNG data with random
    row bytes.

Version 1.7.0beta73 [December 11, 2015]
  Fixed syntax "$(command)" in tests/pngstest that some shells other than
    bash could not parse (Bug report by Nelson Beebe). Use `command` instead.
  Combined some redundant checks on info_ptr==NULL in png_handle_PLTE()
  Changed png_struct->options from png_byte to png_uint_32, to hold
    up to 16 2-bit options.
     
Version 1.7.0beta74 [December 19, 2015]
  Fixed copyright years in source files.
  Removed LE/BE dependencies in pngvalid, to 'fix' the current problem
    in the BigEndian tests by not testing it, making the BE code the same 
    as the LE version.
  Fixes to pngvalid for various reduced build configurations (eliminate unused
    statics) and a fix for the case in rgb_to_gray when the digitize option
    reduces graylo to 0, producing a large error.
  Widened the 'limit' check on the internally calculated error limits in
    the 'DIGITIZE' case (the code used prior to 1.7 for rgb_to_gray error
    checks) and changed the check to only operate in non-release builds
   (base build type not RC or RELEASE.)
  Fixed undefined behavior in pngvalid.c, undefined because
    (png_byte) << shift is undefined if it changes the signed bit
    (because png_byte is promoted to int). The libpng exported functions
    png_get_uint_32 and png_get_uint_16 handle this. (Bug reported by
    David Drysdale as a result of reports from UBSAN in clang 3.8).
  This changes pngvalid to use BE random numbers; this used to produce
    errors but these should not be fixed as a result of the previous changes.
  Implemented a prototype of filter selection. This rewrites the code
    used previously in the heuristics to make it easier to debug and
    introduces the 'methodical' method, which is intended to be an
    expensive but reliable way of reducing image size. The code in this
    commit does not work; the 'methodical' test for success does not take
    account of data buffered inside zlib and, anyway, it changes the
    results of pngtest so that the test fails.  This is just a checkpoint
    of the current state
  Disabled 'methodical' filter selection code. It is incomplete; it works
    but does not do anything useful except, maybe, on really enormous images.
  Added .travis.yml configuration file to control Travis continuous
    integration testing (David Drysdale).

Version 1.7.0beta75 [December 21, 2015]
  Fixed duplicate tIME chunk from png_write_png.
  Added an example program, pngcp.c, that illustrates the problem when
    used to copy pngtest.png (the result is an invalid PNG because the
    tIME chunk is duplicated.)
  Re-enabled 'methodical' filter selection code.
  Added an accurate 'methodical' measure.
  Fixed incorrect references to 'pngimage' in pngcp.
  Fixed incorrect debug macro in release builds.
  Reversed the order of tests in png_zlib_compress_validate(().
    Undefined behaviour sanitizer currently fires for this test
    with an error about member access within null pointer to
    struct; put the check that relies on pz->list being non-NULL
    second (David Drysdale).

Version 1.7.0beta76 [January 7, 2016]
  Corrected the options handling. Setting the new, higher, option
    bits triggered the byte check (which is no longer necessary).
  Added NULL pz->list test to png_zlib_compress_validate().  This seems
    safer; in fact, a NULL dereference never happens because the test
    ends up just doing arithmetic on NULL but it seems possible that the
    undefined arithmetic can still happen if there is a bug elsewhere.
  Added code to pngcp.c to iterate through the command line options when
    non-list options have the 'all' parameter.  This is used to rapidly
    test the effect of different zlib options.
  Revised the handling of tIME and text chunks on read to record the
    location of the chunks relative to PLTE and IDAT.  Behavior on write
    is unchanged except that if the position was recorded on read it will
    be re-used.  This involves an ABI change to the png_text_struct; a
    one byte location field is added (with the same meaning as the one
    used to record unknown chunk location.) Because this field is only
    used on read there is no API change unless a png_info from a libpng
    read is passed to a subsequent libpng write (this did not work very
    well before 1.7; the tIME chunk could get duplicated.) The new field
    is ignored by png_set_text(), resetting it to the current position
    in the read or write stream.  On write the position is set to the
    next location to be written unless the write has not started (the
    position is before the signature) in which case the location is set
    to PNG_HAVE_PLTE|PNG_AFTER_IDAT.  When the chunk is written the
    position is set to the actual write location (effectively the position
    is frozen.)
  Relocated assert() in contrib/tools/pngfix.c, bug found by American
    Fuzzy Lop, reported by Brian Carpenter.
  Marked 'limit' UNUSED in transform_range_check().  This only affects
    release builds.
  Fixed new Coverity defect, potential NULL dereference of "ps" in pngwutil.c
  Added temporary workaround for Coverity "Dead code" defect.

Version 1.7.0beta77 [January 16, 2016]
  Fixed new Coverity defect, another NULL dereference of "ps" in pngwutil.c
  Prevent the CMINFO optimization code from running twice on any PNG IDAT
    stream longer than 2048 bytes; the second time could overwrite bytes
    2048,2049, invalidating the output.
  Fixed a (debug) checks that was slightly wrong (< when <= should have been
    used) and this caused write to abort maybe 1 out of 2048 times.
  Improved the contrib/examples/pngcp search mode.  This is still a
    work-in-progress, but it seems fairly stable (if not exactly 100%
    optimal).  pngcp now allows 'all' for some options which iterates
    through all possible settings (this reliably produces the smallest
    IDAT that libpng can produce with those settings.)  It also contains
    a "--search" command line option that attempts to optimize this by
    skipping pointless tests; it is close, most of the time, but not perfect.
  Fixed write problem with reduced size IDAT chunks.
    png_set_compression_buffer_size would result in a spurious debug assert
    if the compression buffer size was set to something other than a multiple
    of PNG_ROW_BUFFER_SIZE; the debug test failed to add the buffer 'start'
  The sequential read code failed to read to the end of the IDAT stream in
    about 1 of 820 cases, resulting in a spurious warning.  The
    png_set_compression_buffer_size API also would not work (or do bad things)
    if the size of a zlib uInt was less than 32 bits.
  Added pngcp IDAT size test and changed the order of the 'level'
    and 'windowBits' searches to seach windowBits first; this favors
    windowBits optimizations over compression level ones on the basis
    that the latter should only affect the write code. This includes a
    quiet API change to alter png_set_compression_buffer_size to use
    a png_alloc_size_t, not png_size_t and implement the correct checks.
  Fixed recently introduced palette sharing bug.  The internal read
    code change to stop sharing the palette was incompletely implemented.
    The result is that unless palette index checking is turned off and
    there are no read transformations the png_info palette gets deleted
    when the png_struct is deleted.  This is normally harmless (png_info
    gets deleted first) but in the case of pngcp it results in
    use-after-free of the palette and, therefore, palette corruption and
    maybe on some operating systems and access violation.
  Updated the pngcp 'search' mode to check a restricted range of memLevels;
    there is an unrelated bug which means that lower zlib memLevels result
    in memory corruption under some circumstances, probably less often
    than 1:1000.
  Attempted to work around a false-positive Coverity issue in pngvalid.c.

Version 1.7.0beta78 [January 23, 2016]
  Changed PNG_USE_MKSTEMP to __COVERITY__ to select alternate
    "tmpfile()" implementation in contrib/libtests/pngstest.c
  Fixed NO_STDIO build of pngunknown.c to skip calling png_init_io()
    if there is no stdio.h support.
  Added a png_image_write_to_memory() API and a number of assist macros
    to allow an application that uses the simplified API write to bypass
    stdio and write directly to memory.
  Added some warnings (png.h) and some check code to detect *possible*
    overflow in the ROW_STRIDE and simplified image SIZE macros.  This
    disallows image width/height/format that *might* overflow.  This is
    a quiet API change that limits in-memory image size (uncompressed) to
    less than 4GByte and image row size (stride) to less than 2GByte.
  Revised  Simplified API to use system appropriate types.  This is
    an API change for 1.7, albeit a quiet one; it may produce compiler
    warnings but should not result in errors, unless warnings are treated
    as errors. On 64-bit systems it widens the results of the various
    PNG_IMAGE_ macros that return size values (component counts, byte sizes)
    to 64 bits.  It also changes the row_stride parameter, which is the
    pointer difference between adjacent rows of the image buffer, to
    the ANSI-C90 defined type ptrdiff_t. The existing (1.6.22) checks for
    overflow are preserved but now accomodate images that require more than
    32 bits of address space when size_t/ptrdiff_t are 64 bit types.
  Revised workaround for false-positive Coverity issue in pngvalid.c.

Version 1.7.0beta79 [March 9, 2016]
  Only use exit(77) in configure builds.
  Corrected error in PNG_IMAGE_PNG_SIZE_MAX. This new macro underreported
    the palette size because it failed to take into account that the memory
    palette has to be expanded to full RGB when it is written to PNG.
  Updated CMakeLists.txt, added supporting scripts/gen*.cmake.in
    and test.cmake.in (Roger Leigh).
  Revised pngstest to (by default) make random backgrounds on a per-file,
    not per-session, basis.
  Refined pngcp with better (more consistent) reporting of the "--search"
    results plus changes so that when compiled against libpng 1.6 the program
    correctly copies text chunks; previously when a search option caused
    multiple copies of the same file the copies after the first would not
    have the text chunks.
  Expanded search logging in pngcp to output results during the search;
    sufficient for basic tests on zlib parameters.
  More sophisticated default write compression options, which helps
    significantly for some files along with code to make it easier to control
    the compression defaults and to make the settings honor the API calls
    the application makes (previously low windowBits settings would get reset
    to higher values.)
  Changed PNG_INFO_cHNK and PNG_FREE_cHNK from 0xnnnn to 0xnnnnU in png.h
    (Robert C. Seacord). Various other flags in png.h made unsigned as well.
  Fixed some misleading indentation (Krishnaraj Bhat).

Version 1.7.0beta80 [May 6, 2016]
  Fixed typo (missing underscore) in #define PNG_READ_16_TO_8_SUPPORTED
    Bug report by (Y.Ohashik).
  Quieted two Coverity issues in contrib/libtests/timepng.c.
  Write code update (John Bowler):
    Implemented better defaulting of zlib settings based on image properties.
    Replaced pngtest.png with one compressed with the new zlib settings.
    Implemented pass-through of png_write_rows when the rows can be used
      directly (a common case) optimizing the handling of previous-row
      buffering.
    Removed the METHODICAL filter selection method and disabled the HEURISTIC
      one.  The first was ridiculously slow (though useful for experiments),
      and the second didn't work. Filter selection is temporarily disabled (it
      defaults to the lowest numbered filter in the list; typically 'none').
    New handling of compression settings (incomplete), new PNG compression level
      (not yet visible in an API).
    Back ported 'PNG_FAST_FILTERS' from 1.6 (in png.h).
    There are minimal API changes beyond removal of the selection options.
      Work is still to be done to investigate a filter selection mechanism that
      is at least as good as the previous one.
    Minor write bug-fixes, remove unimplemented code.  A debug() assert
      fired if windowBits was set to 8 for the Huffman only and no-compression
      cases. This commit changes it to do some extra checking.  Removed
      unreachable code in pz_default_settings and eliminated a spurious
      warning in pngcp for small files.

Version 1.7.0beta81 [June 11, 2016]
  Check for CLOCK_PROCESS_CPUTIME_ID when building /contrib/libtests/timepng.
    Otherwise it does not build on platforms that don't supply clock_gettime().
  Add check for clock_gettime() in Makefile.am and configure.ac
  Reenabled filter selection (dummy).  This implements the code for
    row-by-row filter selection but does not provide an actual implementation;
    the selection function just chooses the lowest set filter bit.
  Fixed a signed/unsigned warning (GCC 4.8.5) in pngwutil.c
  Implemented base filter selection with row buffering and a crude code-count
    algorithm.
  Added filter selection, palette index checks.  Palette index checking:
    checking on read was erroneously skipped.  pngcp can now turn off the
    palette index checking or fix the errors (mainly to allow comparison with
    libpng 1.6, which defaulted to ignoring it).  The API now documents how
    the 'enabled' parameter works.  On read the check is on by default (it
    was apparently off in libpng 1.6) however now if explicitly turned on the
    warning message is stopped; this provides better interaction with
    get_palette_max at the cost of a small API change (may need to be reviewed.)
  Palette size errors: invalid entries in the palette are now set to #beaded to
    make the errors more obvious and allow easy detection in memory.
  Read transform pipeline caching: changes to fix the palette index check
    (which are erroneously cached), the pipeline can now contain multiple
    caches, e.g., caching of packing of palette indices can be combined with
    caching of palette RGB transforms.
  Read code now checks for callbacks to read 0 data (and faults them).
    Fixed the reading of PNGs with multiple 0 length IDATs that failed as a
    result plus the handling of zero length unknown (which occurs, validly;
    the spurious warning has been removed).
  Filter selection: the 1.6 and earlier sum of absolute differences algorithm
    has been reintroduced with an option to disfavor some filters over others
    where the sums are close (not yet exposed).  The selection code also logs
    the last known occurence of each possible byte code across multiple lines.
    This allows detection of PNG images with lower bit depth than the format
    implies and, therefore, allows the filtering to be turned off in those
    cases as well.
  The default write zlib settings are still lower than libpng16.  The
    selection algorithm is being refined (the overall results are worse than
    not doing any filtering).
  Port contrib/libtests/pngvalid.c from libpng16.
  PNG compression level setting API: this allows the various compression
    settings controlling deflate, fitlering, and so on to be set via a single
    setting with six values.  This is currently documented in png.h ("Write
    compression settings").
  Internally the compression settings have been tuned both for the overall
    setting and for any specific settings made by the original APIs.
  APIs to control iCCP chunk compression separately have been added.
  contrib/examples/pngcp.c has been modified to accomodate the new compression
    setting and to include options for separate control of iCCP chunk
    compression.
  The new "png_setting" ABI has been modified to accomodate a wider range of
    settings and most of the old compression control ABIs have been replaced by
    function-like macros with the same API which call png_setting.  This is an
    API check in 1.7.0 for png_setting (alone).  png_setting now handles all
    of png_set_option.  This eliminates 19 ABIs at the cost of adding 1
    (png_setting).
  CRC and benign error checking has been updated internally to use bit-fields
    and the CRC calculation skip when the CRC is not used has been improved
    slightly to avoid the initialization of the CRC.  A new png_setting based
    API allows more detailed control of benign error/warning messages (this
    may change, the internal error handling seems too complex.)  The
    ERROR_NUMBERS support has been removed with the intent of implementing
    proper i18n.
  The memcpy-size-0 issue in png_push_fill_buffer has been fixed, with an
    appropriate debug() assert if a fill for 0 bytes occurs.
  Most PNG_FLAG_ values for png_struct::flags have been eliminated (as a
    result of the benign error handling changes).  Only one remains.
  The LOW_MEMORY PNG_COMPRESSION option should not be setting HUFFMAN_ONLY or
    using a low deflate 'level'; according to the comments in zconf.h only
    windowBits and memLevel affect the memory.  pngwutil.c has been changed
    to use the same values as HIGH compression.
  The COMPAT option turned on the old optimize_cmf code (now in fix_cinfo),
    however there was a serious bug in that code; it put the wrong value in
    z_cmf.  The setting was also not handled correctly in
    pz_compression_settings.
  pngtest now verifies the operation of COMPAT and, as a result, pngtest.png
    has been reverted to the libpng 1.6 (etc) version.
  IDAT size handling has been improved; if not explicitly set values
    appropriate to png_level are now chosen (in addition to the handling for
    the COMPAT setting).  HIGH and HIGH_READ_SPEED now create unlimited
    (up to the PNG chunk-size limit of 2^31-1 bytes) size IDAT chunks,
    which requires buffering the whole of the IDAT data in memory but
    reflects what other programs and optimizers do.
  Changed handling of PNG_IMAGE_FLAG_FAST in the simplified API to use
    PNG_COMPRESSION_HIGH_SPEED, and PNG_COMPRESSION_HIGH otherwise.
  Removed png_struct::flags which is no longer used.
  Fixed implementations of png_app_error() and png_app_warning() which
    previously were swapped.
  Avoid potential overflow of the PNG_IMAGE_SIZE macro.  This macro
    is not used within libpng, but is used in some of the examples.

Version 1.7.0beta82 [July 4, 2016]
  Put the SKIP definition in the correct place. It needs to come after the
    png.h include (see all the other .c files in contrib/libtests) because it
    depends on PNG_LIBPNG_VER.
  Moved pngcp to contrib/tools and added pngcp to the build together
    with a pngcp.dfa configuration test (John Bowler)
  Added a "Common linking failures" section to the INSTALL document.
  Relocated misplaced #endif in png.c sRGB profile checking.
  Fixed two Coverity issues in pngcp.c.

Version 1.7.0beta83 [July 23, 2016]
  Fixed some indentation to comply with our coding style.
  Removed/rearranged certain png_struct fields that are only used
    in reading.
  Fixed debug test of output gamma.

Version 1.7.0beta84 [September 26, 2016]
  Minor editing of INSTALL, (whitespace, added copyright line)
  Don't install pngcp; it conflicts with pngcp in the pngtools package.
  Fixed handling zero length IDAT in pngfix (bug report by Agostino Sarubbo,
    bugfix by John Bowler).
  Conditionally compile png_set_benign_errors() in pngread.c and pngtest.c
  Changed PNG_ZLIB_VERNUM to ZLIB_VERNUM in pngrutil.c.
  If CRC handling of critical chunks has been set to PNG_CRC_QUIET_USE,
    ignore the ADLER32 checksum in the IDAT chunk as well as the chunk CRCs.
  Issue png_benign_error() on ADLER32 checksum mismatch instead of png_error().
  Add tests/badcrc.png and tests/badadler.png to tests/pngtest.

Version 1.7.0beta85 [December 27, 2016]
  Updated the documentation about CRC and ADLER32 handling.
  Quieted warnings from clang-3.8 in pngunknown.c and pngvalid.c.
  Removed the use of a macro containing the pre-processor 'defined'
    operator.  It is unclear whether this is valid; a macro that
    "generates" 'defined' is not permitted, but the use of the word
    "generates" within the C90 standard seems to imply more than simple
    substitution of an expression itself containing a well-formed defined
    operation.

Version 1.7.0beta86 [December 29, 2016]
  Ported CMakeLists.txt from libpng-1.6.27rc01.
  Fixed a potential null pointer dereference in png_set_text_2() (bug report
    and patch by Patrick Keshishian, CVE-2016-10087).

Version 1.7.0beta87 [April 1, 2017]
  Fixed arm/aarch64 detection in CMakeLists.txt (Gianfranco Costamagna).
  The contrib/examples/pngtopng.c recovery code was in the wrong "if"
    branches; the comments were correct.
  Added missing "$(CPPFLAGS)" to the compile line for c.pic.o in
    makefile.linux and makefile.solaris-x86 (Cosmin).
  Merged some recent changes from libpng-1.6.30beta01.

Version 1.7.0beta88 [August 7. 2017]
  Added private png_check_chunk_name() and png_check_chunk_length()
    functions.

Version 1.7.0beta89 [August 19, 2017]
  Check for 0 return from png_get_rowbytes() in contrib/pngminus/*.c to stop
    some Coverity issues (162705, 162706, and 162707).

Version 1.7.0beta90 [August 28, 2017]
  Added PNGMINUS_UNUSED macro to contrib/pngminus/p*.c and added missing
    parenthesis in contrib/pngminus/pnm2png.c (bug report by Christian Hesse).

Send comments/corrections/commendations to png-mng-implement at lists.sf.net
(subscription required; visit
https://lists.sourceforge.net/lists/listinfo/png-mng-implement
to subscribe)
or to glennrp at users.sourceforge.net

Glenn R-P
