OptiPNG - Revision history
==========================

Legend
------
++ Added or improved performance-related feature
   (might improve compression ratio or processing speed).
 + Added or improved feature.
 - Removed feature.
 ! Fixed bug.
!! Fixed critical bug
   (crash, data/metadata loss or security hazard).
 * Improved architecture, upgraded dependency, refactored code, etc.
** Reported factoid.

Version 7.9.1   2025-may-20
-------------
 * Upgraded libpng to version 1.6.48.
!! REALLY fixed a corner case in the RGB-to-palette reduction code,
   in which a dangling tRNS chunk (i.e. a tRNS chunk containing an
   RGB triplet that doesn't actually exist in the RGB-encoded image)
   should have been discarded (but wasn't).
   [Re-reported by Dan Fandrich]
 + Enabled the making of a SIMD-optimized build of libpng on select
   target platforms. Currently, this is enabled by default on ARM64
   and X86-64.
 + Added a CMake file, an alternative to the configure build script.
 - Deprecated the configure build script.
 - Removed the support for 16-bit platforms.
 - Removed the option -log.
 * Rewrote the user manual in AsciiDoc format.
** Got bored of 0-dot-version numbers.

Version 0.7.9   2025-apr-11
-------------
 * Upgraded libpng to version 1.6.47.
 * Upgraded zlib to version 1.3.1-optipng.
 * Upgraded cexcept to version 2.99-optipng.
!! Fixed a corner case in the RGB-to-palette reduction code, in which
   a dangling tRNS chunk (i.e. a tRNS chunk containing an RGB triplet
   that doesn't actually exist in the RGB-encoded image) should have
   been discarded (but wasn't); this caused the palette-encoded output
   image to contain bogus transparency.
   [Reported by Andrew Dent]

Version 0.7.8   2023-nov-03
-------------
 * Upgraded libpng to version 1.6.40.
 * Upgraded zlib to version 1.3-optipng.
 * Upgraded cexcept to version 2.0.2-optipng.
!! Fixed a global-buffer-overflow vulnerability in the GIF reader.
   [Reported by Zeng Yunxiang; fixed by Thomas Hurst]
 ! Fixed a stack-print-after-scope defect in the error handler.
 ! Fixed an assertion failure in the image reduction module.
 ! Fixed the command-line wildargs expansion in the Windows port.
 * Raised the minimum required libpng version from 1.2.9 to 1.6.35.
 * Raised the minimum required zlib version from 1.2.1 to 1.2.8.
 * Refactored the structured exception handling.

Version 0.7.7   2017-dec-27
-------------
 * Upgraded libpng to version 1.6.34.
 * Upgraded zlib to version 1.2.11-optipng.
 * Upgraded minitiff to version 0.2.
!! Fixed a buffer overflow vulnerability in the GIF decoder.
   [Reported by Joonun Jang]
!! Fixed an integer overflow vulnerability in the TIFF decoder.
   [Reported by Jaeseung Choi]
 ! Fixed the build on macOS High Sierra.
   [Reported by various users]
   [Fixed by Yuen Ho Wong and Friedrich Preuss]
 ! Fixed the build on DJGPP.
 * Disallowed out-of-bounds values in rangeset options.

Version 0.7.6   2016-apr-03   [Released by Ramona C. Truta]
-------------
 * Upgraded libpng to version 1.6.21.
 ! Fixed an assertion failure in the image reduction code.
   [Fixed by upgrading libpng]
!! Fixed various security-sensitive defects in the BMP decoder.
   [Reported by Henri Salo and Hans Jerry Illikainen]
   [Fixed by Ramona C. Truta]
 ! Fixed a benign uninitialized memory read in the GIF decoder.
   [Reported by Gustavo Grieco]
 ! Fixed a build failure occurring under the Estonian (et_EE) locale.
   [Reported by Sebastian Pipping]
   [Fixed by Priit Laes]
 ! Fixed a build failure occurring on Mac OS X, FreeBSD, and possibly
   other systems that lack POSIX-compliant high-resolution timestamps.
   [Reported by Ryan Schmidt and Dmitry Egorov]
   [Contributed by Sebastian Pipping]
 ! Fixed a typo causing build failures in 32-bit ANSI C compilation.
   [Reported by various users]

Version 0.7.5   2014-mar-24
-------------
 * Upgraded libpng to version 1.6.10-optipng.
 * Upgraded zlib to version 1.2.8-optipng.
 ! Fixed various build issues with libpng-1.5 and libpng-1.6.
   [Fixed by Oliver Schneider]
 * Allowed the handling of huge image files (> millions of pixels
   per row or column) to be independent of the libpng version.
 + Allowed the option -preserve to save the file ownership (UID/GID)
   on Unix.
   [Requested by Otto Kekäläinen]
 ! Fixed a build issue with Clang.
 + Added various enhancements to the configure script.

Version 0.7.4   2012-oct-21
-------------
!! Fixed the previous fix, which failed to fix the option -fix.
   [Reported by Gynvael Coldwind and Mateusz Jurczyk]

Version 0.7.3   2012-sep-16
-------------
!! Fixed a use-after-free vulnerability in the palette reduction code.
   This vulnerability was accidentally introduced in version 0.7.

Version 0.7.2   2012-aug-24
-------------
 * Upgraded libpng to version 1.4.12.
 * Upgraded zlib to version 1.2.7-optipng.
 ! Fixed the display of huge (4GB+) file/IDAT sizes on 32-bit platforms.
 ! Issued a proper error message if the output IDAT can't fit in 2GB.
   Acknowledged this limitation in the user manual.
   [Reported by John Sauter]
 ! Fixed the output file cleanup that should occur after a write error.
 * Added the option -debug and various undocumented debug features.
 * Moved the PNG reduction module (opngreduc) to a separate sub-project.

Version 0.7.1   2012-mar-19   [Released by Ramona C. Truta]
-------------
!! Fixed a regression in the reduction of palette-encoded grayscale
   images. (This regression was introduced in version 0.7.)
   [Fixed by Adam Ciarcinski]

Version 0.7     2012-feb-29   [Released by Cosmin & Ramona C. Truta]
-----------
 * Upgraded libpng to version 1.4.9.
 * Upgraded zlib to version 1.2.6-optipng.
!! Fixed a rarely-occurring out-of-bounds memory access error in
   the Z_RLE strategy in zlib.
   [Reported by Christopher Wichura]
   [Fixed by upgrading zlib]
 + Added the popularly-requested option -strip.
   The only suboption currently supported is "-strip all".
 + Added the option -clobber.
   [Contributed by Maciej Pilichowski]
 + Added the option -backup, as an alias of -keep.
   [Contributed by Ramona C. Truta]
 + Added the option -silent, as an alias of -quiet.
   [Contributed by Ramona C. Truta]
 - Deprecated the option -log.
   [Contributed by Ramona C. Truta]
 * Changed the activity display output from STDOUT to STDERR.
 + Allowed the option -preserve to save high-resolution timestamps
   on Unix, if the POSIX-1.2008 API is available.
   (This feature was previously available on Windows only.)
 ! Fixed a minor precision error in the display of file size percents.
 ! Fixed a memory leak that occurred when reading broken GIF images.
 ! Fixed various build issues.
   [Fixed by Sebastian Pipping and Ville Skyttä]
 * Resolved all remaining compatibility issues with libpng-1.5.
   [Contributed by Adam Ciarcinski]
 * Added build support for clang.
 * Reorganized the source directory structure.

Version 0.6.5   2011-jan-24
-------------
 * Upgraded libpng to version 1.4.5-optipng.
 * Upgraded zlib to version 1.2.5-optipng.
!! Fixed the I/O states (in libpng 1.4.5);
   they caused incorrect file reads in some rare cases.
   [Reported by Dmitry Marakasov]
!! Fixed processing of PNG files with chunks of size 0.
   [Reported by Matthew Fearnley]
 ! Fixed a display error in the TIFF import.
   [Fixed by Piotr Bandurski]
 + Improved checking of the arguments of -f, -zc, -zm and -zs.
 - Removed quirks from the rangeset option argument syntax.
 ! Fixed a build issue under the system-supplied libpng-1.4.
   [Fixed by Petr Gajdos]
 * Resolved forward-compatibility issues regarding libpng-1.5;
   however, the system-supplied libpng-1.5 is not yet supported.
 * Added various enhancements to the configure+make build system.
   [Contributed by Elias Pipping and Dmitri Zubko]

Version 0.6.4   2010-mar-14
-------------
 * Upgraded libpng to version 1.4.1-optipng.
 * Upgraded zlib to version 1.2.4-optipng.
 + Added the option -nx.
 * Clarified the behavior of the option -nz and the relationship between
   the options -nz and -o0.
 + Added a filesystem check (resolving normalized paths, symlinks, etc.)
   to better detect when the output overwrites the input.
 + Enabled automatic wildcard expansion (i.e. globbing) on Win64.
 ! Fixed a Unicode build issue on Windows.
   [Fixed by Fabien Barbier]

Version 0.6.3   2009-may-18
-------------
 * Upgraded libpng to version 1.2.36-optipng.
!! Fixed a use-after-free error in the GIF reader.
   [Reported by Roy Tam]
   [Fixed by Bryan McQuade]
 ! Flushed the output log to display the current trial in real time.
   This only worked on Windows in the previous version.
   [Fixed by Vincent Lefèvre]
 ! Fixed an error in reporting unrecognized file formats.
 - Removed the requirement to "fix" TIFF files that contain unrecognized
   metadata.
   [Requested by Piotr Bandurski]
 * Simplified the option abbreviation rules. Option names can now be
   abbreviated to their shortest unique prefix, as in X11 applications.

Version 0.6.2   2008-nov-09
-------------
 * Upgraded libpng to version 1.2.33-optipng.
++ Put back a speed optimization, accidentally removed in version 0.6,
   allowing singleton trials (-o1) to be bypassed in certain conditions.
!! Fixed an array overflow in the BMP reader.
!! Fixed the loss of private chunks under the option -snip.
 + Produced a more concise on-screen output in the non-verbose mode.
   [Contributed by Vincent Lefèvre]
 * Added a programming interface to the optimization engine, in order
   to facilitate the development of PNG-optimizing GUI apps and plugins.

Version 0.6.1   2008-jul-20
-------------
 * Upgraded cexcept to version 2.0.1.
 + Added a configure script, to be used instead of unix-secure.mak.
 ! Fixed a build issue that occurred when using libpng from the system.
   [Reported by Nelson A. de Oliveira]
 ! Fixed the processing when the image reduction yields an output larger
   than the original.
   [Reported by Michael Krishtopa]
 ! Fixed the behavior of the option -preserve.
   [Reported by Bill Koch]
 - Removed displaying of partial progress when abandoning IDATs under
   the option -v. (The percentages displayed were not very accurate.)

Version 0.6     2008-jun-15
-----------
 * Upgraded libpng to version 1.2.29-optipng.
++ Implemented grayscale(alpha)-to-palette reductions.
++ Improved conversion of bKGD info during RGB-to-palette reductions.
   [Contributed by Matthew Fearnley]
!! Fixed conversion of bKGD and tRNS during 16-to-8-bit reductions.
   [Reported by Matthew Fearnley]
 + Added support for compressed BMP (incl. PNG-compressed BMP, you bet!)
 + Improved the speed of reading raw PNM files.
 + Recognized PNG digital signatures (dSIG) and disabled optimization
   in their presence, to preserve their integrity.
 + Allowed the user to enforce the optimization of dSIG'ed files.
 + Recognized APNG animation files and disabled reductions to preserve
   their integrity.
 + Added the option -snip, to allow the user to snip one image out of
   a multi-image file, such as animated GIF, multi-page TIFF, or APNG.
 + Improved recovery of PNG files with incomplete IDAT.
!! Fixed a crash triggered by the use of -log on some platforms.
   [Fixed by Stefan Brüns]
 ! Fixed the behavior of the options -out and -dir when the input is
   already optimized.
   [Reported by Christian Davideck]
 * Provided more detailed image information at the start of processing.
 * Provided a more detailed summary at the end of processing, under the
   presence of the option -v and/or the occurrence of exceptional events.

Version 0.5.5   2007-jan-28
-------------
 * Upgraded libpng to version 1.2.15-optipng.
++ Used a previously-missed RGB-to-palette reduction opportunity
   for images containing 256 distinct colors.
   [Reported by Joachim Kluge]
!! Fixed conversion of bKGD info during RGB-to-palette reductions.
   [Reported by Matthew Fearnley]
 ! Fixed pre-computation of iterations.
   [Reported by Matthew Fearnley]
 ! Eliminated a false alarm when processing RGB images with tRNS
   in Unix-secure mode.
   [Reported by Till Maas]
   [Fixed by Nelson A. de Oliveira]
 ! Fixed the behavior of the options -out and -dir when changing
   interlacing.
   [Reported by Martin Packman]
 ! Fixed the behavior of "-dir [DRIVE]:" on Windows.

Version 0.5.4   2006-aug-11
-------------
 + Added the options -out and -dir, to specify the name of the
   output file or directory.
   [Requested by Alexander Lucas]
 * Added support for builds based on the system-supplied libpng.
   [Contributed by Nelson A. de Oliveira]

Version 0.5.3   2006-jul-23
-------------
 * Upgraded libpng to version 1.2.12-optipng.
 + Implemented basic support for TIFF (grayscale, RGB and RGBA,
   uncompressed).
++ Avoided the redundant trial when the search space is singular
   (e.g. when running "optipng -o1 example.tif").
 + Prevented accidental file corruption when using the option -log.
 ! Fixed (again) a small typo in the online help.

Version 0.5.2   2006-may-07
-------------
 + Improved handling of inexact PNM-to-PNG conversions.
 ! Fixed a typo that was breaking the build on some Unix platforms.
   [Reported by Aaron Reitz]

Version 0.5.1   2006-apr-30
-------------
++ Implemented bit depth reduction for palette images.
 * Upgraded libpng to version 1.2.10-optipng.
 + Improved the BMP support.
 + Added a Unix man page.
   [Contributed by Nelson A. de Oliveira]
 + Allowed abbreviation of command-line options.
 + Changed the option -log to accept a file name as an argument.
 * Renamed the option -no to -simulate.
 ! Fixed an error in handling .bak files on Unix.
   [Reported by Adam Szojda and Nelson A. de Oliveira]
 ! Fixed a small typo in the help screen.
   [Reported by A. Costa and Nelson A. de Oliveira]

Version 0.5     2006-jan-14
-----------
++ Added pngxtern, a libpng add-on for external image format
   support: BMP (uncompressed), GIF, PNM.
++ Implemented RGB(A)-to-palette reductions.
 * Upgraded zlib to version 1.2.3-optipng.
 * Upgraded libpng to version 1.2.8-optipng.
 + If trials are ended prematurely, detailed progression is only
   reported under the option -v.
 - Removed reporting of some IDAT sizes that exceeded the optimum.
   (This was NOT a bug, but a "feature" that confused some users.)
 ! Fixed an RGB-to-gray reduction problem that occurred under some
   specific background colors.
 * Added support for builds based on the system-supplied zlib.
   [Requested by Nelson A. de Oliveira]
 * Modified LICENSE. It is now a verbatim spell of the zlib license.

Version 0.4.8   2005-may-10
-------------
 * Upgraded libpng to version 1.0.18-optipng.
!! Fixed a palette-to-gray reduction problem that occurred when an
   RGB triple had both an alpha below max, and an alpha equal to max.
   [Reported by Nicolas Le Gland]
 + Packed the Windows executable using UPX.

Version 0.4.7   2004-oct-30
-------------
!! Fixed a palette-to-gray reduction problem that occurred when
   having more than one alpha value per RGB triple.
   [Reported by Larry Hastings]
 ! Fixed the progress display, when processing very large images.
 + Displayed the image info at the beginning of processing.
++ Reduced the IDAT buffer size, allowing abandoned trials to
   terminate earlier in some circumstances.
 + Implemented error recovery, when PLTE is too small, and/or
   tRNS is too large.

Version 0.4.6   2004-oct-25
-------------
 * Upgraded zlib to version 1.2.2-optipng.
 * Upgraded libpng to version 1.0.17-optipng.
   This provides safe handling of some ill-formed PNG images.
 + Rewrote makefiles.
 + Added project workspace to build under Visual C++ 6.0,
   integrated with memory leak detection.
++ Implemented a premature termination of trials, in the moment
   when IDAT grows beyond the smallest size previously achieved.
   [Requested by Larry Hastings]
 + Changed the order of trials, to perform the trials that are
   more likely to yield a smaller IDAT, at the beginning.
 + Added the option -full to avoid the premature termination of
   trials; useful for debugging.

Version 0.4.5   2004-may-31
-------------
 * Upgraded zlib to version 1.2.1.f-cos2.
 * Upgraded libpng to version 1.0.15-cos2.
 * Renamed the option -nx to -nz.
 + Added the option -preserve to preserve file attributes
   (file mode, time stamp, etc.) where applicable.
   [Requested by Nehal Mistry]
 ! Fixed an incorrect initialization of zlib window bits.
 ! Displayed an error message when the search space was invalid.
!! Fixed a palette reduction problem for bit depths below 8.
 ! Eliminated memory leaks.
   [Contributed by Niels de Koning]

Version 0.4.4   2003-nov-20
-------------
 * Upgraded zlib to version 1.2.1.
++ Added support for the Z_RLE strategy.

Version 0.4.3   2003-aug-12
-------------
 ! Fixed a reduction problem that caused an assertion failure.
   [Reported by Dimitri Papadopoulos]

Version 0.4.2   2003-jun-30
-------------
++ Enhanced the support for palette size reductions:
   trailing sterile palette entries are removed even when
   the bit depth is below 8.
 ! Enforced recompression when the new IDAT has the same size,
   but other chunks have been reduced.
 + Displayed the IDAT size difference as a percentage.
   [Requested by Nehal Mistry]

Version 0.4.1   2003-may-19
-------------
 ! Fixed the removal of trailing sterile palette entries.

Version 0.4     2003-may-12
-----------
++ Added support for palette-to-gray reductions.
++ Added partial support for palette size reductions.
 ! Fixed the reporting of invalid command-line options.
 ! Eliminated a spurious warning when the zlib window size
   is set to 256.

Version 0.3.2   2003-mar-11
-------------
 + Added support for updating sBIT during reductions.
 ! Fixed the reduction of the alpha channel.

Version 0.3.1   2003-feb-25
-------------
 ! Fixed the encoding of interlaced images when they become
   larger than the input.
   [Reported by James H. Cloos, Jr.]
 + Added the HISTORY document (this file).

Version 0.3     2003-feb-24
-----------
 * Announced the first public release of OptiPNG.
++ Added support for iterating through zlib memory levels.
++ Added support for collapsing IDAT, avoiding calls to
   png_set_compression_buffer_size().
   This reduces the memory requirements.
++ Added support for lossless reduction of the image type:
   RGB[A] -> G[A], RGBA -> RGB, GA -> G
 + Added many user options.
 + Added documentation.

Version 0.2     2001-dec-27
-----------
 + Added support for optimization level presets.
 + Added a user option for changing the interlacing.

Version 0.1     2001-dec-17
-----------
 + Added support for chunk I/O status annotation.
   This improves the speed of OptiPNG significantly.
 * Added structured exception handling via cexcept.

Version 0.0.1   2001-dec-10
-------------
 * Introduced OptiPNG.
++ Compressed PNG IDAT data repeatedly, iterating through zlib
   compression and strategy levels, as well as PNG delta filters.
