
Libpng 1.0.7beta16 - June 4, 2000

This is a public release of libpng, intended for use in production codes.

Changes since the last public release (1.0.6):

  Changed sprintf() to strcpy() in png_write_sCAL_s() to work without STDIO
  Added data_length parameter to png_decompress_chunk() function
  Revised documentation to remove reference to abandoned png_free_chnk functions
  Fixed an error in png_rgb_to_gray_fixed()
  Revised example.c, usage of png_destroy_write_struct().
  Renamed makefile.ibmvac3 to makefile.ibmc, added libpng.icc IBM project file
  Added a check for info_ptr->free_me&PNG_FREE_TEXT when free'ing text in png.c
  Simplify png_sig_bytes() function to remove use of non-ISO-C strdup().
  Added png_data_freer() function.
  In the code that checks for over-length tRNS chunks, added check of
    info_ptr->num_trans as well as png_ptr->num_trans (Matthias Benckmann)
  Check for existing data and free it if the free_me flag is set, in png_set_*()
    and png_handle_*().
  Only define PNG_WEIGHTED_FILTERS_SUPPORTED when PNG_FLOATING_POINT_SUPPORTED
    is defined.
  Changed several instances of PNG_NO_CONSOLE_ID to PNG_NO_STDIO in pngrutil.c
    and mentioned the purposes of the two macros in libpng.txt/libpng.3.
  Revised png_set_iCCP() and png_set_rows() to avoid prematurely freeing data.
  Add checks in png_set_text() for NULL members of the input text structure.
  Removed superfluous prototype for png_set_itxt from png.h
  Removed "else" from pngread.c, after png_error(), and changed "0" to "length".
  Changed several png_errors about malformed ancillary chunks to png_warnings.
  Added png_pass-* arrays to pnggccrd.c when PNG_USE_LOCAL_ARRAYS is defined.
  Relocated paragraph about png_set_background() in libpng.3/libpng.txt
    and other revisions (Matthias Benckmann)
  Relocated info_ptr->free_me to restore binary compatibility with libpng-1.0.5
    (breaks compatibility with libpng-1.0.6).
  Relocated info_ptr->free_me, png_ptr->free_me, and other info_ptr and
    png_ptr members to restore binary compatibility with libpng-1.0.5
    (breaks compatibility with libpng-1.0.6).
  Rearranged some members at the end of png_info and png_struct, to put
    unknown_chunks_num and free_me within the original size of the png_structs
    and free_me, png_read_user_fn, and png_free_fn within the original png_info,
    because some old applications allocate the structs directly instead of
    using png_create_*().
  Added documentation of user memory functions in libpng.txt/libpng.3
  Modified png_read_png so that it will use user_allocated row_pointers
    if present, unless free_me directs that it be freed, and added description
    of the use of png_set_rows() and png_get_rows() in libpng.txt/libpng.3.
  Added PNG_LEGACY_SUPPORTED macro, and #ifdef out all new (since version
    1.00) members of png_struct and png_info, to regain binary compatibility
    when you define this macro.  Capabilities lost in this event
    are user transforms (new in version 1.0.0),the user transform pointer
    (new in version 1.0.2), rgb_to_gray (new in 1.0.5), iCCP, sCAL, sPLT,
    the high-level interface, and unknown chunks support (all new in 1.0.6).
    This was necessary because of old applications that allocate the structs
    directly as authors were instructed to do in libpng-0.88 and earlier,
    instead of using png_create_*(). 
  Added makefile.intel and updated makefile.watcom (Pawel Mrochen)
  Overloaded png_read_init() and png_write_init() with macros that convert
    calls to png_read_init_2() or png_write_init_2() that check the version
    and structure sizes.
  Made PNG_NO_ITXT_SUPPORTED the default setting, to avoid memory overrun
    when old applications fill the info_ptr->text structure directly.
  Added PNGAPI macro, and added it to the definitions of all exported functions.
  Made PNG_NO_CONSOLE_IO the default condition when PNG_BUILD_DLL is defined.
  Use MSC _RPTn debugging instead of fprintf if _MSC_VER is defined.
  Added png_access_version_number() function.
  Check for mask&PNG_FREE_CHNK (for TEXT, SCAL, PCAL) in png_free_data().
  Expanded libpng.3/libpng.txt information about png_data_freer().
  Changed pnggccrd.c and pngvcrd.c to handle bad adaptive filter types as
    warnings instead of errors, as pngrutil.c does.
  Set the PNG_INFO_IDAT valid flag in png_set_rows() so png_write_png()
    will actually write IDATs.
  Made the default PNG_USE_LOCAL_ARRAYS depend on PNG_DLL instead of WIN32.
  Make png_free_data() ignore its final parameter when freeing data that can
    have multiple instances (text, sPLT, unknowns).
  Removed info_ptr->valid tests from png_free_data(), as in version 1.0.5.
  Added png_set_invalid() function.
  Fixed incorrect illustrations of png_destroy_write_struct() in example.c.
  Revised the deliberately erroneous Linux setjmp code in pngconf.h to produce
    fewer error messages.
  Set each pointer to NULL after freeing it in png_free_data().
  Worked around a problem in pngconf.h; AIX's strings.h defines an "index"
    macro that conflicts with libpng's png_color_16.index. (Dimitri Papadapoulos)
  Added "msvc" directory with MSVC++ project files (Simon-Pierre Cadieux).
  Added PNG_NO_POINTER_INDEXING macro to use array-indexing instead of pointer
    indexing in pngrutil.c and pngwutil.c to accommodate a buggy compiler.
  Added a check for overlength PLTE chunk in pngrutil.c.
  Added PNG_NO_POINTER_INDEXING macro to use array-indexing instead of pointer
    indexing in pngrutil.c and pngwutil.c to accommodate a buggy compiler.
  Added a warning in png_decompress_chunk() when it runs out of data.
  Added PNG_USE_DLL macro.
  Revised the copyright/disclaimer/license notice.

Send comments/corrections/commendations to
png-implement@ccrc.wustl.edu or to randeg@alum.rpi.edu

Glenn R-P
