CHANGES - changes for libpng

version 0.2
  added reader into png.h
  fixed small problems in stub file
version 0.3
  added pull reader
  split up pngwrite.c to several files
  added pnglib.txt
  added example.c
  cleaned up writer, adding a few new tranformations
  fixed some bugs in writer
  interfaced with zlib 0.5
  added K&R support
  added check for 64 KB blocks for 16 bit machines
version 0.4
  cleaned up code and commented code
  simplified time handling into png_time
  created png_color_16 and png_color_8 to handle color needs
  cleaned up color type defines
  fixed various bugs
  made various names more consistant
  interfaced with zlib 0.71
  cleaned up zTXt reader and writer (using zlib's Reset functions)
  split transformations into pngrtran.c and pngwtran.c
version 0.5
  interfaced with zlib 0.8
  fixed many reading and writing bugs
  saved using 3 spaces instead of tabs
version 0.6
  added png_large_malloc() and png_large_free()
  added png_size_t
  cleaned up some compiler warnings
  added png_start_read_image()
version 0.7
  cleaned up lots of bugs
  finished dithering and other stuff
  added test program
  changed name from pnglib to libpng
version 0.71 [June, 1995]
  changed pngtest.png for zlib 0.93
  fixed error in libpng.txt and example.c
version 0.8
  cleaned up some bugs
  added png_set_filler()
  split up pngstub.c into pngmem.c, pngio.c, and pngerror.c
  added #define's to remove unwanted code
  moved png_info_init() to png.c
  added old_size into png_realloc()
  added functions to manually set filtering and compression info
  changed compression parameters based on image type
  optimized filter selection code
  added version info
  changed external functions passing floats to doubles (k&r problems?)
  put all the configurable stuff in pngconf.h
  enabled png_set_shift to work with paletted images on read
  added png_read_update_info() - updates info structure with
     transformations
version 0.81 [August, 1995]
  incorporated Tim Wegner's medium model code (thanks, Tim)
version 0.82 [September, 1995]
  [unspecified changes]
version 0.85 [December, 1995]
  added more medium model code (almost everything's a far)
  added i/o, error, and memory callback functions
  fixed some bugs (16 bit, 4 bit interlaced, etc.)
  added first run progressive reader (barely tested)
version 0.86 [January, 1996]
  fixed bugs
  improved documentation
version 0.87 [January, 1996]
  fixed medium model bugs
  fixed other bugs introduced in 0.85 and 0.86
  added some minor documentation
version 0.88 [January, 1996]
  fixed progressive bugs
  replaced tabs with spaces
  cleaned up documentation
  added callbacks for read/write and warning/error functions
version 0.89 [July, 1996]
  added new initialization API to make libpng work better with shared libs
     we now have png_create_read_struct(), png_create_write_struct(),
     png_create_info_struct(), png_destroy_read_struct(), and
     png_destroy_write_struct() instead of the separate calls to
     malloc and png_read_init(), png_info_init(), and png_write_init()
  changed warning/error callback functions to fix bug - this means you
     should use the new initialization API if you were using the old
     png_set_message_fn() calls, and that the old API no longer exists
     so that people are aware that they need to change their code
  changed filter selection API to allow selection of multiple filters
     since it didn't work in previous versions of libpng anyways
  optimized filter selection code    
  fixed png_set_background() to allow using an arbitrary RGB color for
     paletted images
  fixed gamma and background correction for paletted images, so
     png_correct_palette is not needed unless you are correcting an
     external palette (you will need to #define PNG_CORRECT_PALETTE_SUPPORTED
     in pngconf.h) - if nobody uses this, it may disappear in the future.
  fixed bug with Borland 64K memory allocation (Alexander Lehmann)
  fixed bug in interlace handling (Smarasderagd, I think)
  added more error checking for writing and image to reduce invalid files
  separated read and write functions so that they won't both be linked
     into a binary when only reading or writing functionality is used
  new pngtest image also has interlacing and zTXt
  updated documentation to reflect new API
version 0.90 [January, 1997]
  made CRC errors/warnings on critical and ancillary chunks configurable
  libpng will use the zlib CRC routines by (compile-time) default
  changed DOS small/medium model memory support - needs zlib 1.04 (Tim Wegner)
  added external C++ wrapper statements to png.h (Gilles Dauphin)
  allow PNG file to be read when some or all of file signature has already
     been read from the beginning of the stream.  ****This affects the size
     of info_struct and invalidates all programs that use a shared libpng****
  fixed png_filler() declarations
  fixed? background color conversions
  fixed order of error function pointers to match documentation
  current chunk name is now available in png_struct to reduce the number
     of nearly identical error messages (will simplify multi-lingual
     support when available)
  try to get ready for unknown-chunk callback functions:
     - previously read critical chunks are flagged, so the chunk handling
       routines can determine if the chunk is in the right place
     - all chunk handling routines have the same prototypes, so we will
       be able to handle all chunks via a callback mechanism
  try to fix Linux "setjmp" buffer size problems
version 0.95 [March, 1997]
  fixed bug in pngwutil.c allocating "up_row" twice and "avg_row" never
  fixed bug in PNG file signature compares when start != 0
  changed parameter type of png_set_filler(...filler...) from png_byte
     to png_uint_32
  added test for MACOS to ensure that both math.h and fp.h are not #included
  added macros for libpng to be compiled as a Windows DLL (Andreas Kupries)
  added "packswap" transformation, which changes the endianness of
     packed-pixel bytes (Kevin Bracey)
  added "strip_alpha" transformation, which removes the alpha channel of
     input images without using it (not neccesarily a good idea)
  added "swap_alpha" transformation, which puts the alpha channel in front
     of the color bytes instead of after
  removed all implicit variable tests which assume NULL == 0 (I think)
  changed several variables to "png_size_t" to show 16/32-bit limitations
  added new pCAL chunk read/write support
  added experimental filter selection weighting (Greg Roelofs)
  removed old png_set_rgbx() and png_set_xrgb() functions that have been
     obsolete for about 2 years now (use png_set_filler() instead)
  added macros to read 16- and 32-bit ints directly from buffer, to be
     used only on those systems that support it (namely PowerPC and 680x0)
     With some testing, this may become the default for MACOS/PPC systems.
  only calculate CRC on data if we are going to use it
  added macros for zTXt compression type PNG_zTXt_COMPRESSION_???
  added macros for simple libpng debugging output selectable at compile time
  removed PNG_READ_END_MODE in progressive reader (Smarasderagd)
  more description of info_struct in libpng.txt and png.h
  more instructions in example.c
  more chunk types tested in pngtest.c
  renamed pngrcb.c to pngset.c, and all png_read_<chunk> functions to be
     png_set_<chunk>.  We now have corresponding png_get_<chunk>
     functions in pngget.c to get infomation in info_ptr.  This isolates
     the application from the internal organization of png_info_struct
     (good for shared library implementations).
version 0.96 [May, 1997]
  fixed serious bug with < 8bpp images introduced in 0.95
  fixed 256-color transparency bug (Greg Roelofs)
  fixed up documentation (Greg Roelofs, Laszlo Nyul)
  fixed "error" in pngconf.h for Linux setjmp() behaviour
  fixed DOS medium model support (Tim Wegner)
  fixed png_check_keyword() for case with error in static string text
  added read of CRC after IEND chunk for embedded PNGs (Laszlo Nyul)
  added typecasts to quiet compiler errors
  added more debugging info
version 0.97 [January, 1998]
  removed PNG_USE_OWN_CRC capability
  relocated png_set_crc_action from pngrutil.c to pngrtran.c
  fixed typecasts of "new_key", etc. (Andreas Dilger)
  added RFC 1152 [sic] date support
  fixed bug in gamma handling of 4-bit grayscale
  added 2-bit grayscale gamma handling (Glenn R-P)
  added more typecasts. 65536L becomes (png_uint_32)65536L, etc. (Glenn R-P)
  minor corrections in libpng.txt
  added simple sRGB support (Glenn R-P)
  easier conditional compiling, e.g. define PNG_READ/WRITE_NOT_FULLY_SUPPORTED;
     all configurable options can be selected from command-line instead
     of having to edit pngconf.h (Glenn R-P)
  fixed memory leak in pngwrite.c (free info_ptr->text) (Glenn R-P)
  added more conditions for png_do_background, to avoid changing
     black pixels to background when a background is supplied and
     no pixels are transparent
  repaired PNG_NO_STDIO behaviour
  tested NODIV support and made it default behaviour (Greg Roelofs)
  added "-m" option and PNGTEST_DEBUG_MEMORY to pngtest (John Bowler)
  regularized version numbering scheme and bumped shared-library major
     version number to 2 to avoid problems with libpng 0.89 apps (Greg Roelofs)
version 0.98 [January, 1998]
  cleaned up some typos in libpng.txt and in code documentation
  fixed memory leaks in pCAL chunk processing (Glenn R-P and John Bowler)
  cosmetic change "display_gamma" to "screen_gamma" in pngrtran.c
  changed recommendation about file_gamma for PC images to .51 from .45,
     in example.c and libpng.txt, added comments to distinguish between
     screen_gamma, viewing_gamma, and display_gamma.
  changed all references to RFC1152 to read RFC1123 and changed the
     PNG_TIME_RFC1152_SUPPORTED macro to PNG_TIME_RFC1123_SUPPORTED
  added png_invert_alpha capability (Glenn R-P -- suggestion by Jon Vincent)
  changed srgb_intent from png_byte to int to avoid compiler bugs
version 0.99 [January 30, 1998]
  free info_ptr->text instead of end_info_ptr->text in pngread.c (John Bowler)
  fixed a longstanding "packswap" bug in pngtrans.c
  fixed some inconsistencies in pngconf.h that prevented compiling with
     PNG_READ_GAMMA_SUPPORTED and PNG_READ_hIST_SUPPORTED undefined
  fixed some typos and made other minor rearrangement of libpng.txt (Andreas)
  changed recommendation about file_gamma for PC images to .50 from .51 in
     example.c and libpng.txt, and changed file_gamma for sRGB images to .45
  added a number of functions to access information from the png structure
     png_get_image_height(), etc. (Glenn R-P, suggestion by Brad Pettit)
  added TARGET_MACOS similar to zlib-1.0.8
  define PNG_ALWAYS_EXTERN when __MWERKS__ && WIN32 are defined
  added type casting to all png_malloc() function calls
version 0.99a [January 31, 1998]
  Added type casts and parentheses to all returns that return a value.(Tim W.)
version 0.99b [February 4, 1998]
  Added type cast png_uint_32 on malloc function calls where needed.
  Changed type of num_hist from png_uint_32 to int (same as num_palette).
  Added checks for rowbytes overflow, in case png_size_t is less than 32 bits.
  Renamed makefile.elf to makefile.lnx.
version 0.99c [February 7, 1998]
  More type casting.  Removed erroneous overflow test in pngmem.c.
  Added png_buffered_memcpy() and png_buffered_memset(), apply them to rowbytes.
  Added UNIX manual pages libpng.3 (incorporating libpng.txt) and  png.5.
version 0.99d [February 11, 1998]
  Renamed "far_to_near()" "png_far_to_near()"
  Revised libpng.3
  Version 99c "buffered" operations didn't work as intended.  Replaced them
    with png_memcpy_check() and png_memset_check().
  Added many "if (png_ptr == NULL) return" to quell compiler warnings about
    unused png_ptr, mostly in pngget.c and pngset.c.
  Check for overlength tRNS chunk present when indexed-color PLTE is read.
  Cleaned up spelling errors in libpng.3/libpng.txt
  Corrected a problem with png_get_tRNS() which returned undefined trans array
version 0.99e [February 28, 1998]
  Corrected png_get_tRNS() again.
  Add parentheses for easier reading of pngget.c, fixed "||" should be "&&".
  Touched up example.c to make more of it compileable, although the entire
    file still can't be compiled (Willem van Schaik)
  Fixed a bug in png_do_shift() (Bryan Tsai)
  Added a space in png.h prototype for png_write_chunk_start()
  Replaced pngtest.png with one created with zlib 1.1.1
  Changed pngtest to report PASS even when file size is different (Jean-loup G.)
  Corrected some logic errors in png_do_invert_alpha() (Chris Patterson)
version 0.99f [March 5, 1998]
  Corrected a bug in pngpread() introduced in version 99c (Kevin Bracey)
  Moved makefiles into a "scripts" directory, and added INSTALL instruction file
  Added makefile.os2 and pngos2.def (A. Zabolotny) and makefile.s2x (W. Sebok)
  Added pointers to "note on libpng versions" in makefile.lnx and README
  Added row callback feature when reading and writing nonprogressive rows
     and added a test of this feature in pngtest.c
  Added user transform callbacks, with test of the feature in pngtest.c
version 0.99g [March 6, 1998, morning]
  Minor changes to pngtest.c to suppress compiler warnings.
  Removed "beta" language from documentation.
version 0.99h [March 6, 1998, evening]
  Minor changes to previous minor changes to pngtest.c 
  Changed PNG_READ_NOT_FULLY_SUPPORTED to PNG_READ_TRANSFORMS_NOT_SUPPORTED
  and added PNG_PROGRESSIVE_READ_NOT_SUPPORTED macro
version 1.00 [March 7, 1998]
  Changed several typedefs in pngrutil.c
  Added makefile.wat (Pawel Mrochen), updated makefile.tc3 (Willem van Schaik)
  replaced "while(1)" with "for(;;)"
  added PNGARG() to prototypes in pngtest.c and removed some prototypes
  updated some of the makefiles (Tom Lane)
  changed some typedefs (s_start, etc.) in pngrutil.c
  fixed dimensions of "short_months" array in pngwrite.c
  Replaced ansi2knr.c with the one from jpeg-v6
version 1.0.0 [March 8, 1998]
  Changed name from 1.00 to 1.0.0 (Adam Costello)
  Added smakefile.ppc (with SCOPTIONS.ppc) for Amiga PPC (Andreas Kleinert)
version 1.0.0a [March 9, 1998]
  Fixed three bugs in pngrtran.c to make gamma+background handling consistent
  (Greg Roelofs)
  Changed format of the PNG_LIBPNG_VER integer to xyyzz instead of xyz
  for major, minor, and bugfix releases.  This is 10001. (Adam Costello,
  Tom Lane)
  Make months range from 1-12 in png_convert_to_rfc1123
version 1.0.0b [March 13, 1998]
  Quieted compiler complaints about two empty "for" loops in pngrutil.c
  Minor changes to makefile.s2x
  Removed #ifdef/#endif around a png_free() in pngread.c
version 1.0.1 [March 14, 1998]
  Changed makefile.s2x to reduce security risk of using a relative pathname
  Fixed some typos in the documentation (Greg).
  Fixed a problem with value of "channels" returned by png_read_update_info()
version 1.0.1a [April 21, 1998]
  Optimized Paeth calculations by replacing abs() function calls with intrinsics
  plus other loop optimizations. Improves avg decoding speed by about 20%.
  Commented out i386istic "align" compiler flags in makefile.lnx.
  Reduced the default warning level in some makefiles, to make them consistent.
  Removed references to IJG and JPEG in the ansi2knr.c copyright statement.
  Fixed a bug in png_do_strip_filler with XXRRGGBB => RRGGBB transformation.
  Added grayscale and 16-bit capability to png_do_read_filler().
  Fixed a bug in pngset.c, introduced in version 0.99c, that sets rowbytes
    too large when writing an image with bit_depth < 8 (Bob Dellaca).
  Corrected some bugs in the experimental weighted filtering heuristics.
  Moved a misplaced pngrutil code block that truncates tRNS if it has more
    than num_palette entries -- test was done before num_palette was defined.
  Fixed a png_convert_to_rfc1123() bug that converts day 31 to 0 (Steve Eddins).
  Changed compiler flags in makefile.wat for better optimization (Pawel Mrochen).
version 1.0.1b [May 2, 1998]
  Relocated png_do_gray_to_rgb() within png_do_read_transformations() (Greg).
  Relocated the png_composite macros from pngrtran.c to png.h (Greg).
  Added makefile.sco (contributed by Mike Hopkirk).
  Fixed two bugs (missing definitions of "istop") introduced in libpng-1.0.1a.
  Fixed a bug in pngrtran.c that would set channels=5 under some circumstances.
  More work on the Paeth-filtering, achieving imperceptible speedup (A Kleinert).
  More work on loop optimization which may help when compiled with C++ compilers.
  Added warnings when people try to use transforms they've defined out.
  Collapsed 4 "i" and "c" loops into single "i" loops in pngrtran and pngwtran.
  Revised paragraph about png_set_expand() in libpng.txt and libpng.3 (Greg)
version 1.0.1c [May 11, 1998]
  Fixed a bug in pngrtran.c (introduced in libpng-1.0.1a) where the masks for
    filler bytes should have been 0xff instead of 0xf.
  Added max_pixel_depth=32 in pngrutil.c when using FILLER with palette images.
  Moved PNG_WRIGHT_WEIGHTED_FILTER_SUPPORTED and PNG_WRITE_FLUSH_SUPPORTED
    out of the PNG_WRITE_TRANSFORMS_NOT_SUPPORTED block of pngconf.h
  Added "PNG_NO_WRITE_TRANSFORMS" etc., as alternatives for *_NOT_SUPPORTED,
    for consistency, in pngconf.h
  Added individual "ifndef PNG_NO_[CAPABILITY]" in pngconf.h to make it easier
    to remove unwanted capabilities via the compile line
  Made some corrections to grammar (which, it's) in documentation (Greg).
  Corrected example.c, use of row_pointers in png_write_image().
version 1.0.1d [May 21, 1998]
  Corrected several statements that some compilers interpret as illegal use
    of side effects in pngrutil.c and pngtrans.c, that were introduced in
    version 1.0.1b
  Revised png_read_rows() to avoid repeated if-testing for NULL (A Kleinert)
  More corrections to example.c, use of row_pointers in png_write_image()
    and png_read_rows().
  Added pngdll.mak and pngdef.pas to scripts directory, contributed by
    Bob Dellaca, to make a png32bd.dll with Borland C++ 4.5
  Fixed error in example.c with png_set_text: num_text is 3, not 2 (Guido V.)
  Changed several loops from count-down to count-up, for consistency.
