mirror of
https://git.code.sf.net/p/libpng/code.git
synced 2025-07-10 18:04:09 +02:00
[master] Imported from libpng-1.6.18.tar
This commit is contained in:
parent
2b667e4923
commit
287fb89248
114
ANNOUNCE
114
ANNOUNCE
@ -1,4 +1,4 @@
|
|||||||
Libpng 1.6.17 - March 26, 2015
|
Libpng 1.6.18 - July 23, 2015
|
||||||
|
|
||||||
This is a public release of libpng, intended for use in production codes.
|
This is a public release of libpng, intended for use in production codes.
|
||||||
|
|
||||||
@ -7,61 +7,79 @@ Files available for download:
|
|||||||
Source files with LF line endings (for Unix/Linux) and with a
|
Source files with LF line endings (for Unix/Linux) and with a
|
||||||
"configure" script
|
"configure" script
|
||||||
|
|
||||||
libpng-1.6.17.tar.xz (LZMA-compressed, recommended)
|
libpng-1.6.18.tar.xz (LZMA-compressed, recommended)
|
||||||
libpng-1.6.17.tar.gz
|
libpng-1.6.18.tar.gz
|
||||||
|
|
||||||
Source files with CRLF line endings (for Windows), without the
|
Source files with CRLF line endings (for Windows), without the
|
||||||
"configure" script
|
"configure" script
|
||||||
|
|
||||||
lpng1617.7z (LZMA-compressed, recommended)
|
lpng1618.7z (LZMA-compressed, recommended)
|
||||||
lpng1617.zip
|
lpng1618.zip
|
||||||
|
|
||||||
Other information:
|
Other information:
|
||||||
|
|
||||||
libpng-1.6.17-README.txt
|
libpng-1.6.18-README.txt
|
||||||
libpng-1.6.17-LICENSE.txt
|
libpng-1.6.18-LICENSE.txt
|
||||||
libpng-1.6.17-*.asc (armored detached GPG signatures)
|
libpng-1.6.18-*.asc (armored detached GPG signatures)
|
||||||
|
|
||||||
Changes since the last public release (1.6.16):
|
Changes since the last public release (1.6.17):
|
||||||
|
Removed PNG_SET_CHUNK_[CACHE|MALLOC]_LIMIT_SUPPORTED macros. They
|
||||||
Removed duplicate PNG_SAFE_LIMITS_SUPPORTED handling from pngconf.h
|
have been combined with PNG_SET_USER_LIMITS_SUPPORTED (resolves
|
||||||
Corrected the width limit calculation in png_check_IHDR().
|
bug report by Andrew Church).
|
||||||
Removed user limits from pngfix. Also pass NULL pointers to
|
Fixed rgb_to_gray checks and added tRNS checks to pngvalid.c. This
|
||||||
png_read_row to skip the unnecessary row de-interlace stuff.
|
fixes some arithmetic errors that caused some tests to fail on
|
||||||
Added testing of png_set_packing() to pngvalid.c
|
some 32-bit platforms (Bug reports by Peter Breitenlohner [i686]
|
||||||
Regenerated configure scripts in the *.tar distributions with libtool-2.4.4
|
and Petr Gajdos [i586]).
|
||||||
Implement previously untested cases of libpng transforms in pngvalid.c
|
Suppressed some warnings from the Borland C++ 5.5.1/5.82 compiler
|
||||||
Fixed byte order in 2-byte filler, in png_do_read_filler().
|
(Bug report by Viktor Szaka'ts).
|
||||||
Made the check for out-of-range values in png_set_tRNS() detect
|
Replaced "unexpected" with an integer (0xabadca11) in pngset.c
|
||||||
values that are exactly 2^bit_depth, and work on 16-bit platforms.
|
where a long was expected, to avoid a compiler warning when PNG_DEBUG > 1.
|
||||||
Merged some parts of libpng-1.6.17beta01 and libpng-1.7.0beta47.
|
Added contrib/examples/simpleover.c, to demonstrate how to handle
|
||||||
Added #ifndef __COVERITY__ where needed in png.c, pngrutil.c and
|
alpha compositing of multiple images, using the "simplified API"
|
||||||
pngset.c to avoid warnings about dead code.
|
and an example PNG generation tool, contrib/examples/genpng.c
|
||||||
Do not build png_product2() when it is unused.
|
(John Bowler).
|
||||||
Display user limits in the output from pngtest.
|
PNG_RELEASE_BUILD replaces tests where the code depended on the build base
|
||||||
Eliminated the PNG_SAFE_LIMITS macro and restored the 1-million-column
|
type and can be defined on the command line, allowing testing in beta
|
||||||
and 1-million-row default limits in pnglibconf.dfa, that can be reset
|
builds (John Bowler).
|
||||||
by the user at build time or run time. This provides a more robust
|
Avoid Coverity issue 80858 (REVERSE NULL) in pngtest.c
|
||||||
defense against DOS and as-yet undiscovered overflows.
|
Avoid a harmless potential integer overflow in png_XYZ_from_xy() (Bug
|
||||||
Added PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED macro, on by default.
|
report from Christopher Ferris).
|
||||||
Allow user to call png_get_IHDR() with NULL arguments (Reuben Hawkins).
|
Backport filter selection code from libpng-1.7.0beta51, to combine
|
||||||
Rebuilt configure scripts with automake-1.15 and libtool-2.4.6
|
sub_row, up_row, avg_row, and paeth_row into try_row and tst_row.
|
||||||
Moved png_set_filter() prototype into a PNG_WRITE_SUPPORTED block
|
Changed png_voidcast(), etc., to voidcast(), etc., in contrib/tools/pngfix.c
|
||||||
of png.h.
|
to avoid confusion with the libpng private macros.
|
||||||
Avoid runtime checks when converting integer to png_byte with
|
Fixed old cut&paste bug in the weighted filter selection code in
|
||||||
Visual Studio (Sergey Kosarevsky)
|
pngwutil.c, introduced in libpng-0.95, March 1997.
|
||||||
Removed some comments that the configure script did not handle
|
Removed WRITE_WEIGHTED_FILTERED code, to save a few kbytes of the
|
||||||
properly from scripts/pnglibconf.dfa and pnglibconf.h.prebuilt.
|
compiled library size. It never worked properly and as far as we can
|
||||||
Free the unknown_chunks structure even when it contains no data.
|
tell, no one uses it. The png_set_filter_heuristics() and
|
||||||
Updated CMakeLists.txt to add OSX framework, change YES/NO to ON/OFF
|
png_set_filter_heuristics_fixed() APIs are retained but deprecated
|
||||||
for consistency, and remove some useless tests (Alexey Petruchik).
|
and do nothing.
|
||||||
Remove pnglibconf.h, pnglibconf.c, pnglibconf.pre, pnglibconf.dfn,
|
Quieted some Coverity issues in pngfix.c, png-fix-itxt.c, pngvalid.c,
|
||||||
and pnglibconf.out instead of pnglibconf.* in "make clean" (Cosmin).
|
pngstest.c, and pngimage.c. Most seem harmless, but png-fix-itxt
|
||||||
Fixed simplified 8-bit-linear to sRGB alpha. The calculated alpha
|
would only work with iTXt chunks with length 255 or less.
|
||||||
value was wrong. It's not clear if this affected the final stored
|
Removed non-working progressive reader 'skip' function. This
|
||||||
value; in the obvious code path the upper and lower 8-bits of the
|
function has apparently never been used. It was implemented
|
||||||
alpha value were identical and the alpha was truncated to 8-bits
|
to support back-door modification of png_struct in libpng-1.4.x
|
||||||
rather than dividing by 257 (John Bowler).
|
but (because it does nothing and cannot do anything) was apparently
|
||||||
|
never tested (John Bowler).
|
||||||
|
Fixed cexcept.h in which GCC 5 now reports that one of the auto
|
||||||
|
variables in the Try macro needs to be volatile to prevent value
|
||||||
|
being lost over the setjmp (John Bowler).
|
||||||
|
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).
|
||||||
|
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 pngstruct.h
|
||||||
|
Replaced arbitrary use of 'extern' with #define PNG_LINKAGE_*. To
|
||||||
|
preserve API compatibility, the new defines all default to "extern"
|
||||||
|
(requested by Jan Nijtmans).
|
||||||
|
Belatedly added Mans Rullgard and James Yu to the list of Contributing
|
||||||
|
Authors.
|
||||||
|
|
||||||
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
|
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
|
||||||
(subscription required; visit
|
(subscription required; visit
|
||||||
|
|||||||
161
CHANGES
161
CHANGES
@ -1,11 +1,14 @@
|
|||||||
|
#if 0
|
||||||
CHANGES - changes for libpng
|
CHANGES - changes for libpng
|
||||||
|
|
||||||
Version 0.2
|
version 0.1 [March 29, 1995]
|
||||||
|
initial work-in-progress release
|
||||||
|
|
||||||
|
version 0.2 [April 1, 1995]
|
||||||
added reader into png.h
|
added reader into png.h
|
||||||
fixed small problems in stub file
|
fixed small problems in stub file
|
||||||
|
|
||||||
Version 0.3
|
version 0.3 [April 8, 1995]
|
||||||
added pull reader
|
added pull reader
|
||||||
split up pngwrite.c to several files
|
split up pngwrite.c to several files
|
||||||
added pnglib.txt
|
added pnglib.txt
|
||||||
@ -14,9 +17,9 @@ Version 0.3
|
|||||||
fixed some bugs in writer
|
fixed some bugs in writer
|
||||||
interfaced with zlib 0.5
|
interfaced with zlib 0.5
|
||||||
added K&R support
|
added K&R support
|
||||||
added check for 64 KB blocks for 16-bit machines
|
added check for 64 KB blocks for 16 bit machines
|
||||||
|
|
||||||
Version 0.4
|
version 0.4 [April 26, 1995]
|
||||||
cleaned up code and commented code
|
cleaned up code and commented code
|
||||||
simplified time handling into png_time
|
simplified time handling into png_time
|
||||||
created png_color_16 and png_color_8 to handle color needs
|
created png_color_16 and png_color_8 to handle color needs
|
||||||
@ -27,28 +30,29 @@ Version 0.4
|
|||||||
cleaned up zTXt reader and writer (using zlib's Reset functions)
|
cleaned up zTXt reader and writer (using zlib's Reset functions)
|
||||||
split transformations into pngrtran.c and pngwtran.c
|
split transformations into pngrtran.c and pngwtran.c
|
||||||
|
|
||||||
Version 0.5
|
version 0.5 [April 30, 1995]
|
||||||
interfaced with zlib 0.8
|
interfaced with zlib 0.8
|
||||||
fixed many reading and writing bugs
|
fixed many reading and writing bugs
|
||||||
saved using 3 spaces instead of tabs
|
saved using 3 spaces instead of tabs
|
||||||
|
|
||||||
Version 0.6
|
version 0.6 [May 1, 1995]
|
||||||
|
first beta release
|
||||||
added png_large_malloc() and png_large_free()
|
added png_large_malloc() and png_large_free()
|
||||||
added png_size_t
|
added png_size_t
|
||||||
cleaned up some compiler warnings
|
cleaned up some compiler warnings
|
||||||
added png_start_read_image()
|
added png_start_read_image()
|
||||||
|
|
||||||
Version 0.7
|
version 0.7 [June 24, 1995]
|
||||||
cleaned up lots of bugs
|
cleaned up lots of bugs
|
||||||
finished dithering and other stuff
|
finished dithering and other stuff
|
||||||
added test program
|
added test program
|
||||||
changed name from pnglib to libpng
|
changed name from pnglib to libpng
|
||||||
|
|
||||||
Version 0.71 [June, 1995]
|
version 0.71 [June 26, 1995]
|
||||||
changed pngtest.png for zlib 0.93
|
changed pngtest.png for zlib 0.93
|
||||||
fixed error in libpng.txt and example.c
|
fixed error in libpng.txt and example.c
|
||||||
|
|
||||||
Version 0.8
|
version 0.8 [August 20, 1995]
|
||||||
cleaned up some bugs
|
cleaned up some bugs
|
||||||
added png_set_filler()
|
added png_set_filler()
|
||||||
split up pngstub.c into pngmem.c, pngio.c, and pngerror.c
|
split up pngstub.c into pngmem.c, pngio.c, and pngerror.c
|
||||||
@ -91,7 +95,7 @@ Version 0.88 [January, 1996]
|
|||||||
cleaned up documentation
|
cleaned up documentation
|
||||||
added callbacks for read/write and warning/error functions
|
added callbacks for read/write and warning/error functions
|
||||||
|
|
||||||
Version 0.89 [July, 1996]
|
Version 0.89 [June 5, 1996]
|
||||||
Added new initialization API to make libpng work better with shared libs
|
Added new initialization API to make libpng work better with shared libs
|
||||||
we now have png_create_read_struct(), png_create_write_struct(),
|
we now have png_create_read_struct(), png_create_write_struct(),
|
||||||
png_create_info_struct(), png_destroy_read_struct(), and
|
png_create_info_struct(), png_destroy_read_struct(), and
|
||||||
@ -118,6 +122,9 @@ Version 0.89 [July, 1996]
|
|||||||
New pngtest image also has interlacing and zTXt
|
New pngtest image also has interlacing and zTXt
|
||||||
Updated documentation to reflect new API
|
Updated documentation to reflect new API
|
||||||
|
|
||||||
|
Version 0.89c [June 17, 1996]
|
||||||
|
Bug fixes.
|
||||||
|
|
||||||
Version 0.90 [January, 1997]
|
Version 0.90 [January, 1997]
|
||||||
Made CRC errors/warnings on critical and ancillary chunks configurable
|
Made CRC errors/warnings on critical and ancillary chunks configurable
|
||||||
libpng will use the zlib CRC routines by (compile-time) default
|
libpng will use the zlib CRC routines by (compile-time) default
|
||||||
@ -158,7 +165,7 @@ Version 0.95 [March, 1997]
|
|||||||
Added new pCAL chunk read/write support
|
Added new pCAL chunk read/write support
|
||||||
Added experimental filter selection weighting (Greg Roelofs)
|
Added experimental filter selection weighting (Greg Roelofs)
|
||||||
Removed old png_set_rgbx() and png_set_xrgb() functions that have been
|
Removed old png_set_rgbx() and png_set_xrgb() functions that have been
|
||||||
obsolete for about 2 years now (use png_set_filler() instead)
|
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
|
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)
|
used only on those systems that support it (namely PowerPC and 680x0)
|
||||||
With some testing, this may become the default for MACOS/PPC systems.
|
With some testing, this may become the default for MACOS/PPC systems.
|
||||||
@ -440,7 +447,7 @@ Version 1.0.3 [January 14, 1999]
|
|||||||
|
|
||||||
Version 1.0.3a [August 12, 1999]
|
Version 1.0.3a [August 12, 1999]
|
||||||
Added check for PNG_READ_INTERLACE_SUPPORTED in pngread.c; issue a warning
|
Added check for PNG_READ_INTERLACE_SUPPORTED in pngread.c; issue a warning
|
||||||
if an attempt is made to read an interlaced image when it's not supported.
|
if an attempt is made to read an interlaced image when it's not supported.
|
||||||
Added check if png_ptr->trans is defined before freeing it in pngread.c
|
Added check if png_ptr->trans is defined before freeing it in pngread.c
|
||||||
Modified the Y2K statement to include versions back to version 0.71
|
Modified the Y2K statement to include versions back to version 0.71
|
||||||
Fixed a bug in the check for valid IHDR bit_depth/color_types in pngrutil.c
|
Fixed a bug in the check for valid IHDR bit_depth/color_types in pngrutil.c
|
||||||
@ -448,7 +455,7 @@ Version 1.0.3a [August 12, 1999]
|
|||||||
Replaced leading blanks with tab characters in makefile.hux
|
Replaced leading blanks with tab characters in makefile.hux
|
||||||
Changed "dworkin.wustl.edu" to "ccrc.wustl.edu" in various documents.
|
Changed "dworkin.wustl.edu" to "ccrc.wustl.edu" in various documents.
|
||||||
Changed (float)red and (float)green to (double)red, (double)green
|
Changed (float)red and (float)green to (double)red, (double)green
|
||||||
in png_set_rgb_to_gray() to avoid "promotion" problems in AIX.
|
in png_set_rgb_to_gray() to avoid "promotion" problems in AIX.
|
||||||
Fixed a bug in pngconf.h that omitted <stdio.h> when PNG_DEBUG==0 (K Bracey).
|
Fixed a bug in pngconf.h that omitted <stdio.h> when PNG_DEBUG==0 (K Bracey).
|
||||||
Reformatted libpng.3 and libpngpf.3 with proper fonts (script by J. vanZandt).
|
Reformatted libpng.3 and libpngpf.3 with proper fonts (script by J. vanZandt).
|
||||||
Updated documentation to refer to the PNG-1.2 specification.
|
Updated documentation to refer to the PNG-1.2 specification.
|
||||||
@ -491,7 +498,7 @@ Version 1.0.3d [September 4, 1999]
|
|||||||
Added new png_expand functions to scripts/pngdef.pas and pngos2.def
|
Added new png_expand functions to scripts/pngdef.pas and pngos2.def
|
||||||
Added a demo read_user_transform_fn that examines the row filters in pngtest.c
|
Added a demo read_user_transform_fn that examines the row filters in pngtest.c
|
||||||
|
|
||||||
Version 1.0.4 [September 24, 1999]
|
Version 1.0.4 [September 24, 1999, not distributed publicly]
|
||||||
Define PNG_ALWAYS_EXTERN in pngconf.h if __STDC__ is defined
|
Define PNG_ALWAYS_EXTERN in pngconf.h if __STDC__ is defined
|
||||||
Delete #define PNG_INTERNAL and include "png.h" from pngasmrd.h
|
Delete #define PNG_INTERNAL and include "png.h" from pngasmrd.h
|
||||||
Made several minor corrections to pngtest.c
|
Made several minor corrections to pngtest.c
|
||||||
@ -518,6 +525,7 @@ Version 1.0.4c [October 1, 1999]
|
|||||||
Added a "png_check_version" function in png.c and pngtest.c that will generate
|
Added a "png_check_version" function in png.c and pngtest.c that will generate
|
||||||
a helpful compiler error if an old png.h is found in the search path.
|
a helpful compiler error if an old png.h is found in the search path.
|
||||||
Changed type of png_user_transform_depth|channels from int to png_byte.
|
Changed type of png_user_transform_depth|channels from int to png_byte.
|
||||||
|
Added "Libpng is OSI Certified Open Source Software" statement to png.h
|
||||||
|
|
||||||
Version 1.0.4d [October 6, 1999]
|
Version 1.0.4d [October 6, 1999]
|
||||||
Changed 0.45 to 0.45455 in png_set_sRGB()
|
Changed 0.45 to 0.45455 in png_set_sRGB()
|
||||||
@ -904,7 +912,7 @@ Version 1.0.7 [July 1, 2000]
|
|||||||
Version 1.0.8beta1 [July 8, 2000]
|
Version 1.0.8beta1 [July 8, 2000]
|
||||||
Added png_free(png_ptr, key) two places in pngpread.c to stop memory leaks.
|
Added png_free(png_ptr, key) two places in pngpread.c to stop memory leaks.
|
||||||
Changed PNG_NO_STDIO to PNG_NO_CONSOLE_IO, several places in pngrutil.c and
|
Changed PNG_NO_STDIO to PNG_NO_CONSOLE_IO, several places in pngrutil.c and
|
||||||
pngwutil.c.
|
pngwutil.c.
|
||||||
Changed PNG_EXPORT_VAR to use PNG_IMPEXP, in pngconf.h.
|
Changed PNG_EXPORT_VAR to use PNG_IMPEXP, in pngconf.h.
|
||||||
Removed unused "#include <assert.h>" from png.c
|
Removed unused "#include <assert.h>" from png.c
|
||||||
Added WindowsCE support.
|
Added WindowsCE support.
|
||||||
@ -912,12 +920,12 @@ Version 1.0.8beta1 [July 8, 2000]
|
|||||||
|
|
||||||
Version 1.0.8beta2 [July 10, 2000]
|
Version 1.0.8beta2 [July 10, 2000]
|
||||||
Added project files to the wince directory and made further revisions
|
Added project files to the wince directory and made further revisions
|
||||||
of pngtest.c, pngrio.c, and pngwio.c in support of WindowsCE.
|
of pngtest.c, pngrio.c, and pngwio.c in support of WindowsCE.
|
||||||
|
|
||||||
Version 1.0.8beta3 [July 11, 2000]
|
Version 1.0.8beta3 [July 11, 2000]
|
||||||
Only set the PNG_FLAG_FREE_TRNS or PNG_FREE_TRNS flag in png_handle_tRNS()
|
Only set the PNG_FLAG_FREE_TRNS or PNG_FREE_TRNS flag in png_handle_tRNS()
|
||||||
for indexed-color input files to avoid potential double-freeing trans array
|
for indexed-color input files to avoid potential double-freeing trans array
|
||||||
under some unusual conditions; problem was introduced in version 1.0.6f.
|
under some unusual conditions; problem was introduced in version 1.0.6f.
|
||||||
Further revisions to pngtest.c and files in the wince subdirectory.
|
Further revisions to pngtest.c and files in the wince subdirectory.
|
||||||
|
|
||||||
Version 1.0.8beta4 [July 14, 2000]
|
Version 1.0.8beta4 [July 14, 2000]
|
||||||
@ -1089,16 +1097,16 @@ Version 1.2.0beta3 [May 17, 2001]
|
|||||||
|
|
||||||
Version 1.2.0beta4 [June 23, 2001]
|
Version 1.2.0beta4 [June 23, 2001]
|
||||||
Check for missing profile length field in iCCP chunk and free chunk_data
|
Check for missing profile length field in iCCP chunk and free chunk_data
|
||||||
in case of truncated iCCP chunk.
|
in case of truncated iCCP chunk.
|
||||||
Bumped shared-library number to 3 in makefile.sgi and makefile.sggcc
|
Bumped shared-library number to 3 in makefile.sgi and makefile.sggcc
|
||||||
Bumped dll-number from 2 to 3 in makefile.cygwin
|
Bumped dll-number from 2 to 3 in makefile.cygwin
|
||||||
Revised contrib/gregbook/rpng*-x.c to avoid a memory leak and to exit cleanly
|
Revised contrib/gregbook/rpng*-x.c to avoid a memory leak and to exit cleanly
|
||||||
if user attempts to run it on an 8-bit display.
|
if user attempts to run it on an 8-bit display.
|
||||||
Updated contrib/gregbook
|
Updated contrib/gregbook
|
||||||
Use png_malloc instead of png_zalloc to allocate palette in pngset.c
|
Use png_malloc instead of png_zalloc to allocate palette in pngset.c
|
||||||
Updated makefile.ibmc
|
Updated makefile.ibmc
|
||||||
Added some typecasts to eliminate gcc 3.0 warnings. Changed prototypes
|
Added some typecasts to eliminate gcc 3.0 warnings. Changed prototypes
|
||||||
of png_write_oFFS width and height from png_uint_32 to png_int_32.
|
of png_write_oFFS width and height from png_uint_32 to png_int_32.
|
||||||
Updated example.c
|
Updated example.c
|
||||||
Revised prototypes for png_debug_malloc and png_debug_free in pngtest.c
|
Revised prototypes for png_debug_malloc and png_debug_free in pngtest.c
|
||||||
|
|
||||||
@ -1106,9 +1114,9 @@ Version 1.2.0beta5 [August 8, 2001]
|
|||||||
Revised contrib/gregbook
|
Revised contrib/gregbook
|
||||||
Revised makefile.gcmmx
|
Revised makefile.gcmmx
|
||||||
Revised pnggccrd.c to conditionally compile some thread-unsafe code only
|
Revised pnggccrd.c to conditionally compile some thread-unsafe code only
|
||||||
when PNG_THREAD_UNSAFE_OK is defined.
|
when PNG_THREAD_UNSAFE_OK is defined.
|
||||||
Added tests to prevent pngwutil.c from writing a bKGD or tRNS chunk with
|
Added tests to prevent pngwutil.c from writing a bKGD or tRNS chunk with
|
||||||
value exceeding 2^bit_depth-1
|
value exceeding 2^bit_depth-1
|
||||||
Revised makefile.sgi and makefile.sggcc
|
Revised makefile.sgi and makefile.sggcc
|
||||||
Replaced calls to fprintf(stderr,...) with png_warning() in pnggccrd.c
|
Replaced calls to fprintf(stderr,...) with png_warning() in pnggccrd.c
|
||||||
Removed restriction that do_invert_mono only operate on 1-bit opaque files
|
Removed restriction that do_invert_mono only operate on 1-bit opaque files
|
||||||
@ -1449,8 +1457,9 @@ Version 1.2.6beta4 [July 28, 2004]
|
|||||||
Use png_malloc instead of png_zalloc to allocate the pallete.
|
Use png_malloc instead of png_zalloc to allocate the pallete.
|
||||||
|
|
||||||
Version 1.0.16rc1 and 1.2.6rc1 [August 4, 2004]
|
Version 1.0.16rc1 and 1.2.6rc1 [August 4, 2004]
|
||||||
Fixed buffer overflow vulnerability in png_handle_tRNS()
|
Fixed buffer overflow vulnerability (CVE-2004-0597) in png_handle_tRNS().
|
||||||
Fixed integer arithmetic overflow vulnerability in png_read_png().
|
Fixed NULL dereference vulnerability (CVE-2004-0598) in png_handle_iCCP().
|
||||||
|
Fixed integer overflow vulnerability (CVE-2004-0599) in png_read_png().
|
||||||
Fixed some harmless bugs in png_handle_sBIT, etc, that would cause
|
Fixed some harmless bugs in png_handle_sBIT, etc, that would cause
|
||||||
duplicate chunk types to go undetected.
|
duplicate chunk types to go undetected.
|
||||||
Fixed some timestamps in the -config version
|
Fixed some timestamps in the -config version
|
||||||
@ -1493,7 +1502,7 @@ Version 1.0.16rc4 and 1.2.6rc4 [August 10, 2004]
|
|||||||
|
|
||||||
Version 1.0.16rc5 and 1.2.6rc5 [August 10, 2004]
|
Version 1.0.16rc5 and 1.2.6rc5 [August 10, 2004]
|
||||||
Moved "PNG_HANDLE_CHUNK_*" macros out of PNG_ASSEMBLER_CODE_SUPPORTED
|
Moved "PNG_HANDLE_CHUNK_*" macros out of PNG_ASSEMBLER_CODE_SUPPORTED
|
||||||
section of png.h where they were inadvertently placed in version rc3.
|
section of png.h where they were inadvertently placed in version rc3.
|
||||||
|
|
||||||
Version 1.2.6 and 1.0.16 [August 15, 2004]
|
Version 1.2.6 and 1.0.16 [August 15, 2004]
|
||||||
Revised pngtest so memory allocation testing is only done when PNG_DEBUG==1.
|
Revised pngtest so memory allocation testing is only done when PNG_DEBUG==1.
|
||||||
@ -2325,7 +2334,7 @@ Version 1.4.0beta63 [June 15, 2009]
|
|||||||
Version 1.4.0beta64 [June 24, 2009]
|
Version 1.4.0beta64 [June 24, 2009]
|
||||||
Eliminated PNG_LEGACY_SUPPORTED code.
|
Eliminated PNG_LEGACY_SUPPORTED code.
|
||||||
Moved the various unknown chunk macro definitions outside of the
|
Moved the various unknown chunk macro definitions outside of the
|
||||||
PNG_READ|WRITE_ANCILLARY_CHUNK_SUPPORTED blocks.
|
PNG_READ|WRITE_ANCILLARY_CHUNK_SUPPORTED blocks.
|
||||||
|
|
||||||
Version 1.4.0beta65 [June 26, 2009]
|
Version 1.4.0beta65 [June 26, 2009]
|
||||||
Added a reference to the libpng license in each file.
|
Added a reference to the libpng license in each file.
|
||||||
@ -4525,7 +4534,7 @@ Version 1.6.3beta03 [April 30, 2013]
|
|||||||
Expanded manual paragraph about writing private chunks, particularly
|
Expanded manual paragraph about writing private chunks, particularly
|
||||||
the need to call png_set_keep_unknown_chunks() when writing them.
|
the need to call png_set_keep_unknown_chunks() when writing them.
|
||||||
Avoid dereferencing NULL pointer possibly returned from
|
Avoid dereferencing NULL pointer possibly returned from
|
||||||
png_create_write_struct() (Andrew Church).
|
png_create_write_struct() (Andrew Church).
|
||||||
|
|
||||||
Version 1.6.3beta05 [May 9, 2013]
|
Version 1.6.3beta05 [May 9, 2013]
|
||||||
Calculate our own zlib windowBits when decoding rather than trusting the
|
Calculate our own zlib windowBits when decoding rather than trusting the
|
||||||
@ -5141,7 +5150,7 @@ Version 1.6.17beta01 [January 29, 2015]
|
|||||||
Added #ifndef __COVERITY__ where needed in png.c, pngrutil.c and
|
Added #ifndef __COVERITY__ where needed in png.c, pngrutil.c and
|
||||||
pngset.c to avoid warnings about dead code.
|
pngset.c to avoid warnings about dead code.
|
||||||
Added "& 0xff" to many instances of expressions that are typecast
|
Added "& 0xff" to many instances of expressions that are typecast
|
||||||
to (png_byte), to avoid Coverity gripes.
|
to (png_byte), to avoid Coverity warnings.
|
||||||
|
|
||||||
Version 1.6.17beta02 [February 7, 2015]
|
Version 1.6.17beta02 [February 7, 2015]
|
||||||
Work around one more Coverity-scan dead-code warning.
|
Work around one more Coverity-scan dead-code warning.
|
||||||
@ -5205,6 +5214,97 @@ Version 1.6.17rc06 [March 23, 2015]
|
|||||||
Version 1.6.17 [March 26, 2015]
|
Version 1.6.17 [March 26, 2015]
|
||||||
No changes.
|
No changes.
|
||||||
|
|
||||||
|
Version 1.6.18beta01 [April 1, 2015]
|
||||||
|
Removed PNG_SET_CHUNK_[CACHE|MALLOC]_LIMIT_SUPPORTED macros. They
|
||||||
|
have been combined with PNG_SET_USER_LIMITS_SUPPORTED (resolves
|
||||||
|
bug report by Andrew Church).
|
||||||
|
Fixed rgb_to_gray checks and added tRNS checks to pngvalid.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]).
|
||||||
|
|
||||||
|
Version 1.6.18beta02 [April 26, 2015]
|
||||||
|
Suppressed some warnings from the Borland C++ 5.5.1/5.82 compiler
|
||||||
|
(Bug report by Viktor Szaka'ts).
|
||||||
|
|
||||||
|
Version 1.6.18beta03 [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.
|
||||||
|
Added contrib/examples/simpleover.c, to demonstrate how to handle
|
||||||
|
alpha compositing of multiple images, using the "simplified API"
|
||||||
|
and an example PNG generation tool, contrib/examples/genpng.c
|
||||||
|
(John Bowler).
|
||||||
|
|
||||||
|
Version 1.6.18beta04 [May 20, 2015]
|
||||||
|
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 (John Bowler).
|
||||||
|
Avoid Coverity issue 80858 (REVERSE NULL) in pngtest.c PNG_DEBUG builds.
|
||||||
|
Avoid a harmless potential integer overflow in png_XYZ_from_xy() (Bug
|
||||||
|
report from Christopher Ferris).
|
||||||
|
|
||||||
|
Version 1.6.18beta05 [May 31, 2015]
|
||||||
|
Backport filter selection code from libpng-1.7.0beta51, to combine
|
||||||
|
sub_row, up_row, avg_row, and paeth_row into try_row and tst_row.
|
||||||
|
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.6.18beta06 [June 1, 2015]
|
||||||
|
Removed 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
|
||||||
|
and do nothing.
|
||||||
|
|
||||||
|
Version 1.6.18beta07 [June 6, 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).
|
||||||
|
Fixed cexcept.h in which GCC 5 now reports that one of the auto
|
||||||
|
variables in the Try macro needs to be volatile to prevent value
|
||||||
|
being lost over the setjmp (John Bowler).
|
||||||
|
Fixed NO_WRITE_FILTER and -Wconversion build breaks (John Bowler).
|
||||||
|
Fix g++ build breaks (John Bowler).
|
||||||
|
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.
|
||||||
|
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.6.18beta08 [June 30, 2015]
|
||||||
|
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
|
||||||
|
|
||||||
|
Version 1.6.18beta09 [July 5, 2015]
|
||||||
|
Removed some useless typecasts from contrib/tools/png-fix-itxt.c
|
||||||
|
Fixed a new signed-unsigned comparison in pngrtran.c (Max Stepin).
|
||||||
|
Replaced arbitrary use of 'extern' with #define PNG_LINKAGE_*. To
|
||||||
|
preserve API compatibility, the new defines all default to "extern"
|
||||||
|
(requested by Jan Nijtmans).
|
||||||
|
|
||||||
|
Version 1.6.18rc01 [July 9, 2015]
|
||||||
|
Belatedly added Mans Rullgard and James Yu to the list of Contributing
|
||||||
|
Authors.
|
||||||
|
|
||||||
|
Version 1.6.18rc02 [July 12, 2015]
|
||||||
|
Restored unused FILTER_HEURISTIC macros removed at libpng-1.6.18beta08
|
||||||
|
to png.h to avoid compatibility warnings.
|
||||||
|
|
||||||
|
Version 1.6.18rc03 [July 15, 2015]
|
||||||
|
Minor changes to the man page
|
||||||
|
|
||||||
|
Version 1.6.18 [July 23, 2015]
|
||||||
|
No changes.
|
||||||
|
|
||||||
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
|
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
|
||||||
(subscription required; visit
|
(subscription required; visit
|
||||||
https://lists.sourceforge.net/lists/listinfo/png-mng-implement
|
https://lists.sourceforge.net/lists/listinfo/png-mng-implement
|
||||||
@ -5212,3 +5312,4 @@ to subscribe)
|
|||||||
or to glennrp at users.sourceforge.net
|
or to glennrp at users.sourceforge.net
|
||||||
|
|
||||||
Glenn R-P
|
Glenn R-P
|
||||||
|
#endif
|
||||||
|
|||||||
@ -16,7 +16,7 @@ enable_testing()
|
|||||||
|
|
||||||
set(PNGLIB_MAJOR 1)
|
set(PNGLIB_MAJOR 1)
|
||||||
set(PNGLIB_MINOR 6)
|
set(PNGLIB_MINOR 6)
|
||||||
set(PNGLIB_RELEASE 17)
|
set(PNGLIB_RELEASE 18)
|
||||||
set(PNGLIB_NAME libpng${PNGLIB_MAJOR}${PNGLIB_MINOR})
|
set(PNGLIB_NAME libpng${PNGLIB_MAJOR}${PNGLIB_MINOR})
|
||||||
set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE})
|
set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE})
|
||||||
|
|
||||||
@ -261,7 +261,7 @@ endif(NOT WIN32 OR CYGWIN OR MINGW)
|
|||||||
# SET UP LINKS
|
# SET UP LINKS
|
||||||
if(PNG_SHARED)
|
if(PNG_SHARED)
|
||||||
set_target_properties(${PNG_LIB_NAME} PROPERTIES
|
set_target_properties(${PNG_LIB_NAME} PROPERTIES
|
||||||
# VERSION 16.${PNGLIB_RELEASE}.1.6.17
|
# VERSION 16.${PNGLIB_RELEASE}.1.6.18
|
||||||
VERSION 16.${PNGLIB_RELEASE}.0
|
VERSION 16.${PNGLIB_RELEASE}.0
|
||||||
SOVERSION 16
|
SOVERSION 16
|
||||||
CLEAN_DIRECT_OUTPUT 1)
|
CLEAN_DIRECT_OUTPUT 1)
|
||||||
|
|||||||
48
LICENSE
48
LICENSE
@ -10,21 +10,17 @@ this sentence.
|
|||||||
|
|
||||||
This code is released under the libpng license.
|
This code is released under the libpng license.
|
||||||
|
|
||||||
libpng versions 1.2.6, August 15, 2004, through 1.6.17, March 26, 2015, are
|
libpng versions 1.0.7, July 1, 2000, through 1.6.18, July 23, 2015, are
|
||||||
Copyright (c) 2004, 2006-2015 Glenn Randers-Pehrson, and are
|
Copyright (c) 2000-2002, 2004, 2006-2015 Glenn Randers-Pehrson, and are
|
||||||
distributed according to the same disclaimer and license as libpng-1.2.5
|
|
||||||
with the following individual added to the list of Contributing Authors
|
|
||||||
|
|
||||||
Cosmin Truta
|
|
||||||
|
|
||||||
libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
|
|
||||||
Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
|
|
||||||
distributed according to the same disclaimer and license as libpng-1.0.6
|
distributed according to the same disclaimer and license as libpng-1.0.6
|
||||||
with the following individuals added to the list of Contributing Authors
|
with the following individuals added to the list of Contributing Authors:
|
||||||
|
|
||||||
Simon-Pierre Cadieux
|
Simon-Pierre Cadieux
|
||||||
Eric S. Raymond
|
Eric S. Raymond
|
||||||
|
Mans Rullgard
|
||||||
|
Cosmin Truta
|
||||||
Gilles Vollant
|
Gilles Vollant
|
||||||
|
James Yu
|
||||||
|
|
||||||
and with the following additions to the disclaimer:
|
and with the following additions to the disclaimer:
|
||||||
|
|
||||||
@ -36,17 +32,17 @@ and with the following additions to the disclaimer:
|
|||||||
the user.
|
the user.
|
||||||
|
|
||||||
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
|
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
|
||||||
Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
|
Copyright (c) 1998-2000 Glenn Randers-Pehrson, and are distributed according
|
||||||
distributed according to the same disclaimer and license as libpng-0.96,
|
to the same disclaimer and license as libpng-0.96, with the following
|
||||||
with the following individuals added to the list of Contributing Authors:
|
individuals added to the list of Contributing Authors:
|
||||||
|
|
||||||
Tom Lane
|
Tom Lane
|
||||||
Glenn Randers-Pehrson
|
Glenn Randers-Pehrson
|
||||||
Willem van Schaik
|
Willem van Schaik
|
||||||
|
|
||||||
libpng versions 0.89, June 1996, through 0.96, May 1997, are
|
libpng versions 0.89, June 1996, through 0.96, May 1997, are
|
||||||
Copyright (c) 1996, 1997 Andreas Dilger
|
Copyright (c) 1996-1997 Andreas Dilger, and are
|
||||||
Distributed according to the same disclaimer and license as libpng-0.88,
|
distributed according to the same disclaimer and license as libpng-0.88,
|
||||||
with the following individuals added to the list of Contributing Authors:
|
with the following individuals added to the list of Contributing Authors:
|
||||||
|
|
||||||
John Bowler
|
John Bowler
|
||||||
@ -57,7 +53,7 @@ with the following individuals added to the list of Contributing Authors:
|
|||||||
Tom Tanner
|
Tom Tanner
|
||||||
|
|
||||||
libpng versions 0.5, May 1995, through 0.88, January 1996, are
|
libpng versions 0.5, May 1995, through 0.88, January 1996, are
|
||||||
Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
|
||||||
|
|
||||||
For the purposes of this copyright and license, "Contributing Authors"
|
For the purposes of this copyright and license, "Contributing Authors"
|
||||||
is defined as the following set of individuals:
|
is defined as the following set of individuals:
|
||||||
@ -80,13 +76,13 @@ Permission is hereby granted to use, copy, modify, and distribute this
|
|||||||
source code, or portions hereof, for any purpose, without fee, subject
|
source code, or portions hereof, for any purpose, without fee, subject
|
||||||
to the following restrictions:
|
to the following restrictions:
|
||||||
|
|
||||||
1. The origin of this source code must not be misrepresented.
|
1. The origin of this source code must not be misrepresented.
|
||||||
|
|
||||||
2. Altered versions must be plainly marked as such and must not
|
2. Altered versions must be plainly marked as such and must not
|
||||||
be misrepresented as being the original source.
|
be misrepresented as being the original source.
|
||||||
|
|
||||||
3. This Copyright notice may not be removed or altered from any
|
3. This Copyright notice may not be removed or altered from any
|
||||||
source or altered source distribution.
|
source or altered source distribution.
|
||||||
|
|
||||||
The Contributing Authors and Group 42, Inc. specifically permit, without
|
The Contributing Authors and Group 42, Inc. specifically permit, without
|
||||||
fee, and encourage the use of this source code as a component to
|
fee, and encourage the use of this source code as a component to
|
||||||
@ -94,18 +90,18 @@ supporting the PNG file format in commercial products. If you use this
|
|||||||
source code in a product, acknowledgment is not required but would be
|
source code in a product, acknowledgment is not required but would be
|
||||||
appreciated.
|
appreciated.
|
||||||
|
|
||||||
|
|
||||||
A "png_get_copyright" function is available, for convenient use in "about"
|
A "png_get_copyright" function is available, for convenient use in "about"
|
||||||
boxes and the like:
|
boxes and the like:
|
||||||
|
|
||||||
printf("%s",png_get_copyright(NULL));
|
printf("%s", png_get_copyright(NULL));
|
||||||
|
|
||||||
Also, the PNG logo (in PNG format, of course) is supplied in the
|
Also, the PNG logo (in PNG format, of course) is supplied in the
|
||||||
files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
|
files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
|
||||||
|
|
||||||
Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a
|
Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
|
||||||
certification mark of the Open Source Initiative.
|
a certification mark of the Open Source Initiative. OSI has not addressed
|
||||||
|
the additional disclaimers inserted at version 1.0.7.
|
||||||
|
|
||||||
Glenn Randers-Pehrson
|
Glenn Randers-Pehrson
|
||||||
glennrp at users.sourceforge.net
|
glennrp at users.sourceforge.net
|
||||||
March 26, 2015
|
July 23, 2015
|
||||||
|
|||||||
4
README
4
README
@ -1,4 +1,4 @@
|
|||||||
README for libpng version 1.6.17 - March 26, 2015 (shared library 16.0)
|
README for libpng version 1.6.18 - July 23, 2015 (shared library 16.0)
|
||||||
See the note about version numbers near the top of png.h
|
See the note about version numbers near the top of png.h
|
||||||
|
|
||||||
See INSTALL for instructions on how to install libpng.
|
See INSTALL for instructions on how to install libpng.
|
||||||
@ -134,7 +134,7 @@ and ...". If in doubt, send questions to me. I'll bounce them
|
|||||||
to others, if necessary.
|
to others, if necessary.
|
||||||
|
|
||||||
Please do not send suggestions on how to change PNG. We have
|
Please do not send suggestions on how to change PNG. We have
|
||||||
been discussing PNG for nineteen years now, and it is official and
|
been discussing PNG for twenty years now, and it is official and
|
||||||
finished. If you have suggestions for libpng, however, I'll
|
finished. If you have suggestions for libpng, however, I'll
|
||||||
gladly listen. Even if your suggestion is not used immediately,
|
gladly listen. Even if your suggestion is not used immediately,
|
||||||
it may be used later.
|
it may be used later.
|
||||||
|
|||||||
@ -73,8 +73,9 @@ done
|
|||||||
# present bad things are happening.
|
# present bad things are happening.
|
||||||
#
|
#
|
||||||
# The autotools generated files:
|
# The autotools generated files:
|
||||||
libpng_autotools_files="Makefile.in aclocal.m4 config.guess config.h.in\
|
libpng_autotools_files="Makefile.in aclocal.m4 config.guess config.h.in
|
||||||
config.sub configure depcomp install-sh ltmain.sh missing test-driver"
|
config.h.in~ config.sub configure depcomp install-sh ltmain.sh missing\
|
||||||
|
test-driver"
|
||||||
#
|
#
|
||||||
# Files generated by versions of configue >2.68 or automake >1.13 (i.e. later
|
# Files generated by versions of configue >2.68 or automake >1.13 (i.e. later
|
||||||
# versions than those required by configure.ac):
|
# versions than those required by configure.ac):
|
||||||
|
|||||||
@ -18,7 +18,7 @@ AC_PREREQ([2.68])
|
|||||||
|
|
||||||
dnl Version number stuff here:
|
dnl Version number stuff here:
|
||||||
|
|
||||||
AC_INIT([libpng],[1.6.17],[png-mng-implement@lists.sourceforge.net])
|
AC_INIT([libpng],[1.6.18],[png-mng-implement@lists.sourceforge.net])
|
||||||
AC_CONFIG_MACRO_DIR([scripts])
|
AC_CONFIG_MACRO_DIR([scripts])
|
||||||
|
|
||||||
# libpng does not follow GNU file name conventions (hence 'foreign')
|
# libpng does not follow GNU file name conventions (hence 'foreign')
|
||||||
@ -39,10 +39,10 @@ dnl automake, so the following is not necessary (and is not defined anyway):
|
|||||||
dnl AM_PREREQ([1.11.2])
|
dnl AM_PREREQ([1.11.2])
|
||||||
dnl stop configure from automagically running automake
|
dnl stop configure from automagically running automake
|
||||||
|
|
||||||
PNGLIB_VERSION=1.6.17
|
PNGLIB_VERSION=1.6.18
|
||||||
PNGLIB_MAJOR=1
|
PNGLIB_MAJOR=1
|
||||||
PNGLIB_MINOR=6
|
PNGLIB_MINOR=6
|
||||||
PNGLIB_RELEASE=17
|
PNGLIB_RELEASE=18
|
||||||
|
|
||||||
dnl End of version number stuff
|
dnl End of version number stuff
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
OPERATING SYSTEM SPECIFIC ARM NEON DETECTION
|
OPERATING SYSTEM SPECIFIC ARM NEON DETECTION
|
||||||
--------------------------------------------
|
--------------------------------------------
|
||||||
|
|
||||||
Detection of the ability to exexcute ARM NEON on an ARM processor requires
|
Detection of the ability to execute ARM NEON on an ARM processor requires
|
||||||
operating system support. (The information is not available in user mode.)
|
operating system support. (The information is not available in user mode.)
|
||||||
|
|
||||||
HOW TO USE THIS
|
HOW TO USE THIS
|
||||||
|
|||||||
@ -26,6 +26,10 @@
|
|||||||
|
|
||||||
#include <png.h>
|
#include <png.h>
|
||||||
|
|
||||||
|
#if defined(PNG_READ_SUPPORTED) && defined(PNG_STDIO_SUPPORTED) && \
|
||||||
|
defined (PNG_iCCP_SUPPORTED)
|
||||||
|
|
||||||
|
|
||||||
static int verbose = 1;
|
static int verbose = 1;
|
||||||
static png_byte no_profile[] = "no profile";
|
static png_byte no_profile[] = "no profile";
|
||||||
|
|
||||||
@ -178,3 +182,4 @@ main(int argc, char **argv)
|
|||||||
/* Exit code is true if any extract succeeds */
|
/* Exit code is true if any extract succeeds */
|
||||||
return extracted == 0;
|
return extracted == 0;
|
||||||
}
|
}
|
||||||
|
#endif /* READ && STDIO && iCCP */
|
||||||
|
|||||||
@ -27,6 +27,8 @@
|
|||||||
*/
|
*/
|
||||||
#include "../../png.h"
|
#include "../../png.h"
|
||||||
|
|
||||||
|
#if defined(PNG_READ_SUPPORTED) && defined(PNG_SEQUENTIAL_READ_SUPPORTED)
|
||||||
|
|
||||||
/* Return component 'c' of pixel 'x' from the given row. */
|
/* Return component 'c' of pixel 'x' from the given row. */
|
||||||
static unsigned int
|
static unsigned int
|
||||||
component(png_const_bytep row, png_uint_32 x, unsigned int c,
|
component(png_const_bytep row, png_uint_32 x, unsigned int c,
|
||||||
@ -366,3 +368,4 @@ int main(int argc, const char **argv)
|
|||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
#endif /* READ && SEQUENTIAL_READ */
|
||||||
|
|||||||
@ -20,6 +20,8 @@
|
|||||||
* ensure the code picks up the local libpng implementation:
|
* ensure the code picks up the local libpng implementation:
|
||||||
*/
|
*/
|
||||||
#include "../../png.h"
|
#include "../../png.h"
|
||||||
|
#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) && \
|
||||||
|
defined(PNG_SIMPLIFIED_WRITE_SUPPORTED)
|
||||||
|
|
||||||
int main(int argc, const char **argv)
|
int main(int argc, const char **argv)
|
||||||
{
|
{
|
||||||
@ -90,3 +92,4 @@ int main(int argc, const char **argv)
|
|||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
#endif /* READ && WRITE */
|
||||||
|
|||||||
648
contrib/examples/simpleover.c
Normal file
648
contrib/examples/simpleover.c
Normal file
@ -0,0 +1,648 @@
|
|||||||
|
/*- simpleover
|
||||||
|
*
|
||||||
|
* COPYRIGHT: Written by John Cunningham Bowler, 2015.
|
||||||
|
* To the extent possible under law, the author has waived all copyright and
|
||||||
|
* related or neighboring rights to this work. This work is published from:
|
||||||
|
* United States.
|
||||||
|
*
|
||||||
|
* Read several PNG files, which should have an alpha channel or transparency
|
||||||
|
* information, and composite them together to produce one or more 16-bit linear
|
||||||
|
* RGBA intermediates. This involves doing the correct 'over' composition to
|
||||||
|
* combine the alpha channels and corresponding data.
|
||||||
|
*
|
||||||
|
* Finally read an output (background) PNG using the 24-bit RGB format (the
|
||||||
|
* PNG will be composited on green (#00ff00) by default if it has an alpha
|
||||||
|
* channel), and apply the intermediate image generated above to specified
|
||||||
|
* locations in the image.
|
||||||
|
*
|
||||||
|
* The command line has the general format:
|
||||||
|
*
|
||||||
|
* simpleover <background.png> [output.png]
|
||||||
|
* {--sprite=width,height,name {[--at=x,y] {sprite.png}}}
|
||||||
|
* {--add=name {x,y}}
|
||||||
|
*
|
||||||
|
* The --sprite and --add options may occur multiple times. They are executed
|
||||||
|
* in order. --add may refer to any sprite already read.
|
||||||
|
*
|
||||||
|
* This code is intended to show how to composite multiple images together
|
||||||
|
* correctly. Apart from the libpng Simplified API the only work done in here
|
||||||
|
* is to combine multiple input PNG images into a single sprite; this involves
|
||||||
|
* a Porter-Duff 'over' operation and the input PNG images may, as a result,
|
||||||
|
* be regarded as being layered one on top of the other with the first (leftmost
|
||||||
|
* on the command line) being at the bottom and the last on the top.
|
||||||
|
*/
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
/* Normally use <png.h> here to get the installed libpng, but this is done to
|
||||||
|
* ensure the code picks up the local libpng implementation, so long as this
|
||||||
|
* file is linked against a sufficiently recent libpng (1.6+) it is ok to
|
||||||
|
* change this to <png.h>:
|
||||||
|
*/
|
||||||
|
#include "../../png.h"
|
||||||
|
|
||||||
|
#ifdef PNG_SIMPLIFIED_READ_SUPPORTED
|
||||||
|
|
||||||
|
#define sprite_name_chars 15
|
||||||
|
struct sprite {
|
||||||
|
FILE *file;
|
||||||
|
png_uint_16p buffer;
|
||||||
|
unsigned int width;
|
||||||
|
unsigned int height;
|
||||||
|
char name[sprite_name_chars+1];
|
||||||
|
};
|
||||||
|
|
||||||
|
#if 0 /* div by 65535 test program */
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
double err = 0;
|
||||||
|
unsigned int xerr = 0;
|
||||||
|
unsigned int r = 32769;
|
||||||
|
{
|
||||||
|
unsigned int x = 0;
|
||||||
|
|
||||||
|
do {
|
||||||
|
unsigned int t = x + (x >> 16) /*+ (x >> 31)*/ + r;
|
||||||
|
double v = x, errtest;
|
||||||
|
|
||||||
|
if (t < x) {
|
||||||
|
fprintf(stderr, "overflow: %u+%u -> %u\n", x, r, t);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
v /= 65535;
|
||||||
|
errtest = v;
|
||||||
|
t >>= 16;
|
||||||
|
errtest -= t;
|
||||||
|
|
||||||
|
if (errtest > err) {
|
||||||
|
err = errtest;
|
||||||
|
xerr = x;
|
||||||
|
|
||||||
|
if (errtest >= .5) {
|
||||||
|
fprintf(stderr, "error: %u/65535 = %f, not %u, error %f\n",
|
||||||
|
x, v, t, errtest);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (++x <= 65535U*65535U);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("error %f @ %u\n", err, xerr);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif /* div by 65535 test program */
|
||||||
|
|
||||||
|
static void
|
||||||
|
sprite_op(const struct sprite *sprite, int x_offset, int y_offset,
|
||||||
|
png_imagep image, const png_uint_16 *buffer)
|
||||||
|
{
|
||||||
|
/* This is where the Porter-Duff 'Over' operator is evaluated; change this
|
||||||
|
* code to change the operator (this could be parameterized). Any other
|
||||||
|
* image processing operation could be used here.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* Check for an x or y offset that pushes any part of the image beyond the
|
||||||
|
* right or bottom of the sprite:
|
||||||
|
*/
|
||||||
|
if ((y_offset < 0 || (unsigned)/*SAFE*/y_offset < sprite->height) &&
|
||||||
|
(x_offset < 0 || (unsigned)/*SAFE*/x_offset < sprite->width))
|
||||||
|
{
|
||||||
|
unsigned int y = 0;
|
||||||
|
|
||||||
|
if (y_offset < 0)
|
||||||
|
y = -y_offset; /* Skip to first visible row */
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
unsigned int x = 0;
|
||||||
|
|
||||||
|
if (x_offset < 0)
|
||||||
|
x = -x_offset;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
/* In and out are RGBA values, so: */
|
||||||
|
const png_uint_16 *in_pixel = buffer + (y * image->width + x)*4;
|
||||||
|
png_uint_32 in_alpha = in_pixel[3];
|
||||||
|
|
||||||
|
/* This is the optimized Porter-Duff 'Over' operation, when the
|
||||||
|
* input alpha is 0 the output is not changed.
|
||||||
|
*/
|
||||||
|
if (in_alpha > 0)
|
||||||
|
{
|
||||||
|
png_uint_16 *out_pixel = sprite->buffer +
|
||||||
|
((y+y_offset) * sprite->width + (x+x_offset))*4;
|
||||||
|
|
||||||
|
/* This is the weight to apply to the output: */
|
||||||
|
in_alpha = 65535-in_alpha;
|
||||||
|
|
||||||
|
if (in_alpha > 0)
|
||||||
|
{
|
||||||
|
/* The input must be composed onto the output. This means
|
||||||
|
* multiplying the current output pixel value by the inverse
|
||||||
|
* of the input alpha (1-alpha). A division is required but
|
||||||
|
* it is by the constant 65535. Approximate this as:
|
||||||
|
*
|
||||||
|
* (x + (x >> 16) + 32769) >> 16;
|
||||||
|
*
|
||||||
|
* This is exact (and does not overflow) for all values of
|
||||||
|
* x in the range 0..65535*65535. (Note that the calculation
|
||||||
|
* produces the closest integer; the maximum error is <0.5).
|
||||||
|
*/
|
||||||
|
png_uint_32 tmp;
|
||||||
|
|
||||||
|
# define compose(c)\
|
||||||
|
tmp = out_pixel[c] * in_alpha;\
|
||||||
|
tmp = (tmp + (tmp >> 16) + 32769) >> 16;\
|
||||||
|
out_pixel[c] = tmp + in_pixel[c]
|
||||||
|
|
||||||
|
/* The following is very vectorizable... */
|
||||||
|
compose(0);
|
||||||
|
compose(1);
|
||||||
|
compose(2);
|
||||||
|
compose(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
out_pixel[0] = in_pixel[0],
|
||||||
|
out_pixel[1] = in_pixel[1],
|
||||||
|
out_pixel[2] = in_pixel[2],
|
||||||
|
out_pixel[3] = in_pixel[3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (++x < image->width);
|
||||||
|
}
|
||||||
|
while (++y < image->height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
create_sprite(struct sprite *sprite, int *argc, const char ***argv)
|
||||||
|
{
|
||||||
|
/* Read the arguments and create this sprite. The sprite buffer has already
|
||||||
|
* been allocated. This reads the input PNGs one by one in linear format,
|
||||||
|
* composes them onto the sprite buffer (the code in the function above)
|
||||||
|
* then saves the result, converting it on the fly to PNG RGBA 8-bit format.
|
||||||
|
*/
|
||||||
|
while (*argc > 0)
|
||||||
|
{
|
||||||
|
char tombstone;
|
||||||
|
int x = 0, y = 0;
|
||||||
|
|
||||||
|
if ((*argv)[0][0] == '-' && (*argv)[0][1] == '-')
|
||||||
|
{
|
||||||
|
/* The only supported option is --at. */
|
||||||
|
if (sscanf((*argv)[0], "--at=%d,%d%c", &x, &y, &tombstone) != 2)
|
||||||
|
break; /* success; caller will parse this option */
|
||||||
|
|
||||||
|
++*argv, --*argc;
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* The argument has to be a file name */
|
||||||
|
png_image image;
|
||||||
|
|
||||||
|
image.version = PNG_IMAGE_VERSION;
|
||||||
|
image.opaque = NULL;
|
||||||
|
|
||||||
|
if (png_image_begin_read_from_file(&image, (*argv)[0]))
|
||||||
|
{
|
||||||
|
png_uint_16p buffer;
|
||||||
|
|
||||||
|
image.format = PNG_FORMAT_LINEAR_RGB_ALPHA;
|
||||||
|
|
||||||
|
buffer = malloc(PNG_IMAGE_SIZE(image));
|
||||||
|
|
||||||
|
if (buffer != NULL)
|
||||||
|
{
|
||||||
|
if (png_image_finish_read(&image, NULL/*background*/, buffer,
|
||||||
|
0/*row_stride*/,
|
||||||
|
NULL/*colormap for PNG_FORMAT_FLAG_COLORMAP*/))
|
||||||
|
{
|
||||||
|
/* This is the place where the Porter-Duff 'Over' operator
|
||||||
|
* needs to be done by this code. In fact, any image
|
||||||
|
* processing required can be done here; the data is in
|
||||||
|
* the correct format (linear, 16-bit) and source and
|
||||||
|
* destination are in memory.
|
||||||
|
*/
|
||||||
|
sprite_op(sprite, x, y, &image, buffer);
|
||||||
|
free(buffer);
|
||||||
|
++*argv, --*argc;
|
||||||
|
/* And continue to the next argument */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
free(buffer);
|
||||||
|
fprintf(stderr, "simpleover: read %s: %s\n", (*argv)[0],
|
||||||
|
image.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "simpleover: out of memory: %lu bytes\n",
|
||||||
|
(unsigned long)PNG_IMAGE_SIZE(image));
|
||||||
|
|
||||||
|
/* png_image_free must be called if we abort the Simplified API
|
||||||
|
* read because of a problem detected in this code. If problems
|
||||||
|
* are detected in the Simplified API it cleans up itself.
|
||||||
|
*/
|
||||||
|
png_image_free(&image);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Failed to read the first argument: */
|
||||||
|
fprintf(stderr, "simpleover: %s: %s\n", (*argv)[0], image.message);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0; /* failure */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* All the sprite operations have completed successfully. Save the RGBA
|
||||||
|
* buffer as a PNG using the simplified write API.
|
||||||
|
*/
|
||||||
|
sprite->file = tmpfile();
|
||||||
|
|
||||||
|
if (sprite->file != NULL)
|
||||||
|
{
|
||||||
|
png_image save;
|
||||||
|
|
||||||
|
memset(&save, 0, sizeof save);
|
||||||
|
save.version = PNG_IMAGE_VERSION;
|
||||||
|
save.opaque = NULL;
|
||||||
|
save.width = sprite->width;
|
||||||
|
save.height = sprite->height;
|
||||||
|
save.format = PNG_FORMAT_LINEAR_RGB_ALPHA;
|
||||||
|
save.flags = PNG_IMAGE_FLAG_FAST;
|
||||||
|
save.colormap_entries = 0;
|
||||||
|
|
||||||
|
if (png_image_write_to_stdio(&save, sprite->file, 1/*convert_to_8_bit*/,
|
||||||
|
sprite->buffer, 0/*row_stride*/, NULL/*colormap*/))
|
||||||
|
{
|
||||||
|
/* Success; the buffer is no longer needed: */
|
||||||
|
free(sprite->buffer);
|
||||||
|
sprite->buffer = NULL;
|
||||||
|
return 1; /* ok */
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
fprintf(stderr, "simpleover: write sprite %s: %s\n", sprite->name,
|
||||||
|
save.message);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
fprintf(stderr, "simpleover: sprite %s: could not allocate tmpfile: %s\n",
|
||||||
|
sprite->name, strerror(errno));
|
||||||
|
|
||||||
|
return 0; /* fail */
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
add_sprite(png_imagep output, png_bytep out_buf, struct sprite *sprite,
|
||||||
|
int *argc, const char ***argv)
|
||||||
|
{
|
||||||
|
/* Given a --add argument naming this sprite, perform the operations listed
|
||||||
|
* in the following arguments. The arguments are expected to have the form
|
||||||
|
* (x,y), which is just an offset at which to add the sprite to the
|
||||||
|
* output.
|
||||||
|
*/
|
||||||
|
while (*argc > 0)
|
||||||
|
{
|
||||||
|
char tombstone;
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
if ((*argv)[0][0] == '-' && (*argv)[0][1] == '-')
|
||||||
|
return 1; /* success */
|
||||||
|
|
||||||
|
if (sscanf((*argv)[0], "%d,%d%c", &x, &y, &tombstone) == 2)
|
||||||
|
{
|
||||||
|
/* Now add the new image into the sprite data, but only if it
|
||||||
|
* will fit.
|
||||||
|
*/
|
||||||
|
if (x < 0 || y < 0 ||
|
||||||
|
(unsigned)/*SAFE*/x >= output->width ||
|
||||||
|
(unsigned)/*SAFE*/y >= output->height ||
|
||||||
|
sprite->width > output->width-x ||
|
||||||
|
sprite->height > output->height-y)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "simpleover: sprite %s @ (%d,%d) outside image\n",
|
||||||
|
sprite->name, x, y);
|
||||||
|
/* Could just skip this, but for the moment it is an error */
|
||||||
|
return 0; /* error */
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Since we know the sprite fits we can just read it into the
|
||||||
|
* output using the simplified API.
|
||||||
|
*/
|
||||||
|
png_image in;
|
||||||
|
|
||||||
|
in.version = PNG_IMAGE_VERSION;
|
||||||
|
rewind(sprite->file);
|
||||||
|
|
||||||
|
if (png_image_begin_read_from_stdio(&in, sprite->file))
|
||||||
|
{
|
||||||
|
in.format = PNG_FORMAT_RGB; /* force compose */
|
||||||
|
|
||||||
|
if (png_image_finish_read(&in, NULL/*background*/,
|
||||||
|
out_buf + (y*output->width + x)*3/*RGB*/,
|
||||||
|
output->width*3/*row_stride*/,
|
||||||
|
NULL/*colormap for PNG_FORMAT_FLAG_COLORMAP*/))
|
||||||
|
{
|
||||||
|
++*argv, --*argc;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The read failed: */
|
||||||
|
fprintf(stderr, "simpleover: add sprite %s: %s\n", sprite->name,
|
||||||
|
in.message);
|
||||||
|
return 0; /* error */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "simpleover: --add='%s': invalid position %s\n",
|
||||||
|
sprite->name, (*argv)[0]);
|
||||||
|
return 0; /* error */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1; /* ok */
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
simpleover_process(png_imagep output, png_bytep out_buf, int argc,
|
||||||
|
const char **argv)
|
||||||
|
{
|
||||||
|
int result = 1; /* success */
|
||||||
|
# define csprites 10/*limit*/
|
||||||
|
# define str(a) #a
|
||||||
|
int nsprites = 0;
|
||||||
|
struct sprite sprites[csprites];
|
||||||
|
|
||||||
|
while (argc > 0)
|
||||||
|
{
|
||||||
|
result = 0; /* fail */
|
||||||
|
|
||||||
|
if (strncmp(argv[0], "--sprite=", 9) == 0)
|
||||||
|
{
|
||||||
|
char tombstone;
|
||||||
|
|
||||||
|
if (nsprites < csprites)
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
|
||||||
|
sprites[nsprites].width = sprites[nsprites].height = 0;
|
||||||
|
sprites[nsprites].name[0] = 0;
|
||||||
|
|
||||||
|
n = sscanf(argv[0], "--sprite=%u,%u,%" str(sprite_name_chars) "s%c",
|
||||||
|
&sprites[nsprites].width, &sprites[nsprites].height,
|
||||||
|
sprites[nsprites].name, &tombstone);
|
||||||
|
|
||||||
|
if ((n == 2 || n == 3) &&
|
||||||
|
sprites[nsprites].width > 0 && sprites[nsprites].height > 0)
|
||||||
|
{
|
||||||
|
size_t buf_size, tmp;
|
||||||
|
|
||||||
|
/* Default a name if not given. */
|
||||||
|
if (sprites[nsprites].name[0] == 0)
|
||||||
|
sprintf(sprites[nsprites].name, "sprite-%d", nsprites+1);
|
||||||
|
|
||||||
|
/* Allocate a buffer for the sprite and calculate the buffer
|
||||||
|
* size:
|
||||||
|
*/
|
||||||
|
buf_size = sizeof (png_uint_16 [4]);
|
||||||
|
buf_size *= sprites[nsprites].width;
|
||||||
|
buf_size *= sprites[nsprites].height;
|
||||||
|
|
||||||
|
/* This can overflow a (size_t); check for this: */
|
||||||
|
tmp = buf_size;
|
||||||
|
tmp /= sprites[nsprites].width;
|
||||||
|
tmp /= sprites[nsprites].height;
|
||||||
|
|
||||||
|
if (tmp == sizeof (png_uint_16 [4]))
|
||||||
|
{
|
||||||
|
sprites[nsprites].buffer = malloc(buf_size);
|
||||||
|
/* This buffer must be initialized to transparent: */
|
||||||
|
memset(sprites[nsprites].buffer, 0, buf_size);
|
||||||
|
|
||||||
|
if (sprites[nsprites].buffer != NULL)
|
||||||
|
{
|
||||||
|
sprites[nsprites].file = NULL;
|
||||||
|
++argv, --argc;
|
||||||
|
|
||||||
|
if (create_sprite(sprites+nsprites++, &argc, &argv))
|
||||||
|
{
|
||||||
|
result = 1; /* still ok */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
break; /* error */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Overflow, or OOM */
|
||||||
|
fprintf(stderr, "simpleover: %s: sprite too large\n", argv[0]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "simpleover: %s: invalid sprite (%u,%u)\n",
|
||||||
|
argv[0], sprites[nsprites].width, sprites[nsprites].height);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "simpleover: %s: too many sprites\n", argv[0]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (strncmp(argv[0], "--add=", 6) == 0)
|
||||||
|
{
|
||||||
|
const char *name = argv[0]+6;
|
||||||
|
int isprite = nsprites;
|
||||||
|
|
||||||
|
++argv, --argc;
|
||||||
|
|
||||||
|
while (--isprite >= 0)
|
||||||
|
{
|
||||||
|
if (strcmp(sprites[isprite].name, name) == 0)
|
||||||
|
{
|
||||||
|
if (!add_sprite(output, out_buf, sprites+isprite, &argc, &argv))
|
||||||
|
goto out; /* error in add_sprite */
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isprite < 0) /* sprite not found */
|
||||||
|
{
|
||||||
|
fprintf(stderr, "simpleover: --add='%s': sprite not found\n", name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "simpleover: %s: unrecognized operation\n", argv[0]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = 1; /* ok */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clean up the cache of sprites: */
|
||||||
|
out:
|
||||||
|
while (--nsprites >= 0)
|
||||||
|
{
|
||||||
|
if (sprites[nsprites].buffer != NULL)
|
||||||
|
free(sprites[nsprites].buffer);
|
||||||
|
|
||||||
|
if (sprites[nsprites].file != NULL)
|
||||||
|
(void)fclose(sprites[nsprites].file);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, const char **argv)
|
||||||
|
{
|
||||||
|
int result = 1; /* default to fail */
|
||||||
|
|
||||||
|
if (argc >= 2)
|
||||||
|
{
|
||||||
|
int argi = 2;
|
||||||
|
const char *output = NULL;
|
||||||
|
png_image image;
|
||||||
|
|
||||||
|
if (argc > 2 && argv[2][0] != '-'/*an operation*/)
|
||||||
|
{
|
||||||
|
output = argv[2];
|
||||||
|
argi = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
image.version = PNG_IMAGE_VERSION;
|
||||||
|
image.opaque = NULL;
|
||||||
|
|
||||||
|
if (png_image_begin_read_from_file(&image, argv[1]))
|
||||||
|
{
|
||||||
|
png_bytep buffer;
|
||||||
|
|
||||||
|
image.format = PNG_FORMAT_RGB; /* 24-bit RGB */
|
||||||
|
|
||||||
|
buffer = malloc(PNG_IMAGE_SIZE(image));
|
||||||
|
|
||||||
|
if (buffer != NULL)
|
||||||
|
{
|
||||||
|
png_color background = {0, 0xff, 0}; /* fully saturated green */
|
||||||
|
|
||||||
|
if (png_image_finish_read(&image, &background, buffer,
|
||||||
|
0/*row_stride*/, NULL/*colormap for PNG_FORMAT_FLAG_COLORMAP */))
|
||||||
|
{
|
||||||
|
/* At this point png_image_finish_read has cleaned up the
|
||||||
|
* allocated data in png_image, and only the buffer needs to be
|
||||||
|
* freed.
|
||||||
|
*
|
||||||
|
* Perform the remaining operations:
|
||||||
|
*/
|
||||||
|
if (simpleover_process(&image, buffer, argc-argi, argv+argi))
|
||||||
|
{
|
||||||
|
/* Write the output: */
|
||||||
|
if ((output != NULL &&
|
||||||
|
png_image_write_to_file(&image, output,
|
||||||
|
0/*convert_to_8bit*/, buffer, 0/*row_stride*/,
|
||||||
|
NULL/*colormap*/)) ||
|
||||||
|
(output == NULL &&
|
||||||
|
png_image_write_to_stdio(&image, stdout,
|
||||||
|
0/*convert_to_8bit*/, buffer, 0/*row_stride*/,
|
||||||
|
NULL/*colormap*/)))
|
||||||
|
result = 0;
|
||||||
|
|
||||||
|
else
|
||||||
|
fprintf(stderr, "simpleover: write %s: %s\n",
|
||||||
|
output == NULL ? "stdout" : output, image.message);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* else simpleover_process writes an error message */
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
fprintf(stderr, "simpleover: read %s: %s\n", argv[1],
|
||||||
|
image.message);
|
||||||
|
|
||||||
|
free(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "simpleover: out of memory: %lu bytes\n",
|
||||||
|
(unsigned long)PNG_IMAGE_SIZE(image));
|
||||||
|
|
||||||
|
/* This is the only place where a 'free' is required; libpng does
|
||||||
|
* the cleanup on error and success, but in this case we couldn't
|
||||||
|
* complete the read because of running out of memory.
|
||||||
|
*/
|
||||||
|
png_image_free(&image);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Failed to read the first argument: */
|
||||||
|
fprintf(stderr, "simpleover: %s: %s\n", argv[1], image.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Usage message */
|
||||||
|
fprintf(stderr,
|
||||||
|
"simpleover: usage: simpleover background.png [output.png]\n"
|
||||||
|
" Output 'background.png' as a 24-bit RGB PNG file in 'output.png'\n"
|
||||||
|
" or, if not given, stdout. 'background.png' will be composited\n"
|
||||||
|
" on fully saturated green.\n"
|
||||||
|
"\n"
|
||||||
|
" Optionally, before output, process additional PNG files:\n"
|
||||||
|
"\n"
|
||||||
|
" --sprite=width,height,name {[--at=x,y] {sprite.png}}\n"
|
||||||
|
" Produce a transparent sprite of size (width,height) and with\n"
|
||||||
|
" name 'name'.\n"
|
||||||
|
" For each sprite.png composite it using a Porter-Duff 'Over'\n"
|
||||||
|
" operation at offset (x,y) in the sprite (defaulting to (0,0)).\n"
|
||||||
|
" Input PNGs will be truncated to the area of the sprite.\n"
|
||||||
|
"\n"
|
||||||
|
" --add='name' {x,y}\n"
|
||||||
|
" Optionally, before output, composite a sprite, 'name', which\n"
|
||||||
|
" must have been previously produced using --sprite, at each\n"
|
||||||
|
" offset (x,y) in the output image. Each sprite must fit\n"
|
||||||
|
" completely within the output image.\n"
|
||||||
|
"\n"
|
||||||
|
" PNG files are processed in the order they occur on the command\n"
|
||||||
|
" line and thus the first PNG processed appears as the bottommost\n"
|
||||||
|
" in the output image.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
#endif /* SIMPLIFIED_READ */
|
||||||
@ -1,8 +1,8 @@
|
|||||||
/* pngimage.c
|
/* pngimage.c
|
||||||
*
|
*
|
||||||
* Copyright (c) 2014 John Cunningham Bowler
|
* Copyright (c) 2015 John Cunningham Bowler
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.10 [March 6, 2014]
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
*
|
*
|
||||||
* This code is released under the libpng license.
|
* This code is released under the libpng license.
|
||||||
* For conditions of distribution and use, see the disclaimer
|
* For conditions of distribution and use, see the disclaimer
|
||||||
@ -1120,8 +1120,8 @@ compare_read(struct display *dp, int applied_transforms)
|
|||||||
{
|
{
|
||||||
int b;
|
int b;
|
||||||
|
|
||||||
case 16: /* Two bytes per component, bit-endian */
|
case 16: /* Two bytes per component, big-endian */
|
||||||
for (b = (bpp >> 4); b > 0; )
|
for (b = (bpp >> 4); b > 0; --b)
|
||||||
{
|
{
|
||||||
unsigned int sig = (unsigned int)(0xffff0000 >> sig_bits[b]);
|
unsigned int sig = (unsigned int)(0xffff0000 >> sig_bits[b]);
|
||||||
|
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
/*-
|
/*-
|
||||||
* pngstest.c
|
* pngstest.c
|
||||||
*
|
*
|
||||||
* Copyright (c) 2013-2014 John Cunningham Bowler
|
* Copyright (c) 2013-2015 John Cunningham Bowler
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.16 [December 22, 2014]
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
*
|
*
|
||||||
* This code is released under the libpng license.
|
* This code is released under the libpng license.
|
||||||
* For conditions of distribution and use, see the disclaimer
|
* For conditions of distribution and use, see the disclaimer
|
||||||
@ -615,7 +615,7 @@ freeimage(Image *image)
|
|||||||
|
|
||||||
if (image->tmpfile_name[0] != 0 && (image->opts & KEEP_TMPFILES) == 0)
|
if (image->tmpfile_name[0] != 0 && (image->opts & KEEP_TMPFILES) == 0)
|
||||||
{
|
{
|
||||||
remove(image->tmpfile_name);
|
(void)remove(image->tmpfile_name);
|
||||||
image->tmpfile_name[0] = 0;
|
image->tmpfile_name[0] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2828,7 +2828,7 @@ compare_two_images(Image *a, Image *b, int via_linear,
|
|||||||
|
|
||||||
else if (y >= b->image.colormap_entries)
|
else if (y >= b->image.colormap_entries)
|
||||||
{
|
{
|
||||||
if ((a->opts & ACCUMULATE) == 0)
|
if ((b->opts & ACCUMULATE) == 0)
|
||||||
{
|
{
|
||||||
char pindex[9];
|
char pindex[9];
|
||||||
sprintf(pindex, "%lu[%lu]", (unsigned long)y,
|
sprintf(pindex, "%lu[%lu]", (unsigned long)y,
|
||||||
@ -3175,7 +3175,9 @@ read_one_file(Image *image)
|
|||||||
|
|
||||||
if (cb > 0)
|
if (cb > 0)
|
||||||
{
|
{
|
||||||
|
#ifndef __COVERITY__
|
||||||
if ((unsigned long int)cb <= (size_t)~(size_t)0)
|
if ((unsigned long int)cb <= (size_t)~(size_t)0)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
png_bytep b = voidcast(png_bytep, malloc((size_t)cb));
|
png_bytep b = voidcast(png_bytep, malloc((size_t)cb));
|
||||||
|
|
||||||
@ -3243,8 +3245,41 @@ write_one_file(Image *output, Image *image, int convert_to_8bit)
|
|||||||
|
|
||||||
if (image->opts & USE_STDIO)
|
if (image->opts & USE_STDIO)
|
||||||
{
|
{
|
||||||
|
#ifndef PNG_USE_MKSTEMP
|
||||||
FILE *f = tmpfile();
|
FILE *f = tmpfile();
|
||||||
|
#else
|
||||||
|
/* Experimental. Coverity says tmpfile() is insecure because it
|
||||||
|
* generates predictable names.
|
||||||
|
*
|
||||||
|
* It is possible to satisfy Coverity by using mkstemp(); however,
|
||||||
|
* any platform supporting mkstemp() undoubtedly has a secure tmpfile()
|
||||||
|
* implementation as well, and doesn't need the fix. Note that
|
||||||
|
* the fix won't work on platforms that don't support mkstemp().
|
||||||
|
*
|
||||||
|
* https://www.securecoding.cert.org/confluence/display/c/
|
||||||
|
* FIO21-C.+Do+not+create+temporary+files+in+shared+directories
|
||||||
|
* says that most historic implementations of tmpfile() provide
|
||||||
|
* only a limited number of possible temporary file names
|
||||||
|
* (usually 26) before file names are recycled. That article also
|
||||||
|
* provides a secure solution that unfortunately depends upon mkstemp().
|
||||||
|
*/
|
||||||
|
char tmpfile[] = "pngstest-XXXXXX";
|
||||||
|
int filedes;
|
||||||
|
FILE *f;
|
||||||
|
umask(0177);
|
||||||
|
filedes = mkstemp(tmpfile);
|
||||||
|
if (filedes < 0)
|
||||||
|
f = NULL;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
f = fdopen(filedes,"w+");
|
||||||
|
/* Hide the filename immediately and ensure that the file does
|
||||||
|
* not exist after the program ends
|
||||||
|
*/
|
||||||
|
(void) unlink(tmpfile);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (f != NULL)
|
if (f != NULL)
|
||||||
{
|
{
|
||||||
if (png_image_write_to_stdio(&image->image, f, convert_to_8bit,
|
if (png_image_write_to_stdio(&image->image, f, convert_to_8bit,
|
||||||
@ -3588,7 +3623,7 @@ main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Safe: checked above */
|
/* Safe: checked above */
|
||||||
strcpy(tmpf, argv[c]);
|
strncpy(tmpf, argv[c], sizeof (tmpf)-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngvalid.c - validate libpng by constructing then reading png files.
|
/* pngvalid.c - validate libpng by constructing then reading png files.
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.17 [March 26, 2015]
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
* Copyright (c) 2014-2015 Glenn Randers-Pehrson
|
* Copyright (c) 2014-2015 Glenn Randers-Pehrson
|
||||||
* Written by John Cunningham Bowler
|
* Written by John Cunningham Bowler
|
||||||
*
|
*
|
||||||
@ -258,7 +258,7 @@ make_four_random_bytes(png_uint_32* seed, png_bytep bytes)
|
|||||||
make_random_bytes(seed, bytes, 4);
|
make_random_bytes(seed, bytes, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef PNG_READ_SUPPORTED
|
#if defined PNG_READ_SUPPORTED || defined PNG_WRITE_tRNS_SUPPORTED
|
||||||
static void
|
static void
|
||||||
randomize(void *pv, size_t size)
|
randomize(void *pv, size_t size)
|
||||||
{
|
{
|
||||||
@ -267,7 +267,9 @@ randomize(void *pv, size_t size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define RANDOMIZE(this) randomize(&(this), sizeof (this))
|
#define RANDOMIZE(this) randomize(&(this), sizeof (this))
|
||||||
|
#endif /* READ || WRITE_tRNS */
|
||||||
|
|
||||||
|
#ifdef PNG_READ_SUPPORTED
|
||||||
static unsigned int
|
static unsigned int
|
||||||
random_mod(unsigned int max)
|
random_mod(unsigned int max)
|
||||||
{
|
{
|
||||||
@ -295,7 +297,8 @@ random_choice(void)
|
|||||||
/* A numeric ID based on PNG file characteristics. The 'do_interlace' field
|
/* A numeric ID based on PNG file characteristics. The 'do_interlace' field
|
||||||
* simply records whether pngvalid did the interlace itself or whether it
|
* simply records whether pngvalid did the interlace itself or whether it
|
||||||
* was done by libpng. Width and height must be less than 256. 'palette' is an
|
* was done by libpng. Width and height must be less than 256. 'palette' is an
|
||||||
* index of the palette to use for formats with a palette (0 otherwise.)
|
* index of the palette to use for formats with a palette otherwise a boolean
|
||||||
|
* indicating if a tRNS chunk was generated.
|
||||||
*/
|
*/
|
||||||
#define FILEID(col, depth, palette, interlace, width, height, do_interlace) \
|
#define FILEID(col, depth, palette, interlace, width, height, do_interlace) \
|
||||||
((png_uint_32)((col) + ((depth)<<3) + ((palette)<<8) + ((interlace)<<13) + \
|
((png_uint_32)((col) + ((depth)<<3) + ((palette)<<8) + ((interlace)<<13) + \
|
||||||
@ -316,12 +319,16 @@ standard_name(char *buffer, size_t bufsize, size_t pos, png_byte colour_type,
|
|||||||
png_uint_32 w, png_uint_32 h, int do_interlace)
|
png_uint_32 w, png_uint_32 h, int do_interlace)
|
||||||
{
|
{
|
||||||
pos = safecat(buffer, bufsize, pos, colour_types[colour_type]);
|
pos = safecat(buffer, bufsize, pos, colour_types[colour_type]);
|
||||||
if (npalette > 0)
|
if (colour_type == 3) /* must have a palette */
|
||||||
{
|
{
|
||||||
pos = safecat(buffer, bufsize, pos, "[");
|
pos = safecat(buffer, bufsize, pos, "[");
|
||||||
pos = safecatn(buffer, bufsize, pos, npalette);
|
pos = safecatn(buffer, bufsize, pos, npalette);
|
||||||
pos = safecat(buffer, bufsize, pos, "]");
|
pos = safecat(buffer, bufsize, pos, "]");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if (npalette != 0)
|
||||||
|
pos = safecat(buffer, bufsize, pos, "+tRNS");
|
||||||
|
|
||||||
pos = safecat(buffer, bufsize, pos, " ");
|
pos = safecat(buffer, bufsize, pos, " ");
|
||||||
pos = safecatn(buffer, bufsize, pos, bit_depth);
|
pos = safecatn(buffer, bufsize, pos, bit_depth);
|
||||||
pos = safecat(buffer, bufsize, pos, " bit");
|
pos = safecat(buffer, bufsize, pos, " bit");
|
||||||
@ -378,25 +385,32 @@ standard_name_from_id(char *buffer, size_t bufsize, size_t pos, png_uint_32 id)
|
|||||||
|
|
||||||
static int
|
static int
|
||||||
next_format(png_bytep colour_type, png_bytep bit_depth,
|
next_format(png_bytep colour_type, png_bytep bit_depth,
|
||||||
unsigned int* palette_number, int no_low_depth_gray)
|
unsigned int* palette_number, int low_depth_gray, int tRNS)
|
||||||
{
|
{
|
||||||
if (*bit_depth == 0)
|
if (*bit_depth == 0)
|
||||||
{
|
{
|
||||||
*colour_type = 0;
|
*colour_type = 0;
|
||||||
if (no_low_depth_gray)
|
if (low_depth_gray)
|
||||||
*bit_depth = 8;
|
|
||||||
else
|
|
||||||
*bit_depth = 1;
|
*bit_depth = 1;
|
||||||
|
else
|
||||||
|
*bit_depth = 8;
|
||||||
*palette_number = 0;
|
*palette_number = 0;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*colour_type == 3)
|
if (*colour_type < 4/*no alpha channel*/)
|
||||||
{
|
{
|
||||||
/* Add multiple palettes for colour type 3. */
|
/* Add multiple palettes for colour type 3, one image with tRNS
|
||||||
if (++*palette_number < PALETTE_COUNT(*bit_depth))
|
* and one without for other non-alpha formats:
|
||||||
|
*/
|
||||||
|
unsigned int pn = ++*palette_number;
|
||||||
|
png_byte ct = *colour_type;
|
||||||
|
|
||||||
|
if (((ct == 0/*GRAY*/ || ct/*RGB*/ == 2) && tRNS && pn < 2) ||
|
||||||
|
(ct == 3/*PALETTE*/ && pn < PALETTE_COUNT(*bit_depth)))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
/* No: next bit depth */
|
||||||
*palette_number = 0;
|
*palette_number = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1305,7 +1319,10 @@ store_current_palette(png_store *ps, int *npalette)
|
|||||||
* operation.)
|
* operation.)
|
||||||
*/
|
*/
|
||||||
if (ps->current == NULL)
|
if (ps->current == NULL)
|
||||||
|
{
|
||||||
store_log(ps, ps->pread, "no current stream for palette", 1);
|
store_log(ps, ps->pread, "no current stream for palette", 1);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* The result may be null if there is no palette. */
|
/* The result may be null if there is no palette. */
|
||||||
*npalette = ps->current->npalette;
|
*npalette = ps->current->npalette;
|
||||||
@ -1959,6 +1976,7 @@ typedef struct png_modifier
|
|||||||
|
|
||||||
/* Run tests on reading with a combination of transforms, */
|
/* Run tests on reading with a combination of transforms, */
|
||||||
unsigned int test_transform :1;
|
unsigned int test_transform :1;
|
||||||
|
unsigned int test_tRNS :1; /* Includes tRNS images */
|
||||||
|
|
||||||
/* When to use the use_input_precision option, this controls the gamma
|
/* When to use the use_input_precision option, this controls the gamma
|
||||||
* validation code checks. If set any value that is within the transformed
|
* validation code checks. If set any value that is within the transformed
|
||||||
@ -1990,6 +2008,16 @@ typedef struct png_modifier
|
|||||||
unsigned int test_gamma_expand16 :1;
|
unsigned int test_gamma_expand16 :1;
|
||||||
unsigned int test_exhaustive :1;
|
unsigned int test_exhaustive :1;
|
||||||
|
|
||||||
|
/* Whether or not to run the low-bit-depth grayscale tests. This fail on
|
||||||
|
* gamma images in some cases because of gross inaccuracies in the grayscale
|
||||||
|
* gamma handling for low bit depth.
|
||||||
|
*/
|
||||||
|
unsigned int test_lbg :1;
|
||||||
|
unsigned int test_lbg_gamma_threshold :1;
|
||||||
|
unsigned int test_lbg_gamma_transform :1;
|
||||||
|
unsigned int test_lbg_gamma_sbit :1;
|
||||||
|
unsigned int test_lbg_gamma_composition :1;
|
||||||
|
|
||||||
unsigned int log :1; /* Log max error */
|
unsigned int log :1; /* Log max error */
|
||||||
|
|
||||||
/* Buffer information, the buffer size limits the size of the chunks that can
|
/* Buffer information, the buffer size limits the size of the chunks that can
|
||||||
@ -2042,6 +2070,11 @@ modifier_init(png_modifier *pm)
|
|||||||
pm->test_standard = 0;
|
pm->test_standard = 0;
|
||||||
pm->test_size = 0;
|
pm->test_size = 0;
|
||||||
pm->test_transform = 0;
|
pm->test_transform = 0;
|
||||||
|
# ifdef PNG_WRITE_tRNS_SUPPORTED
|
||||||
|
pm->test_tRNS = 1;
|
||||||
|
# else
|
||||||
|
pm->test_tRNS = 0;
|
||||||
|
# endif
|
||||||
pm->use_input_precision = 0;
|
pm->use_input_precision = 0;
|
||||||
pm->use_input_precision_sbit = 0;
|
pm->use_input_precision_sbit = 0;
|
||||||
pm->use_input_precision_16to8 = 0;
|
pm->use_input_precision_16to8 = 0;
|
||||||
@ -2054,6 +2087,11 @@ modifier_init(png_modifier *pm)
|
|||||||
pm->test_gamma_background = 0;
|
pm->test_gamma_background = 0;
|
||||||
pm->test_gamma_alpha_mode = 0;
|
pm->test_gamma_alpha_mode = 0;
|
||||||
pm->test_gamma_expand16 = 0;
|
pm->test_gamma_expand16 = 0;
|
||||||
|
pm->test_lbg = 1;
|
||||||
|
pm->test_lbg_gamma_threshold = 1;
|
||||||
|
pm->test_lbg_gamma_transform = 1;
|
||||||
|
pm->test_lbg_gamma_sbit = 1;
|
||||||
|
pm->test_lbg_gamma_composition = 1;
|
||||||
pm->test_exhaustive = 0;
|
pm->test_exhaustive = 0;
|
||||||
pm->log = 0;
|
pm->log = 0;
|
||||||
|
|
||||||
@ -3192,6 +3230,45 @@ init_standard_palette(png_store *ps, png_structp pp, png_infop pi, int npalette,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef PNG_WRITE_tRNS_SUPPORTED
|
||||||
|
static void
|
||||||
|
set_random_tRNS(png_structp pp, png_infop pi, PNG_CONST png_byte colour_type,
|
||||||
|
PNG_CONST int bit_depth)
|
||||||
|
{
|
||||||
|
/* To make this useful the tRNS color needs to match at least one pixel.
|
||||||
|
* Random values are fine for gray, including the 16-bit case where we know
|
||||||
|
* that the test image contains all the gray values. For RGB we need more
|
||||||
|
* method as only 65536 different RGB values are generated.
|
||||||
|
*/
|
||||||
|
png_color_16 tRNS;
|
||||||
|
const png_uint_16 mask = (png_uint_16)((1U << bit_depth)-1);
|
||||||
|
|
||||||
|
RANDOMIZE(tRNS);
|
||||||
|
|
||||||
|
if (colour_type & 2/*RGB*/)
|
||||||
|
{
|
||||||
|
if (bit_depth == 8)
|
||||||
|
{
|
||||||
|
tRNS.blue = tRNS.red ^ tRNS.green;
|
||||||
|
tRNS.red &= mask;
|
||||||
|
tRNS.green &= mask;
|
||||||
|
tRNS.blue &= mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
else /* bit_depth == 16 */
|
||||||
|
{
|
||||||
|
tRNS.green = (png_uint_16)(tRNS.red * 257);
|
||||||
|
tRNS.blue = (png_uint_16)(tRNS.green * 17);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
tRNS.gray &= mask;
|
||||||
|
|
||||||
|
png_set_tRNS(pp, pi, NULL, 0, &tRNS);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* The number of passes is related to the interlace type. There was no libpng
|
/* The number of passes is related to the interlace type. There was no libpng
|
||||||
* API to determine this prior to 1.5, so we need an inquiry function:
|
* API to determine this prior to 1.5, so we need an inquiry function:
|
||||||
*/
|
*/
|
||||||
@ -3525,6 +3602,11 @@ make_transform_image(png_store* PNG_CONST ps, png_byte PNG_CONST colour_type,
|
|||||||
if (colour_type == 3) /* palette */
|
if (colour_type == 3) /* palette */
|
||||||
init_standard_palette(ps, pp, pi, 1U << bit_depth, 1/*do tRNS*/);
|
init_standard_palette(ps, pp, pi, 1U << bit_depth, 1/*do tRNS*/);
|
||||||
|
|
||||||
|
# ifdef PNG_WRITE_tRNS_SUPPORTED
|
||||||
|
else if (palette_number)
|
||||||
|
set_random_tRNS(pp, pi, colour_type, bit_depth);
|
||||||
|
# endif
|
||||||
|
|
||||||
png_write_info(pp, pi);
|
png_write_info(pp, pi);
|
||||||
|
|
||||||
if (png_get_rowbytes(pp, pi) !=
|
if (png_get_rowbytes(pp, pi) !=
|
||||||
@ -3598,19 +3680,20 @@ make_transform_image(png_store* PNG_CONST ps, png_byte PNG_CONST colour_type,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
make_transform_images(png_store *ps)
|
make_transform_images(png_modifier *pm)
|
||||||
{
|
{
|
||||||
png_byte colour_type = 0;
|
png_byte colour_type = 0;
|
||||||
png_byte bit_depth = 0;
|
png_byte bit_depth = 0;
|
||||||
unsigned int palette_number = 0;
|
unsigned int palette_number = 0;
|
||||||
|
|
||||||
/* This is in case of errors. */
|
/* This is in case of errors. */
|
||||||
safecat(ps->test, sizeof ps->test, 0, "make standard images");
|
safecat(pm->this.test, sizeof pm->this.test, 0, "make standard images");
|
||||||
|
|
||||||
/* Use next_format to enumerate all the combinations we test, including
|
/* Use next_format to enumerate all the combinations we test, including
|
||||||
* generating multiple low bit depth palette images.
|
* generating multiple low bit depth palette images. Non-A images (palette
|
||||||
|
* and direct) are created with and without tRNS chunks.
|
||||||
*/
|
*/
|
||||||
while (next_format(&colour_type, &bit_depth, &palette_number, 0))
|
while (next_format(&colour_type, &bit_depth, &palette_number, 1, 1))
|
||||||
{
|
{
|
||||||
int interlace_type;
|
int interlace_type;
|
||||||
|
|
||||||
@ -3621,7 +3704,7 @@ make_transform_images(png_store *ps)
|
|||||||
|
|
||||||
standard_name(name, sizeof name, 0, colour_type, bit_depth,
|
standard_name(name, sizeof name, 0, colour_type, bit_depth,
|
||||||
palette_number, interlace_type, 0, 0, 0);
|
palette_number, interlace_type, 0, 0, 0);
|
||||||
make_transform_image(ps, colour_type, bit_depth, palette_number,
|
make_transform_image(&pm->this, colour_type, bit_depth, palette_number,
|
||||||
interlace_type, name);
|
interlace_type, name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4017,7 +4100,7 @@ make_error(png_store* volatile psIn, png_byte PNG_CONST colour_type,
|
|||||||
|
|
||||||
Try
|
Try
|
||||||
{
|
{
|
||||||
png_structp pp;
|
volatile png_structp pp;
|
||||||
png_infop pi;
|
png_infop pi;
|
||||||
|
|
||||||
pp = set_store_for_write(ps, &pi, name);
|
pp = set_store_for_write(ps, &pi, name);
|
||||||
@ -4287,6 +4370,7 @@ typedef struct standard_display
|
|||||||
size_t cbRow; /* Bytes in a row of the output image */
|
size_t cbRow; /* Bytes in a row of the output image */
|
||||||
int do_interlace; /* Do interlacing internally */
|
int do_interlace; /* Do interlacing internally */
|
||||||
int is_transparent; /* Transparency information was present. */
|
int is_transparent; /* Transparency information was present. */
|
||||||
|
int has_tRNS; /* color type GRAY or RGB with a tRNS chunk. */
|
||||||
int speed; /* Doing a speed test */
|
int speed; /* Doing a speed test */
|
||||||
int use_update_info;/* Call update_info, not start_image */
|
int use_update_info;/* Call update_info, not start_image */
|
||||||
struct
|
struct
|
||||||
@ -4619,14 +4703,14 @@ standard_info_part1(standard_display *dp, png_structp pp, png_infop pi)
|
|||||||
case 0:
|
case 0:
|
||||||
dp->transparent.red = dp->transparent.green = dp->transparent.blue =
|
dp->transparent.red = dp->transparent.green = dp->transparent.blue =
|
||||||
trans_color->gray;
|
trans_color->gray;
|
||||||
dp->is_transparent = 1;
|
dp->has_tRNS = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
dp->transparent.red = trans_color->red;
|
dp->transparent.red = trans_color->red;
|
||||||
dp->transparent.green = trans_color->green;
|
dp->transparent.green = trans_color->green;
|
||||||
dp->transparent.blue = trans_color->blue;
|
dp->transparent.blue = trans_color->blue;
|
||||||
dp->is_transparent = 1;
|
dp->has_tRNS = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
@ -5518,7 +5602,7 @@ image_pixel_add_alpha(image_pixel *this, PNG_CONST standard_display *display)
|
|||||||
if (this->colour_type == PNG_COLOR_TYPE_GRAY)
|
if (this->colour_type == PNG_COLOR_TYPE_GRAY)
|
||||||
{
|
{
|
||||||
if (this->bit_depth < 8)
|
if (this->bit_depth < 8)
|
||||||
this->bit_depth = 8;
|
this->bit_depth = this->sample_depth = 8;
|
||||||
|
|
||||||
if (this->have_tRNS)
|
if (this->have_tRNS)
|
||||||
{
|
{
|
||||||
@ -5553,9 +5637,11 @@ image_pixel_add_alpha(image_pixel *this, PNG_CONST standard_display *display)
|
|||||||
this->alphaf = 0;
|
this->alphaf = 0;
|
||||||
else
|
else
|
||||||
this->alphaf = 1;
|
this->alphaf = 1;
|
||||||
|
|
||||||
this->colour_type = PNG_COLOR_TYPE_RGB_ALPHA;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
this->alphaf = 1;
|
||||||
|
|
||||||
|
this->colour_type = PNG_COLOR_TYPE_RGB_ALPHA;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The error in the alpha is zero and the sBIT value comes from the
|
/* The error in the alpha is zero and the sBIT value comes from the
|
||||||
@ -5848,8 +5934,9 @@ transform_info_imp(transform_display *dp, png_structp pp, png_infop pi)
|
|||||||
/* If png_set_filler is in action then fake the output color type to include
|
/* If png_set_filler is in action then fake the output color type to include
|
||||||
* an alpha channel where appropriate.
|
* an alpha channel where appropriate.
|
||||||
*/
|
*/
|
||||||
if (dp->output_bit_depth >= 8 && (dp->output_colour_type == PNG_COLOR_TYPE_RGB ||
|
if (dp->output_bit_depth >= 8 &&
|
||||||
dp->output_colour_type == PNG_COLOR_TYPE_GRAY) && dp->this.filler)
|
(dp->output_colour_type == PNG_COLOR_TYPE_RGB ||
|
||||||
|
dp->output_colour_type == PNG_COLOR_TYPE_GRAY) && dp->this.filler)
|
||||||
dp->output_colour_type |= 4;
|
dp->output_colour_type |= 4;
|
||||||
|
|
||||||
/* Validate the combination of colour type and bit depth that we are getting
|
/* Validate the combination of colour type and bit depth that we are getting
|
||||||
@ -6372,6 +6459,13 @@ image_transform_png_set_tRNS_to_alpha_set(PNG_CONST image_transform *this,
|
|||||||
transform_display *that, png_structp pp, png_infop pi)
|
transform_display *that, png_structp pp, png_infop pi)
|
||||||
{
|
{
|
||||||
png_set_tRNS_to_alpha(pp);
|
png_set_tRNS_to_alpha(pp);
|
||||||
|
|
||||||
|
/* If there was a tRNS chunk that would get expanded and add an alpha
|
||||||
|
* channel is_transparent must be updated:
|
||||||
|
*/
|
||||||
|
if (that->this.has_tRNS)
|
||||||
|
that->this.is_transparent = 1;
|
||||||
|
|
||||||
this->next->set(this->next, that, pp, pi);
|
this->next->set(this->next, that, pp, pi);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6430,6 +6524,7 @@ image_transform_png_set_gray_to_rgb_set(PNG_CONST image_transform *this,
|
|||||||
transform_display *that, png_structp pp, png_infop pi)
|
transform_display *that, png_structp pp, png_infop pi)
|
||||||
{
|
{
|
||||||
png_set_gray_to_rgb(pp);
|
png_set_gray_to_rgb(pp);
|
||||||
|
/* NOTE: this doesn't result in tRNS expansion. */
|
||||||
this->next->set(this->next, that, pp, pi);
|
this->next->set(this->next, that, pp, pi);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6489,6 +6584,10 @@ image_transform_png_set_expand_set(PNG_CONST image_transform *this,
|
|||||||
transform_display *that, png_structp pp, png_infop pi)
|
transform_display *that, png_structp pp, png_infop pi)
|
||||||
{
|
{
|
||||||
png_set_expand(pp);
|
png_set_expand(pp);
|
||||||
|
|
||||||
|
if (that->this.has_tRNS)
|
||||||
|
that->this.is_transparent = 1;
|
||||||
|
|
||||||
this->next->set(this->next, that, pp, pi);
|
this->next->set(this->next, that, pp, pi);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6539,6 +6638,7 @@ image_transform_png_set_expand_gray_1_2_4_to_8_set(
|
|||||||
png_infop pi)
|
png_infop pi)
|
||||||
{
|
{
|
||||||
png_set_expand_gray_1_2_4_to_8(pp);
|
png_set_expand_gray_1_2_4_to_8(pp);
|
||||||
|
/* NOTE: don't expect this to expand tRNS */
|
||||||
this->next->set(this->next, that, pp, pi);
|
this->next->set(this->next, that, pp, pi);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6570,6 +6670,11 @@ image_transform_png_set_expand_16_set(PNG_CONST image_transform *this,
|
|||||||
transform_display *that, png_structp pp, png_infop pi)
|
transform_display *that, png_structp pp, png_infop pi)
|
||||||
{
|
{
|
||||||
png_set_expand_16(pp);
|
png_set_expand_16(pp);
|
||||||
|
|
||||||
|
/* NOTE: at present libpng does SET_EXPAND as well, so tRNS is expanded. */
|
||||||
|
if (that->this.has_tRNS)
|
||||||
|
that->this.is_transparent = 1;
|
||||||
|
|
||||||
this->next->set(this->next, that, pp, pi);
|
this->next->set(this->next, that, pp, pi);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6940,14 +7045,14 @@ image_transform_png_set_rgb_to_gray_ini(PNG_CONST image_transform *this,
|
|||||||
* When DIGITIZE is set because a pre-1.7 version of libpng is being
|
* When DIGITIZE is set because a pre-1.7 version of libpng is being
|
||||||
* tested allow a bigger slack.
|
* tested allow a bigger slack.
|
||||||
*
|
*
|
||||||
* NOTE: this magic number was determined by experiment to be 1.25.
|
* NOTE: this magic number was determined by experiment to be about
|
||||||
* There's no great merit to the value below, however it only affects
|
* 1.263. There's no great merit to the value below, however it only
|
||||||
* the limit used for checking for internal calculation errors, not
|
* affects the limit used for checking for internal calculation errors,
|
||||||
* the actual limit imposed by pngvalid on the output errors.
|
* not the actual limit imposed by pngvalid on the output errors.
|
||||||
*/
|
*/
|
||||||
that->pm->limit += pow(
|
that->pm->limit += pow(
|
||||||
# if DIGITIZE
|
# if DIGITIZE
|
||||||
1.25
|
1.3
|
||||||
# else
|
# else
|
||||||
1.0
|
1.0
|
||||||
# endif
|
# endif
|
||||||
@ -7111,7 +7216,8 @@ image_transform_png_set_rgb_to_gray_mod(PNG_CONST image_transform *this,
|
|||||||
const unsigned int sample_depth = that->sample_depth;
|
const unsigned int sample_depth = that->sample_depth;
|
||||||
const unsigned int calc_depth = (pm->assume_16_bit_calculations ? 16 :
|
const unsigned int calc_depth = (pm->assume_16_bit_calculations ? 16 :
|
||||||
sample_depth);
|
sample_depth);
|
||||||
const unsigned int gamma_depth = (sample_depth == 16 ? 16 :
|
const unsigned int gamma_depth = (sample_depth == 16 ?
|
||||||
|
PNG_MAX_GAMMA_8 :
|
||||||
(pm->assume_16_bit_calculations ? PNG_MAX_GAMMA_8 : sample_depth));
|
(pm->assume_16_bit_calculations ? PNG_MAX_GAMMA_8 : sample_depth));
|
||||||
int isgray;
|
int isgray;
|
||||||
double r, g, b;
|
double r, g, b;
|
||||||
@ -7125,56 +7231,73 @@ image_transform_png_set_rgb_to_gray_mod(PNG_CONST image_transform *this,
|
|||||||
* will be identical after this operation if there is only one
|
* will be identical after this operation if there is only one
|
||||||
* transform, feel free to delete the png_error checks on this below in
|
* transform, feel free to delete the png_error checks on this below in
|
||||||
* the future (this is just me trying to ensure it works!)
|
* the future (this is just me trying to ensure it works!)
|
||||||
|
*
|
||||||
|
* Interval arithmetic is exact, but to implement it it must be
|
||||||
|
* possible to control the floating point implementation rounding mode.
|
||||||
|
* This cannot be done in ANSI-C, so instead I reduce the 'lo' values
|
||||||
|
* by DBL_EPSILON and increase the 'hi' values by the same.
|
||||||
*/
|
*/
|
||||||
|
# define DD(v,d,r) (digitize(v*(1-DBL_EPSILON), d, r) * (1-DBL_EPSILON))
|
||||||
|
# define DU(v,d,r) (digitize(v*(1+DBL_EPSILON), d, r) * (1+DBL_EPSILON))
|
||||||
|
|
||||||
r = rlo = rhi = that->redf;
|
r = rlo = rhi = that->redf;
|
||||||
rlo -= that->rede;
|
rlo -= that->rede;
|
||||||
rlo = digitize(rlo, calc_depth, 1/*round*/);
|
rlo = DD(rlo, calc_depth, 1/*round*/);
|
||||||
rhi += that->rede;
|
rhi += that->rede;
|
||||||
rhi = digitize(rhi, calc_depth, 1/*round*/);
|
rhi = DU(rhi, calc_depth, 1/*round*/);
|
||||||
|
|
||||||
g = glo = ghi = that->greenf;
|
g = glo = ghi = that->greenf;
|
||||||
glo -= that->greene;
|
glo -= that->greene;
|
||||||
glo = digitize(glo, calc_depth, 1/*round*/);
|
glo = DD(glo, calc_depth, 1/*round*/);
|
||||||
ghi += that->greene;
|
ghi += that->greene;
|
||||||
ghi = digitize(ghi, calc_depth, 1/*round*/);
|
ghi = DU(ghi, calc_depth, 1/*round*/);
|
||||||
|
|
||||||
b = blo = bhi = that->bluef;
|
b = blo = bhi = that->bluef;
|
||||||
blo -= that->bluee;
|
blo -= that->bluee;
|
||||||
blo = digitize(blo, calc_depth, 1/*round*/);
|
blo = DD(blo, calc_depth, 1/*round*/);
|
||||||
bhi += that->greene;
|
bhi += that->greene;
|
||||||
bhi = digitize(bhi, calc_depth, 1/*round*/);
|
bhi = DU(bhi, calc_depth, 1/*round*/);
|
||||||
|
|
||||||
isgray = r==g && g==b;
|
isgray = r==g && g==b;
|
||||||
|
|
||||||
if (data.gamma != 1)
|
if (data.gamma != 1)
|
||||||
{
|
{
|
||||||
PNG_CONST double power = 1/data.gamma;
|
PNG_CONST double power = 1/data.gamma;
|
||||||
PNG_CONST double abse = calc_depth == 16 ? .5/65535 : .5/255;
|
PNG_CONST double abse = .5/(sample_depth == 16 ? 65535 : 255);
|
||||||
|
|
||||||
/* 'abse' is the absolute error permitted in linear calculations. It
|
/* If a gamma calculation is done it is done using lookup tables of
|
||||||
* is used here to capture the error permitted in the handling
|
* precision gamma_depth, so the already digitized value above may
|
||||||
* (undoing) of the gamma encoding. Once again digitization occurs
|
* need to be further digitized here.
|
||||||
* to handle the upper and lower bounds of the values. This is
|
|
||||||
* where the real errors are introduced.
|
|
||||||
*/
|
*/
|
||||||
|
if (gamma_depth != calc_depth)
|
||||||
|
{
|
||||||
|
rlo = DD(rlo, gamma_depth, 0/*truncate*/);
|
||||||
|
rhi = DU(rhi, gamma_depth, 0/*truncate*/);
|
||||||
|
glo = DD(glo, gamma_depth, 0/*truncate*/);
|
||||||
|
ghi = DU(ghi, gamma_depth, 0/*truncate*/);
|
||||||
|
blo = DD(blo, gamma_depth, 0/*truncate*/);
|
||||||
|
bhi = DU(bhi, gamma_depth, 0/*truncate*/);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 'abse' is the error in the gamma table calculation itself. */
|
||||||
r = pow(r, power);
|
r = pow(r, power);
|
||||||
rlo = digitize(pow(rlo, power)-abse, calc_depth, 1);
|
rlo = DD(pow(rlo, power)-abse, calc_depth, 1);
|
||||||
rhi = digitize(pow(rhi, power)+abse, calc_depth, 1);
|
rhi = DU(pow(rhi, power)+abse, calc_depth, 1);
|
||||||
|
|
||||||
g = pow(g, power);
|
g = pow(g, power);
|
||||||
glo = digitize(pow(glo, power)-abse, calc_depth, 1);
|
glo = DD(pow(glo, power)-abse, calc_depth, 1);
|
||||||
ghi = digitize(pow(ghi, power)+abse, calc_depth, 1);
|
ghi = DU(pow(ghi, power)+abse, calc_depth, 1);
|
||||||
|
|
||||||
b = pow(b, power);
|
b = pow(b, power);
|
||||||
blo = digitize(pow(blo, power)-abse, calc_depth, 1);
|
blo = DD(pow(blo, power)-abse, calc_depth, 1);
|
||||||
bhi = digitize(pow(bhi, power)+abse, calc_depth, 1);
|
bhi = DU(pow(bhi, power)+abse, calc_depth, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now calculate the actual gray values. Although the error in the
|
/* Now calculate the actual gray values. Although the error in the
|
||||||
* coefficients depends on whether they were specified on the command
|
* coefficients depends on whether they were specified on the command
|
||||||
* line (in which case truncation to 15 bits happened) or not (rounding
|
* line (in which case truncation to 15 bits happened) or not (rounding
|
||||||
* was used) the maxium error in an individual coefficient is always
|
* was used) the maxium error in an individual coefficient is always
|
||||||
* 1/32768, because even in the rounding case the requirement that
|
* 2/32768, because even in the rounding case the requirement that
|
||||||
* coefficients add up to 32768 can cause a larger rounding error.
|
* coefficients add up to 32768 can cause a larger rounding error.
|
||||||
*
|
*
|
||||||
* The only time when rounding doesn't occur in 1.5.5 and later is when
|
* The only time when rounding doesn't occur in 1.5.5 and later is when
|
||||||
@ -7185,19 +7308,19 @@ image_transform_png_set_rgb_to_gray_mod(PNG_CONST image_transform *this,
|
|||||||
|
|
||||||
{
|
{
|
||||||
PNG_CONST int do_round = data.gamma != 1 || calc_depth == 16;
|
PNG_CONST int do_round = data.gamma != 1 || calc_depth == 16;
|
||||||
PNG_CONST double ce = 1. / 32768;
|
PNG_CONST double ce = 2. / 32768;
|
||||||
|
|
||||||
graylo = digitize(rlo * (data.red_coefficient-ce) +
|
graylo = DD(rlo * (data.red_coefficient-ce) +
|
||||||
glo * (data.green_coefficient-ce) +
|
glo * (data.green_coefficient-ce) +
|
||||||
blo * (data.blue_coefficient-ce), gamma_depth, do_round);
|
blo * (data.blue_coefficient-ce), calc_depth, do_round);
|
||||||
if (graylo <= 0)
|
if (graylo > gray) /* always accept the right answer */
|
||||||
graylo = 0;
|
graylo = gray;
|
||||||
|
|
||||||
grayhi = digitize(rhi * (data.red_coefficient+ce) +
|
grayhi = DU(rhi * (data.red_coefficient+ce) +
|
||||||
ghi * (data.green_coefficient+ce) +
|
ghi * (data.green_coefficient+ce) +
|
||||||
bhi * (data.blue_coefficient+ce), gamma_depth, do_round);
|
bhi * (data.blue_coefficient+ce), calc_depth, do_round);
|
||||||
if (grayhi >= 1)
|
if (grayhi < gray)
|
||||||
grayhi = 1;
|
grayhi = gray;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* And invert the gamma. */
|
/* And invert the gamma. */
|
||||||
@ -7205,11 +7328,25 @@ image_transform_png_set_rgb_to_gray_mod(PNG_CONST image_transform *this,
|
|||||||
{
|
{
|
||||||
PNG_CONST double power = data.gamma;
|
PNG_CONST double power = data.gamma;
|
||||||
|
|
||||||
|
/* And this happens yet again, shifting the values once more. */
|
||||||
|
if (gamma_depth != sample_depth)
|
||||||
|
{
|
||||||
|
rlo = DD(rlo, gamma_depth, 0/*truncate*/);
|
||||||
|
rhi = DU(rhi, gamma_depth, 0/*truncate*/);
|
||||||
|
glo = DD(glo, gamma_depth, 0/*truncate*/);
|
||||||
|
ghi = DU(ghi, gamma_depth, 0/*truncate*/);
|
||||||
|
blo = DD(blo, gamma_depth, 0/*truncate*/);
|
||||||
|
bhi = DU(bhi, gamma_depth, 0/*truncate*/);
|
||||||
|
}
|
||||||
|
|
||||||
gray = pow(gray, power);
|
gray = pow(gray, power);
|
||||||
graylo = digitize(pow(graylo, power), sample_depth, 1);
|
graylo = DD(pow(graylo, power), sample_depth, 1);
|
||||||
grayhi = digitize(pow(grayhi, power), sample_depth, 1);
|
grayhi = DU(pow(grayhi, power), sample_depth, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# undef DD
|
||||||
|
# undef DU
|
||||||
|
|
||||||
/* Now the error can be calculated.
|
/* Now the error can be calculated.
|
||||||
*
|
*
|
||||||
* If r==g==b because there is no overall gamma correction libpng
|
* If r==g==b because there is no overall gamma correction libpng
|
||||||
@ -7260,16 +7397,28 @@ image_transform_png_set_rgb_to_gray_mod(PNG_CONST image_transform *this,
|
|||||||
{
|
{
|
||||||
/* There is no need to do the conversions to and from linear space,
|
/* There is no need to do the conversions to and from linear space,
|
||||||
* so the calculation should be a lot more accurate. There is a
|
* so the calculation should be a lot more accurate. There is a
|
||||||
* built in 1/32768 error in the coefficients because they only have
|
* built in error in the coefficients because they only have 15 bits
|
||||||
* 15 bits and are adjusted to make sure they add up to 32768, so
|
* and are adjusted to make sure they add up to 32768. This
|
||||||
* the result may have an additional error up to 1/32768. (Note
|
* involves a integer calculation with truncation of the form:
|
||||||
* that adding the 1/32768 here avoids needing to increase the
|
*
|
||||||
* global error limits to take this into account.)
|
* ((int)(coefficient * 100000) * 32768)/100000
|
||||||
|
*
|
||||||
|
* This is done to the red and green coefficients (the ones
|
||||||
|
* provided to the API) then blue is calculated from them so the
|
||||||
|
* result adds up to 32768. In the worst case this can result in
|
||||||
|
* a -1 error in red and green and a +2 error in blue. Consequently
|
||||||
|
* the worst case in the calculation below is 2/32768 error.
|
||||||
|
*
|
||||||
|
* TODO: consider fixing this in libpng by rounding the calculation
|
||||||
|
* limiting the error to 1/32768.
|
||||||
|
*
|
||||||
|
* Handling this by adding 2/32768 here avoids needing to increase
|
||||||
|
* the global error limits to take this into account.)
|
||||||
*/
|
*/
|
||||||
gray = r * data.red_coefficient + g * data.green_coefficient +
|
gray = r * data.red_coefficient + g * data.green_coefficient +
|
||||||
b * data.blue_coefficient;
|
b * data.blue_coefficient;
|
||||||
err = re * data.red_coefficient + ge * data.green_coefficient +
|
err = re * data.red_coefficient + ge * data.green_coefficient +
|
||||||
be * data.blue_coefficient + 1./32768 + gray * 5 * DBL_EPSILON;
|
be * data.blue_coefficient + 2./32768 + gray * 5 * DBL_EPSILON;
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
@ -7304,7 +7453,7 @@ image_transform_png_set_rgb_to_gray_mod(PNG_CONST image_transform *this,
|
|||||||
* previously added input quantization error at this point.
|
* previously added input quantization error at this point.
|
||||||
*/
|
*/
|
||||||
gray = r * data.red_coefficient + g * data.green_coefficient +
|
gray = r * data.red_coefficient + g * data.green_coefficient +
|
||||||
b * data.blue_coefficient - 1./32768 - out_qe;
|
b * data.blue_coefficient - 2./32768 - out_qe;
|
||||||
if (gray <= 0)
|
if (gray <= 0)
|
||||||
gray = 0;
|
gray = 0;
|
||||||
else
|
else
|
||||||
@ -7314,7 +7463,7 @@ image_transform_png_set_rgb_to_gray_mod(PNG_CONST image_transform *this,
|
|||||||
}
|
}
|
||||||
|
|
||||||
grayhi = rhi * data.red_coefficient + ghi * data.green_coefficient +
|
grayhi = rhi * data.red_coefficient + ghi * data.green_coefficient +
|
||||||
bhi * data.blue_coefficient + 1./32768 + out_qe;
|
bhi * data.blue_coefficient + 2./32768 + out_qe;
|
||||||
grayhi *= (1 + 6 * DBL_EPSILON);
|
grayhi *= (1 + 6 * DBL_EPSILON);
|
||||||
if (grayhi >= 1)
|
if (grayhi >= 1)
|
||||||
grayhi = 1;
|
grayhi = 1;
|
||||||
@ -7429,6 +7578,9 @@ image_transform_png_set_background_set(PNG_CONST image_transform *this,
|
|||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (that->this.has_tRNS)
|
||||||
|
that->this.is_transparent = 1;
|
||||||
|
|
||||||
bit_depth = that->this.bit_depth;
|
bit_depth = that->this.bit_depth;
|
||||||
expand = 1;
|
expand = 1;
|
||||||
}
|
}
|
||||||
@ -7506,14 +7658,14 @@ image_transform_png_set_background_mod(PNG_CONST image_transform *this,
|
|||||||
/* Remove the alpha type and set the alpha (not in that order.) */
|
/* Remove the alpha type and set the alpha (not in that order.) */
|
||||||
that->alphaf = 1;
|
that->alphaf = 1;
|
||||||
that->alphae = 0;
|
that->alphae = 0;
|
||||||
|
|
||||||
if (that->colour_type == PNG_COLOR_TYPE_RGB_ALPHA)
|
|
||||||
that->colour_type = PNG_COLOR_TYPE_RGB;
|
|
||||||
else if (that->colour_type == PNG_COLOR_TYPE_GRAY_ALPHA)
|
|
||||||
that->colour_type = PNG_COLOR_TYPE_GRAY;
|
|
||||||
/* PNG_COLOR_TYPE_PALETTE is not changed */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (that->colour_type == PNG_COLOR_TYPE_RGB_ALPHA)
|
||||||
|
that->colour_type = PNG_COLOR_TYPE_RGB;
|
||||||
|
else if (that->colour_type == PNG_COLOR_TYPE_GRAY_ALPHA)
|
||||||
|
that->colour_type = PNG_COLOR_TYPE_GRAY;
|
||||||
|
/* PNG_COLOR_TYPE_PALETTE is not changed */
|
||||||
|
|
||||||
this->next->mod(this->next, that, pp, display);
|
this->next->mod(this->next, that, pp, display);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8301,7 +8453,8 @@ perform_transform_test(png_modifier *pm)
|
|||||||
png_byte bit_depth = 0;
|
png_byte bit_depth = 0;
|
||||||
unsigned int palette_number = 0;
|
unsigned int palette_number = 0;
|
||||||
|
|
||||||
while (next_format(&colour_type, &bit_depth, &palette_number, 0))
|
while (next_format(&colour_type, &bit_depth, &palette_number, pm->test_lbg,
|
||||||
|
pm->test_tRNS))
|
||||||
{
|
{
|
||||||
png_uint_32 counter = 0;
|
png_uint_32 counter = 0;
|
||||||
size_t base_pos;
|
size_t base_pos;
|
||||||
@ -8604,7 +8757,9 @@ init_validate_info(validate_info *vi, gamma_display *dp, png_const_structp pp,
|
|||||||
vi->outlog = outlog(dp->pm, in_depth, out_depth);
|
vi->outlog = outlog(dp->pm, in_depth, out_depth);
|
||||||
|
|
||||||
if ((dp->this.colour_type & PNG_COLOR_MASK_ALPHA) != 0 ||
|
if ((dp->this.colour_type & PNG_COLOR_MASK_ALPHA) != 0 ||
|
||||||
(dp->this.colour_type == 3 && dp->this.is_transparent))
|
(dp->this.colour_type == 3 && dp->this.is_transparent) ||
|
||||||
|
((dp->this.colour_type == 0 || dp->this.colour_type == 2) &&
|
||||||
|
dp->this.has_tRNS))
|
||||||
{
|
{
|
||||||
vi->do_background = dp->do_background;
|
vi->do_background = dp->do_background;
|
||||||
|
|
||||||
@ -8634,7 +8789,7 @@ init_validate_info(validate_info *vi, gamma_display *dp, png_const_structp pp,
|
|||||||
vi->background_blue = b;
|
vi->background_blue = b;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else /* Do not expect any background processing */
|
||||||
vi->do_background = 0;
|
vi->do_background = 0;
|
||||||
|
|
||||||
if (vi->do_background == 0)
|
if (vi->do_background == 0)
|
||||||
@ -9350,6 +9505,7 @@ gamma_image_validate(gamma_display *dp, png_const_structp pp,
|
|||||||
png_uint_32 y;
|
png_uint_32 y;
|
||||||
PNG_CONST store_palette_entry *in_palette = dp->this.palette;
|
PNG_CONST store_palette_entry *in_palette = dp->this.palette;
|
||||||
PNG_CONST int in_is_transparent = dp->this.is_transparent;
|
PNG_CONST int in_is_transparent = dp->this.is_transparent;
|
||||||
|
int process_tRNS;
|
||||||
int out_npalette = -1;
|
int out_npalette = -1;
|
||||||
int out_is_transparent = 0; /* Just refers to the palette case */
|
int out_is_transparent = 0; /* Just refers to the palette case */
|
||||||
store_palette out_palette;
|
store_palette out_palette;
|
||||||
@ -9365,6 +9521,7 @@ gamma_image_validate(gamma_display *dp, png_const_structp pp,
|
|||||||
|
|
||||||
processing = (vi.gamma_correction > 0 && !dp->threshold_test)
|
processing = (vi.gamma_correction > 0 && !dp->threshold_test)
|
||||||
|| in_bd != out_bd || in_ct != out_ct || vi.do_background;
|
|| in_bd != out_bd || in_ct != out_ct || vi.do_background;
|
||||||
|
process_tRNS = dp->this.has_tRNS && vi.do_background;
|
||||||
|
|
||||||
/* TODO: FIX THIS: MAJOR BUG! If the transformations all happen inside
|
/* TODO: FIX THIS: MAJOR BUG! If the transformations all happen inside
|
||||||
* the palette there is no way of finding out, because libpng fails to
|
* the palette there is no way of finding out, because libpng fails to
|
||||||
@ -9403,8 +9560,8 @@ gamma_image_validate(gamma_display *dp, png_const_structp pp,
|
|||||||
/* Handle input alpha - png_set_background will cause the output
|
/* Handle input alpha - png_set_background will cause the output
|
||||||
* alpha to disappear so there is nothing to check.
|
* alpha to disappear so there is nothing to check.
|
||||||
*/
|
*/
|
||||||
if ((in_ct & PNG_COLOR_MASK_ALPHA) != 0 || (in_ct == 3 &&
|
if ((in_ct & PNG_COLOR_MASK_ALPHA) != 0 ||
|
||||||
in_is_transparent))
|
(in_ct == 3 && in_is_transparent))
|
||||||
{
|
{
|
||||||
PNG_CONST unsigned int input_alpha = in_ct == 3 ?
|
PNG_CONST unsigned int input_alpha = in_ct == 3 ?
|
||||||
dp->this.palette[in_index].alpha :
|
dp->this.palette[in_index].alpha :
|
||||||
@ -9436,6 +9593,35 @@ gamma_image_validate(gamma_display *dp, png_const_structp pp,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if (process_tRNS)
|
||||||
|
{
|
||||||
|
/* alpha needs to be set appropriately for this pixel, it is
|
||||||
|
* currently 1 and needs to be 0 for an input pixel which matches
|
||||||
|
* the values in tRNS.
|
||||||
|
*/
|
||||||
|
switch (in_ct)
|
||||||
|
{
|
||||||
|
case 0: /* gray */
|
||||||
|
if (sample(std, in_ct, in_bd, x, 0, 0, 0) ==
|
||||||
|
dp->this.transparent.red)
|
||||||
|
alpha = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2: /* RGB */
|
||||||
|
if (sample(std, in_ct, in_bd, x, 0, 0, 0) ==
|
||||||
|
dp->this.transparent.red &&
|
||||||
|
sample(std, in_ct, in_bd, x, 1, 0, 0) ==
|
||||||
|
dp->this.transparent.green &&
|
||||||
|
sample(std, in_ct, in_bd, x, 2, 0, 0) ==
|
||||||
|
dp->this.transparent.blue)
|
||||||
|
alpha = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Handle grayscale or RGB components. */
|
/* Handle grayscale or RGB components. */
|
||||||
if ((in_ct & PNG_COLOR_MASK_COLOR) == 0) /* grayscale */
|
if ((in_ct & PNG_COLOR_MASK_COLOR) == 0) /* grayscale */
|
||||||
(void)gamma_component_validate("gray", &vi,
|
(void)gamma_component_validate("gray", &vi,
|
||||||
@ -9545,7 +9731,7 @@ gamma_test(png_modifier *pmIn, PNG_CONST png_byte colour_typeIn,
|
|||||||
|
|
||||||
modification_reset(d.pm->modifications);
|
modification_reset(d.pm->modifications);
|
||||||
|
|
||||||
/* Get a png_struct for writing the image. */
|
/* Get a png_struct for reading the image. */
|
||||||
pp = set_modifier_for_read(d.pm, &pi, d.this.id, name);
|
pp = set_modifier_for_read(d.pm, &pi, d.this.id, name);
|
||||||
standard_palette_init(&d.this);
|
standard_palette_init(&d.this);
|
||||||
|
|
||||||
@ -9684,9 +9870,13 @@ perform_gamma_threshold_tests(png_modifier *pm)
|
|||||||
/* Don't test more than one instance of each palette - it's pointless, in
|
/* Don't test more than one instance of each palette - it's pointless, in
|
||||||
* fact this test is somewhat excessive since libpng doesn't make this
|
* fact this test is somewhat excessive since libpng doesn't make this
|
||||||
* decision based on colour type or bit depth!
|
* decision based on colour type or bit depth!
|
||||||
|
*
|
||||||
|
* CHANGED: now test two palettes and, as a side effect, images with and
|
||||||
|
* without tRNS.
|
||||||
*/
|
*/
|
||||||
while (next_format(&colour_type, &bit_depth, &palette_number, 1/*gamma*/))
|
while (next_format(&colour_type, &bit_depth, &palette_number,
|
||||||
if (palette_number == 0)
|
pm->test_lbg_gamma_threshold, pm->test_tRNS))
|
||||||
|
if (palette_number < 2)
|
||||||
{
|
{
|
||||||
double test_gamma = 1.0;
|
double test_gamma = 1.0;
|
||||||
while (test_gamma >= .4)
|
while (test_gamma >= .4)
|
||||||
@ -9746,7 +9936,8 @@ static void perform_gamma_transform_tests(png_modifier *pm)
|
|||||||
png_byte bit_depth = 0;
|
png_byte bit_depth = 0;
|
||||||
unsigned int palette_number = 0;
|
unsigned int palette_number = 0;
|
||||||
|
|
||||||
while (next_format(&colour_type, &bit_depth, &palette_number, 1/*gamma*/))
|
while (next_format(&colour_type, &bit_depth, &palette_number,
|
||||||
|
pm->test_lbg_gamma_transform, pm->test_tRNS))
|
||||||
{
|
{
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
|
|
||||||
@ -9776,7 +9967,8 @@ static void perform_gamma_sbit_tests(png_modifier *pm)
|
|||||||
png_byte colour_type = 0, bit_depth = 0;
|
png_byte colour_type = 0, bit_depth = 0;
|
||||||
unsigned int npalette = 0;
|
unsigned int npalette = 0;
|
||||||
|
|
||||||
while (next_format(&colour_type, &bit_depth, &npalette, 1/*gamma*/))
|
while (next_format(&colour_type, &bit_depth, &npalette,
|
||||||
|
pm->test_lbg_gamma_sbit, pm->test_tRNS))
|
||||||
if ((colour_type & PNG_COLOR_MASK_ALPHA) == 0 &&
|
if ((colour_type & PNG_COLOR_MASK_ALPHA) == 0 &&
|
||||||
((colour_type == 3 && sbit < 8) ||
|
((colour_type == 3 && sbit < 8) ||
|
||||||
(colour_type != 3 && sbit < bit_depth)))
|
(colour_type != 3 && sbit < bit_depth)))
|
||||||
@ -9967,8 +10159,17 @@ static void gamma_composition_test(png_modifier *pm,
|
|||||||
}
|
}
|
||||||
|
|
||||||
background.index = 193; /* rgb(193,193,193) to detect errors */
|
background.index = 193; /* rgb(193,193,193) to detect errors */
|
||||||
|
|
||||||
if (!(colour_type & PNG_COLOR_MASK_COLOR))
|
if (!(colour_type & PNG_COLOR_MASK_COLOR))
|
||||||
{
|
{
|
||||||
|
/* Because, currently, png_set_background is always called with
|
||||||
|
* 'need_expand' false in this case and because the gamma test itself
|
||||||
|
* doesn't cause an expand to 8-bit for lower bit depths the colour must
|
||||||
|
* be reduced to the correct range.
|
||||||
|
*/
|
||||||
|
if (bit_depth < 8)
|
||||||
|
background.gray &= (png_uint_16)((1U << bit_depth)-1);
|
||||||
|
|
||||||
/* Grayscale input, we do not convert to RGB (TBD), so we must set the
|
/* Grayscale input, we do not convert to RGB (TBD), so we must set the
|
||||||
* background to gray - else libpng seems to fail.
|
* background to gray - else libpng seems to fail.
|
||||||
*/
|
*/
|
||||||
@ -10017,9 +10218,18 @@ perform_gamma_composition_tests(png_modifier *pm, int do_background,
|
|||||||
|
|
||||||
/* Skip the non-alpha cases - there is no setting of a transparency colour at
|
/* Skip the non-alpha cases - there is no setting of a transparency colour at
|
||||||
* present.
|
* present.
|
||||||
|
*
|
||||||
|
* TODO: incorrect; the palette case sets tRNS and, now RGB and gray do,
|
||||||
|
* however the palette case fails miserably so is commented out below.
|
||||||
*/
|
*/
|
||||||
while (next_format(&colour_type, &bit_depth, &palette_number, 1/*gamma*/))
|
while (next_format(&colour_type, &bit_depth, &palette_number,
|
||||||
if ((colour_type & PNG_COLOR_MASK_ALPHA) != 0)
|
pm->test_lbg_gamma_composition, pm->test_tRNS))
|
||||||
|
if ((colour_type & PNG_COLOR_MASK_ALPHA) != 0
|
||||||
|
#if 0 /* TODO: FIXME */
|
||||||
|
/*TODO: FIXME: this should work */
|
||||||
|
|| colour_type == 3
|
||||||
|
#endif
|
||||||
|
|| (colour_type != 3 && palette_number != 0))
|
||||||
{
|
{
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
|
|
||||||
@ -10751,6 +10961,18 @@ int main(int argc, char **argv)
|
|||||||
pm.ngammas = ARRAY_SIZE(gammas);
|
pm.ngammas = ARRAY_SIZE(gammas);
|
||||||
pm.ngamma_tests = 0; /* default to off */
|
pm.ngamma_tests = 0; /* default to off */
|
||||||
|
|
||||||
|
/* Low bit depth gray images don't do well in the gamma tests, until
|
||||||
|
* this is fixed turn them off for some gamma cases:
|
||||||
|
*/
|
||||||
|
# ifdef PNG_WRITE_tRNS_SUPPORTED
|
||||||
|
pm.test_tRNS = 1;
|
||||||
|
# endif
|
||||||
|
pm.test_lbg = 0;
|
||||||
|
pm.test_lbg_gamma_threshold = 1;
|
||||||
|
pm.test_lbg_gamma_transform = 0/*PNG_LIBPNG_VER >= 10700*/;
|
||||||
|
pm.test_lbg_gamma_sbit = 1;
|
||||||
|
pm.test_lbg_gamma_composition = 0;
|
||||||
|
|
||||||
/* And the test encodings */
|
/* And the test encodings */
|
||||||
pm.encodings = test_encodings;
|
pm.encodings = test_encodings;
|
||||||
pm.nencodings = ARRAY_SIZE(test_encodings);
|
pm.nencodings = ARRAY_SIZE(test_encodings);
|
||||||
@ -10863,7 +11085,7 @@ int main(int argc, char **argv)
|
|||||||
pm.test_gamma_transform = 1;
|
pm.test_gamma_transform = 1;
|
||||||
pm.test_gamma_sbit = 1;
|
pm.test_gamma_sbit = 1;
|
||||||
pm.test_gamma_scale16 = 1;
|
pm.test_gamma_scale16 = 1;
|
||||||
pm.test_gamma_background = 1;
|
pm.test_gamma_background = 1; /* composition */
|
||||||
pm.test_gamma_alpha_mode = 1;
|
pm.test_gamma_alpha_mode = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -10912,6 +11134,24 @@ int main(int argc, char **argv)
|
|||||||
else if (strcmp(*argv, "--noexpand16") == 0)
|
else if (strcmp(*argv, "--noexpand16") == 0)
|
||||||
pm.test_gamma_expand16 = 0;
|
pm.test_gamma_expand16 = 0;
|
||||||
|
|
||||||
|
else if (strcmp(*argv, "--low-depth-gray") == 0)
|
||||||
|
pm.test_lbg = pm.test_lbg_gamma_threshold =
|
||||||
|
pm.test_lbg_gamma_transform = pm.test_lbg_gamma_sbit =
|
||||||
|
pm.test_lbg_gamma_composition = 1;
|
||||||
|
|
||||||
|
else if (strcmp(*argv, "--nolow-depth-gray") == 0)
|
||||||
|
pm.test_lbg = pm.test_lbg_gamma_threshold =
|
||||||
|
pm.test_lbg_gamma_transform = pm.test_lbg_gamma_sbit =
|
||||||
|
pm.test_lbg_gamma_composition = 0;
|
||||||
|
|
||||||
|
# ifdef PNG_WRITE_tRNS_SUPPORTED
|
||||||
|
else if (strcmp(*argv, "--tRNS") == 0)
|
||||||
|
pm.test_tRNS = 1;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
else if (strcmp(*argv, "--notRNS") == 0)
|
||||||
|
pm.test_tRNS = 0;
|
||||||
|
|
||||||
else if (strcmp(*argv, "--more-gammas") == 0)
|
else if (strcmp(*argv, "--more-gammas") == 0)
|
||||||
pm.ngamma_tests = 3U;
|
pm.ngamma_tests = 3U;
|
||||||
|
|
||||||
@ -11102,7 +11342,7 @@ int main(int argc, char **argv)
|
|||||||
Try
|
Try
|
||||||
{
|
{
|
||||||
/* Make useful base images */
|
/* Make useful base images */
|
||||||
make_transform_images(&pm.this);
|
make_transform_images(&pm);
|
||||||
|
|
||||||
/* Perform the standard and gamma tests. */
|
/* Perform the standard and gamma tests. */
|
||||||
if (pm.test_standard)
|
if (pm.test_standard)
|
||||||
|
|||||||
867
contrib/tools/genpng.c
Normal file
867
contrib/tools/genpng.c
Normal file
@ -0,0 +1,867 @@
|
|||||||
|
/*- genpng
|
||||||
|
*
|
||||||
|
* COPYRIGHT: Written by John Cunningham Bowler, 2015.
|
||||||
|
* To the extent possible under law, the author has waived all copyright and
|
||||||
|
* related or neighboring rights to this work. This work is published from:
|
||||||
|
* United States.
|
||||||
|
*
|
||||||
|
* Generate a PNG with an alpha channel, correctly.
|
||||||
|
*
|
||||||
|
* This is a test case generator; the resultant PNG files are only of interest
|
||||||
|
* to those of us who care about whether the edges of circles are green, red,
|
||||||
|
* or yellow.
|
||||||
|
*
|
||||||
|
* The program generates an RGB+Alpha PNG of a given size containing the given
|
||||||
|
* shapes on a transparent background:
|
||||||
|
*
|
||||||
|
* genpng width height { shape }
|
||||||
|
* shape ::= color width shape x1 y1 x2 y2
|
||||||
|
*
|
||||||
|
* 'color' is:
|
||||||
|
*
|
||||||
|
* black white red green yellow blue brown purple pink orange gray cyan
|
||||||
|
*
|
||||||
|
* The point is to have colors that are linguistically meaningful plus that old
|
||||||
|
* bugbear of the department store dress murders, Cyan, the only color we argue
|
||||||
|
* about.
|
||||||
|
*
|
||||||
|
* 'shape' is:
|
||||||
|
*
|
||||||
|
* circle: an ellipse
|
||||||
|
* square: a rectangle
|
||||||
|
* line: a straight line
|
||||||
|
*
|
||||||
|
* Each shape is followed by four numbers, these are two points in the output
|
||||||
|
* coordinate space (as real numbers) which describe the circle, square, or
|
||||||
|
* line. The shape is filled if it is preceded by 'filled' (not valid for
|
||||||
|
* 'line') or is drawn with a line, in which case the width of the line must
|
||||||
|
* precede the shape.
|
||||||
|
*
|
||||||
|
* The whole set of information can be repeated as many times as desired:
|
||||||
|
*
|
||||||
|
* shape ::= color width shape x1 y1 x2 y2
|
||||||
|
*
|
||||||
|
* color ::= black|white|red|green|yellow|blue
|
||||||
|
* color ::= brown|purple|pink|orange|gray|cyan
|
||||||
|
* width ::= filled
|
||||||
|
* width ::= <number>
|
||||||
|
* shape ::= circle|square|line
|
||||||
|
* x1 ::= <number>
|
||||||
|
* x2 ::= <number>
|
||||||
|
* y1 ::= <number>
|
||||||
|
* y2 ::= <number>
|
||||||
|
*
|
||||||
|
* The output PNG is generated by down-sampling a 4x supersampled image using
|
||||||
|
* a bi-cubic filter. The bi-cubic has a 2 (output) pixel width, so an 8x8
|
||||||
|
* array of super-sampled points contribute to each output pixel. The value of
|
||||||
|
* a super-sampled point is found using an unfiltered, aliased, infinite
|
||||||
|
* precision image: Each shape from the last to the first is checked to see if
|
||||||
|
* the point is in the drawn area and, if it is, the color of the point is the
|
||||||
|
* color of the shape and the alpha is 1, if not the previous shape is checked.
|
||||||
|
*
|
||||||
|
* This is an aliased algorithm because no filtering is done; a point is either
|
||||||
|
* inside or outside each shape and 'close' points do not contribute to the
|
||||||
|
* sample. The down-sampling is relied on to correct the error of not using
|
||||||
|
* a filter.
|
||||||
|
*
|
||||||
|
* The line end-caps are 'flat'; they go through the points. The square line
|
||||||
|
* joins are mitres; the outside of the lines are continued to the point of
|
||||||
|
* intersection.
|
||||||
|
*/
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
/* Normally use <png.h> here to get the installed libpng, but this is done to
|
||||||
|
* ensure the code picks up the local libpng implementation:
|
||||||
|
*/
|
||||||
|
#include "../../png.h"
|
||||||
|
|
||||||
|
#if defined(PNG_SIMPLIFIED_WRITE_SUPPORTED) && defined(PNG_STDIO_SUPPORTED)
|
||||||
|
|
||||||
|
static const struct color
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
double red;
|
||||||
|
double green;
|
||||||
|
double blue;
|
||||||
|
} colors[] =
|
||||||
|
/* color ::= black|white|red|green|yellow|blue
|
||||||
|
* color ::= brown|purple|pink|orange|gray|cyan
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
{ "black", 0, 0, 0 },
|
||||||
|
{ "white", 1, 1, 1 },
|
||||||
|
{ "red", 1, 0, 0 },
|
||||||
|
{ "green", 0, 1, 0 },
|
||||||
|
{ "yellow", 1, 1, 0 },
|
||||||
|
{ "blue", 0, 0, 1 },
|
||||||
|
{ "brown", .5, .125, 0 },
|
||||||
|
{ "purple", 1, 0, 1 },
|
||||||
|
{ "pink", 1, .5, .5 },
|
||||||
|
{ "orange", 1, .5, 0 },
|
||||||
|
{ "gray", 0, .5, .5 },
|
||||||
|
{ "cyan", 0, 1, 1 }
|
||||||
|
};
|
||||||
|
#define color_count ((sizeof colors)/(sizeof colors[0]))
|
||||||
|
|
||||||
|
static const struct color *
|
||||||
|
color_of(const char *arg)
|
||||||
|
{
|
||||||
|
int icolor = color_count;
|
||||||
|
|
||||||
|
while (--icolor >= 0)
|
||||||
|
{
|
||||||
|
if (strcmp(colors[icolor].name, arg) == 0)
|
||||||
|
return colors+icolor;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "genpng: invalid color %s\n", arg);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static double
|
||||||
|
width_of(const char *arg)
|
||||||
|
{
|
||||||
|
if (strcmp(arg, "filled") == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char *ep = NULL;
|
||||||
|
double w = strtod(arg, &ep);
|
||||||
|
|
||||||
|
if (ep != NULL && *ep == 0 && w > 0)
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "genpng: invalid line width %s\n", arg);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static double
|
||||||
|
coordinate_of(const char *arg)
|
||||||
|
{
|
||||||
|
char *ep = NULL;
|
||||||
|
double w = strtod(arg, &ep);
|
||||||
|
|
||||||
|
if (ep != NULL && *ep == 0)
|
||||||
|
return w;
|
||||||
|
|
||||||
|
fprintf(stderr, "genpng: invalid coordinate value %s\n", arg);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct arg; /* forward declaration */
|
||||||
|
|
||||||
|
typedef int (*shape_fn_ptr)(const struct arg *arg, double x, double y);
|
||||||
|
/* A function to determine if (x,y) is inside the shape.
|
||||||
|
*
|
||||||
|
* There are two implementations:
|
||||||
|
*
|
||||||
|
* inside_fn: returns true if the point is inside
|
||||||
|
* check_fn: returns;
|
||||||
|
* -1: the point is outside the shape by more than the filter width (2)
|
||||||
|
* 0: the point may be inside the shape
|
||||||
|
* +1: the point is inside the shape by more than the filter width
|
||||||
|
*/
|
||||||
|
#define OUTSIDE (-1)
|
||||||
|
#define INSIDE (1)
|
||||||
|
|
||||||
|
struct arg
|
||||||
|
{
|
||||||
|
const struct color *color;
|
||||||
|
shape_fn_ptr inside_fn;
|
||||||
|
shape_fn_ptr check_fn;
|
||||||
|
double width; /* line width, 0 for 'filled' */
|
||||||
|
double x1, y1, x2, y2;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* IMPLEMENTATION NOTE:
|
||||||
|
*
|
||||||
|
* We want the contribution of each shape to the sample corresponding to each
|
||||||
|
* pixel. This could be obtained by super sampling the image to infinite
|
||||||
|
* dimensions, finding each point within the shape and assigning that a value
|
||||||
|
* '1' while leaving every point outside the shape with value '0' then
|
||||||
|
* downsampling to the image size with sinc; computationally very expensive.
|
||||||
|
*
|
||||||
|
* Approximations are as follows:
|
||||||
|
*
|
||||||
|
* 1) If the pixel coordinate is within the shape assume the sample has the
|
||||||
|
* shape color and is opaque, else assume there is no contribution from
|
||||||
|
* the shape.
|
||||||
|
*
|
||||||
|
* This is the equivalent of aliased rendering or resampling an image with
|
||||||
|
* a block filter. The maximum error in the calculated alpha (which will
|
||||||
|
* always be 0 or 1) is 0.5.
|
||||||
|
*
|
||||||
|
* 2) If the shape is within a square of size 1x1 centered on the pixel assume
|
||||||
|
* that the shape obscures an amount of the pixel equal to its area within
|
||||||
|
* that square.
|
||||||
|
*
|
||||||
|
* This is the equivalent of 'pixel coverage' alpha calculation or resampling
|
||||||
|
* an image with a bi-linear filter. The maximum error is over 0.2, but the
|
||||||
|
* results are often acceptable.
|
||||||
|
*
|
||||||
|
* This can be approximated by applying (1) to a super-sampled image then
|
||||||
|
* downsampling with a bi-linear filter. The error in the super-sampled
|
||||||
|
* image is 0.5 per sample, but the resampling reduces this.
|
||||||
|
*
|
||||||
|
* 3) Use a better filter with a super-sampled image; in the limit this is the
|
||||||
|
* sinc() approach.
|
||||||
|
*
|
||||||
|
* 4) Do the geometric calculation; a bivariate definite integral across the
|
||||||
|
* shape, unfortunately this means evaluating Si(x), the integral of sinc(x),
|
||||||
|
* which is still a lot of math.
|
||||||
|
*
|
||||||
|
* This code uses approach (3) with a bi-cubic filter and 8x super-sampling
|
||||||
|
* and method (1) for the super-samples. This means that the sample is either
|
||||||
|
* 0 or 1, depending on whether the sub-pixel is within or outside the shape.
|
||||||
|
* The bi-cubic weights are also fixed and the 16 required weights are
|
||||||
|
* pre-computed here (note that the 'scale' setting will need to be changed if
|
||||||
|
* 'super' is increased).
|
||||||
|
*
|
||||||
|
* The code also calculates a sum to the edge of the filter. This is not
|
||||||
|
* currently used by could be used to optimize the calculation.
|
||||||
|
*/
|
||||||
|
#if 0 /* bc code */
|
||||||
|
scale=10
|
||||||
|
super=8
|
||||||
|
define bicubic(x) {
|
||||||
|
if (x <= 1) return (1.5*x - 2.5)*x*x + 1;
|
||||||
|
if (x < 2) return (((2.5 - 0.5*x)*x - 4)*x + 2);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
define sum(x) {
|
||||||
|
auto s;
|
||||||
|
s = 0;
|
||||||
|
while (x < 2*super) {
|
||||||
|
s = s + bicubic(x/super);
|
||||||
|
x = x + 1;
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
define results(x) {
|
||||||
|
auto b, s;
|
||||||
|
b = bicubic(x/super);
|
||||||
|
s = sum(x);
|
||||||
|
|
||||||
|
print " /*", x, "*/ { ", b, ", ", s, " }";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
x=0
|
||||||
|
while (x<2*super) {
|
||||||
|
x = x + results(x)
|
||||||
|
if (x < 2*super) print ","
|
||||||
|
print "\n"
|
||||||
|
}
|
||||||
|
quit
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define BICUBIC1(x) /* |x| <= 1 */ ((1.5*(x)* - 2.5)*(x)*(x) + 1)
|
||||||
|
#define BICUBIC2(x) /* 1 < |x| < 2 */ (((2.5 - 0.5*(x))*(x) - 4)*(x) + 2)
|
||||||
|
#define FILTER_WEIGHT 9 /* Twice the first sum below */
|
||||||
|
#define FILTER_WIDTH 2 /* Actually half the width; -2..+2 */
|
||||||
|
#define FILTER_STEPS 8 /* steps per filter unit */
|
||||||
|
static const double
|
||||||
|
bicubic[16][2] =
|
||||||
|
{
|
||||||
|
/* These numbers are exact; the weight for the filter is 1/9, but this
|
||||||
|
* would make the numbers inexact, so it is not included here.
|
||||||
|
*/
|
||||||
|
/* bicubic sum */
|
||||||
|
/* 0*/ { 1.0000000000, 4.5000000000 },
|
||||||
|
/* 1*/ { .9638671875, 3.5000000000 },
|
||||||
|
/* 2*/ { .8671875000, 2.5361328125 },
|
||||||
|
/* 3*/ { .7275390625, 1.6689453125 },
|
||||||
|
/* 4*/ { .5625000000, .9414062500 },
|
||||||
|
/* 5*/ { .3896484375, .3789062500 },
|
||||||
|
/* 6*/ { .2265625000, -.0107421875 },
|
||||||
|
/* 7*/ { .0908203125, -.2373046875 },
|
||||||
|
/* 8*/ { 0, -.3281250000 },
|
||||||
|
/* 9*/ { -.0478515625, -.3281250000 },
|
||||||
|
/*10*/ { -.0703125000, -.2802734375 },
|
||||||
|
/*11*/ { -.0732421875, -.2099609375 },
|
||||||
|
/*12*/ { -.0625000000, -.1367187500 },
|
||||||
|
/*13*/ { -.0439453125, -.0742187500 },
|
||||||
|
/*14*/ { -.0234375000, -.0302734375 },
|
||||||
|
/*15*/ { -.0068359375, -.0068359375 }
|
||||||
|
};
|
||||||
|
|
||||||
|
static double
|
||||||
|
alpha_calc(const struct arg *arg, double x, double y)
|
||||||
|
{
|
||||||
|
/* For [x-2..x+2],[y-2,y+2] calculate the weighted bicubic given a function
|
||||||
|
* which tells us whether a point is inside or outside the shape. First
|
||||||
|
* check if we need to do this at all:
|
||||||
|
*/
|
||||||
|
switch (arg->check_fn(arg, x, y))
|
||||||
|
{
|
||||||
|
case OUTSIDE:
|
||||||
|
return 0; /* all samples outside the shape */
|
||||||
|
|
||||||
|
case INSIDE:
|
||||||
|
return 1; /* all samples inside the shape */
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
int dy;
|
||||||
|
double alpha = 0;
|
||||||
|
|
||||||
|
# define FILTER_D (FILTER_WIDTH*FILTER_STEPS-1)
|
||||||
|
for (dy=-FILTER_D; dy<=FILTER_D; ++dy)
|
||||||
|
{
|
||||||
|
double wy = bicubic[abs(dy)][0];
|
||||||
|
|
||||||
|
if (wy != 0)
|
||||||
|
{
|
||||||
|
double alphay = 0;
|
||||||
|
int dx;
|
||||||
|
|
||||||
|
for (dx=-FILTER_D; dx<=FILTER_D; ++dx)
|
||||||
|
{
|
||||||
|
double wx = bicubic[abs(dx)][0];
|
||||||
|
|
||||||
|
if (wx != 0 && arg->inside_fn(arg, x+dx/16, y+dy/16))
|
||||||
|
alphay += wx;
|
||||||
|
}
|
||||||
|
|
||||||
|
alpha += wy * alphay;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This needs to be weighted for each dimension: */
|
||||||
|
return alpha / (FILTER_WEIGHT*FILTER_WEIGHT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* These are the shape functions. */
|
||||||
|
/* "square",
|
||||||
|
* { inside_square_filled, check_square_filled },
|
||||||
|
* { inside_square, check_square }
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
square_check(double x, double y, double x1, double y1, double x2, double y2)
|
||||||
|
/* Is x,y inside the square (x1,y1)..(x2,y2)? */
|
||||||
|
{
|
||||||
|
/* Do a modified Cohen-Sutherland on one point, bit patterns that indicate
|
||||||
|
* 'outside' are:
|
||||||
|
*
|
||||||
|
* x<x1 | x<y1 | x<x2 | x<y2
|
||||||
|
* 0 x 0 x To the right
|
||||||
|
* 1 x 1 x To the left
|
||||||
|
* x 0 x 0 Below
|
||||||
|
* x 1 x 1 Above
|
||||||
|
*
|
||||||
|
* So 'inside' is (x<x1) != (x<x2) && (y<y1) != (y<y2);
|
||||||
|
*/
|
||||||
|
return ((x<x1) ^ (x<x2)) & ((y<y1) ^ (y<y2));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
inside_square_filled(const struct arg *arg, double x, double y)
|
||||||
|
{
|
||||||
|
return square_check(x, y, arg->x1, arg->y1, arg->x2, arg->y2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
square_check_line(const struct arg *arg, double x, double y, double w)
|
||||||
|
/* Check for a point being inside the boundaries implied by the given arg
|
||||||
|
* and assuming a width 2*w each side of the boundaries. This returns the
|
||||||
|
* 'check' INSIDE/OUTSIDE/0 result but note the semantics:
|
||||||
|
*
|
||||||
|
* +--------------+
|
||||||
|
* | | OUTSIDE
|
||||||
|
* | INSIDE |
|
||||||
|
* | |
|
||||||
|
* +--------------+
|
||||||
|
*
|
||||||
|
* And '0' means within the line boundaries.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
double cx = (arg->x1+arg->x2)/2;
|
||||||
|
double wx = fabs(arg->x1-arg->x2)/2;
|
||||||
|
double cy = (arg->y1+arg->y2)/2;
|
||||||
|
double wy = fabs(arg->y1-arg->y2)/2;
|
||||||
|
|
||||||
|
if (square_check(x, y, cx-wx-w, cy-wy-w, cx+wx+w, cy+wy+w))
|
||||||
|
{
|
||||||
|
/* Inside, but maybe too far; check for the redundant case where
|
||||||
|
* the lines overlap:
|
||||||
|
*/
|
||||||
|
wx -= w;
|
||||||
|
wy -= w;
|
||||||
|
if (wx > 0 && wy > 0 && square_check(x, y, cx-wx, cy-wy, cx+wx, cy+wy))
|
||||||
|
return INSIDE; /* between (inside) the boundary lines. */
|
||||||
|
|
||||||
|
return 0; /* inside the lines themselves. */
|
||||||
|
}
|
||||||
|
|
||||||
|
return OUTSIDE; /* outside the boundary lines. */
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
check_square_filled(const struct arg *arg, double x, double y)
|
||||||
|
{
|
||||||
|
/* The filter extends +/-FILTER_WIDTH each side of each output point, so
|
||||||
|
* the check has to expand and contract the square by that amount; '0'
|
||||||
|
* means close enough to the edge of the square that the bicubic filter has
|
||||||
|
* to be run, OUTSIDE means alpha==0, INSIDE means alpha==1.
|
||||||
|
*/
|
||||||
|
return square_check_line(arg, x, y, FILTER_WIDTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
inside_square(const struct arg *arg, double x, double y)
|
||||||
|
{
|
||||||
|
/* Return true if within the drawn lines, else false, no need to distinguish
|
||||||
|
* INSIDE vs OUTSIDE here:
|
||||||
|
*/
|
||||||
|
return square_check_line(arg, x, y, arg->width/2) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
check_square(const struct arg *arg, double x, double y)
|
||||||
|
{
|
||||||
|
/* So for this function a result of 'INSIDE' means inside the actual lines.
|
||||||
|
*/
|
||||||
|
double w = arg->width/2;
|
||||||
|
|
||||||
|
if (square_check_line(arg, x, y, w+FILTER_WIDTH) == 0)
|
||||||
|
{
|
||||||
|
/* Somewhere close to the boundary lines. If far enough inside one of
|
||||||
|
* them then we can return INSIDE:
|
||||||
|
*/
|
||||||
|
w -= FILTER_WIDTH;
|
||||||
|
|
||||||
|
if (w > 0 && square_check_line(arg, x, y, w) == 0)
|
||||||
|
return INSIDE;
|
||||||
|
|
||||||
|
/* Point is somewhere in the filter region: */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
else /* Inside or outside the square by more than w+FILTER_WIDTH. */
|
||||||
|
return OUTSIDE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* "circle",
|
||||||
|
* { inside_circle_filled, check_circle_filled },
|
||||||
|
* { inside_circle, check_circle }
|
||||||
|
*
|
||||||
|
* The functions here are analoguous to the square ones; however, they check
|
||||||
|
* the corresponding ellipse as opposed to the rectangle.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
circle_check(double x, double y, double x1, double y1, double x2, double y2)
|
||||||
|
{
|
||||||
|
if (square_check(x, y, x1, y1, x2, y2))
|
||||||
|
{
|
||||||
|
/* Inside the square, so maybe inside the circle too: */
|
||||||
|
const double cx = (x1 + x2)/2;
|
||||||
|
const double cy = (y1 + y2)/2;
|
||||||
|
const double dx = x1 - x2;
|
||||||
|
const double dy = y1 - y2;
|
||||||
|
|
||||||
|
x = (x - cx)/dx;
|
||||||
|
y = (y - cy)/dy;
|
||||||
|
|
||||||
|
/* It is outside if the distance from the center is more than half the
|
||||||
|
* diameter:
|
||||||
|
*/
|
||||||
|
return x*x+y*y < .25;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0; /* outside */
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
inside_circle_filled(const struct arg *arg, double x, double y)
|
||||||
|
{
|
||||||
|
return circle_check(x, y, arg->x1, arg->y1, arg->x2, arg->y2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
circle_check_line(const struct arg *arg, double x, double y, double w)
|
||||||
|
/* Check for a point being inside the boundaries implied by the given arg
|
||||||
|
* and assuming a width 2*w each side of the boundaries. This function has
|
||||||
|
* the same semantic as square_check_line but tests the circle.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
double cx = (arg->x1+arg->x2)/2;
|
||||||
|
double wx = fabs(arg->x1-arg->x2)/2;
|
||||||
|
double cy = (arg->y1+arg->y2)/2;
|
||||||
|
double wy = fabs(arg->y1-arg->y2)/2;
|
||||||
|
|
||||||
|
if (circle_check(x, y, cx-wx-w, cy-wy-w, cx+wx+w, cy+wy+w))
|
||||||
|
{
|
||||||
|
/* Inside, but maybe too far; check for the redundant case where
|
||||||
|
* the lines overlap:
|
||||||
|
*/
|
||||||
|
wx -= w;
|
||||||
|
wy -= w;
|
||||||
|
if (wx > 0 && wy > 0 && circle_check(x, y, cx-wx, cy-wy, cx+wx, cy+wy))
|
||||||
|
return INSIDE; /* between (inside) the boundary lines. */
|
||||||
|
|
||||||
|
return 0; /* inside the lines themselves. */
|
||||||
|
}
|
||||||
|
|
||||||
|
return OUTSIDE; /* outside the boundary lines. */
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
check_circle_filled(const struct arg *arg, double x, double y)
|
||||||
|
{
|
||||||
|
return circle_check_line(arg, x, y, FILTER_WIDTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
inside_circle(const struct arg *arg, double x, double y)
|
||||||
|
{
|
||||||
|
return circle_check_line(arg, x, y, arg->width/2) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
check_circle(const struct arg *arg, double x, double y)
|
||||||
|
{
|
||||||
|
/* Exactly as the 'square' code. */
|
||||||
|
double w = arg->width/2;
|
||||||
|
|
||||||
|
if (circle_check_line(arg, x, y, w+FILTER_WIDTH) == 0)
|
||||||
|
{
|
||||||
|
w -= FILTER_WIDTH;
|
||||||
|
|
||||||
|
if (w > 0 && circle_check_line(arg, x, y, w) == 0)
|
||||||
|
return INSIDE;
|
||||||
|
|
||||||
|
/* Point is somewhere in the filter region: */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
else /* Inside or outside the square by more than w+FILTER_WIDTH. */
|
||||||
|
return OUTSIDE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* "line",
|
||||||
|
* { NULL, NULL }, There is no 'filled' line.
|
||||||
|
* { inside_line, check_line }
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
line_check(double x, double y, double x1, double y1, double x2, double y2,
|
||||||
|
double w, double expand)
|
||||||
|
{
|
||||||
|
/* Shift all the points to (arg->x1, arg->y1) */
|
||||||
|
double lx = x2 - x1;
|
||||||
|
double ly = y2 - y1;
|
||||||
|
double len2 = lx*lx + ly*ly;
|
||||||
|
double cross, dot;
|
||||||
|
|
||||||
|
x -= x1;
|
||||||
|
y -= y1;
|
||||||
|
|
||||||
|
/* The dot product is the distance down the line, the cross product is
|
||||||
|
* the distance away from the line:
|
||||||
|
*
|
||||||
|
* distance = |cross| / sqrt(len2)
|
||||||
|
*/
|
||||||
|
cross = x * ly - y * lx;
|
||||||
|
|
||||||
|
/* If 'distance' is more than w the point is definitely outside the line:
|
||||||
|
*
|
||||||
|
* distance >= w
|
||||||
|
* |cross| >= w * sqrt(len2)
|
||||||
|
* cross^2 >= w^2 * len2:
|
||||||
|
*/
|
||||||
|
if (cross*cross >= (w+expand)*(w+expand)*len2)
|
||||||
|
return 0; /* outside */
|
||||||
|
|
||||||
|
/* Now find the distance *along* the line; this comes from the dot product
|
||||||
|
* lx.x+ly.y. The actual distance (in pixels) is:
|
||||||
|
*
|
||||||
|
* distance = dot / sqrt(len2)
|
||||||
|
*/
|
||||||
|
dot = lx * x + ly * y;
|
||||||
|
|
||||||
|
/* The test for 'outside' is:
|
||||||
|
*
|
||||||
|
* distance < 0 || distance > sqrt(len2)
|
||||||
|
* -> dot / sqrt(len2) > sqrt(len2)
|
||||||
|
* -> dot > len2
|
||||||
|
*
|
||||||
|
* But 'expand' is used for the filter width and needs to be handled too:
|
||||||
|
*/
|
||||||
|
return dot > -expand && dot < len2+expand;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
inside_line(const struct arg *arg, double x, double y)
|
||||||
|
{
|
||||||
|
return line_check(x, y, arg->x1, arg->y1, arg->x2, arg->y2, arg->width/2, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
check_line(const struct arg *arg, double x, double y)
|
||||||
|
{
|
||||||
|
/* The end caps of the line must be checked too; it's not enough just to
|
||||||
|
* widen the line by FILTER_WIDTH; 'expand' exists for this purpose:
|
||||||
|
*/
|
||||||
|
if (line_check(x, y, arg->x1, arg->y1, arg->x2, arg->y2, arg->width/2,
|
||||||
|
FILTER_WIDTH))
|
||||||
|
{
|
||||||
|
/* Inside the line+filter; far enough inside that the filter isn't
|
||||||
|
* required?
|
||||||
|
*/
|
||||||
|
if (arg->width > 2*FILTER_WIDTH &&
|
||||||
|
line_check(x, y, arg->x1, arg->y1, arg->x2, arg->y2, arg->width/2,
|
||||||
|
-FILTER_WIDTH))
|
||||||
|
return INSIDE;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return OUTSIDE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
shape_fn_ptr function[2/*fill,line*/][2];
|
||||||
|
# define FN_INSIDE 0
|
||||||
|
# define FN_CHECK 1
|
||||||
|
} shape_defs[] =
|
||||||
|
{
|
||||||
|
{ "square",
|
||||||
|
{ { inside_square_filled, check_square_filled },
|
||||||
|
{ inside_square, check_square } }
|
||||||
|
},
|
||||||
|
{ "circle",
|
||||||
|
{ { inside_circle_filled, check_circle_filled },
|
||||||
|
{ inside_circle, check_circle } }
|
||||||
|
},
|
||||||
|
{ "line",
|
||||||
|
{ { NULL, NULL },
|
||||||
|
{ inside_line, check_line } }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#define shape_count ((sizeof shape_defs)/(sizeof shape_defs[0]))
|
||||||
|
|
||||||
|
static shape_fn_ptr
|
||||||
|
shape_of(const char *arg, double width, int f)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for (i=0; i<shape_count; ++i) if (strcmp(shape_defs[i].name, arg) == 0)
|
||||||
|
{
|
||||||
|
shape_fn_ptr fn = shape_defs[i].function[width != 0][f];
|
||||||
|
|
||||||
|
if (fn != NULL)
|
||||||
|
return fn;
|
||||||
|
|
||||||
|
fprintf(stderr, "genpng: %s %s not supported\n",
|
||||||
|
width == 0 ? "filled" : "unfilled", arg);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "genpng: %s: not a valid shape name\n", arg);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
parse_arg(struct arg *arg, const char **argv/*7 arguments*/)
|
||||||
|
{
|
||||||
|
/* shape ::= color width shape x1 y1 x2 y2 */
|
||||||
|
arg->color = color_of(argv[0]);
|
||||||
|
arg->width = width_of(argv[1]);
|
||||||
|
arg->inside_fn = shape_of(argv[2], arg->width, FN_INSIDE);
|
||||||
|
arg->check_fn = shape_of(argv[2], arg->width, FN_CHECK);
|
||||||
|
arg->x1 = coordinate_of(argv[3]);
|
||||||
|
arg->y1 = coordinate_of(argv[4]);
|
||||||
|
arg->x2 = coordinate_of(argv[5]);
|
||||||
|
arg->y2 = coordinate_of(argv[6]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static png_uint_32
|
||||||
|
read_wh(const char *name, const char *str)
|
||||||
|
/* read a PNG width or height */
|
||||||
|
{
|
||||||
|
char *ep = NULL;
|
||||||
|
unsigned long ul = strtoul(str, &ep, 10);
|
||||||
|
|
||||||
|
if (ep != NULL && *ep == 0 && ul > 0 && ul <= 0x7fffffff)
|
||||||
|
return (png_uint_32)/*SAFE*/ul;
|
||||||
|
|
||||||
|
fprintf(stderr, "genpng: %s: invalid number %s\n", name, str);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
pixel(png_uint_16p p, struct arg *args, int nargs, double x, double y)
|
||||||
|
{
|
||||||
|
/* Fill in the pixel by checking each shape (args[nargs]) for effects on
|
||||||
|
* the corresponding sample:
|
||||||
|
*/
|
||||||
|
double r=0, g=0, b=0, a=0;
|
||||||
|
|
||||||
|
while (--nargs >= 0 && a != 1)
|
||||||
|
{
|
||||||
|
/* NOTE: alpha_calc can return a value outside the range 0..1 with the
|
||||||
|
* bicubic filter.
|
||||||
|
*/
|
||||||
|
const double alpha = alpha_calc(args+nargs, x, y) * (1-a);
|
||||||
|
|
||||||
|
r += alpha * args[nargs].color->red;
|
||||||
|
g += alpha * args[nargs].color->green;
|
||||||
|
b += alpha * args[nargs].color->blue;
|
||||||
|
a += alpha;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 'a' may be negative or greater than 1; if it is, negative clamp the
|
||||||
|
* pixel to 0 if >1 clamp r/g/b:
|
||||||
|
*/
|
||||||
|
if (a > 0)
|
||||||
|
{
|
||||||
|
if (a > 1)
|
||||||
|
{
|
||||||
|
if (r > 1) r = 1;
|
||||||
|
if (g > 1) g = 1;
|
||||||
|
if (b > 1) b = 1;
|
||||||
|
a = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* And fill in the pixel: */
|
||||||
|
p[0] = (png_uint_16)/*SAFE*/round(r * 65535);
|
||||||
|
p[1] = (png_uint_16)/*SAFE*/round(g * 65535);
|
||||||
|
p[2] = (png_uint_16)/*SAFE*/round(b * 65535);
|
||||||
|
p[3] = (png_uint_16)/*SAFE*/round(a * 65535);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
p[3] = p[2] = p[1] = p[0] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, const char **argv)
|
||||||
|
{
|
||||||
|
int convert_to_8bit = 0;
|
||||||
|
|
||||||
|
/* There is one option: --8bit: */
|
||||||
|
if (argc > 1 && strcmp(argv[1], "--8bit") == 0)
|
||||||
|
--argc, ++argv, convert_to_8bit = 1;
|
||||||
|
|
||||||
|
if (argc >= 3)
|
||||||
|
{
|
||||||
|
png_uint_16p buffer;
|
||||||
|
int nshapes;
|
||||||
|
png_image image;
|
||||||
|
# define max_shapes 256
|
||||||
|
struct arg arg_list[max_shapes];
|
||||||
|
|
||||||
|
/* The libpng Simplified API write code requires a fully initialized
|
||||||
|
* structure.
|
||||||
|
*/
|
||||||
|
memset(&image, 0, sizeof image);
|
||||||
|
image.version = PNG_IMAGE_VERSION;
|
||||||
|
image.opaque = NULL;
|
||||||
|
image.width = read_wh("width", argv[1]);
|
||||||
|
image.height = read_wh("height", argv[2]);
|
||||||
|
image.format = PNG_FORMAT_LINEAR_RGB_ALPHA;
|
||||||
|
image.flags = 0;
|
||||||
|
image.colormap_entries = 0;
|
||||||
|
|
||||||
|
/* Check the remainder of the arguments */
|
||||||
|
for (nshapes=0; 3+7*(nshapes+1) <= argc && nshapes < max_shapes;
|
||||||
|
++nshapes)
|
||||||
|
parse_arg(arg_list+nshapes, argv+3+7*nshapes);
|
||||||
|
|
||||||
|
if (3+7*nshapes != argc)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "genpng: %s: too many arguments\n", argv[3+7*nshapes]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create the buffer: */
|
||||||
|
buffer = malloc(PNG_IMAGE_SIZE(image));
|
||||||
|
|
||||||
|
if (buffer != NULL)
|
||||||
|
{
|
||||||
|
png_uint_32 y;
|
||||||
|
|
||||||
|
/* Write each row... */
|
||||||
|
for (y=0; y<image.height; ++y)
|
||||||
|
{
|
||||||
|
png_uint_32 x;
|
||||||
|
|
||||||
|
/* Each pixel in each row: */
|
||||||
|
for (x=0; x<image.width; ++x)
|
||||||
|
pixel(buffer + 4*(x + y*image.width), arg_list, nshapes, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write the result (to stdout) */
|
||||||
|
if (png_image_write_to_stdio(&image, stdout, convert_to_8bit,
|
||||||
|
buffer, 0/*row_stride*/, NULL/*colormap*/))
|
||||||
|
{
|
||||||
|
free(buffer);
|
||||||
|
return 0; /* success */
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
fprintf(stderr, "genpng: write stdout: %s\n", image.message);
|
||||||
|
|
||||||
|
free(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
fprintf(stderr, "genpng: out of memory: %lu bytes\n",
|
||||||
|
(unsigned long)PNG_IMAGE_SIZE(image));
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Wrong number of arguments */
|
||||||
|
fprintf(stderr, "genpng: usage: genpng [--8bit] width height {shape}\n"
|
||||||
|
" Generate a transparent PNG in RGBA (truecolor+alpha) format\n"
|
||||||
|
" containing the given shape or shapes. Shapes are defined:\n"
|
||||||
|
"\n"
|
||||||
|
" shape ::= color width shape x1 y1 x2 y2\n"
|
||||||
|
" color ::= black|white|red|green|yellow|blue\n"
|
||||||
|
" color ::= brown|purple|pink|orange|gray|cyan\n"
|
||||||
|
" width ::= filled|<number>\n"
|
||||||
|
" shape ::= circle|square|line\n"
|
||||||
|
" x1,x2 ::= <number>\n"
|
||||||
|
" y1,y2 ::= <number>\n"
|
||||||
|
"\n"
|
||||||
|
" Numbers are floating point numbers describing points relative to\n"
|
||||||
|
" the top left of the output PNG as pixel coordinates. The 'width'\n"
|
||||||
|
" parameter is either the width of the line (in output pixels) used\n"
|
||||||
|
" to draw the shape or 'filled' to indicate that the shape should\n"
|
||||||
|
" be filled with the color.\n"
|
||||||
|
"\n"
|
||||||
|
" Colors are interpreted loosely to give access to the eight full\n"
|
||||||
|
" intensity RGB values:\n"
|
||||||
|
"\n"
|
||||||
|
" black, red, green, blue, yellow, cyan, purple, white,\n"
|
||||||
|
"\n"
|
||||||
|
" Cyan is full intensity blue+green; RGB(0,1,1), plus the following\n"
|
||||||
|
" lower intensity values:\n"
|
||||||
|
"\n"
|
||||||
|
" brown: red+orange: RGB(0.5, 0.125, 0) (dark red+orange)\n"
|
||||||
|
" pink: red+white: RGB(1.0, 0.5, 0.5)\n"
|
||||||
|
" orange: red+yellow: RGB(1.0, 0.5, 0)\n"
|
||||||
|
" gray: black+white: RGB(0.5, 0.5, 0.5)\n"
|
||||||
|
"\n"
|
||||||
|
" The RGB values are selected to make detection of aliasing errors\n"
|
||||||
|
" easy. The names are selected to make the description of errors\n"
|
||||||
|
" easy.\n"
|
||||||
|
"\n"
|
||||||
|
" The PNG is written to stdout, if --8bit is given a 32bpp RGBA sRGB\n"
|
||||||
|
" file is produced, otherwise a 64bpp RGBA linear encoded file is\n"
|
||||||
|
" written.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif /* SIMPLIFIED_WRITE && STDIO */
|
||||||
@ -1,8 +1,8 @@
|
|||||||
|
|
||||||
/* png-fix-itxt version 1.0.0
|
/* png-fix-itxt version 1.0.0
|
||||||
*
|
*
|
||||||
* Copyright 2013 Glenn Randers-Pehrson
|
* Copyright 2015 Glenn Randers-Pehrson
|
||||||
* Last changed in libpng 1.6.3 [July 18, 2013]
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
*
|
*
|
||||||
* This code is released under the libpng license.
|
* This code is released under the libpng license.
|
||||||
* For conditions of distribution and use, see the disclaimer
|
* For conditions of distribution and use, see the disclaimer
|
||||||
@ -34,8 +34,10 @@
|
|||||||
|
|
||||||
#define MAX_LENGTH 500000
|
#define MAX_LENGTH 500000
|
||||||
|
|
||||||
#define GETBREAK ((unsigned char)(inchar=getchar())); if (inchar == EOF) break
|
/* Read one character (inchar), also return octet (c), break if EOF */
|
||||||
|
#define GETBREAK inchar=getchar(); \
|
||||||
|
c=(inchar & 0xffU);\
|
||||||
|
if (inchar != c) break
|
||||||
int
|
int
|
||||||
main(void)
|
main(void)
|
||||||
{
|
{
|
||||||
@ -48,25 +50,25 @@ main(void)
|
|||||||
/* Skip 8-byte signature */
|
/* Skip 8-byte signature */
|
||||||
for (i=8; i; i--)
|
for (i=8; i; i--)
|
||||||
{
|
{
|
||||||
c=GETBREAK;
|
GETBREAK;
|
||||||
putchar(c);
|
putchar(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inchar != EOF)
|
if (inchar == c) /* !EOF */
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
/* Read the length */
|
/* Read the length */
|
||||||
unsigned long length; /* must be 32 bits! */
|
unsigned long length; /* must be 32 bits! */
|
||||||
c=GETBREAK; buf[0] = c; length = c; length <<= 8;
|
GETBREAK; buf[0] = c; length = c; length <<= 8;
|
||||||
c=GETBREAK; buf[1] = c; length += c; length <<= 8;
|
GETBREAK; buf[1] = c; length += c; length <<= 8;
|
||||||
c=GETBREAK; buf[2] = c; length += c; length <<= 8;
|
GETBREAK; buf[2] = c; length += c; length <<= 8;
|
||||||
c=GETBREAK; buf[3] = c; length += c;
|
GETBREAK; buf[3] = c; length += c;
|
||||||
|
|
||||||
/* Read the chunkname */
|
/* Read the chunkname */
|
||||||
c=GETBREAK; buf[4] = c;
|
GETBREAK; buf[4] = c;
|
||||||
c=GETBREAK; buf[5] = c;
|
GETBREAK; buf[5] = c;
|
||||||
c=GETBREAK; buf[6] = c;
|
GETBREAK; buf[6] = c;
|
||||||
c=GETBREAK; buf[7] = c;
|
GETBREAK; buf[7] = c;
|
||||||
|
|
||||||
|
|
||||||
/* The iTXt chunk type expressed as integers is (105, 84, 88, 116) */
|
/* The iTXt chunk type expressed as integers is (105, 84, 88, 116) */
|
||||||
@ -81,19 +83,22 @@ for (;;)
|
|||||||
/* Copy the data bytes */
|
/* Copy the data bytes */
|
||||||
for (i=8; i < length + 12; i++)
|
for (i=8; i < length + 12; i++)
|
||||||
{
|
{
|
||||||
c=GETBREAK; buf[i] = c;
|
GETBREAK; buf[i] = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (inchar != c) /* EOF */
|
||||||
|
break;
|
||||||
|
|
||||||
/* Calculate the CRC */
|
/* Calculate the CRC */
|
||||||
crc = crc32(crc, buf+4, (uInt)length+4);
|
crc = crc32(crc, buf+4, (uInt)length+4);
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
/* Check the CRC */
|
/* Check the CRC */
|
||||||
if (((crc >> 24) & 0xff) == buf[length+8] &&
|
if (((crc >> 24) & 0xffU) == buf[length+8] &&
|
||||||
((crc >> 16) & 0xff) == buf[length+9] &&
|
((crc >> 16) & 0xffU) == buf[length+9] &&
|
||||||
((crc >> 8) & 0xff) == buf[length+10] &&
|
((crc >> 8) & 0xffU) == buf[length+10] &&
|
||||||
((crc ) & 0xff) == buf[length+11])
|
((crc ) & 0xffU) == buf[length+11])
|
||||||
break;
|
break;
|
||||||
|
|
||||||
length++;
|
length++;
|
||||||
@ -101,18 +106,21 @@ for (;;)
|
|||||||
if (length >= MAX_LENGTH-12)
|
if (length >= MAX_LENGTH-12)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
c=GETBREAK;
|
GETBREAK;
|
||||||
buf[length+11]=c;
|
buf[length+11] = c;
|
||||||
|
|
||||||
/* Update the CRC */
|
/* Update the CRC */
|
||||||
crc = crc32(crc, buf+7+length, 1);
|
crc = crc32(crc, buf+7+length, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (inchar != c) /* EOF */
|
||||||
|
break;
|
||||||
|
|
||||||
/* Update length bytes */
|
/* Update length bytes */
|
||||||
buf[0] = (unsigned char)((length << 24) & 0xff);
|
buf[0] = (unsigned char)((length >> 24) & 0xffU);
|
||||||
buf[1] = (unsigned char)((length << 16) & 0xff);
|
buf[1] = (unsigned char)((length >> 16) & 0xffU);
|
||||||
buf[2] = (unsigned char)((length << 8) & 0xff);
|
buf[2] = (unsigned char)((length >> 8) & 0xffU);
|
||||||
buf[3] = (unsigned char)((length ) & 0xff);
|
buf[3] = (unsigned char)((length ) & 0xffU);
|
||||||
|
|
||||||
/* Write the fixed iTXt chunk (length, name, data, crc) */
|
/* Write the fixed iTXt chunk (length, name, data, crc) */
|
||||||
for (i=0; i<length+12; i++)
|
for (i=0; i<length+12; i++)
|
||||||
@ -121,6 +129,9 @@ for (;;)
|
|||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (inchar != c) /* EOF */
|
||||||
|
break;
|
||||||
|
|
||||||
/* Copy bytes that were already read (length and chunk name) */
|
/* Copy bytes that were already read (length and chunk name) */
|
||||||
for (i=0; i<8; i++)
|
for (i=0; i<8; i++)
|
||||||
putchar(buf[i]);
|
putchar(buf[i]);
|
||||||
@ -128,11 +139,11 @@ for (;;)
|
|||||||
/* Copy data bytes and CRC */
|
/* Copy data bytes and CRC */
|
||||||
for (i=8; i< length+12; i++)
|
for (i=8; i< length+12; i++)
|
||||||
{
|
{
|
||||||
c=GETBREAK;
|
GETBREAK;
|
||||||
putchar(c);
|
putchar(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inchar == EOF)
|
if (inchar != c) /* EOF */
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -142,7 +153,7 @@ for (;;)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inchar == EOF)
|
if (inchar != c) /* EOF */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (buf[4] == 73 && buf[5] == 69 && buf[6] == 78 && buf[7] == 68)
|
if (buf[4] == 73 && buf[5] == 69 && buf[6] == 78 && buf[7] == 68)
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 2014-2015 John Cunningham Bowler
|
* Copyright (c) 2014-2015 John Cunningham Bowler
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.17 [March 26, 2015]
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
*
|
*
|
||||||
* This code is released under the libpng license.
|
* This code is released under the libpng license.
|
||||||
* For conditions of distribution and use, see the disclaimer
|
* For conditions of distribution and use, see the disclaimer
|
||||||
@ -71,8 +71,8 @@
|
|||||||
* with older builds.
|
* with older builds.
|
||||||
*/
|
*/
|
||||||
#if ZLIB_VERNUM < 0x1260
|
#if ZLIB_VERNUM < 0x1260
|
||||||
# define PNGZ_MSG_CAST(s) png_constcast(char*,s)
|
# define PNGZ_MSG_CAST(s) constcast(char*,s)
|
||||||
# define PNGZ_INPUT_CAST(b) png_constcast(png_bytep,b)
|
# define PNGZ_INPUT_CAST(b) constcast(png_bytep,b)
|
||||||
#else
|
#else
|
||||||
# define PNGZ_MSG_CAST(s) (s)
|
# define PNGZ_MSG_CAST(s) (s)
|
||||||
# define PNGZ_INPUT_CAST(b) (b)
|
# define PNGZ_INPUT_CAST(b) (b)
|
||||||
@ -86,17 +86,17 @@
|
|||||||
|
|
||||||
/* Copied from pngpriv.h */
|
/* Copied from pngpriv.h */
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
# define png_voidcast(type, value) static_cast<type>(value)
|
# define voidcast(type, value) static_cast<type>(value)
|
||||||
# define png_constcast(type, value) const_cast<type>(value)
|
# define constcast(type, value) const_cast<type>(value)
|
||||||
# define png_aligncast(type, value) \
|
# define aligncast(type, value) \
|
||||||
static_cast<type>(static_cast<void*>(value))
|
static_cast<type>(static_cast<void*>(value))
|
||||||
# define png_aligncastconst(type, value) \
|
# define aligncastconst(type, value) \
|
||||||
static_cast<type>(static_cast<const void*>(value))
|
static_cast<type>(static_cast<const void*>(value))
|
||||||
#else
|
#else
|
||||||
# define png_voidcast(type, value) (value)
|
# define voidcast(type, value) (value)
|
||||||
# define png_constcast(type, value) ((type)(value))
|
# define constcast(type, value) ((type)(value))
|
||||||
# define png_aligncast(type, value) ((void*)(value))
|
# define aligncast(type, value) ((void*)(value))
|
||||||
# define png_aligncastconst(type, value) ((const void*)(value))
|
# define aligncastconst(type, value) ((const void*)(value))
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
#if PNG_LIBPNG_VER < 10700
|
#if PNG_LIBPNG_VER < 10700
|
||||||
@ -446,7 +446,7 @@ static void
|
|||||||
make_random_bytes(png_uint_32* seed, void* pv, size_t size)
|
make_random_bytes(png_uint_32* seed, void* pv, size_t size)
|
||||||
{
|
{
|
||||||
png_uint_32 u0 = seed[0], u1 = seed[1];
|
png_uint_32 u0 = seed[0], u1 = seed[1];
|
||||||
png_bytep bytes = png_voidcast(png_bytep, pv);
|
png_bytep bytes = voidcast(png_bytep, pv);
|
||||||
|
|
||||||
/* There are thirty-three bits; the next bit in the sequence is bit-33 XOR
|
/* There are thirty-three bits; the next bit in the sequence is bit-33 XOR
|
||||||
* bit-20. The top 1 bit is in u1, the bottom 32 are in u0.
|
* bit-20. The top 1 bit is in u1, the bottom 32 are in u0.
|
||||||
@ -668,7 +668,7 @@ IDAT_list_extend(struct IDAT_list *tail)
|
|||||||
if (length < tail->length) /* arithmetic overflow */
|
if (length < tail->length) /* arithmetic overflow */
|
||||||
length = tail->length;
|
length = tail->length;
|
||||||
|
|
||||||
next = png_voidcast(IDAT_list*, malloc(IDAT_list_size(NULL, length)));
|
next = voidcast(IDAT_list*, malloc(IDAT_list_size(NULL, length)));
|
||||||
CLEAR(*next);
|
CLEAR(*next);
|
||||||
|
|
||||||
/* The caller must handle this: */
|
/* The caller must handle this: */
|
||||||
@ -3535,7 +3535,7 @@ get_control(png_const_structrp png_ptr)
|
|||||||
/* This just returns the (file*). The chunk and idat control structures
|
/* This just returns the (file*). The chunk and idat control structures
|
||||||
* don't always exist.
|
* don't always exist.
|
||||||
*/
|
*/
|
||||||
struct control *control = png_voidcast(struct control*,
|
struct control *control = voidcast(struct control*,
|
||||||
png_get_error_ptr(png_ptr));
|
png_get_error_ptr(png_ptr));
|
||||||
return &control->file;
|
return &control->file;
|
||||||
}
|
}
|
||||||
@ -3543,7 +3543,7 @@ get_control(png_const_structrp png_ptr)
|
|||||||
static void
|
static void
|
||||||
allocate(struct file *file, int allocate_idat)
|
allocate(struct file *file, int allocate_idat)
|
||||||
{
|
{
|
||||||
struct control *control = png_voidcast(struct control*, file->alloc_ptr);
|
struct control *control = voidcast(struct control*, file->alloc_ptr);
|
||||||
|
|
||||||
if (allocate_idat)
|
if (allocate_idat)
|
||||||
{
|
{
|
||||||
@ -3853,6 +3853,7 @@ usage(const char *prog)
|
|||||||
int
|
int
|
||||||
main(int argc, const char **argv)
|
main(int argc, const char **argv)
|
||||||
{
|
{
|
||||||
|
char temp_name[FILENAME_MAX+1];
|
||||||
const char * prog = *argv;
|
const char * prog = *argv;
|
||||||
const char * outfile = NULL;
|
const char * outfile = NULL;
|
||||||
const char * suffix = NULL;
|
const char * suffix = NULL;
|
||||||
@ -3955,7 +3956,6 @@ main(int argc, const char **argv)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
size_t outlen = strlen(*argv);
|
size_t outlen = strlen(*argv);
|
||||||
char temp_name[FILENAME_MAX+1];
|
|
||||||
|
|
||||||
if (outfile == NULL) /* else this takes precedence */
|
if (outfile == NULL) /* else this takes precedence */
|
||||||
{
|
{
|
||||||
|
|||||||
@ -1,11 +1,12 @@
|
|||||||
/*===
|
/*===
|
||||||
cexcept.h 2.0.1 (2008-Jul-19-Sat)
|
cexcept.h 2.0.1 (2008-Jul-19-Sat, modified 2015-Jun-03-Mon)
|
||||||
http://www.nicemice.net/cexcept/
|
http://www.nicemice.net/cexcept/
|
||||||
Adam M. Costello
|
Adam M. Costello
|
||||||
http://www.nicemice.net/amc/
|
http://www.nicemice.net/amc/
|
||||||
|
|
||||||
An interface for exception-handling in ANSI C (C89 and subsequent ISO
|
An interface for exception-handling in ANSI C (C89 and subsequent ISO
|
||||||
standards), developed jointly with Cosmin Truta.
|
standards), developed jointly with Cosmin Truta. Revised by John Bowler,
|
||||||
|
June 2015, to declare exception_env and exception_prev "volatile".
|
||||||
|
|
||||||
Copyright (c) 2000-2008 Adam M. Costello and Cosmin Truta.
|
Copyright (c) 2000-2008 Adam M. Costello and Cosmin Truta.
|
||||||
This software may be modified only if its author and version
|
This software may be modified only if its author and version
|
||||||
@ -210,7 +211,7 @@ struct exception_context { \
|
|||||||
|
|
||||||
#define Try \
|
#define Try \
|
||||||
{ \
|
{ \
|
||||||
jmp_buf *exception__prev, exception__env; \
|
jmp_buf * volatile exception__prev, exception__env; \
|
||||||
exception__prev = the_exception_context->penv; \
|
exception__prev = the_exception_context->penv; \
|
||||||
the_exception_context->penv = &exception__env; \
|
the_exception_context->penv = &exception__env; \
|
||||||
if (setjmp(exception__env) == 0) { \
|
if (setjmp(exception__env) == 0) { \
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
libpng-manual.txt - A description on how to use and modify libpng
|
libpng-manual.txt - A description on how to use and modify libpng
|
||||||
|
|
||||||
libpng version 1.6.17 - March 26, 2015
|
libpng version 1.6.18 - July 23, 2015
|
||||||
Updated and distributed by Glenn Randers-Pehrson
|
Updated and distributed by Glenn Randers-Pehrson
|
||||||
<glennrp at users.sourceforge.net>
|
<glennrp at users.sourceforge.net>
|
||||||
Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
@ -11,7 +11,7 @@ libpng-manual.txt - A description on how to use and modify libpng
|
|||||||
|
|
||||||
Based on:
|
Based on:
|
||||||
|
|
||||||
libpng versions 0.97, January 1998, through 1.6.17 - March 26, 2015
|
libpng versions 0.97, January 1998, through 1.6.18 - July 23, 2015
|
||||||
Updated and distributed by Glenn Randers-Pehrson
|
Updated and distributed by Glenn Randers-Pehrson
|
||||||
Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
|
|
||||||
@ -4065,10 +4065,11 @@ a 16-bit linear encoded PNG file is written.
|
|||||||
|
|
||||||
With all APIs row_stride is handled as in the read APIs - it is the spacing
|
With all APIs row_stride is handled as in the read APIs - it is the spacing
|
||||||
from one row to the next in component sized units (float) and if negative
|
from one row to the next in component sized units (float) and if negative
|
||||||
indicates a bottom-up row layout in the buffer.
|
indicates a bottom-up row layout in the buffer. If you pass zero, libpng will
|
||||||
|
calculate the row_stride for you from the width and number of channels.
|
||||||
|
|
||||||
Note that the write API does not support interlacing, sub-8-bit pixels,
|
Note that the write API does not support interlacing, sub-8-bit pixels,
|
||||||
and indexed (paletted) images.
|
indexed (paletted) images, or most ancillary chunks.
|
||||||
|
|
||||||
VI. Modifying/Customizing libpng
|
VI. Modifying/Customizing libpng
|
||||||
|
|
||||||
@ -4356,41 +4357,6 @@ is called for the first time.)
|
|||||||
same as the value of filter_method used
|
same as the value of filter_method used
|
||||||
in png_set_IHDR().
|
in png_set_IHDR().
|
||||||
|
|
||||||
It is also possible to influence how libpng chooses from among the
|
|
||||||
available filters. This is done in one or both of two ways - by
|
|
||||||
telling it how important it is to keep the same filter for successive
|
|
||||||
rows, and by telling it the relative computational costs of the filters.
|
|
||||||
|
|
||||||
double weights[3] = {1.5, 1.3, 1.1},
|
|
||||||
costs[PNG_FILTER_VALUE_LAST] =
|
|
||||||
{1.0, 1.3, 1.3, 1.5, 1.7};
|
|
||||||
|
|
||||||
png_set_filter_heuristics(png_ptr,
|
|
||||||
PNG_FILTER_HEURISTIC_WEIGHTED, 3,
|
|
||||||
weights, costs);
|
|
||||||
|
|
||||||
The weights are multiplying factors that indicate to libpng that the
|
|
||||||
row filter should be the same for successive rows unless another row filter
|
|
||||||
is that many times better than the previous filter. In the above example,
|
|
||||||
if the previous 3 filters were SUB, SUB, NONE, the SUB filter could have a
|
|
||||||
"sum of absolute differences" 1.5 x 1.3 times higher than other filters
|
|
||||||
and still be chosen, while the NONE filter could have a sum 1.1 times
|
|
||||||
higher than other filters and still be chosen. Unspecified weights are
|
|
||||||
taken to be 1.0, and the specified weights should probably be declining
|
|
||||||
like those above in order to emphasize recent filters over older filters.
|
|
||||||
|
|
||||||
The filter costs specify for each filter type a relative decoding cost
|
|
||||||
to be considered when selecting row filters. This means that filters
|
|
||||||
with higher costs are less likely to be chosen over filters with lower
|
|
||||||
costs, unless their "sum of absolute differences" is that much smaller.
|
|
||||||
The costs do not necessarily reflect the exact computational speeds of
|
|
||||||
the various filters, since this would unduly influence the final image
|
|
||||||
size.
|
|
||||||
|
|
||||||
Note that the numbers above were invented purely for this example and
|
|
||||||
are given only to help explain the function usage. Little testing has
|
|
||||||
been done to find optimum values for either the costs or the weights.
|
|
||||||
|
|
||||||
Requesting debug printout
|
Requesting debug printout
|
||||||
|
|
||||||
The macro definition PNG_DEBUG can be used to request debugging
|
The macro definition PNG_DEBUG can be used to request debugging
|
||||||
@ -5109,6 +5075,23 @@ length, which resulted in PNG files that cannot be read beyond the bad iTXt
|
|||||||
chunk. This error was fixed in libpng-1.6.3, and a tool (called
|
chunk. This error was fixed in libpng-1.6.3, and a tool (called
|
||||||
contrib/tools/png-fix-itxt) has been added to the libpng distribution.
|
contrib/tools/png-fix-itxt) has been added to the libpng distribution.
|
||||||
|
|
||||||
|
Starting with libpng-1.6.17, the PNG_SAFE_LIMITS macro was eliminated
|
||||||
|
and safe limits are used by default (users who need larger limits
|
||||||
|
can still override them at compile time or run time, as described above).
|
||||||
|
|
||||||
|
The new limits are
|
||||||
|
default spec limit
|
||||||
|
png_user_width_max 1,000,000 2,147,483,647
|
||||||
|
png_user_height_max 1,000,000 2,147,483,647
|
||||||
|
png_user_chunk_cache_max 128 unlimited
|
||||||
|
png_user_chunk_malloc_max 8,000,000 unlimited
|
||||||
|
|
||||||
|
Starting with libpng-1.6.18, a PNG_RELEASE_BUILD macro was added, which allows
|
||||||
|
library builders to control compilation for an installed system (a release build).
|
||||||
|
It can be set for testing debug or beta builds to ensure that they will compile
|
||||||
|
when the build type is switched to RC or STABLE. In essence this overrides the
|
||||||
|
PNG_LIBPNG_BUILD_BASE_TYPE definition which is not directly user controllable.
|
||||||
|
|
||||||
XIII. Detecting libpng
|
XIII. Detecting libpng
|
||||||
|
|
||||||
The png_get_io_ptr() function has been present since libpng-0.88, has never
|
The png_get_io_ptr() function has been present since libpng-0.88, has never
|
||||||
@ -5279,13 +5262,13 @@ Other rules can be inferred by inspecting the libpng source.
|
|||||||
|
|
||||||
XVI. Y2K Compliance in libpng
|
XVI. Y2K Compliance in libpng
|
||||||
|
|
||||||
March 26, 2015
|
July 23, 2015
|
||||||
|
|
||||||
Since the PNG Development group is an ad-hoc body, we can't make
|
Since the PNG Development group is an ad-hoc body, we can't make
|
||||||
an official declaration.
|
an official declaration.
|
||||||
|
|
||||||
This is your unofficial assurance that libpng from version 0.71 and
|
This is your unofficial assurance that libpng from version 0.71 and
|
||||||
upward through 1.6.17 are Y2K compliant. It is my belief that earlier
|
upward through 1.6.18 are Y2K compliant. It is my belief that earlier
|
||||||
versions were also Y2K compliant.
|
versions were also Y2K compliant.
|
||||||
|
|
||||||
Libpng only has two year fields. One is a 2-byte unsigned integer
|
Libpng only has two year fields. One is a 2-byte unsigned integer
|
||||||
|
|||||||
139
libpng.3
139
libpng.3
@ -1,6 +1,6 @@
|
|||||||
.TH LIBPNG 3 "March 26, 2015"
|
.TH LIBPNG 3 "July 23, 2015"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
libpng \- Portable Network Graphics (PNG) Reference Library 1.6.17
|
libpng \- Portable Network Graphics (PNG) Reference Library 1.6.18
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
\fB
|
\fB
|
||||||
#include <png.h>\fP
|
#include <png.h>\fP
|
||||||
@ -119,6 +119,8 @@ libpng \- Portable Network Graphics (PNG) Reference Library 1.6.17
|
|||||||
|
|
||||||
\fBpng_byte png_get_libpng_ver (png_const_structp \fIpng_ptr\fP\fB);\fP
|
\fBpng_byte png_get_libpng_ver (png_const_structp \fIpng_ptr\fP\fB);\fP
|
||||||
|
|
||||||
|
\fBint png_get_palette_max(png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
|
||||||
|
|
||||||
\fBpng_voidp png_get_mem_ptr (png_const_structp \fIpng_ptr\fP\fB);\fP
|
\fBpng_voidp png_get_mem_ptr (png_const_structp \fIpng_ptr\fP\fB);\fP
|
||||||
|
|
||||||
\fBpng_uint_32 png_get_oFFs (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*offset_x\fP\fB, png_uint_32 \fP\fI*offset_y\fP\fB, int \fI*unit_type\fP\fB);\fP
|
\fBpng_uint_32 png_get_oFFs (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*offset_x\fP\fB, png_uint_32 \fP\fI*offset_y\fP\fB, int \fI*unit_type\fP\fB);\fP
|
||||||
@ -369,6 +371,8 @@ libpng \- Portable Network Graphics (PNG) Reference Library 1.6.17
|
|||||||
|
|
||||||
\fBvoid png_set_oFFs (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIoffset_x\fP\fB, png_uint_32 \fP\fIoffset_y\fP\fB, int \fIunit_type\fP\fB);\fP
|
\fBvoid png_set_oFFs (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIoffset_x\fP\fB, png_uint_32 \fP\fIoffset_y\fP\fB, int \fIunit_type\fP\fB);\fP
|
||||||
|
|
||||||
|
\fBint png_set_option(png_structrp \fP\fIpng_ptr\fP\fB, int \fP\fIoption\fP\fB, int \fIonoff\fP\fB);\fP
|
||||||
|
|
||||||
\fBvoid png_set_packing (png_structp \fIpng_ptr\fP\fB);\fP
|
\fBvoid png_set_packing (png_structp \fIpng_ptr\fP\fB);\fP
|
||||||
|
|
||||||
\fBvoid png_set_packswap (png_structp \fIpng_ptr\fP\fB);\fP
|
\fBvoid png_set_packswap (png_structp \fIpng_ptr\fP\fB);\fP
|
||||||
@ -504,7 +508,7 @@ Following is a copy of the libpng-manual.txt file that accompanies libpng.
|
|||||||
.SH LIBPNG.TXT
|
.SH LIBPNG.TXT
|
||||||
libpng-manual.txt - A description on how to use and modify libpng
|
libpng-manual.txt - A description on how to use and modify libpng
|
||||||
|
|
||||||
libpng version 1.6.17 - March 26, 2015
|
libpng version 1.6.18 - July 23, 2015
|
||||||
Updated and distributed by Glenn Randers-Pehrson
|
Updated and distributed by Glenn Randers-Pehrson
|
||||||
<glennrp at users.sourceforge.net>
|
<glennrp at users.sourceforge.net>
|
||||||
Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
@ -515,7 +519,7 @@ libpng-manual.txt - A description on how to use and modify libpng
|
|||||||
|
|
||||||
Based on:
|
Based on:
|
||||||
|
|
||||||
libpng versions 0.97, January 1998, through 1.6.17 - March 26, 2015
|
libpng versions 0.97, January 1998, through 1.6.18 - July 23, 2015
|
||||||
Updated and distributed by Glenn Randers-Pehrson
|
Updated and distributed by Glenn Randers-Pehrson
|
||||||
Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
|
|
||||||
@ -4569,10 +4573,11 @@ a 16-bit linear encoded PNG file is written.
|
|||||||
|
|
||||||
With all APIs row_stride is handled as in the read APIs - it is the spacing
|
With all APIs row_stride is handled as in the read APIs - it is the spacing
|
||||||
from one row to the next in component sized units (float) and if negative
|
from one row to the next in component sized units (float) and if negative
|
||||||
indicates a bottom-up row layout in the buffer.
|
indicates a bottom-up row layout in the buffer. If you pass zero, libpng will
|
||||||
|
calculate the row_stride for you from the width and number of channels.
|
||||||
|
|
||||||
Note that the write API does not support interlacing, sub-8-bit pixels,
|
Note that the write API does not support interlacing, sub-8-bit pixels,
|
||||||
and indexed (paletted) images.
|
indexed (paletted) images, or most ancillary chunks.
|
||||||
|
|
||||||
.SH VI. Modifying/Customizing libpng
|
.SH VI. Modifying/Customizing libpng
|
||||||
|
|
||||||
@ -4860,41 +4865,6 @@ is called for the first time.)
|
|||||||
same as the value of filter_method used
|
same as the value of filter_method used
|
||||||
in png_set_IHDR().
|
in png_set_IHDR().
|
||||||
|
|
||||||
It is also possible to influence how libpng chooses from among the
|
|
||||||
available filters. This is done in one or both of two ways - by
|
|
||||||
telling it how important it is to keep the same filter for successive
|
|
||||||
rows, and by telling it the relative computational costs of the filters.
|
|
||||||
|
|
||||||
double weights[3] = {1.5, 1.3, 1.1},
|
|
||||||
costs[PNG_FILTER_VALUE_LAST] =
|
|
||||||
{1.0, 1.3, 1.3, 1.5, 1.7};
|
|
||||||
|
|
||||||
png_set_filter_heuristics(png_ptr,
|
|
||||||
PNG_FILTER_HEURISTIC_WEIGHTED, 3,
|
|
||||||
weights, costs);
|
|
||||||
|
|
||||||
The weights are multiplying factors that indicate to libpng that the
|
|
||||||
row filter should be the same for successive rows unless another row filter
|
|
||||||
is that many times better than the previous filter. In the above example,
|
|
||||||
if the previous 3 filters were SUB, SUB, NONE, the SUB filter could have a
|
|
||||||
"sum of absolute differences" 1.5 x 1.3 times higher than other filters
|
|
||||||
and still be chosen, while the NONE filter could have a sum 1.1 times
|
|
||||||
higher than other filters and still be chosen. Unspecified weights are
|
|
||||||
taken to be 1.0, and the specified weights should probably be declining
|
|
||||||
like those above in order to emphasize recent filters over older filters.
|
|
||||||
|
|
||||||
The filter costs specify for each filter type a relative decoding cost
|
|
||||||
to be considered when selecting row filters. This means that filters
|
|
||||||
with higher costs are less likely to be chosen over filters with lower
|
|
||||||
costs, unless their "sum of absolute differences" is that much smaller.
|
|
||||||
The costs do not necessarily reflect the exact computational speeds of
|
|
||||||
the various filters, since this would unduly influence the final image
|
|
||||||
size.
|
|
||||||
|
|
||||||
Note that the numbers above were invented purely for this example and
|
|
||||||
are given only to help explain the function usage. Little testing has
|
|
||||||
been done to find optimum values for either the costs or the weights.
|
|
||||||
|
|
||||||
.SS Requesting debug printout
|
.SS Requesting debug printout
|
||||||
|
|
||||||
The macro definition PNG_DEBUG can be used to request debugging
|
The macro definition PNG_DEBUG can be used to request debugging
|
||||||
@ -5613,6 +5583,23 @@ length, which resulted in PNG files that cannot be read beyond the bad iTXt
|
|||||||
chunk. This error was fixed in libpng-1.6.3, and a tool (called
|
chunk. This error was fixed in libpng-1.6.3, and a tool (called
|
||||||
contrib/tools/png-fix-itxt) has been added to the libpng distribution.
|
contrib/tools/png-fix-itxt) has been added to the libpng distribution.
|
||||||
|
|
||||||
|
Starting with libpng-1.6.17, the PNG_SAFE_LIMITS macro was eliminated
|
||||||
|
and safe limits are used by default (users who need larger limits
|
||||||
|
can still override them at compile time or run time, as described above).
|
||||||
|
|
||||||
|
The new limits are
|
||||||
|
default spec limit
|
||||||
|
png_user_width_max 1,000,000 2,147,483,647
|
||||||
|
png_user_height_max 1,000,000 2,147,483,647
|
||||||
|
png_user_chunk_cache_max 128 unlimited
|
||||||
|
png_user_chunk_malloc_max 8,000,000 unlimited
|
||||||
|
|
||||||
|
Starting with libpng-1.6.18, a PNG_RELEASE_BUILD macro was added, which allows
|
||||||
|
library builders to control compilation for an installed system (a release build).
|
||||||
|
It can be set for testing debug or beta builds to ensure that they will compile
|
||||||
|
when the build type is switched to RC or STABLE. In essence this overrides the
|
||||||
|
PNG_LIBPNG_BUILD_BASE_TYPE definition which is not directly user controllable.
|
||||||
|
|
||||||
.SH XIII. Detecting libpng
|
.SH XIII. Detecting libpng
|
||||||
|
|
||||||
The png_get_io_ptr() function has been present since libpng-0.88, has never
|
The png_get_io_ptr() function has been present since libpng-0.88, has never
|
||||||
@ -5783,13 +5770,13 @@ Other rules can be inferred by inspecting the libpng source.
|
|||||||
|
|
||||||
.SH XVI. Y2K Compliance in libpng
|
.SH XVI. Y2K Compliance in libpng
|
||||||
|
|
||||||
March 26, 2015
|
July 23, 2015
|
||||||
|
|
||||||
Since the PNG Development group is an ad-hoc body, we can't make
|
Since the PNG Development group is an ad-hoc body, we can't make
|
||||||
an official declaration.
|
an official declaration.
|
||||||
|
|
||||||
This is your unofficial assurance that libpng from version 0.71 and
|
This is your unofficial assurance that libpng from version 0.71 and
|
||||||
upward through 1.6.17 are Y2K compliant. It is my belief that earlier
|
upward through 1.6.18 are Y2K compliant. It is my belief that earlier
|
||||||
versions were also Y2K compliant.
|
versions were also Y2K compliant.
|
||||||
|
|
||||||
Libpng only has two year fields. One is a 2-byte unsigned integer
|
Libpng only has two year fields. One is a 2-byte unsigned integer
|
||||||
@ -6044,6 +6031,9 @@ the first widely used release:
|
|||||||
1.6.17beta01-06 16 10617 16.so.16.17[.0]
|
1.6.17beta01-06 16 10617 16.so.16.17[.0]
|
||||||
1.6.17rc01-06 16 10617 16.so.16.17[.0]
|
1.6.17rc01-06 16 10617 16.so.16.17[.0]
|
||||||
1.6.17 16 10617 16.so.16.17[.0]
|
1.6.17 16 10617 16.so.16.17[.0]
|
||||||
|
1.6.18beta01-09 16 10618 16.so.16.18[.0]
|
||||||
|
1.6.18rc01-03 16 10618 16.so.16.18[.0]
|
||||||
|
1.6.18 16 10618 16.so.16.18[.0]
|
||||||
|
|
||||||
Henceforth the source version will match the shared-library minor
|
Henceforth the source version will match the shared-library minor
|
||||||
and patch numbers; the shared-library major version number will be
|
and patch numbers; the shared-library major version number will be
|
||||||
@ -6100,7 +6090,7 @@ possible without all of you.
|
|||||||
|
|
||||||
Thanks to Frank J. T. Wojcik for helping with the documentation.
|
Thanks to Frank J. T. Wojcik for helping with the documentation.
|
||||||
|
|
||||||
Libpng version 1.6.17 - March 26, 2015:
|
Libpng version 1.6.18 - July 23, 2015:
|
||||||
Initially created in 1995 by Guy Eric Schalnat, then of Group 42, Inc.
|
Initially created in 1995 by Guy Eric Schalnat, then of Group 42, Inc.
|
||||||
Currently maintained by Glenn Randers-Pehrson (glennrp at users.sourceforge.net).
|
Currently maintained by Glenn Randers-Pehrson (glennrp at users.sourceforge.net).
|
||||||
|
|
||||||
@ -6123,44 +6113,39 @@ this sentence.
|
|||||||
|
|
||||||
This code is released under the libpng license.
|
This code is released under the libpng license.
|
||||||
|
|
||||||
libpng versions 1.2.6, August 15, 2004, through 1.6.17, March 26, 2015, are
|
libpng versions 1.0.7, July 1, 2000, through 1.6.18, July 23, 2015, are
|
||||||
Copyright (c) 2004,2006-2015 Glenn Randers-Pehrson, and are
|
Copyright (c) 2000-2002, 2004, 2006-2015 Glenn Randers-Pehrson, and are
|
||||||
distributed according to the same disclaimer and license as libpng-1.2.5
|
|
||||||
with the following individual added to the list of Contributing Authors
|
|
||||||
|
|
||||||
Cosmin Truta
|
|
||||||
|
|
||||||
libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
|
|
||||||
Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
|
|
||||||
distributed according to the same disclaimer and license as libpng-1.0.6
|
distributed according to the same disclaimer and license as libpng-1.0.6
|
||||||
with the following individuals added to the list of Contributing Authors
|
with the following individuals added to the list of Contributing Authors:
|
||||||
|
|
||||||
Simon-Pierre Cadieux
|
Simon-Pierre Cadieux
|
||||||
Eric S. Raymond
|
Eric S. Raymond
|
||||||
|
Mans Rullgard
|
||||||
|
Cosmin Truta
|
||||||
Gilles Vollant
|
Gilles Vollant
|
||||||
|
James Yu
|
||||||
|
|
||||||
and with the following additions to the disclaimer:
|
and with the following additions to the disclaimer:
|
||||||
|
|
||||||
There is no warranty against interference with your
|
There is no warranty against interference with your enjoyment of the
|
||||||
enjoyment of the library or against infringement.
|
library or against infringement. There is no warranty that our
|
||||||
There is no warranty that our efforts or the library
|
efforts or the library will fulfill any of your particular purposes
|
||||||
will fulfill any of your particular purposes or needs.
|
or needs. This library is provided with all faults, and the entire
|
||||||
This library is provided with all faults, and the entire
|
risk of satisfactory quality, performance, accuracy, and effort is with
|
||||||
risk of satisfactory quality, performance, accuracy, and
|
the user.
|
||||||
effort is with the user.
|
|
||||||
|
|
||||||
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
|
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
|
||||||
Copyright (c) 1998, 1999 Glenn Randers-Pehrson
|
Copyright (c) 1998-2000 Glenn Randers-Pehrson, and are distributed according
|
||||||
Distributed according to the same disclaimer and license as libpng-0.96,
|
to the same disclaimer and license as libpng-0.96, with the following
|
||||||
with the following individuals added to the list of Contributing Authors:
|
individuals added to the list of Contributing Authors:
|
||||||
|
|
||||||
Tom Lane
|
Tom Lane
|
||||||
Glenn Randers-Pehrson
|
Glenn Randers-Pehrson
|
||||||
Willem van Schaik
|
Willem van Schaik
|
||||||
|
|
||||||
libpng versions 0.89, June 1996, through 0.96, May 1997, are
|
libpng versions 0.89, June 1996, through 0.96, May 1997, are
|
||||||
Copyright (c) 1996, 1997 Andreas Dilger
|
Copyright (c) 1996-1997 Andreas Dilger, and are
|
||||||
Distributed according to the same disclaimer and license as libpng-0.88,
|
distributed according to the same disclaimer and license as libpng-0.88,
|
||||||
with the following individuals added to the list of Contributing Authors:
|
with the following individuals added to the list of Contributing Authors:
|
||||||
|
|
||||||
John Bowler
|
John Bowler
|
||||||
@ -6171,7 +6156,7 @@ with the following individuals added to the list of Contributing Authors:
|
|||||||
Tom Tanner
|
Tom Tanner
|
||||||
|
|
||||||
libpng versions 0.5, May 1995, through 0.88, January 1996, are
|
libpng versions 0.5, May 1995, through 0.88, January 1996, are
|
||||||
Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
|
||||||
|
|
||||||
For the purposes of this copyright and license, "Contributing Authors"
|
For the purposes of this copyright and license, "Contributing Authors"
|
||||||
is defined as the following set of individuals:
|
is defined as the following set of individuals:
|
||||||
@ -6194,13 +6179,13 @@ Permission is hereby granted to use, copy, modify, and distribute this
|
|||||||
source code, or portions hereof, for any purpose, without fee, subject
|
source code, or portions hereof, for any purpose, without fee, subject
|
||||||
to the following restrictions:
|
to the following restrictions:
|
||||||
|
|
||||||
1. The origin of this source code must not be misrepresented.
|
1. The origin of this source code must not be misrepresented.
|
||||||
|
|
||||||
2. Altered versions must be plainly marked as such and
|
2. Altered versions must be plainly marked as such and must not
|
||||||
must not be misrepresented as being the original source.
|
be misrepresented as being the original source.
|
||||||
|
|
||||||
3. This Copyright notice may not be removed or altered from
|
3. This Copyright notice may not be removed or altered from any
|
||||||
any source or altered source distribution.
|
source or altered source distribution.
|
||||||
|
|
||||||
The Contributing Authors and Group 42, Inc. specifically permit, without
|
The Contributing Authors and Group 42, Inc. specifically permit, without
|
||||||
fee, and encourage the use of this source code as a component to
|
fee, and encourage the use of this source code as a component to
|
||||||
@ -6208,21 +6193,21 @@ supporting the PNG file format in commercial products. If you use this
|
|||||||
source code in a product, acknowledgment is not required but would be
|
source code in a product, acknowledgment is not required but would be
|
||||||
appreciated.
|
appreciated.
|
||||||
|
|
||||||
|
|
||||||
A "png_get_copyright" function is available, for convenient use in "about"
|
A "png_get_copyright" function is available, for convenient use in "about"
|
||||||
boxes and the like:
|
boxes and the like:
|
||||||
|
|
||||||
printf("%s",png_get_copyright(NULL));
|
printf("%s", png_get_copyright(NULL));
|
||||||
|
|
||||||
Also, the PNG logo (in PNG format, of course) is supplied in the
|
Also, the PNG logo (in PNG format, of course) is supplied in the
|
||||||
files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
|
files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
|
||||||
|
|
||||||
Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a
|
Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
|
||||||
certification mark of the Open Source Initiative.
|
a certification mark of the Open Source Initiative. OSI has not addressed
|
||||||
|
the additional disclaimers inserted at version 1.0.7.
|
||||||
|
|
||||||
Glenn Randers-Pehrson
|
Glenn Randers-Pehrson
|
||||||
glennrp at users.sourceforge.net
|
glennrp at users.sourceforge.net
|
||||||
March 26, 2015
|
July 23, 2015
|
||||||
|
|
||||||
.\" end of man page
|
.\" end of man page
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
.TH LIBPNGPF 3 "March 26, 2015"
|
.TH LIBPNGPF 3 "July 23, 2015"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
libpng \- Portable Network Graphics (PNG) Reference Library 1.6.17
|
libpng \- Portable Network Graphics (PNG) Reference Library 1.6.18
|
||||||
(private functions)
|
(private functions)
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
\fB#include \fI"pngpriv.h"
|
\fB#include \fI"pngpriv.h"
|
||||||
|
|||||||
2
png.5
2
png.5
@ -1,4 +1,4 @@
|
|||||||
.TH PNG 5 "March 26, 2015"
|
.TH PNG 5 "July 23, 2015"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
png \- Portable Network Graphics (PNG) format
|
png \- Portable Network Graphics (PNG) format
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
|
|||||||
113
png.c
113
png.c
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* png.c - location for general purpose libpng functions
|
/* png.c - location for general purpose libpng functions
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.17 [March 26, 2015]
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
@ -14,7 +14,7 @@
|
|||||||
#include "pngpriv.h"
|
#include "pngpriv.h"
|
||||||
|
|
||||||
/* Generate a compiler error if there is an old png.h in the search path. */
|
/* Generate a compiler error if there is an old png.h in the search path. */
|
||||||
typedef png_libpng_version_1_6_17 Your_png_h_is_not_version_1_6_17;
|
typedef png_libpng_version_1_6_18 Your_png_h_is_not_version_1_6_18;
|
||||||
|
|
||||||
/* Tells libpng that we have already handled the first "num_bytes" bytes
|
/* Tells libpng that we have already handled the first "num_bytes" bytes
|
||||||
* of the PNG file signature. If the PNG data is embedded into another
|
* of the PNG file signature. If the PNG data is embedded into another
|
||||||
@ -101,7 +101,7 @@ png_zfree(voidpf png_ptr, voidpf ptr)
|
|||||||
void /* PRIVATE */
|
void /* PRIVATE */
|
||||||
png_reset_crc(png_structrp png_ptr)
|
png_reset_crc(png_structrp png_ptr)
|
||||||
{
|
{
|
||||||
/* The cast is safe because the crc is a 32 bit value. */
|
/* The cast is safe because the crc is a 32-bit value. */
|
||||||
png_ptr->crc = (png_uint_32)crc32(0, Z_NULL, 0);
|
png_ptr->crc = (png_uint_32)crc32(0, Z_NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -129,7 +129,7 @@ png_calculate_crc(png_structrp png_ptr, png_const_bytep ptr, png_size_t length)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 'uLong' is defined in zlib.h as unsigned long; this means that on some
|
/* 'uLong' is defined in zlib.h as unsigned long; this means that on some
|
||||||
* systems it is a 64 bit value. crc32, however, returns 32 bits so the
|
* systems it is a 64-bit value. crc32, however, returns 32 bits so the
|
||||||
* following cast is safe. 'uInt' may be no more than 16 bits, so it is
|
* following cast is safe. 'uInt' may be no more than 16 bits, so it is
|
||||||
* necessary to perform a loop here.
|
* necessary to perform a loop here.
|
||||||
*/
|
*/
|
||||||
@ -243,15 +243,15 @@ png_create_png_struct,(png_const_charp user_png_ver, png_voidp error_ptr,
|
|||||||
create_struct.user_height_max = PNG_USER_HEIGHT_MAX;
|
create_struct.user_height_max = PNG_USER_HEIGHT_MAX;
|
||||||
|
|
||||||
# ifdef PNG_USER_CHUNK_CACHE_MAX
|
# ifdef PNG_USER_CHUNK_CACHE_MAX
|
||||||
/* Added at libpng-1.2.43 and 1.4.0 */
|
/* Added at libpng-1.2.43 and 1.4.0 */
|
||||||
create_struct.user_chunk_cache_max = PNG_USER_CHUNK_CACHE_MAX;
|
create_struct.user_chunk_cache_max = PNG_USER_CHUNK_CACHE_MAX;
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# ifdef PNG_USER_CHUNK_MALLOC_MAX
|
# ifdef PNG_USER_CHUNK_MALLOC_MAX
|
||||||
/* Added at libpng-1.2.43 and 1.4.1, required only for read but exists
|
/* Added at libpng-1.2.43 and 1.4.1, required only for read but exists
|
||||||
* in png_struct regardless.
|
* in png_struct regardless.
|
||||||
*/
|
*/
|
||||||
create_struct.user_chunk_malloc_max = PNG_USER_CHUNK_MALLOC_MAX;
|
create_struct.user_chunk_malloc_max = PNG_USER_CHUNK_MALLOC_MAX;
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
@ -275,7 +275,9 @@ png_create_png_struct,(png_const_charp user_png_ver, png_voidp error_ptr,
|
|||||||
|
|
||||||
# ifdef PNG_SETJMP_SUPPORTED
|
# ifdef PNG_SETJMP_SUPPORTED
|
||||||
if (!setjmp(create_jmp_buf))
|
if (!setjmp(create_jmp_buf))
|
||||||
|
# endif
|
||||||
{
|
{
|
||||||
|
# ifdef PNG_SETJMP_SUPPORTED
|
||||||
/* Temporarily fake out the longjmp information until we have
|
/* Temporarily fake out the longjmp information until we have
|
||||||
* successfully completed this function. This only works if we have
|
* successfully completed this function. This only works if we have
|
||||||
* setjmp() support compiled in, but it is safe - this stuff should
|
* setjmp() support compiled in, but it is safe - this stuff should
|
||||||
@ -284,8 +286,6 @@ png_create_png_struct,(png_const_charp user_png_ver, png_voidp error_ptr,
|
|||||||
create_struct.jmp_buf_ptr = &create_jmp_buf;
|
create_struct.jmp_buf_ptr = &create_jmp_buf;
|
||||||
create_struct.jmp_buf_size = 0; /*stack allocation*/
|
create_struct.jmp_buf_size = 0; /*stack allocation*/
|
||||||
create_struct.longjmp_fn = longjmp;
|
create_struct.longjmp_fn = longjmp;
|
||||||
# else
|
|
||||||
{
|
|
||||||
# endif
|
# endif
|
||||||
/* Call the general version checker (shared with read and write code):
|
/* Call the general version checker (shared with read and write code):
|
||||||
*/
|
*/
|
||||||
@ -304,10 +304,10 @@ png_create_png_struct,(png_const_charp user_png_ver, png_voidp error_ptr,
|
|||||||
create_struct.zstream.opaque = png_ptr;
|
create_struct.zstream.opaque = png_ptr;
|
||||||
|
|
||||||
# ifdef PNG_SETJMP_SUPPORTED
|
# ifdef PNG_SETJMP_SUPPORTED
|
||||||
/* Eliminate the local error handling: */
|
/* Eliminate the local error handling: */
|
||||||
create_struct.jmp_buf_ptr = NULL;
|
create_struct.jmp_buf_ptr = NULL;
|
||||||
create_struct.jmp_buf_size = 0;
|
create_struct.jmp_buf_size = 0;
|
||||||
create_struct.longjmp_fn = 0;
|
create_struct.longjmp_fn = 0;
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
*png_ptr = create_struct;
|
*png_ptr = create_struct;
|
||||||
@ -766,13 +766,13 @@ png_get_copyright(png_const_structrp png_ptr)
|
|||||||
#else
|
#else
|
||||||
# ifdef __STDC__
|
# ifdef __STDC__
|
||||||
return PNG_STRING_NEWLINE \
|
return PNG_STRING_NEWLINE \
|
||||||
"libpng version 1.6.17 - March 26, 2015" PNG_STRING_NEWLINE \
|
"libpng version 1.6.18 - July 23, 2015" PNG_STRING_NEWLINE \
|
||||||
"Copyright (c) 1998-2015 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \
|
"Copyright (c) 1998-2015 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \
|
||||||
"Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \
|
"Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \
|
||||||
"Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \
|
"Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \
|
||||||
PNG_STRING_NEWLINE;
|
PNG_STRING_NEWLINE;
|
||||||
# else
|
# else
|
||||||
return "libpng version 1.6.17 - March 26, 2015\
|
return "libpng version 1.6.18 - July 23, 2015\
|
||||||
Copyright (c) 1998-2015 Glenn Randers-Pehrson\
|
Copyright (c) 1998-2015 Glenn Randers-Pehrson\
|
||||||
Copyright (c) 1996-1997 Andreas Dilger\
|
Copyright (c) 1996-1997 Andreas Dilger\
|
||||||
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.";
|
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.";
|
||||||
@ -811,9 +811,9 @@ png_get_header_version(png_const_structrp png_ptr)
|
|||||||
#ifdef __STDC__
|
#ifdef __STDC__
|
||||||
return PNG_HEADER_VERSION_STRING
|
return PNG_HEADER_VERSION_STRING
|
||||||
# ifndef PNG_READ_SUPPORTED
|
# ifndef PNG_READ_SUPPORTED
|
||||||
" (NO READ SUPPORT)"
|
" (NO READ SUPPORT)"
|
||||||
# endif
|
# endif
|
||||||
PNG_STRING_NEWLINE;
|
PNG_STRING_NEWLINE;
|
||||||
#else
|
#else
|
||||||
return PNG_HEADER_VERSION_STRING;
|
return PNG_HEADER_VERSION_STRING;
|
||||||
#endif
|
#endif
|
||||||
@ -1086,10 +1086,10 @@ png_colorspace_set_gamma(png_const_structrp png_ptr,
|
|||||||
errmsg = "gamma value out of range";
|
errmsg = "gamma value out of range";
|
||||||
|
|
||||||
# ifdef PNG_READ_gAMA_SUPPORTED
|
# ifdef PNG_READ_gAMA_SUPPORTED
|
||||||
/* Allow the application to set the gamma value more than once */
|
/* Allow the application to set the gamma value more than once */
|
||||||
else if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 &&
|
else if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 &&
|
||||||
(colorspace->flags & PNG_COLORSPACE_FROM_gAMA) != 0)
|
(colorspace->flags & PNG_COLORSPACE_FROM_gAMA) != 0)
|
||||||
errmsg = "duplicate";
|
errmsg = "duplicate";
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
/* Do nothing if the colorspace is already invalid */
|
/* Do nothing if the colorspace is already invalid */
|
||||||
@ -1130,31 +1130,31 @@ png_colorspace_sync_info(png_const_structrp png_ptr, png_inforp info_ptr)
|
|||||||
PNG_INFO_iCCP);
|
PNG_INFO_iCCP);
|
||||||
|
|
||||||
# ifdef PNG_COLORSPACE_SUPPORTED
|
# ifdef PNG_COLORSPACE_SUPPORTED
|
||||||
/* Clean up the iCCP profile now if it won't be used. */
|
/* Clean up the iCCP profile now if it won't be used. */
|
||||||
png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, -1/*not used*/);
|
png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, -1/*not used*/);
|
||||||
# else
|
# else
|
||||||
PNG_UNUSED(png_ptr)
|
PNG_UNUSED(png_ptr)
|
||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
# ifdef PNG_COLORSPACE_SUPPORTED
|
# ifdef PNG_COLORSPACE_SUPPORTED
|
||||||
/* Leave the INFO_iCCP flag set if the pngset.c code has already set
|
/* Leave the INFO_iCCP flag set if the pngset.c code has already set
|
||||||
* it; this allows a PNG to contain a profile which matches sRGB and
|
* it; this allows a PNG to contain a profile which matches sRGB and
|
||||||
* yet still have that profile retrievable by the application.
|
* yet still have that profile retrievable by the application.
|
||||||
*/
|
*/
|
||||||
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_MATCHES_sRGB) != 0)
|
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_MATCHES_sRGB) != 0)
|
||||||
info_ptr->valid |= PNG_INFO_sRGB;
|
info_ptr->valid |= PNG_INFO_sRGB;
|
||||||
|
|
||||||
else
|
else
|
||||||
info_ptr->valid &= ~PNG_INFO_sRGB;
|
info_ptr->valid &= ~PNG_INFO_sRGB;
|
||||||
|
|
||||||
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
|
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
|
||||||
info_ptr->valid |= PNG_INFO_cHRM;
|
info_ptr->valid |= PNG_INFO_cHRM;
|
||||||
|
|
||||||
else
|
else
|
||||||
info_ptr->valid &= ~PNG_INFO_cHRM;
|
info_ptr->valid &= ~PNG_INFO_cHRM;
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) != 0)
|
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) != 0)
|
||||||
@ -1235,16 +1235,17 @@ png_XYZ_from_xy(png_XYZ *XYZ, const png_xy *xy)
|
|||||||
|
|
||||||
/* Check xy and, implicitly, z. Note that wide gamut color spaces typically
|
/* Check xy and, implicitly, z. Note that wide gamut color spaces typically
|
||||||
* have end points with 0 tristimulus values (these are impossible end
|
* have end points with 0 tristimulus values (these are impossible end
|
||||||
* points, but they are used to cover the possible colors.)
|
* points, but they are used to cover the possible colors). We check
|
||||||
|
* xy->whitey against 5, not 0, to avoid a possible integer overflow.
|
||||||
*/
|
*/
|
||||||
if (xy->redx < 0 || xy->redx > PNG_FP_1) return 1;
|
if (xy->redx < 0 || xy->redx > PNG_FP_1) return 1;
|
||||||
if (xy->redy < 0 || xy->redy > PNG_FP_1-xy->redx) return 1;
|
if (xy->redy < 0 || xy->redy > PNG_FP_1-xy->redx) return 1;
|
||||||
if (xy->greenx < 0 || xy->greenx > PNG_FP_1) return 1;
|
if (xy->greenx < 0 || xy->greenx > PNG_FP_1) return 1;
|
||||||
if (xy->greeny < 0 || xy->greeny > PNG_FP_1-xy->greenx) return 1;
|
if (xy->greeny < 0 || xy->greeny > PNG_FP_1-xy->greenx) return 1;
|
||||||
if (xy->bluex < 0 || xy->bluex > PNG_FP_1) return 1;
|
if (xy->bluex < 0 || xy->bluex > PNG_FP_1) return 1;
|
||||||
if (xy->bluey < 0 || xy->bluey > PNG_FP_1-xy->bluex) return 1;
|
if (xy->bluey < 0 || xy->bluey > PNG_FP_1-xy->bluex) return 1;
|
||||||
if (xy->whitex < 0 || xy->whitex > PNG_FP_1) return 1;
|
if (xy->whitex < 0 || xy->whitex > PNG_FP_1) return 1;
|
||||||
if (xy->whitey < 0 || xy->whitey > PNG_FP_1-xy->whitex) return 1;
|
if (xy->whitey < 5 || xy->whitey > PNG_FP_1-xy->whitex) return 1;
|
||||||
|
|
||||||
/* The reverse calculation is more difficult because the original tristimulus
|
/* The reverse calculation is more difficult because the original tristimulus
|
||||||
* value had 9 independent values (red,green,blue)x(X,Y,Z) however only 8
|
* value had 9 independent values (red,green,blue)x(X,Y,Z) however only 8
|
||||||
@ -2276,7 +2277,7 @@ png_compare_ICC_profile_with_sRGB(png_const_structrp png_ptr,
|
|||||||
|
|
||||||
/* Length *and* intent must match */
|
/* Length *and* intent must match */
|
||||||
if (length == png_sRGB_checks[i].length &&
|
if (length == png_sRGB_checks[i].length &&
|
||||||
intent == png_sRGB_checks[i].intent)
|
intent == (png_uint_32) png_sRGB_checks[i].intent)
|
||||||
{
|
{
|
||||||
/* Now calculate the adler32 if not done already. */
|
/* Now calculate the adler32 if not done already. */
|
||||||
if (adler == 0)
|
if (adler == 0)
|
||||||
@ -2843,7 +2844,7 @@ png_ascii_from_fp(png_const_structrp png_ptr, png_charp ascii, png_size_t size,
|
|||||||
|
|
||||||
if (fp >= DBL_MIN && fp <= DBL_MAX)
|
if (fp >= DBL_MIN && fp <= DBL_MAX)
|
||||||
{
|
{
|
||||||
int exp_b10; /* A base 10 exponent */
|
int exp_b10; /* A base 10 exponent */
|
||||||
double base; /* 10^exp_b10 */
|
double base; /* 10^exp_b10 */
|
||||||
|
|
||||||
/* First extract a base 10 exponent of the number,
|
/* First extract a base 10 exponent of the number,
|
||||||
@ -2891,7 +2892,7 @@ png_ascii_from_fp(png_const_structrp png_ptr, png_charp ascii, png_size_t size,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
{
|
{
|
||||||
int czero, clead, cdigits;
|
unsigned int czero, clead, cdigits;
|
||||||
char exponent[10];
|
char exponent[10];
|
||||||
|
|
||||||
/* Allow up to two leading zeros - this will not lengthen
|
/* Allow up to two leading zeros - this will not lengthen
|
||||||
@ -2921,7 +2922,7 @@ png_ascii_from_fp(png_const_structrp png_ptr, png_charp ascii, png_size_t size,
|
|||||||
* of the loop don't break the number into parts so
|
* of the loop don't break the number into parts so
|
||||||
* that the final digit is rounded.
|
* that the final digit is rounded.
|
||||||
*/
|
*/
|
||||||
if (cdigits+czero-clead+1 < (int)precision)
|
if (cdigits+czero+1 < precision+clead)
|
||||||
fp = modf(fp, &d);
|
fp = modf(fp, &d);
|
||||||
|
|
||||||
else
|
else
|
||||||
@ -3027,7 +3028,7 @@ png_ascii_from_fp(png_const_structrp png_ptr, png_charp ascii, png_size_t size,
|
|||||||
*ascii++ = (char)(48 + (int)d), ++cdigits;
|
*ascii++ = (char)(48 + (int)d), ++cdigits;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (cdigits+czero-clead < (int)precision && fp > DBL_MIN);
|
while (cdigits+czero < precision+clead && fp > DBL_MIN);
|
||||||
|
|
||||||
/* The total output count (max) is now 4+precision */
|
/* The total output count (max) is now 4+precision */
|
||||||
|
|
||||||
@ -3095,7 +3096,7 @@ png_ascii_from_fp(png_const_structrp png_ptr, png_charp ascii, png_size_t size,
|
|||||||
/* Need another size check here for the exponent digits, so
|
/* Need another size check here for the exponent digits, so
|
||||||
* this need not be considered above.
|
* this need not be considered above.
|
||||||
*/
|
*/
|
||||||
if ((int)size > cdigits)
|
if (size > cdigits)
|
||||||
{
|
{
|
||||||
while (cdigits > 0) *ascii++ = exponent[--cdigits];
|
while (cdigits > 0) *ascii++ = exponent[--cdigits];
|
||||||
|
|
||||||
@ -4236,7 +4237,7 @@ png_set_option(png_structrp png_ptr, int option, int onoff)
|
|||||||
* contrib/tools/makesRGB.c. The actual sRGB transfer curve defined in the
|
* contrib/tools/makesRGB.c. The actual sRGB transfer curve defined in the
|
||||||
* specification (see the article at http://en.wikipedia.org/wiki/SRGB)
|
* specification (see the article at http://en.wikipedia.org/wiki/SRGB)
|
||||||
* is used, not the gamma=1/2.2 approximation use elsewhere in libpng.
|
* is used, not the gamma=1/2.2 approximation use elsewhere in libpng.
|
||||||
* The sRGB to linear table is exact (to the nearest 16 bit linear fraction).
|
* The sRGB to linear table is exact (to the nearest 16-bit linear fraction).
|
||||||
* The inverse (linear to sRGB) table has accuracies as follows:
|
* The inverse (linear to sRGB) table has accuracies as follows:
|
||||||
*
|
*
|
||||||
* For all possible (255*65535+1) input values:
|
* For all possible (255*65535+1) input values:
|
||||||
|
|||||||
107
png.h
107
png.h
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* png.h - header file for PNG reference library
|
/* png.h - header file for PNG reference library
|
||||||
*
|
*
|
||||||
* libpng version 1.6.17, March 26, 2015
|
* libpng version 1.6.18, July 23, 2015
|
||||||
*
|
*
|
||||||
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
@ -11,8 +11,8 @@
|
|||||||
*
|
*
|
||||||
* Authors and maintainers:
|
* Authors and maintainers:
|
||||||
* libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat
|
* libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat
|
||||||
* libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger
|
* libpng versions 0.89, June 1996, through 0.96, May 1997: Andreas Dilger
|
||||||
* libpng versions 0.97, January 1998, through 1.6.17, March 26, 2015: Glenn
|
* libpng versions 0.97, January 1998, through 1.6.18, July 23, 2015: Glenn
|
||||||
* See also "Contributing Authors", below.
|
* See also "Contributing Authors", below.
|
||||||
*
|
*
|
||||||
* Note about libpng version numbers:
|
* Note about libpng version numbers:
|
||||||
@ -216,6 +216,9 @@
|
|||||||
* 1.6.17beta01-06 16 10617 16.so.16.17[.0]
|
* 1.6.17beta01-06 16 10617 16.so.16.17[.0]
|
||||||
* 1.6.17rc01-06 16 10617 16.so.16.17[.0]
|
* 1.6.17rc01-06 16 10617 16.so.16.17[.0]
|
||||||
* 1.6.17 16 10617 16.so.16.17[.0]
|
* 1.6.17 16 10617 16.so.16.17[.0]
|
||||||
|
* 1.6.18beta01-09 16 10618 16.so.16.18[.0]
|
||||||
|
* 1.6.18rc01-03 16 10618 16.so.16.18[.0]
|
||||||
|
* 1.6.18 16 10618 16.so.16.18[.0]
|
||||||
*
|
*
|
||||||
* Henceforth the source version will match the shared-library major
|
* Henceforth the source version will match the shared-library major
|
||||||
* and minor numbers; the shared-library major version number will be
|
* and minor numbers; the shared-library major version number will be
|
||||||
@ -247,21 +250,16 @@
|
|||||||
*
|
*
|
||||||
* This code is released under the libpng license.
|
* This code is released under the libpng license.
|
||||||
*
|
*
|
||||||
* libpng versions 1.2.6, August 15, 2004, through 1.6.17, March 26, 2015, are
|
* libpng versions 1.0.7, July 1, 2000, through 1.6.18, July 23, 2015, are
|
||||||
* Copyright (c) 2004, 2006-2015 Glenn Randers-Pehrson, and are
|
* Copyright (c) 2000-2002, 2004, 2006-2015 Glenn Randers-Pehrson, and are
|
||||||
* distributed according to the same disclaimer and license as libpng-1.2.5
|
|
||||||
* with the following individual added to the list of Contributing Authors:
|
|
||||||
*
|
|
||||||
* Cosmin Truta
|
|
||||||
*
|
|
||||||
* libpng versions 1.0.7, July 1, 2000, through 1.2.5, October 3, 2002, are
|
|
||||||
* Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
|
|
||||||
* distributed according to the same disclaimer and license as libpng-1.0.6
|
* distributed according to the same disclaimer and license as libpng-1.0.6
|
||||||
* with the following individuals added to the list of Contributing Authors:
|
* with the following individuals added to the list of Contributing Authors:
|
||||||
*
|
*
|
||||||
* Simon-Pierre Cadieux
|
* Simon-Pierre Cadieux
|
||||||
* Eric S. Raymond
|
* Mans Rullgard
|
||||||
|
* Cosmin Truta
|
||||||
* Gilles Vollant
|
* Gilles Vollant
|
||||||
|
* James Yu
|
||||||
*
|
*
|
||||||
* and with the following additions to the disclaimer:
|
* and with the following additions to the disclaimer:
|
||||||
*
|
*
|
||||||
@ -273,17 +271,18 @@
|
|||||||
* the user.
|
* the user.
|
||||||
*
|
*
|
||||||
* libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
|
* libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
|
||||||
* Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson, and are
|
* Copyright (c) 1998-2000 Glenn Randers-Pehrson, and are distributed according
|
||||||
* distributed according to the same disclaimer and license as libpng-0.96,
|
* to the same disclaimer and license as libpng-0.96, with the following
|
||||||
* with the following individuals added to the list of Contributing Authors:
|
* individuals added to the list of Contributing Authors:
|
||||||
*
|
*
|
||||||
* Tom Lane
|
* Tom Lane
|
||||||
* Glenn Randers-Pehrson
|
* Glenn Randers-Pehrson
|
||||||
|
* Eric S. Raymond
|
||||||
* Willem van Schaik
|
* Willem van Schaik
|
||||||
*
|
*
|
||||||
* libpng versions 0.89, June 1996, through 0.96, May 1997, are
|
* libpng versions 0.89, June 1996, through 0.96, May 1997, are
|
||||||
* Copyright (c) 1996, 1997 Andreas Dilger
|
* Copyright (c) 1996-1997 Andreas Dilger, and are
|
||||||
* Distributed according to the same disclaimer and license as libpng-0.88,
|
* distributed according to the same disclaimer and license as libpng-0.88,
|
||||||
* with the following individuals added to the list of Contributing Authors:
|
* with the following individuals added to the list of Contributing Authors:
|
||||||
*
|
*
|
||||||
* John Bowler
|
* John Bowler
|
||||||
@ -294,7 +293,7 @@
|
|||||||
* Tom Tanner
|
* Tom Tanner
|
||||||
*
|
*
|
||||||
* libpng versions 0.5, May 1995, through 0.88, January 1996, are
|
* libpng versions 0.5, May 1995, through 0.88, January 1996, are
|
||||||
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
* Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
|
||||||
*
|
*
|
||||||
* For the purposes of this copyright and license, "Contributing Authors"
|
* For the purposes of this copyright and license, "Contributing Authors"
|
||||||
* is defined as the following set of individuals:
|
* is defined as the following set of individuals:
|
||||||
@ -322,8 +321,8 @@
|
|||||||
* 2. Altered versions must be plainly marked as such and must not
|
* 2. Altered versions must be plainly marked as such and must not
|
||||||
* be misrepresented as being the original source.
|
* be misrepresented as being the original source.
|
||||||
*
|
*
|
||||||
* 3. This Copyright notice may not be removed or altered from
|
* 3. This Copyright notice may not be removed or altered from any
|
||||||
* any source or altered source distribution.
|
* source or altered source distribution.
|
||||||
*
|
*
|
||||||
* The Contributing Authors and Group 42, Inc. specifically permit, without
|
* The Contributing Authors and Group 42, Inc. specifically permit, without
|
||||||
* fee, and encourage the use of this source code as a component to
|
* fee, and encourage the use of this source code as a component to
|
||||||
@ -336,15 +335,16 @@
|
|||||||
* A "png_get_copyright" function is available, for convenient use in "about"
|
* A "png_get_copyright" function is available, for convenient use in "about"
|
||||||
* boxes and the like:
|
* boxes and the like:
|
||||||
*
|
*
|
||||||
* printf("%s", png_get_copyright(NULL));
|
* printf("%s", png_get_copyright(NULL));
|
||||||
*
|
*
|
||||||
* Also, the PNG logo (in PNG format, of course) is supplied in the
|
* Also, the PNG logo (in PNG format, of course) is supplied in the
|
||||||
* files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
|
* files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Libpng is OSI Certified Open Source Software. OSI Certified is a
|
* Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
|
||||||
* certification mark of the Open Source Initiative.
|
* a certification mark of the Open Source Initiative. OSI has not addressed
|
||||||
|
* the additional disclaimers inserted at version 1.0.7.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -359,13 +359,13 @@
|
|||||||
* Y2K compliance in libpng:
|
* Y2K compliance in libpng:
|
||||||
* =========================
|
* =========================
|
||||||
*
|
*
|
||||||
* March 26, 2015
|
* July 23, 2015
|
||||||
*
|
*
|
||||||
* Since the PNG Development group is an ad-hoc body, we can't make
|
* Since the PNG Development group is an ad-hoc body, we can't make
|
||||||
* an official declaration.
|
* an official declaration.
|
||||||
*
|
*
|
||||||
* This is your unofficial assurance that libpng from version 0.71 and
|
* This is your unofficial assurance that libpng from version 0.71 and
|
||||||
* upward through 1.6.17 are Y2K compliant. It is my belief that
|
* upward through 1.6.18 are Y2K compliant. It is my belief that
|
||||||
* earlier versions were also Y2K compliant.
|
* earlier versions were also Y2K compliant.
|
||||||
*
|
*
|
||||||
* Libpng only has two year fields. One is a 2-byte unsigned integer
|
* Libpng only has two year fields. One is a 2-byte unsigned integer
|
||||||
@ -427,9 +427,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* Version information for png.h - this should match the version in png.c */
|
/* Version information for png.h - this should match the version in png.c */
|
||||||
#define PNG_LIBPNG_VER_STRING "1.6.17"
|
#define PNG_LIBPNG_VER_STRING "1.6.18"
|
||||||
#define PNG_HEADER_VERSION_STRING \
|
#define PNG_HEADER_VERSION_STRING \
|
||||||
" libpng version 1.6.17 - March 26, 2015\n"
|
" libpng version 1.6.18 - July 23, 2015\n"
|
||||||
|
|
||||||
#define PNG_LIBPNG_VER_SONUM 16
|
#define PNG_LIBPNG_VER_SONUM 16
|
||||||
#define PNG_LIBPNG_VER_DLLNUM 16
|
#define PNG_LIBPNG_VER_DLLNUM 16
|
||||||
@ -437,7 +437,7 @@
|
|||||||
/* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
|
/* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
|
||||||
#define PNG_LIBPNG_VER_MAJOR 1
|
#define PNG_LIBPNG_VER_MAJOR 1
|
||||||
#define PNG_LIBPNG_VER_MINOR 6
|
#define PNG_LIBPNG_VER_MINOR 6
|
||||||
#define PNG_LIBPNG_VER_RELEASE 17
|
#define PNG_LIBPNG_VER_RELEASE 18
|
||||||
|
|
||||||
/* This should match the numeric part of the final component of
|
/* This should match the numeric part of the final component of
|
||||||
* PNG_LIBPNG_VER_STRING, omitting any leading zero:
|
* PNG_LIBPNG_VER_STRING, omitting any leading zero:
|
||||||
@ -468,7 +468,7 @@
|
|||||||
* version 1.0.0 was mis-numbered 100 instead of 10000). From
|
* version 1.0.0 was mis-numbered 100 instead of 10000). From
|
||||||
* version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release
|
* version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release
|
||||||
*/
|
*/
|
||||||
#define PNG_LIBPNG_VER 10617 /* 1.6.17 */
|
#define PNG_LIBPNG_VER 10618 /* 1.6.18 */
|
||||||
|
|
||||||
/* Library configuration: these options cannot be changed after
|
/* Library configuration: these options cannot be changed after
|
||||||
* the library has been built.
|
* the library has been built.
|
||||||
@ -573,7 +573,7 @@ extern "C" {
|
|||||||
/* This triggers a compiler error in png.c, if png.c and png.h
|
/* This triggers a compiler error in png.c, if png.c and png.h
|
||||||
* do not agree upon the version number.
|
* do not agree upon the version number.
|
||||||
*/
|
*/
|
||||||
typedef char* png_libpng_version_1_6_17;
|
typedef char* png_libpng_version_1_6_18;
|
||||||
|
|
||||||
/* Basic control structions. Read libpng-manual.txt or libpng.3 for more info.
|
/* Basic control structions. Read libpng-manual.txt or libpng.3 for more info.
|
||||||
*
|
*
|
||||||
@ -1623,35 +1623,7 @@ PNG_EXPORT(67, void, png_set_filter, (png_structrp png_ptr, int method,
|
|||||||
#define PNG_FILTER_VALUE_LAST 5
|
#define PNG_FILTER_VALUE_LAST 5
|
||||||
|
|
||||||
#ifdef PNG_WRITE_SUPPORTED
|
#ifdef PNG_WRITE_SUPPORTED
|
||||||
#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* EXPERIMENTAL */
|
#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* DEPRECATED */
|
||||||
/* The "heuristic_method" is given by one of the PNG_FILTER_HEURISTIC_
|
|
||||||
* defines, either the default (minimum-sum-of-absolute-differences), or
|
|
||||||
* the experimental method (weighted-minimum-sum-of-absolute-differences).
|
|
||||||
*
|
|
||||||
* Weights are factors >= 1.0, indicating how important it is to keep the
|
|
||||||
* filter type consistent between rows. Larger numbers mean the current
|
|
||||||
* filter is that many times as likely to be the same as the "num_weights"
|
|
||||||
* previous filters. This is cumulative for each previous row with a weight.
|
|
||||||
* There needs to be "num_weights" values in "filter_weights", or it can be
|
|
||||||
* NULL if the weights aren't being specified. Weights have no influence on
|
|
||||||
* the selection of the first row filter. Well chosen weights can (in theory)
|
|
||||||
* improve the compression for a given image.
|
|
||||||
*
|
|
||||||
* Costs are factors >= 1.0 indicating the relative decoding costs of a
|
|
||||||
* filter type. Higher costs indicate more decoding expense, and are
|
|
||||||
* therefore less likely to be selected over a filter with lower computational
|
|
||||||
* costs. There needs to be a value in "filter_costs" for each valid filter
|
|
||||||
* type (given by PNG_FILTER_VALUE_LAST), or it can be NULL if you aren't
|
|
||||||
* setting the costs. Costs try to improve the speed of decompression without
|
|
||||||
* unduly increasing the compressed image size.
|
|
||||||
*
|
|
||||||
* A negative weight or cost indicates the default value is to be used, and
|
|
||||||
* values in the range [0.0, 1.0) indicate the value is to remain unchanged.
|
|
||||||
* The default values for both weights and costs are currently 1.0, but may
|
|
||||||
* change if good general weighting/cost heuristics can be found. If both
|
|
||||||
* the weights and costs are set to 1.0, this degenerates the WEIGHTED method
|
|
||||||
* to the UNWEIGHTED method, but with added encoding time/computation.
|
|
||||||
*/
|
|
||||||
PNG_FP_EXPORT(68, void, png_set_filter_heuristics, (png_structrp png_ptr,
|
PNG_FP_EXPORT(68, void, png_set_filter_heuristics, (png_structrp png_ptr,
|
||||||
int heuristic_method, int num_weights, png_const_doublep filter_weights,
|
int heuristic_method, int num_weights, png_const_doublep filter_weights,
|
||||||
png_const_doublep filter_costs))
|
png_const_doublep filter_costs))
|
||||||
@ -1661,9 +1633,7 @@ PNG_FIXED_EXPORT(209, void, png_set_filter_heuristics_fixed,
|
|||||||
png_const_fixed_point_p filter_costs))
|
png_const_fixed_point_p filter_costs))
|
||||||
#endif /* WRITE_WEIGHTED_FILTER */
|
#endif /* WRITE_WEIGHTED_FILTER */
|
||||||
|
|
||||||
/* Heuristic used for row filter selection. These defines should NOT be
|
/* The following are no longer used and will be removed from libpng-1.7: */
|
||||||
* changed.
|
|
||||||
*/
|
|
||||||
#define PNG_FILTER_HEURISTIC_DEFAULT 0 /* Currently "UNWEIGHTED" */
|
#define PNG_FILTER_HEURISTIC_DEFAULT 0 /* Currently "UNWEIGHTED" */
|
||||||
#define PNG_FILTER_HEURISTIC_UNWEIGHTED 1 /* Used by libpng < 0.95 */
|
#define PNG_FILTER_HEURISTIC_UNWEIGHTED 1 /* Used by libpng < 0.95 */
|
||||||
#define PNG_FILTER_HEURISTIC_WEIGHTED 2 /* Experimental feature */
|
#define PNG_FILTER_HEURISTIC_WEIGHTED 2 /* Experimental feature */
|
||||||
@ -2783,8 +2753,9 @@ PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i));
|
|||||||
*
|
*
|
||||||
* To read a PNG file using the simplified API:
|
* To read a PNG file using the simplified API:
|
||||||
*
|
*
|
||||||
* 1) Declare a 'png_image' structure (see below) on the stack and set the
|
* 1) Declare a 'png_image' structure (see below) on the stack, set the
|
||||||
* version field to PNG_IMAGE_VERSION.
|
* version field to PNG_IMAGE_VERSION and the 'opaque' pointer to NULL
|
||||||
|
* (this is REQUIRED, your program may crash if you don't do it.)
|
||||||
* 2) Call the appropriate png_image_begin_read... function.
|
* 2) Call the appropriate png_image_begin_read... function.
|
||||||
* 3) Set the png_image 'format' member to the required sample format.
|
* 3) Set the png_image 'format' member to the required sample format.
|
||||||
* 4) Allocate a buffer for the image and, if required, the color-map.
|
* 4) Allocate a buffer for the image and, if required, the color-map.
|
||||||
@ -3209,9 +3180,11 @@ PNG_EXPORT(240, int, png_image_write_to_stdio, (png_imagep image, FILE *file,
|
|||||||
*
|
*
|
||||||
* With all APIs row_stride is handled as in the read APIs - it is the spacing
|
* With all APIs row_stride is handled as in the read APIs - it is the spacing
|
||||||
* from one row to the next in component sized units (1 or 2 bytes) and if
|
* from one row to the next in component sized units (1 or 2 bytes) and if
|
||||||
* negative indicates a bottom-up row layout in the buffer.
|
* negative indicates a bottom-up row layout in the buffer. If row_stride is zero,
|
||||||
|
* libpng will calculate it for you from the image width and number of channels.
|
||||||
*
|
*
|
||||||
* Note that the write API does not support interlacing or sub-8-bit pixels.
|
* Note that the write API does not support interlacing, sub-8-bit pixels, indexed
|
||||||
|
* PNG (color_type 3) or most ancillary chunks.
|
||||||
*/
|
*/
|
||||||
#endif /* STDIO */
|
#endif /* STDIO */
|
||||||
#endif /* SIMPLIFIED_WRITE */
|
#endif /* SIMPLIFIED_WRITE */
|
||||||
|
|||||||
12
pngconf.h
12
pngconf.h
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngconf.h - machine configurable file for libpng
|
/* pngconf.h - machine configurable file for libpng
|
||||||
*
|
*
|
||||||
* libpng version 1.6.17, March 26, 2015
|
* libpng version 1.6.18, July 23, 2015
|
||||||
*
|
*
|
||||||
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
@ -295,11 +295,11 @@
|
|||||||
* table entries, so we discard it here. See the .dfn files in the
|
* table entries, so we discard it here. See the .dfn files in the
|
||||||
* scripts directory.
|
* scripts directory.
|
||||||
*/
|
*/
|
||||||
#ifndef PNG_EXPORTA
|
|
||||||
|
|
||||||
# define PNG_EXPORTA(ordinal, type, name, args, attributes)\
|
#ifndef PNG_EXPORTA
|
||||||
PNG_FUNCTION(PNG_EXPORT_TYPE(type),(PNGAPI name),PNGARG(args), \
|
# define PNG_EXPORTA(ordinal, type, name, args, attributes) \
|
||||||
extern attributes)
|
PNG_FUNCTION(PNG_EXPORT_TYPE(type), (PNGAPI name), PNGARG(args), \
|
||||||
|
PNG_LINKAGE_API attributes)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* ANSI-C (C90) does not permit a macro to be invoked with an empty argument,
|
/* ANSI-C (C90) does not permit a macro to be invoked with an empty argument,
|
||||||
@ -307,7 +307,7 @@
|
|||||||
*/
|
*/
|
||||||
#define PNG_EMPTY /*empty list*/
|
#define PNG_EMPTY /*empty list*/
|
||||||
|
|
||||||
#define PNG_EXPORT(ordinal, type, name, args)\
|
#define PNG_EXPORT(ordinal, type, name, args) \
|
||||||
PNG_EXPORTA(ordinal, type, name, args, PNG_EMPTY)
|
PNG_EXPORTA(ordinal, type, name, args, PNG_EMPTY)
|
||||||
|
|
||||||
/* Use PNG_REMOVED to comment out a removed interface. */
|
/* Use PNG_REMOVED to comment out a removed interface. */
|
||||||
|
|||||||
3
pngmem.c
3
pngmem.c
@ -77,6 +77,9 @@ png_malloc_base,(png_const_structrp png_ptr, png_alloc_size_t size),
|
|||||||
PNG_UNUSED(png_ptr)
|
PNG_UNUSED(png_ptr)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Some compilers complain that this is always true. However, it
|
||||||
|
* can be false when integer overflow happens.
|
||||||
|
*/
|
||||||
if (size > 0 && size <= PNG_SIZE_MAX
|
if (size > 0 && size <= PNG_SIZE_MAX
|
||||||
# ifdef PNG_MAX_MALLOC_64K
|
# ifdef PNG_MAX_MALLOC_64K
|
||||||
&& size <= 65536U
|
&& size <= 65536U
|
||||||
|
|||||||
111
pngpread.c
111
pngpread.c
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngpread.c - read a png file in push mode
|
/* pngpread.c - read a png file in push mode
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.17 [March 26, 2015]
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
@ -19,7 +19,6 @@
|
|||||||
#define PNG_READ_SIG_MODE 0
|
#define PNG_READ_SIG_MODE 0
|
||||||
#define PNG_READ_CHUNK_MODE 1
|
#define PNG_READ_CHUNK_MODE 1
|
||||||
#define PNG_READ_IDAT_MODE 2
|
#define PNG_READ_IDAT_MODE 2
|
||||||
#define PNG_SKIP_MODE 3
|
|
||||||
#define PNG_READ_tEXt_MODE 4
|
#define PNG_READ_tEXt_MODE 4
|
||||||
#define PNG_READ_zTXt_MODE 5
|
#define PNG_READ_zTXt_MODE 5
|
||||||
#define PNG_READ_DONE_MODE 6
|
#define PNG_READ_DONE_MODE 6
|
||||||
@ -78,32 +77,14 @@ png_process_data_pause(png_structrp png_ptr, int save)
|
|||||||
png_uint_32 PNGAPI
|
png_uint_32 PNGAPI
|
||||||
png_process_data_skip(png_structrp png_ptr)
|
png_process_data_skip(png_structrp png_ptr)
|
||||||
{
|
{
|
||||||
png_uint_32 remaining = 0;
|
/* TODO: Deprecate and remove this API.
|
||||||
|
* Somewhere the implementation of this seems to have been lost,
|
||||||
if (png_ptr != NULL && png_ptr->process_mode == PNG_SKIP_MODE &&
|
* or abandoned. It was only to support some internal back-door access
|
||||||
png_ptr->skip_length > 0)
|
* to png_struct) in libpng-1.4.x.
|
||||||
{
|
*/
|
||||||
/* At the end of png_process_data the buffer size must be 0 (see the loop
|
png_app_warning(png_ptr,
|
||||||
* above) so we can detect a broken call here:
|
"png_process_data_skip is not implemented in any current version of libpng");
|
||||||
*/
|
return 0;
|
||||||
if (png_ptr->buffer_size != 0)
|
|
||||||
png_error(png_ptr,
|
|
||||||
"png_process_data_skip called inside png_process_data");
|
|
||||||
|
|
||||||
/* If is impossible for there to be a saved buffer at this point -
|
|
||||||
* otherwise we could not be in SKIP mode. This will also happen if
|
|
||||||
* png_process_skip is called inside png_process_data (but only very
|
|
||||||
* rarely.)
|
|
||||||
*/
|
|
||||||
if (png_ptr->save_buffer_size != 0)
|
|
||||||
png_error(png_ptr, "png_process_data_skip called with saved data");
|
|
||||||
|
|
||||||
remaining = png_ptr->skip_length;
|
|
||||||
png_ptr->skip_length = 0;
|
|
||||||
png_ptr->process_mode = PNG_READ_CHUNK_MODE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return remaining;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* What we do with the incoming data depends on what we were previously
|
/* What we do with the incoming data depends on what we were previously
|
||||||
@ -135,12 +116,6 @@ png_process_some_data(png_structrp png_ptr, png_inforp info_ptr)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case PNG_SKIP_MODE:
|
|
||||||
{
|
|
||||||
png_push_crc_finish(png_ptr);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
png_ptr->buffer_size = 0;
|
png_ptr->buffer_size = 0;
|
||||||
@ -159,7 +134,7 @@ void /* PRIVATE */
|
|||||||
png_push_read_sig(png_structrp png_ptr, png_inforp info_ptr)
|
png_push_read_sig(png_structrp png_ptr, png_inforp info_ptr)
|
||||||
{
|
{
|
||||||
png_size_t num_checked = png_ptr->sig_bytes, /* SAFE, does not exceed 8 */
|
png_size_t num_checked = png_ptr->sig_bytes, /* SAFE, does not exceed 8 */
|
||||||
num_to_check = 8 - num_checked;
|
num_to_check = 8 - num_checked;
|
||||||
|
|
||||||
if (png_ptr->buffer_size < num_to_check)
|
if (png_ptr->buffer_size < num_to_check)
|
||||||
{
|
{
|
||||||
@ -439,69 +414,6 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr)
|
|||||||
png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
|
png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
|
||||||
}
|
}
|
||||||
|
|
||||||
void /* PRIVATE */
|
|
||||||
png_push_crc_skip(png_structrp png_ptr, png_uint_32 skip)
|
|
||||||
{
|
|
||||||
png_ptr->process_mode = PNG_SKIP_MODE;
|
|
||||||
png_ptr->skip_length = skip;
|
|
||||||
}
|
|
||||||
|
|
||||||
void /* PRIVATE */
|
|
||||||
png_push_crc_finish(png_structrp png_ptr)
|
|
||||||
{
|
|
||||||
if (png_ptr->skip_length != 0 && png_ptr->save_buffer_size != 0)
|
|
||||||
{
|
|
||||||
png_size_t save_size = png_ptr->save_buffer_size;
|
|
||||||
png_uint_32 skip_length = png_ptr->skip_length;
|
|
||||||
|
|
||||||
/* We want the smaller of 'skip_length' and 'save_buffer_size', but
|
|
||||||
* they are of different types and we don't know which variable has the
|
|
||||||
* fewest bits. Carefully select the smaller and cast it to the type of
|
|
||||||
* the larger - this cannot overflow. Do not cast in the following test
|
|
||||||
* - it will break on either 16 or 64 bit platforms.
|
|
||||||
*/
|
|
||||||
if (skip_length < save_size)
|
|
||||||
save_size = (png_size_t)skip_length;
|
|
||||||
|
|
||||||
else
|
|
||||||
skip_length = (png_uint_32)save_size;
|
|
||||||
|
|
||||||
png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size);
|
|
||||||
|
|
||||||
png_ptr->skip_length -= skip_length;
|
|
||||||
png_ptr->buffer_size -= save_size;
|
|
||||||
png_ptr->save_buffer_size -= save_size;
|
|
||||||
png_ptr->save_buffer_ptr += save_size;
|
|
||||||
}
|
|
||||||
if (png_ptr->skip_length != 0 && png_ptr->current_buffer_size != 0)
|
|
||||||
{
|
|
||||||
png_size_t save_size = png_ptr->current_buffer_size;
|
|
||||||
png_uint_32 skip_length = png_ptr->skip_length;
|
|
||||||
|
|
||||||
/* We want the smaller of 'skip_length' and 'current_buffer_size', here,
|
|
||||||
* the same problem exists as above and the same solution.
|
|
||||||
*/
|
|
||||||
if (skip_length < save_size)
|
|
||||||
save_size = (png_size_t)skip_length;
|
|
||||||
|
|
||||||
else
|
|
||||||
skip_length = (png_uint_32)save_size;
|
|
||||||
|
|
||||||
png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size);
|
|
||||||
|
|
||||||
png_ptr->skip_length -= skip_length;
|
|
||||||
png_ptr->buffer_size -= save_size;
|
|
||||||
png_ptr->current_buffer_size -= save_size;
|
|
||||||
png_ptr->current_buffer_ptr += save_size;
|
|
||||||
}
|
|
||||||
if (png_ptr->skip_length == 0)
|
|
||||||
{
|
|
||||||
PNG_PUSH_SAVE_BUFFER_IF_LT(4)
|
|
||||||
png_crc_finish(png_ptr, 0);
|
|
||||||
png_ptr->process_mode = PNG_READ_CHUNK_MODE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void PNGCBAPI
|
void PNGCBAPI
|
||||||
png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length)
|
png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length)
|
||||||
{
|
{
|
||||||
@ -584,13 +496,11 @@ png_push_save_buffer(png_structrp png_ptr)
|
|||||||
if (png_ptr->save_buffer == NULL)
|
if (png_ptr->save_buffer == NULL)
|
||||||
{
|
{
|
||||||
png_free(png_ptr, old_buffer);
|
png_free(png_ptr, old_buffer);
|
||||||
old_buffer = NULL;
|
|
||||||
png_error(png_ptr, "Insufficient memory for save_buffer");
|
png_error(png_ptr, "Insufficient memory for save_buffer");
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size);
|
memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size);
|
||||||
png_free(png_ptr, old_buffer);
|
png_free(png_ptr, old_buffer);
|
||||||
old_buffer = NULL;
|
|
||||||
png_ptr->save_buffer_max = new_max;
|
png_ptr->save_buffer_max = new_max;
|
||||||
}
|
}
|
||||||
if (png_ptr->current_buffer_size)
|
if (png_ptr->current_buffer_size)
|
||||||
@ -696,6 +606,7 @@ png_push_read_IDAT(png_structrp png_ptr)
|
|||||||
png_ptr->current_buffer_size -= save_size;
|
png_ptr->current_buffer_size -= save_size;
|
||||||
png_ptr->current_buffer_ptr += save_size;
|
png_ptr->current_buffer_ptr += save_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (png_ptr->idat_size == 0)
|
if (png_ptr->idat_size == 0)
|
||||||
{
|
{
|
||||||
PNG_PUSH_SAVE_BUFFER_IF_LT(4)
|
PNG_PUSH_SAVE_BUFFER_IF_LT(4)
|
||||||
|
|||||||
37
pngpriv.h
37
pngpriv.h
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngpriv.h - private declarations for use inside libpng
|
/* pngpriv.h - private declarations for use inside libpng
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.17 [March 26, 2015]
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
@ -118,8 +118,12 @@
|
|||||||
* to compile with an appropriate #error if ALIGNED_MEMORY has been turned
|
* to compile with an appropriate #error if ALIGNED_MEMORY has been turned
|
||||||
* off.
|
* off.
|
||||||
*
|
*
|
||||||
* Note that gcc-4.9 defines __ARM_NEON instead of __ARM_NEON__, so we
|
* Note that gcc-4.9 defines __ARM_NEON instead of the deprecated
|
||||||
* check both variants.
|
* __ARM_NEON__, so we check both variants.
|
||||||
|
*
|
||||||
|
* To disable ARM_NEON optimizations entirely, and skip compiling the
|
||||||
|
* associated assembler code, pass --enable-arm-neon=no to configure
|
||||||
|
* or put -DPNG_ARM_NEON_OPT=0 in CPPFLAGS.
|
||||||
*/
|
*/
|
||||||
# if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \
|
# if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \
|
||||||
defined(PNG_ALIGNED_MEMORY_SUPPORTED)
|
defined(PNG_ALIGNED_MEMORY_SUPPORTED)
|
||||||
@ -248,17 +252,18 @@
|
|||||||
* always be used to declare an extern data or function object in this file.
|
* always be used to declare an extern data or function object in this file.
|
||||||
*/
|
*/
|
||||||
#ifndef PNG_INTERNAL_DATA
|
#ifndef PNG_INTERNAL_DATA
|
||||||
# define PNG_INTERNAL_DATA(type, name, array) extern type name array
|
# define PNG_INTERNAL_DATA(type, name, array) PNG_LINKAGE_DATA type name array
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef PNG_INTERNAL_FUNCTION
|
#ifndef PNG_INTERNAL_FUNCTION
|
||||||
# define PNG_INTERNAL_FUNCTION(type, name, args, attributes)\
|
# define PNG_INTERNAL_FUNCTION(type, name, args, attributes)\
|
||||||
extern PNG_FUNCTION(type, name, args, PNG_EMPTY attributes)
|
PNG_LINKAGE_FUNCTION PNG_FUNCTION(type, name, args, PNG_EMPTY attributes)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef PNG_INTERNAL_CALLBACK
|
#ifndef PNG_INTERNAL_CALLBACK
|
||||||
# define PNG_INTERNAL_CALLBACK(type, name, args, attributes)\
|
# define PNG_INTERNAL_CALLBACK(type, name, args, attributes)\
|
||||||
extern PNG_FUNCTION(type, (PNGCBAPI name), args, PNG_EMPTY attributes)
|
PNG_LINKAGE_CALLBACK PNG_FUNCTION(type, (PNGCBAPI name), args,\
|
||||||
|
PNG_EMPTY attributes)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* If floating or fixed point APIs are disabled they may still be compiled
|
/* If floating or fixed point APIs are disabled they may still be compiled
|
||||||
@ -296,6 +301,22 @@
|
|||||||
# define PNG_DLL_EXPORT
|
# define PNG_DLL_EXPORT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* This is a global switch to set the compilation for an installed system
|
||||||
|
* (a release build). It can be set for testing debug builds to ensure that
|
||||||
|
* they will compile when the build type is switched to RC or STABLE, the
|
||||||
|
* default is just to use PNG_LIBPNG_BUILD_BASE_TYPE. Set this in CPPFLAGS
|
||||||
|
* with either:
|
||||||
|
*
|
||||||
|
* -DPNG_RELEASE_BUILD Turns on the release compile path
|
||||||
|
* -DPNG_RELEASE_BUILD=0 Turns it off
|
||||||
|
* or in your pngusr.h with
|
||||||
|
* #define PNG_RELEASE_BUILD=1 Turns on the release compile path
|
||||||
|
* #define PNG_RELEASE_BUILD=0 Turns it off
|
||||||
|
*/
|
||||||
|
#ifndef PNG_RELEASE_BUILD
|
||||||
|
# define PNG_RELEASE_BUILD (PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* SECURITY and SAFETY:
|
/* SECURITY and SAFETY:
|
||||||
*
|
*
|
||||||
* libpng is built with support for internal limits on image dimensions and
|
* libpng is built with support for internal limits on image dimensions and
|
||||||
@ -1372,10 +1393,6 @@ PNG_INTERNAL_FUNCTION(void,png_push_read_chunk,(png_structrp png_ptr,
|
|||||||
PNG_INTERNAL_FUNCTION(void,png_push_read_sig,(png_structrp png_ptr,
|
PNG_INTERNAL_FUNCTION(void,png_push_read_sig,(png_structrp png_ptr,
|
||||||
png_inforp info_ptr),PNG_EMPTY);
|
png_inforp info_ptr),PNG_EMPTY);
|
||||||
PNG_INTERNAL_FUNCTION(void,png_push_check_crc,(png_structrp png_ptr),PNG_EMPTY);
|
PNG_INTERNAL_FUNCTION(void,png_push_check_crc,(png_structrp png_ptr),PNG_EMPTY);
|
||||||
PNG_INTERNAL_FUNCTION(void,png_push_crc_skip,(png_structrp png_ptr,
|
|
||||||
png_uint_32 length),PNG_EMPTY);
|
|
||||||
PNG_INTERNAL_FUNCTION(void,png_push_crc_finish,(png_structrp png_ptr),
|
|
||||||
PNG_EMPTY);
|
|
||||||
PNG_INTERNAL_FUNCTION(void,png_push_save_buffer,(png_structrp png_ptr),
|
PNG_INTERNAL_FUNCTION(void,png_push_save_buffer,(png_structrp png_ptr),
|
||||||
PNG_EMPTY);
|
PNG_EMPTY);
|
||||||
PNG_INTERNAL_FUNCTION(void,png_push_restore_buffer,(png_structrp png_ptr,
|
PNG_INTERNAL_FUNCTION(void,png_push_restore_buffer,(png_structrp png_ptr,
|
||||||
|
|||||||
10
pngread.c
10
pngread.c
@ -63,7 +63,7 @@ png_create_read_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr,
|
|||||||
/* In stable builds only warn if an application error can be completely
|
/* In stable builds only warn if an application error can be completely
|
||||||
* handled.
|
* handled.
|
||||||
*/
|
*/
|
||||||
# if PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC
|
# if PNG_RELEASE_BUILD
|
||||||
png_ptr->flags |= PNG_FLAG_APP_WARNINGS_WARN;
|
png_ptr->flags |= PNG_FLAG_APP_WARNINGS_WARN;
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
@ -1043,9 +1043,9 @@ png_read_png(png_structrp png_ptr, png_inforp info_ptr,
|
|||||||
/* Tell libpng to strip 16-bit/color files down to 8 bits per color.
|
/* Tell libpng to strip 16-bit/color files down to 8 bits per color.
|
||||||
*/
|
*/
|
||||||
if ((transforms & PNG_TRANSFORM_SCALE_16) != 0)
|
if ((transforms & PNG_TRANSFORM_SCALE_16) != 0)
|
||||||
/* Added at libpng-1.5.4. "strip_16" produces the same result that it
|
/* Added at libpng-1.5.4. "strip_16" produces the same result that it
|
||||||
* did in earlier versions, while "scale_16" is now more accurate.
|
* did in earlier versions, while "scale_16" is now more accurate.
|
||||||
*/
|
*/
|
||||||
#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
|
#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
|
||||||
png_set_scale_16(png_ptr);
|
png_set_scale_16(png_ptr);
|
||||||
#else
|
#else
|
||||||
@ -1209,7 +1209,7 @@ png_read_png(png_structrp png_ptr, png_inforp info_ptr,
|
|||||||
|
|
||||||
for (iptr = 0; iptr < info_ptr->height; iptr++)
|
for (iptr = 0; iptr < info_ptr->height; iptr++)
|
||||||
info_ptr->row_pointers[iptr] = png_voidcast(png_bytep,
|
info_ptr->row_pointers[iptr] = png_voidcast(png_bytep,
|
||||||
png_malloc(png_ptr, info_ptr->rowbytes));
|
png_malloc(png_ptr, info_ptr->rowbytes));
|
||||||
}
|
}
|
||||||
|
|
||||||
png_read_image(png_ptr, info_ptr->row_pointers);
|
png_read_image(png_ptr, info_ptr->row_pointers);
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngrtran.c - transforms the data in a row for PNG readers
|
/* pngrtran.c - transforms the data in a row for PNG readers
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.17 [March 26, 2015]
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
@ -4460,7 +4460,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,
|
|||||||
|
|
||||||
for (i = 0; i < row_width; i++)
|
for (i = 0; i < row_width; i++)
|
||||||
{
|
{
|
||||||
if (*sp == gray)
|
if ((*sp & 0xffU) == gray)
|
||||||
*dp-- = 0;
|
*dp-- = 0;
|
||||||
|
|
||||||
else
|
else
|
||||||
@ -4478,7 +4478,8 @@ png_do_expand(png_row_infop row_info, png_bytep row,
|
|||||||
dp = row + (row_info->rowbytes << 1) - 1;
|
dp = row + (row_info->rowbytes << 1) - 1;
|
||||||
for (i = 0; i < row_width; i++)
|
for (i = 0; i < row_width; i++)
|
||||||
{
|
{
|
||||||
if (*(sp - 1) == gray_high && *(sp) == gray_low)
|
if ((*(sp - 1) & 0xffU) == gray_high &&
|
||||||
|
(*(sp) & 0xffU) == gray_low)
|
||||||
{
|
{
|
||||||
*dp-- = 0;
|
*dp-- = 0;
|
||||||
*dp-- = 0;
|
*dp-- = 0;
|
||||||
|
|||||||
356
pngrutil.c
356
pngrutil.c
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngrutil.c - utilities to read a PNG file
|
/* pngrutil.c - utilities to read a PNG file
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.17 [March 26, 2015]
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
@ -341,7 +341,7 @@ png_inflate_claim(png_structrp png_ptr, png_uint_32 owner)
|
|||||||
* are minimal.
|
* are minimal.
|
||||||
*/
|
*/
|
||||||
(void)png_safecat(msg, (sizeof msg), 4, " using zstream");
|
(void)png_safecat(msg, (sizeof msg), 4, " using zstream");
|
||||||
#if PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC
|
#if PNG_RELEASE_BUILD
|
||||||
png_chunk_warning(png_ptr, msg);
|
png_chunk_warning(png_ptr, msg);
|
||||||
png_ptr->zowner = 0;
|
png_ptr->zowner = 0;
|
||||||
#else
|
#else
|
||||||
@ -575,7 +575,7 @@ png_decompress_chunk(png_structrp png_ptr,
|
|||||||
*/
|
*/
|
||||||
png_alloc_size_t limit = PNG_SIZE_MAX;
|
png_alloc_size_t limit = PNG_SIZE_MAX;
|
||||||
|
|
||||||
# ifdef PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED
|
# ifdef PNG_SET_USER_LIMITS_SUPPORTED
|
||||||
if (png_ptr->user_chunk_malloc_max > 0 &&
|
if (png_ptr->user_chunk_malloc_max > 0 &&
|
||||||
png_ptr->user_chunk_malloc_max < limit)
|
png_ptr->user_chunk_malloc_max < limit)
|
||||||
limit = png_ptr->user_chunk_malloc_max;
|
limit = png_ptr->user_chunk_malloc_max;
|
||||||
@ -670,7 +670,6 @@ png_decompress_chunk(png_structrp png_ptr,
|
|||||||
* success)
|
* success)
|
||||||
*/
|
*/
|
||||||
png_free(png_ptr, text);
|
png_free(png_ptr, text);
|
||||||
text = NULL;
|
|
||||||
|
|
||||||
/* This really is very benign, but it's still an error because
|
/* This really is very benign, but it's still an error because
|
||||||
* the extra space may otherwise be used as a Trojan Horse.
|
* the extra space may otherwise be used as a Trojan Horse.
|
||||||
@ -1147,11 +1146,13 @@ png_handle_sBIT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
for (i=0; i<truelen; ++i)
|
for (i=0; i<truelen; ++i)
|
||||||
|
{
|
||||||
if (buf[i] == 0 || buf[i] > sample_depth)
|
if (buf[i] == 0 || buf[i] > sample_depth)
|
||||||
{
|
{
|
||||||
png_chunk_benign_error(png_ptr, "invalid");
|
png_chunk_benign_error(png_ptr, "invalid");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)
|
if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)
|
||||||
{
|
{
|
||||||
@ -1462,10 +1463,10 @@ png_handle_iCCP(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
|||||||
finished = 1;
|
finished = 1;
|
||||||
|
|
||||||
# ifdef PNG_sRGB_SUPPORTED
|
# ifdef PNG_sRGB_SUPPORTED
|
||||||
/* Check for a match against sRGB */
|
/* Check for a match against sRGB */
|
||||||
png_icc_set_sRGB(png_ptr,
|
png_icc_set_sRGB(png_ptr,
|
||||||
&png_ptr->colorspace, profile,
|
&png_ptr->colorspace, profile,
|
||||||
png_ptr->zstream.adler);
|
png_ptr->zstream.adler);
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
/* Steal the profile for info_ptr. */
|
/* Steal the profile for info_ptr. */
|
||||||
@ -1675,8 +1676,8 @@ png_handle_sPLT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
|||||||
|
|
||||||
if (dl > max_dl)
|
if (dl > max_dl)
|
||||||
{
|
{
|
||||||
png_warning(png_ptr, "sPLT chunk too long");
|
png_warning(png_ptr, "sPLT chunk too long");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
new_palette.nentries = (png_int_32)(data_length / entry_size);
|
new_palette.nentries = (png_int_32)(data_length / entry_size);
|
||||||
@ -1686,8 +1687,8 @@ png_handle_sPLT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
|||||||
|
|
||||||
if (new_palette.entries == NULL)
|
if (new_palette.entries == NULL)
|
||||||
{
|
{
|
||||||
png_warning(png_ptr, "sPLT chunk requires too much memory");
|
png_warning(png_ptr, "sPLT chunk requires too much memory");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef PNG_POINTER_INDEXING_SUPPORTED
|
#ifdef PNG_POINTER_INDEXING_SUPPORTED
|
||||||
@ -1817,7 +1818,8 @@ png_handle_tRNS(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (length > png_ptr->num_palette || length > PNG_MAX_PALETTE_LENGTH ||
|
if (length > png_ptr->num_palette ||
|
||||||
|
length > (unsigned int) PNG_MAX_PALETTE_LENGTH ||
|
||||||
length == 0)
|
length == 0)
|
||||||
{
|
{
|
||||||
png_crc_finish(png_ptr, length);
|
png_crc_finish(png_ptr, length);
|
||||||
@ -1980,7 +1982,7 @@ png_handle_hIST(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
|||||||
|
|
||||||
num = length / 2 ;
|
num = length / 2 ;
|
||||||
|
|
||||||
if (num != png_ptr->num_palette || num > PNG_MAX_PALETTE_LENGTH)
|
if (num != png_ptr->num_palette || num > (unsigned int) PNG_MAX_PALETTE_LENGTH)
|
||||||
{
|
{
|
||||||
png_crc_finish(png_ptr, length);
|
png_crc_finish(png_ptr, length);
|
||||||
png_chunk_benign_error(png_ptr, "invalid");
|
png_chunk_benign_error(png_ptr, "invalid");
|
||||||
@ -2715,14 +2717,14 @@ png_cache_unknown_chunk(png_structrp png_ptr, png_uint_32 length)
|
|||||||
png_ptr->unknown_chunk.data = NULL;
|
png_ptr->unknown_chunk.data = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifdef PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED
|
# ifdef PNG_SET_USER_LIMITS_SUPPORTED
|
||||||
if (png_ptr->user_chunk_malloc_max > 0 &&
|
if (png_ptr->user_chunk_malloc_max > 0 &&
|
||||||
png_ptr->user_chunk_malloc_max < limit)
|
png_ptr->user_chunk_malloc_max < limit)
|
||||||
limit = png_ptr->user_chunk_malloc_max;
|
limit = png_ptr->user_chunk_malloc_max;
|
||||||
|
|
||||||
# elif PNG_USER_CHUNK_MALLOC_MAX > 0
|
# elif PNG_USER_CHUNK_MALLOC_MAX > 0
|
||||||
if (PNG_USER_CHUNK_MALLOC_MAX < limit)
|
if (PNG_USER_CHUNK_MALLOC_MAX < limit)
|
||||||
limit = PNG_USER_CHUNK_MALLOC_MAX;
|
limit = PNG_USER_CHUNK_MALLOC_MAX;
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
if (length <= limit)
|
if (length <= limit)
|
||||||
@ -2785,7 +2787,7 @@ png_handle_unknown(png_structrp png_ptr, png_inforp info_ptr,
|
|||||||
*/
|
*/
|
||||||
# ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
|
# ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
|
||||||
# ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
|
# ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
|
||||||
keep = png_chunk_unknown_handling(png_ptr, png_ptr->chunk_name);
|
keep = png_chunk_unknown_handling(png_ptr, png_ptr->chunk_name);
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
@ -2794,153 +2796,153 @@ png_handle_unknown(png_structrp png_ptr, png_inforp info_ptr,
|
|||||||
* PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
|
* PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
|
||||||
*/
|
*/
|
||||||
# ifdef PNG_READ_USER_CHUNKS_SUPPORTED
|
# ifdef PNG_READ_USER_CHUNKS_SUPPORTED
|
||||||
/* The user callback takes precedence over the chunk keep value, but the
|
/* The user callback takes precedence over the chunk keep value, but the
|
||||||
* keep value is still required to validate a save of a critical chunk.
|
* keep value is still required to validate a save of a critical chunk.
|
||||||
*/
|
*/
|
||||||
if (png_ptr->read_user_chunk_fn != NULL)
|
if (png_ptr->read_user_chunk_fn != NULL)
|
||||||
|
{
|
||||||
|
if (png_cache_unknown_chunk(png_ptr, length) != 0)
|
||||||
{
|
{
|
||||||
if (png_cache_unknown_chunk(png_ptr, length) != 0)
|
/* Callback to user unknown chunk handler */
|
||||||
|
int ret = (*(png_ptr->read_user_chunk_fn))(png_ptr,
|
||||||
|
&png_ptr->unknown_chunk);
|
||||||
|
|
||||||
|
/* ret is:
|
||||||
|
* negative: An error occurred; png_chunk_error will be called.
|
||||||
|
* zero: The chunk was not handled, the chunk will be discarded
|
||||||
|
* unless png_set_keep_unknown_chunks has been used to set
|
||||||
|
* a 'keep' behavior for this particular chunk, in which
|
||||||
|
* case that will be used. A critical chunk will cause an
|
||||||
|
* error at this point unless it is to be saved.
|
||||||
|
* positive: The chunk was handled, libpng will ignore/discard it.
|
||||||
|
*/
|
||||||
|
if (ret < 0)
|
||||||
|
png_chunk_error(png_ptr, "error in user chunk");
|
||||||
|
|
||||||
|
else if (ret == 0)
|
||||||
{
|
{
|
||||||
/* Callback to user unknown chunk handler */
|
/* If the keep value is 'default' or 'never' override it, but
|
||||||
int ret = (*(png_ptr->read_user_chunk_fn))(png_ptr,
|
* still error out on critical chunks unless the keep value is
|
||||||
&png_ptr->unknown_chunk);
|
* 'always' While this is weird it is the behavior in 1.4.12.
|
||||||
|
* A possible improvement would be to obey the value set for the
|
||||||
/* ret is:
|
* chunk, but this would be an API change that would probably
|
||||||
* negative: An error occurred; png_chunk_error will be called.
|
* damage some applications.
|
||||||
* zero: The chunk was not handled, the chunk will be discarded
|
*
|
||||||
* unless png_set_keep_unknown_chunks has been used to set
|
* The png_app_warning below catches the case that matters, where
|
||||||
* a 'keep' behavior for this particular chunk, in which
|
* the application has not set specific save or ignore for this
|
||||||
* case that will be used. A critical chunk will cause an
|
* chunk or global save or ignore.
|
||||||
* error at this point unless it is to be saved.
|
|
||||||
* positive: The chunk was handled, libpng will ignore/discard it.
|
|
||||||
*/
|
*/
|
||||||
if (ret < 0)
|
if (keep < PNG_HANDLE_CHUNK_IF_SAFE)
|
||||||
png_chunk_error(png_ptr, "error in user chunk");
|
|
||||||
|
|
||||||
else if (ret == 0)
|
|
||||||
{
|
{
|
||||||
/* If the keep value is 'default' or 'never' override it, but
|
# ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
|
||||||
* still error out on critical chunks unless the keep value is
|
if (png_ptr->unknown_default < PNG_HANDLE_CHUNK_IF_SAFE)
|
||||||
* 'always' While this is weird it is the behavior in 1.4.12.
|
|
||||||
* A possible improvement would be to obey the value set for the
|
|
||||||
* chunk, but this would be an API change that would probably
|
|
||||||
* damage some applications.
|
|
||||||
*
|
|
||||||
* The png_app_warning below catches the case that matters, where
|
|
||||||
* the application has not set specific save or ignore for this
|
|
||||||
* chunk or global save or ignore.
|
|
||||||
*/
|
|
||||||
if (keep < PNG_HANDLE_CHUNK_IF_SAFE)
|
|
||||||
{
|
{
|
||||||
# ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
|
png_chunk_warning(png_ptr, "Saving unknown chunk:");
|
||||||
if (png_ptr->unknown_default < PNG_HANDLE_CHUNK_IF_SAFE)
|
png_app_warning(png_ptr,
|
||||||
{
|
"forcing save of an unhandled chunk;"
|
||||||
png_chunk_warning(png_ptr, "Saving unknown chunk:");
|
" please call png_set_keep_unknown_chunks");
|
||||||
png_app_warning(png_ptr,
|
/* with keep = PNG_HANDLE_CHUNK_IF_SAFE */
|
||||||
"forcing save of an unhandled chunk;"
|
|
||||||
" please call png_set_keep_unknown_chunks");
|
|
||||||
/* with keep = PNG_HANDLE_CHUNK_IF_SAFE */
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
keep = PNG_HANDLE_CHUNK_IF_SAFE;
|
|
||||||
}
|
}
|
||||||
}
|
# endif
|
||||||
|
keep = PNG_HANDLE_CHUNK_IF_SAFE;
|
||||||
else /* chunk was handled */
|
|
||||||
{
|
|
||||||
handled = 1;
|
|
||||||
/* Critical chunks can be safely discarded at this point. */
|
|
||||||
keep = PNG_HANDLE_CHUNK_NEVER;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else /* chunk was handled */
|
||||||
keep = PNG_HANDLE_CHUNK_NEVER; /* insufficient memory */
|
{
|
||||||
|
handled = 1;
|
||||||
|
/* Critical chunks can be safely discarded at this point. */
|
||||||
|
keep = PNG_HANDLE_CHUNK_NEVER;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
/* Use the SAVE_UNKNOWN_CHUNKS code or skip the chunk */
|
keep = PNG_HANDLE_CHUNK_NEVER; /* insufficient memory */
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
/* Use the SAVE_UNKNOWN_CHUNKS code or skip the chunk */
|
||||||
# endif /* READ_USER_CHUNKS */
|
# endif /* READ_USER_CHUNKS */
|
||||||
|
|
||||||
# ifdef PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED
|
# ifdef PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED
|
||||||
|
{
|
||||||
|
/* keep is currently just the per-chunk setting, if there was no
|
||||||
|
* setting change it to the global default now (not that this may
|
||||||
|
* still be AS_DEFAULT) then obtain the cache of the chunk if required,
|
||||||
|
* if not simply skip the chunk.
|
||||||
|
*/
|
||||||
|
if (keep == PNG_HANDLE_CHUNK_AS_DEFAULT)
|
||||||
|
keep = png_ptr->unknown_default;
|
||||||
|
|
||||||
|
if (keep == PNG_HANDLE_CHUNK_ALWAYS ||
|
||||||
|
(keep == PNG_HANDLE_CHUNK_IF_SAFE &&
|
||||||
|
PNG_CHUNK_ANCILLARY(png_ptr->chunk_name)))
|
||||||
{
|
{
|
||||||
/* keep is currently just the per-chunk setting, if there was no
|
if (png_cache_unknown_chunk(png_ptr, length) == 0)
|
||||||
* setting change it to the global default now (not that this may
|
keep = PNG_HANDLE_CHUNK_NEVER;
|
||||||
* still be AS_DEFAULT) then obtain the cache of the chunk if required,
|
|
||||||
* if not simply skip the chunk.
|
|
||||||
*/
|
|
||||||
if (keep == PNG_HANDLE_CHUNK_AS_DEFAULT)
|
|
||||||
keep = png_ptr->unknown_default;
|
|
||||||
|
|
||||||
if (keep == PNG_HANDLE_CHUNK_ALWAYS ||
|
|
||||||
(keep == PNG_HANDLE_CHUNK_IF_SAFE &&
|
|
||||||
PNG_CHUNK_ANCILLARY(png_ptr->chunk_name)))
|
|
||||||
{
|
|
||||||
if (png_cache_unknown_chunk(png_ptr, length) == 0)
|
|
||||||
keep = PNG_HANDLE_CHUNK_NEVER;
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
png_crc_finish(png_ptr, length);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
png_crc_finish(png_ptr, length);
|
||||||
|
}
|
||||||
# else
|
# else
|
||||||
# ifndef PNG_READ_USER_CHUNKS_SUPPORTED
|
# ifndef PNG_READ_USER_CHUNKS_SUPPORTED
|
||||||
# error no method to support READ_UNKNOWN_CHUNKS
|
# error no method to support READ_UNKNOWN_CHUNKS
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
{
|
{
|
||||||
/* If here there is no read callback pointer set and no support is
|
/* If here there is no read callback pointer set and no support is
|
||||||
* compiled in to just save the unknown chunks, so simply skip this
|
* compiled in to just save the unknown chunks, so simply skip this
|
||||||
* chunk. If 'keep' is something other than AS_DEFAULT or NEVER then
|
* chunk. If 'keep' is something other than AS_DEFAULT or NEVER then
|
||||||
* the app has erroneously asked for unknown chunk saving when there
|
* the app has erroneously asked for unknown chunk saving when there
|
||||||
* is no support.
|
* is no support.
|
||||||
*/
|
*/
|
||||||
if (keep > PNG_HANDLE_CHUNK_NEVER)
|
if (keep > PNG_HANDLE_CHUNK_NEVER)
|
||||||
png_app_error(png_ptr, "no unknown chunk support available");
|
png_app_error(png_ptr, "no unknown chunk support available");
|
||||||
|
|
||||||
png_crc_finish(png_ptr, length);
|
png_crc_finish(png_ptr, length);
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
|
# ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
|
||||||
/* Now store the chunk in the chunk list if appropriate, and if the limits
|
/* Now store the chunk in the chunk list if appropriate, and if the limits
|
||||||
* permit it.
|
* permit it.
|
||||||
*/
|
*/
|
||||||
if (keep == PNG_HANDLE_CHUNK_ALWAYS ||
|
if (keep == PNG_HANDLE_CHUNK_ALWAYS ||
|
||||||
(keep == PNG_HANDLE_CHUNK_IF_SAFE &&
|
(keep == PNG_HANDLE_CHUNK_IF_SAFE &&
|
||||||
PNG_CHUNK_ANCILLARY(png_ptr->chunk_name)))
|
PNG_CHUNK_ANCILLARY(png_ptr->chunk_name)))
|
||||||
|
{
|
||||||
|
# ifdef PNG_USER_LIMITS_SUPPORTED
|
||||||
|
switch (png_ptr->user_chunk_cache_max)
|
||||||
{
|
{
|
||||||
# ifdef PNG_USER_LIMITS_SUPPORTED
|
case 2:
|
||||||
switch (png_ptr->user_chunk_cache_max)
|
png_ptr->user_chunk_cache_max = 1;
|
||||||
{
|
png_chunk_benign_error(png_ptr, "no space in chunk cache");
|
||||||
case 2:
|
/* FALL THROUGH */
|
||||||
png_ptr->user_chunk_cache_max = 1;
|
case 1:
|
||||||
png_chunk_benign_error(png_ptr, "no space in chunk cache");
|
/* NOTE: prior to 1.6.0 this case resulted in an unknown critical
|
||||||
/* FALL THROUGH */
|
* chunk being skipped, now there will be a hard error below.
|
||||||
case 1:
|
*/
|
||||||
/* NOTE: prior to 1.6.0 this case resulted in an unknown critical
|
break;
|
||||||
* chunk being skipped, now there will be a hard error below.
|
|
||||||
*/
|
|
||||||
break;
|
|
||||||
|
|
||||||
default: /* not at limit */
|
default: /* not at limit */
|
||||||
--(png_ptr->user_chunk_cache_max);
|
--(png_ptr->user_chunk_cache_max);
|
||||||
/* FALL THROUGH */
|
/* FALL THROUGH */
|
||||||
case 0: /* no limit */
|
case 0: /* no limit */
|
||||||
# endif /* USER_LIMITS */
|
# endif /* USER_LIMITS */
|
||||||
/* Here when the limit isn't reached or when limits are compiled
|
/* Here when the limit isn't reached or when limits are compiled
|
||||||
* out; store the chunk.
|
* out; store the chunk.
|
||||||
*/
|
*/
|
||||||
png_set_unknown_chunks(png_ptr, info_ptr,
|
png_set_unknown_chunks(png_ptr, info_ptr,
|
||||||
&png_ptr->unknown_chunk, 1);
|
&png_ptr->unknown_chunk, 1);
|
||||||
handled = 1;
|
handled = 1;
|
||||||
# ifdef PNG_USER_LIMITS_SUPPORTED
|
# ifdef PNG_USER_LIMITS_SUPPORTED
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
# endif
|
|
||||||
}
|
}
|
||||||
|
# endif
|
||||||
|
}
|
||||||
# else /* no store support: the chunk must be handled by the user callback */
|
# else /* no store support: the chunk must be handled by the user callback */
|
||||||
PNG_UNUSED(info_ptr)
|
PNG_UNUSED(info_ptr)
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
/* Regardless of the error handling below the cached data (if any) can be
|
/* Regardless of the error handling below the cached data (if any) can be
|
||||||
@ -3042,13 +3044,13 @@ png_combine_row(png_const_structrp png_ptr, png_bytep dp, int display)
|
|||||||
end_ptr = dp + PNG_ROWBYTES(pixel_depth, row_width) - 1;
|
end_ptr = dp + PNG_ROWBYTES(pixel_depth, row_width) - 1;
|
||||||
end_byte = *end_ptr;
|
end_byte = *end_ptr;
|
||||||
# ifdef PNG_READ_PACKSWAP_SUPPORTED
|
# ifdef PNG_READ_PACKSWAP_SUPPORTED
|
||||||
if ((png_ptr->transformations & PNG_PACKSWAP) != 0)
|
if ((png_ptr->transformations & PNG_PACKSWAP) != 0)
|
||||||
/* little-endian byte */
|
/* little-endian byte */
|
||||||
end_mask = 0xff << end_mask;
|
end_mask = 0xff << end_mask;
|
||||||
|
|
||||||
else /* big-endian byte */
|
else /* big-endian byte */
|
||||||
# endif
|
# endif
|
||||||
end_mask = 0xff >> end_mask;
|
end_mask = 0xff >> end_mask;
|
||||||
/* end_mask is now the bits to *keep* from the destination row */
|
/* end_mask is now the bits to *keep* from the destination row */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3206,12 +3208,12 @@ png_combine_row(png_const_structrp png_ptr, png_bytep dp, int display)
|
|||||||
png_uint_32 mask;
|
png_uint_32 mask;
|
||||||
|
|
||||||
# ifdef PNG_READ_PACKSWAP_SUPPORTED
|
# ifdef PNG_READ_PACKSWAP_SUPPORTED
|
||||||
if ((png_ptr->transformations & PNG_PACKSWAP) != 0)
|
if ((png_ptr->transformations & PNG_PACKSWAP) != 0)
|
||||||
mask = MASK(pass, pixel_depth, display, 0);
|
mask = MASK(pass, pixel_depth, display, 0);
|
||||||
|
|
||||||
else
|
else
|
||||||
# endif
|
# endif
|
||||||
mask = MASK(pass, pixel_depth, display, 1);
|
mask = MASK(pass, pixel_depth, display, 1);
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
@ -3812,15 +3814,15 @@ png_read_filter_row_paeth_1byte_pixel(png_row_infop row_info, png_bytep row,
|
|||||||
p = b - c;
|
p = b - c;
|
||||||
pc = a - c;
|
pc = a - c;
|
||||||
|
|
||||||
# ifdef PNG_USE_ABS
|
#ifdef PNG_USE_ABS
|
||||||
pa = abs(p);
|
pa = abs(p);
|
||||||
pb = abs(pc);
|
pb = abs(pc);
|
||||||
pc = abs(p + pc);
|
pc = abs(p + pc);
|
||||||
# else
|
#else
|
||||||
pa = p < 0 ? -p : p;
|
pa = p < 0 ? -p : p;
|
||||||
pb = pc < 0 ? -pc : pc;
|
pb = pc < 0 ? -pc : pc;
|
||||||
pc = (p + pc) < 0 ? -(p + pc) : p + pc;
|
pc = (p + pc) < 0 ? -(p + pc) : p + pc;
|
||||||
# endif
|
#endif
|
||||||
|
|
||||||
/* Find the best predictor, the least of pa, pb, pc favoring the earlier
|
/* Find the best predictor, the least of pa, pb, pc favoring the earlier
|
||||||
* ones in the case of a tie.
|
* ones in the case of a tie.
|
||||||
@ -3867,15 +3869,15 @@ png_read_filter_row_paeth_multibyte_pixel(png_row_infop row_info, png_bytep row,
|
|||||||
p = b - c;
|
p = b - c;
|
||||||
pc = a - c;
|
pc = a - c;
|
||||||
|
|
||||||
# ifdef PNG_USE_ABS
|
#ifdef PNG_USE_ABS
|
||||||
pa = abs(p);
|
pa = abs(p);
|
||||||
pb = abs(pc);
|
pb = abs(pc);
|
||||||
pc = abs(p + pc);
|
pc = abs(p + pc);
|
||||||
# else
|
#else
|
||||||
pa = p < 0 ? -p : p;
|
pa = p < 0 ? -p : p;
|
||||||
pb = pc < 0 ? -pc : pc;
|
pb = pc < 0 ? -pc : pc;
|
||||||
pc = (p + pc) < 0 ? -(p + pc) : p + pc;
|
pc = (p + pc) < 0 ? -(p + pc) : p + pc;
|
||||||
# endif
|
#endif
|
||||||
|
|
||||||
if (pb < pa) pa = pb, a = b;
|
if (pb < pa) pa = pb, a = b;
|
||||||
if (pc < pa) a = c;
|
if (pc < pa) a = c;
|
||||||
@ -4280,18 +4282,18 @@ png_read_start_row(png_structrp png_ptr)
|
|||||||
#ifdef PNG_READ_EXPAND_16_SUPPORTED
|
#ifdef PNG_READ_EXPAND_16_SUPPORTED
|
||||||
if ((png_ptr->transformations & PNG_EXPAND_16) != 0)
|
if ((png_ptr->transformations & PNG_EXPAND_16) != 0)
|
||||||
{
|
{
|
||||||
# ifdef PNG_READ_EXPAND_SUPPORTED
|
# ifdef PNG_READ_EXPAND_SUPPORTED
|
||||||
/* In fact it is an error if it isn't supported, but checking is
|
/* In fact it is an error if it isn't supported, but checking is
|
||||||
* the safe way.
|
* the safe way.
|
||||||
*/
|
*/
|
||||||
if ((png_ptr->transformations & PNG_EXPAND) != 0)
|
if ((png_ptr->transformations & PNG_EXPAND) != 0)
|
||||||
{
|
{
|
||||||
if (png_ptr->bit_depth < 16)
|
if (png_ptr->bit_depth < 16)
|
||||||
max_pixel_depth *= 2;
|
max_pixel_depth *= 2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
# endif
|
# endif
|
||||||
png_ptr->transformations &= ~PNG_EXPAND_16;
|
png_ptr->transformations &= ~PNG_EXPAND_16;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
8
pngset.c
8
pngset.c
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngset.c - storage of image information into info struct
|
/* pngset.c - storage of image information into info struct
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.17 [March 26, 2015]
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
@ -673,7 +673,6 @@ png_set_iCCP(png_const_structrp png_ptr, png_inforp info_ptr,
|
|||||||
if (new_iccp_profile == NULL)
|
if (new_iccp_profile == NULL)
|
||||||
{
|
{
|
||||||
png_free(png_ptr, new_iccp_name);
|
png_free(png_ptr, new_iccp_name);
|
||||||
new_iccp_name = NULL;
|
|
||||||
png_benign_error(png_ptr,
|
png_benign_error(png_ptr,
|
||||||
"Insufficient memory to process iCCP profile");
|
"Insufficient memory to process iCCP profile");
|
||||||
|
|
||||||
@ -710,7 +709,7 @@ png_set_text_2(png_const_structrp png_ptr, png_inforp info_ptr,
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
png_debug1(1, "in %lx storage function", png_ptr == NULL ? "unexpected" :
|
png_debug1(1, "in %lx storage function", png_ptr == NULL ? 0xabadca11 :
|
||||||
(unsigned long)png_ptr->chunk_name);
|
(unsigned long)png_ptr->chunk_name);
|
||||||
|
|
||||||
if (png_ptr == NULL || info_ptr == NULL || num_text <= 0 || text_ptr == NULL)
|
if (png_ptr == NULL || info_ptr == NULL || num_text <= 0 || text_ptr == NULL)
|
||||||
@ -1522,6 +1521,9 @@ png_set_compression_buffer_size(png_structrp png_ptr, png_size_t size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifndef __COVERITY__
|
#ifndef __COVERITY__
|
||||||
|
/* Some compilers complain that this is always false. However, it
|
||||||
|
* can be true when integer overflow happens.
|
||||||
|
*/
|
||||||
if (size > ZLIB_IO_MAX)
|
if (size > ZLIB_IO_MAX)
|
||||||
{
|
{
|
||||||
png_warning(png_ptr,
|
png_warning(png_ptr,
|
||||||
|
|||||||
32
pngstruct.h
32
pngstruct.h
@ -1,8 +1,8 @@
|
|||||||
|
|
||||||
/* pngstruct.h - header file for PNG reference library
|
/* pngstruct.h - header file for PNG reference library
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.1 [March 28, 2013]
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
* Copyright (c) 1998-2013 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
@ -219,16 +219,18 @@ struct png_struct_def
|
|||||||
png_uint_32 row_number; /* current row in interlace pass */
|
png_uint_32 row_number; /* current row in interlace pass */
|
||||||
png_uint_32 chunk_name; /* PNG_CHUNK() id of current chunk */
|
png_uint_32 chunk_name; /* PNG_CHUNK() id of current chunk */
|
||||||
png_bytep prev_row; /* buffer to save previous (unfiltered) row.
|
png_bytep prev_row; /* buffer to save previous (unfiltered) row.
|
||||||
* This is a pointer into big_prev_row
|
* While reading this is a pointer into
|
||||||
|
* big_prev_row; while writing it is separately
|
||||||
|
* allocated if needed.
|
||||||
*/
|
*/
|
||||||
png_bytep row_buf; /* buffer to save current (unfiltered) row.
|
png_bytep row_buf; /* buffer to save current (unfiltered) row.
|
||||||
* This is a pointer into big_row_buf
|
* While reading, this is a pointer into
|
||||||
|
* big_row_buf; while writing it is separately
|
||||||
|
* allocated.
|
||||||
*/
|
*/
|
||||||
#ifdef PNG_WRITE_SUPPORTED
|
#ifdef PNG_WRITE_FILTER_SUPPORTED
|
||||||
png_bytep sub_row; /* buffer to save "sub" row when filtering */
|
png_bytep try_row; /* buffer to save trial row when filtering */
|
||||||
png_bytep up_row; /* buffer to save "up" row when filtering */
|
png_bytep tst_row; /* buffer to save best trial row when filtering */
|
||||||
png_bytep avg_row; /* buffer to save "avg" row when filtering */
|
|
||||||
png_bytep paeth_row; /* buffer to save "Paeth" row when filtering */
|
|
||||||
#endif
|
#endif
|
||||||
png_size_t info_rowbytes; /* Added in 1.5.4: cache of updated row bytes */
|
png_size_t info_rowbytes; /* Added in 1.5.4: cache of updated row bytes */
|
||||||
|
|
||||||
@ -346,17 +348,7 @@ struct png_struct_def
|
|||||||
png_bytep quantize_index; /* index translation for palette files */
|
png_bytep quantize_index; /* index translation for palette files */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
|
/* Options */
|
||||||
png_byte heuristic_method; /* heuristic for row filter selection */
|
|
||||||
png_byte num_prev_filters; /* number of weights for previous rows */
|
|
||||||
png_bytep prev_filters; /* filter type(s) of previous row(s) */
|
|
||||||
png_uint_16p filter_weights; /* weight(s) for previous line(s) */
|
|
||||||
png_uint_16p inv_filter_weights; /* 1/weight(s) for previous line(s) */
|
|
||||||
png_uint_16p filter_costs; /* relative filter calculation cost */
|
|
||||||
png_uint_16p inv_filter_costs; /* 1/relative filter calculation cost */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Options */
|
|
||||||
#ifdef PNG_SET_OPTION_SUPPORTED
|
#ifdef PNG_SET_OPTION_SUPPORTED
|
||||||
png_byte options; /* On/off state (up to 4 options) */
|
png_byte options; /* On/off state (up to 4 options) */
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
14
pngtest.c
14
pngtest.c
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngtest.c - a simple test program to test libpng
|
/* pngtest.c - a simple test program to test libpng
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.17 [March 26, 2015]
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
@ -565,6 +565,7 @@ png_debug_free(png_structp png_ptr, png_voidp ptr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Unlink the element from the list. */
|
/* Unlink the element from the list. */
|
||||||
|
if (pinformation != NULL)
|
||||||
{
|
{
|
||||||
memory_infop *ppinfo = &pinformation;
|
memory_infop *ppinfo = &pinformation;
|
||||||
|
|
||||||
@ -581,8 +582,7 @@ png_debug_free(png_structp png_ptr, png_voidp ptr)
|
|||||||
/* We must free the list element too, but first kill
|
/* We must free the list element too, but first kill
|
||||||
the memory that is to be freed. */
|
the memory that is to be freed. */
|
||||||
memset(ptr, 0x55, pinfo->size);
|
memset(ptr, 0x55, pinfo->size);
|
||||||
if (pinfo != NULL)
|
free(pinfo);
|
||||||
free(pinfo);
|
|
||||||
pinfo = NULL;
|
pinfo = NULL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1833,10 +1833,10 @@ main(int argc, char *argv[])
|
|||||||
k, (unsigned long)filters_used[k]);
|
k, (unsigned long)filters_used[k]);
|
||||||
#endif
|
#endif
|
||||||
#ifdef PNG_TIME_RFC1123_SUPPORTED
|
#ifdef PNG_TIME_RFC1123_SUPPORTED
|
||||||
if (tIME_chunk_present != 0)
|
if (tIME_chunk_present != 0)
|
||||||
fprintf(STDERR, " tIME = %s\n", tIME_string);
|
fprintf(STDERR, " tIME = %s\n", tIME_string);
|
||||||
|
|
||||||
tIME_chunk_present = 0;
|
tIME_chunk_present = 0;
|
||||||
#endif /* TIME_RFC1123 */
|
#endif /* TIME_RFC1123 */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2028,4 +2028,4 @@ main(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Generate a compiler error if there is an old png.h in the search path. */
|
/* Generate a compiler error if there is an old png.h in the search path. */
|
||||||
typedef png_libpng_version_1_6_17 Your_png_h_is_not_version_1_6_17;
|
typedef png_libpng_version_1_6_18 Your_png_h_is_not_version_1_6_18;
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngtrans.c - transforms the data in a row (used by both readers and writers)
|
/* pngtrans.c - transforms the data in a row (used by both readers and writers)
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.17 [March 26, 2015]
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
@ -704,7 +704,7 @@ png_do_check_palette_indexes(png_structrp png_ptr, png_row_infop row_info)
|
|||||||
*/
|
*/
|
||||||
for (; rp > png_ptr->row_buf; rp--)
|
for (; rp > png_ptr->row_buf; rp--)
|
||||||
{
|
{
|
||||||
if (*rp >> padding != 0)
|
if ((*rp >> padding) != 0)
|
||||||
png_ptr->num_palette_max = 1;
|
png_ptr->num_palette_max = 1;
|
||||||
padding = 0;
|
padding = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
609
pngwrite.c
609
pngwrite.c
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngwrite.c - general routines to write a PNG file
|
/* pngwrite.c - general routines to write a PNG file
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.17 [March 26, 2015]
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
@ -90,43 +90,44 @@ png_write_info_before_PLTE(png_structrp png_ptr, png_const_inforp info_ptr)
|
|||||||
|
|
||||||
if ((png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE) == 0)
|
if ((png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE) == 0)
|
||||||
{
|
{
|
||||||
/* Write PNG signature */
|
/* Write PNG signature */
|
||||||
png_write_sig(png_ptr);
|
png_write_sig(png_ptr);
|
||||||
|
|
||||||
#ifdef PNG_MNG_FEATURES_SUPPORTED
|
#ifdef PNG_MNG_FEATURES_SUPPORTED
|
||||||
if ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) != 0 && \
|
if ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) != 0 && \
|
||||||
png_ptr->mng_features_permitted != 0)
|
png_ptr->mng_features_permitted != 0)
|
||||||
{
|
{
|
||||||
png_warning(png_ptr, "MNG features are not allowed in a PNG datastream");
|
png_warning(png_ptr,
|
||||||
png_ptr->mng_features_permitted = 0;
|
"MNG features are not allowed in a PNG datastream");
|
||||||
}
|
png_ptr->mng_features_permitted = 0;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Write IHDR information. */
|
/* Write IHDR information. */
|
||||||
png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height,
|
png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height,
|
||||||
info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type,
|
info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type,
|
||||||
info_ptr->filter_type,
|
info_ptr->filter_type,
|
||||||
#ifdef PNG_WRITE_INTERLACING_SUPPORTED
|
#ifdef PNG_WRITE_INTERLACING_SUPPORTED
|
||||||
info_ptr->interlace_type
|
info_ptr->interlace_type
|
||||||
#else
|
#else
|
||||||
0
|
0
|
||||||
#endif
|
#endif
|
||||||
);
|
);
|
||||||
|
|
||||||
/* The rest of these check to see if the valid field has the appropriate
|
/* The rest of these check to see if the valid field has the appropriate
|
||||||
* flag set, and if it does, writes the chunk.
|
* flag set, and if it does, writes the chunk.
|
||||||
*
|
*
|
||||||
* 1.6.0: COLORSPACE support controls the writing of these chunks too, and
|
* 1.6.0: COLORSPACE support controls the writing of these chunks too, and
|
||||||
* the chunks will be written if the WRITE routine is there and information
|
* the chunks will be written if the WRITE routine is there and
|
||||||
* is available in the COLORSPACE. (See png_colorspace_sync_info in png.c
|
* information * is available in the COLORSPACE. (See
|
||||||
* for where the valid flags get set.)
|
* png_colorspace_sync_info in png.c for where the valid flags get set.)
|
||||||
*
|
*
|
||||||
* Under certain circumstances the colorspace can be invalidated without
|
* Under certain circumstances the colorspace can be invalidated without
|
||||||
* syncing the info_struct 'valid' flags; this happens if libpng detects and
|
* syncing the info_struct 'valid' flags; this happens if libpng detects
|
||||||
* error and calls png_error while the color space is being set, yet the
|
* an error and calls png_error while the color space is being set, yet
|
||||||
* application continues writing the PNG. So check the 'invalid' flag here
|
* the application continues writing the PNG. So check the 'invalid'
|
||||||
* too.
|
* flag here too.
|
||||||
*/
|
*/
|
||||||
#ifdef PNG_GAMMA_SUPPORTED
|
#ifdef PNG_GAMMA_SUPPORTED
|
||||||
# ifdef PNG_WRITE_gAMA_SUPPORTED
|
# ifdef PNG_WRITE_gAMA_SUPPORTED
|
||||||
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
|
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
|
||||||
@ -137,50 +138,50 @@ png_write_info_before_PLTE(png_structrp png_ptr, png_const_inforp info_ptr)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PNG_COLORSPACE_SUPPORTED
|
#ifdef PNG_COLORSPACE_SUPPORTED
|
||||||
/* Write only one of sRGB or an ICC profile. If a profile was supplied
|
/* Write only one of sRGB or an ICC profile. If a profile was supplied
|
||||||
* and it matches one of the known sRGB ones issue a warning.
|
* and it matches one of the known sRGB ones issue a warning.
|
||||||
*/
|
*/
|
||||||
# ifdef PNG_WRITE_iCCP_SUPPORTED
|
# ifdef PNG_WRITE_iCCP_SUPPORTED
|
||||||
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
|
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
|
||||||
(info_ptr->valid & PNG_INFO_iCCP) != 0)
|
(info_ptr->valid & PNG_INFO_iCCP) != 0)
|
||||||
{
|
{
|
||||||
# ifdef PNG_WRITE_sRGB_SUPPORTED
|
# ifdef PNG_WRITE_sRGB_SUPPORTED
|
||||||
if ((info_ptr->valid & PNG_INFO_sRGB) != 0)
|
if ((info_ptr->valid & PNG_INFO_sRGB) != 0)
|
||||||
png_app_warning(png_ptr,
|
png_app_warning(png_ptr,
|
||||||
"profile matches sRGB but writing iCCP instead");
|
"profile matches sRGB but writing iCCP instead");
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
png_write_iCCP(png_ptr, info_ptr->iccp_name,
|
png_write_iCCP(png_ptr, info_ptr->iccp_name,
|
||||||
info_ptr->iccp_profile);
|
info_ptr->iccp_profile);
|
||||||
}
|
}
|
||||||
# ifdef PNG_WRITE_sRGB_SUPPORTED
|
# ifdef PNG_WRITE_sRGB_SUPPORTED
|
||||||
else
|
else
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# ifdef PNG_WRITE_sRGB_SUPPORTED
|
# ifdef PNG_WRITE_sRGB_SUPPORTED
|
||||||
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
|
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
|
||||||
(info_ptr->valid & PNG_INFO_sRGB) != 0)
|
(info_ptr->valid & PNG_INFO_sRGB) != 0)
|
||||||
png_write_sRGB(png_ptr, info_ptr->colorspace.rendering_intent);
|
png_write_sRGB(png_ptr, info_ptr->colorspace.rendering_intent);
|
||||||
# endif /* WRITE_sRGB */
|
# endif /* WRITE_sRGB */
|
||||||
#endif /* COLORSPACE */
|
#endif /* COLORSPACE */
|
||||||
|
|
||||||
#ifdef PNG_WRITE_sBIT_SUPPORTED
|
#ifdef PNG_WRITE_sBIT_SUPPORTED
|
||||||
if ((info_ptr->valid & PNG_INFO_sBIT) != 0)
|
if ((info_ptr->valid & PNG_INFO_sBIT) != 0)
|
||||||
png_write_sBIT(png_ptr, &(info_ptr->sig_bit), info_ptr->color_type);
|
png_write_sBIT(png_ptr, &(info_ptr->sig_bit), info_ptr->color_type);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PNG_COLORSPACE_SUPPORTED
|
#ifdef PNG_COLORSPACE_SUPPORTED
|
||||||
# ifdef PNG_WRITE_cHRM_SUPPORTED
|
# ifdef PNG_WRITE_cHRM_SUPPORTED
|
||||||
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
|
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
|
||||||
(info_ptr->colorspace.flags & PNG_COLORSPACE_FROM_cHRM) != 0 &&
|
(info_ptr->colorspace.flags & PNG_COLORSPACE_FROM_cHRM) != 0 &&
|
||||||
(info_ptr->valid & PNG_INFO_cHRM) != 0)
|
(info_ptr->valid & PNG_INFO_cHRM) != 0)
|
||||||
png_write_cHRM_fixed(png_ptr, &info_ptr->colorspace.end_points_xy);
|
png_write_cHRM_fixed(png_ptr, &info_ptr->colorspace.end_points_xy);
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
|
#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
|
||||||
write_unknown_chunks(png_ptr, info_ptr, PNG_HAVE_IHDR);
|
write_unknown_chunks(png_ptr, info_ptr, PNG_HAVE_IHDR);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE;
|
png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE;
|
||||||
@ -216,8 +217,13 @@ png_write_info(png_structrp png_ptr, png_const_inforp info_ptr)
|
|||||||
if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0 &&
|
if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0 &&
|
||||||
info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
|
info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
|
||||||
{
|
{
|
||||||
int j;
|
int j, jend;
|
||||||
for (j = 0; j<(int)info_ptr->num_trans; j++)
|
|
||||||
|
jend = info_ptr->num_trans;
|
||||||
|
if (jend > PNG_MAX_PALETTE_LENGTH)
|
||||||
|
jend = PNG_MAX_PALETTE_LENGTH;
|
||||||
|
|
||||||
|
for (j = 0; j<jend; ++j)
|
||||||
info_ptr->trans_alpha[j] =
|
info_ptr->trans_alpha[j] =
|
||||||
(png_byte)(255 - info_ptr->trans_alpha[j]);
|
(png_byte)(255 - info_ptr->trans_alpha[j]);
|
||||||
}
|
}
|
||||||
@ -538,7 +544,7 @@ png_create_write_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr,
|
|||||||
/* App warnings are warnings in release (or release candidate) builds but
|
/* App warnings are warnings in release (or release candidate) builds but
|
||||||
* are errors during development.
|
* are errors during development.
|
||||||
*/
|
*/
|
||||||
#if PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC
|
#if PNG_RELEASE_BUILD
|
||||||
png_ptr->flags |= PNG_FLAG_APP_WARNINGS_WARN;
|
png_ptr->flags |= PNG_FLAG_APP_WARNINGS_WARN;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -849,7 +855,7 @@ png_write_row(png_structrp png_ptr, png_const_bytep row)
|
|||||||
* which is also the output depth.
|
* which is also the output depth.
|
||||||
*/
|
*/
|
||||||
if (row_info.pixel_depth != png_ptr->pixel_depth ||
|
if (row_info.pixel_depth != png_ptr->pixel_depth ||
|
||||||
row_info.pixel_depth != png_ptr->transformed_pixel_depth)
|
row_info.pixel_depth != png_ptr->transformed_pixel_depth)
|
||||||
png_error(png_ptr, "internal write transform logic error");
|
png_error(png_ptr, "internal write transform logic error");
|
||||||
|
|
||||||
#ifdef PNG_MNG_FEATURES_SUPPORTED
|
#ifdef PNG_MNG_FEATURES_SUPPORTED
|
||||||
@ -917,10 +923,6 @@ png_write_flush(png_structrp png_ptr)
|
|||||||
}
|
}
|
||||||
#endif /* WRITE_FLUSH */
|
#endif /* WRITE_FLUSH */
|
||||||
|
|
||||||
#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
|
|
||||||
static void png_reset_filter_heuristics(png_structrp png_ptr);/* forward decl */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Free any memory used in png_ptr struct without freeing the struct itself. */
|
/* Free any memory used in png_ptr struct without freeing the struct itself. */
|
||||||
static void
|
static void
|
||||||
png_write_destroy(png_structrp png_ptr)
|
png_write_destroy(png_structrp png_ptr)
|
||||||
@ -937,24 +939,11 @@ png_write_destroy(png_structrp png_ptr)
|
|||||||
png_ptr->row_buf = NULL;
|
png_ptr->row_buf = NULL;
|
||||||
#ifdef PNG_WRITE_FILTER_SUPPORTED
|
#ifdef PNG_WRITE_FILTER_SUPPORTED
|
||||||
png_free(png_ptr, png_ptr->prev_row);
|
png_free(png_ptr, png_ptr->prev_row);
|
||||||
png_free(png_ptr, png_ptr->sub_row);
|
png_free(png_ptr, png_ptr->try_row);
|
||||||
png_free(png_ptr, png_ptr->up_row);
|
png_free(png_ptr, png_ptr->tst_row);
|
||||||
png_free(png_ptr, png_ptr->avg_row);
|
|
||||||
png_free(png_ptr, png_ptr->paeth_row);
|
|
||||||
png_ptr->prev_row = NULL;
|
png_ptr->prev_row = NULL;
|
||||||
png_ptr->sub_row = NULL;
|
png_ptr->try_row = NULL;
|
||||||
png_ptr->up_row = NULL;
|
png_ptr->tst_row = NULL;
|
||||||
png_ptr->avg_row = NULL;
|
|
||||||
png_ptr->paeth_row = NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
|
|
||||||
/* Use this to save a little code space, it doesn't free the filter_costs */
|
|
||||||
png_reset_filter_heuristics(png_ptr);
|
|
||||||
png_free(png_ptr, png_ptr->filter_costs);
|
|
||||||
png_free(png_ptr, png_ptr->inv_filter_costs);
|
|
||||||
png_ptr->filter_costs = NULL;
|
|
||||||
png_ptr->inv_filter_costs = NULL;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
|
#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
|
||||||
@ -1044,6 +1033,7 @@ png_set_filter(png_structrp png_ptr, int method, int filters)
|
|||||||
#endif /* WRITE_FILTER */
|
#endif /* WRITE_FILTER */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef PNG_WRITE_FILTER_SUPPORTED
|
||||||
/* If we have allocated the row_buf, this means we have already started
|
/* If we have allocated the row_buf, this means we have already started
|
||||||
* with the image and we should have allocated all of the filter buffers
|
* with the image and we should have allocated all of the filter buffers
|
||||||
* that have been selected. If prev_row isn't already allocated, then
|
* that have been selected. If prev_row isn't already allocated, then
|
||||||
@ -1052,203 +1042,76 @@ png_set_filter(png_structrp png_ptr, int method, int filters)
|
|||||||
* wants to start and stop using particular filters during compression,
|
* wants to start and stop using particular filters during compression,
|
||||||
* it should start out with all of the filters, and then remove them
|
* it should start out with all of the filters, and then remove them
|
||||||
* or add them back after the start of compression.
|
* or add them back after the start of compression.
|
||||||
|
*
|
||||||
|
* NOTE: this is a nasty constraint on the code, because it means that the
|
||||||
|
* prev_row buffer must be maintained even if there are currently no
|
||||||
|
* 'prev_row' requiring filters active.
|
||||||
*/
|
*/
|
||||||
if (png_ptr->row_buf != NULL)
|
if (png_ptr->row_buf != NULL)
|
||||||
{
|
{
|
||||||
#ifdef PNG_WRITE_FILTER_SUPPORTED
|
int num_filters;
|
||||||
if ((png_ptr->do_filter & PNG_FILTER_SUB) != 0 &&
|
png_alloc_size_t buf_size;
|
||||||
png_ptr->sub_row == NULL)
|
|
||||||
|
/* Repeat the checks in png_write_start_row; 1 pixel high or wide
|
||||||
|
* images cannot benefit from certain filters. If this isn't done here
|
||||||
|
* the check below will fire on 1 pixel high images.
|
||||||
|
*/
|
||||||
|
if (png_ptr->height == 1)
|
||||||
|
filters &= ~(PNG_FILTER_UP|PNG_FILTER_AVG|PNG_FILTER_PAETH);
|
||||||
|
|
||||||
|
if (png_ptr->width == 1)
|
||||||
|
filters &= ~(PNG_FILTER_SUB|PNG_FILTER_AVG|PNG_FILTER_PAETH);
|
||||||
|
|
||||||
|
if ((filters & (PNG_FILTER_UP|PNG_FILTER_AVG|PNG_FILTER_PAETH)) != 0
|
||||||
|
&& png_ptr->prev_row == NULL)
|
||||||
{
|
{
|
||||||
png_ptr->sub_row = (png_bytep)png_malloc(png_ptr,
|
/* This is the error case, however it is benign - the previous row
|
||||||
(png_ptr->rowbytes + 1));
|
* is not available so the filter can't be used. Just warn here.
|
||||||
png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB;
|
*/
|
||||||
|
png_app_warning(png_ptr,
|
||||||
|
"png_set_filter: UP/AVG/PAETH cannot be added after start");
|
||||||
|
filters &= ~(PNG_FILTER_UP|PNG_FILTER_AVG|PNG_FILTER_PAETH);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((png_ptr->do_filter & PNG_FILTER_UP) != 0 &&
|
num_filters = 0;
|
||||||
png_ptr->up_row == NULL)
|
|
||||||
|
if (filters & PNG_FILTER_SUB)
|
||||||
|
num_filters++;
|
||||||
|
|
||||||
|
if (filters & PNG_FILTER_UP)
|
||||||
|
num_filters++;
|
||||||
|
|
||||||
|
if (filters & PNG_FILTER_AVG)
|
||||||
|
num_filters++;
|
||||||
|
|
||||||
|
if (filters & PNG_FILTER_PAETH)
|
||||||
|
num_filters++;
|
||||||
|
|
||||||
|
/* Allocate needed row buffers if they have not already been
|
||||||
|
* allocated.
|
||||||
|
*/
|
||||||
|
buf_size = PNG_ROWBYTES(png_ptr->usr_channels * png_ptr->usr_bit_depth,
|
||||||
|
png_ptr->width) + 1;
|
||||||
|
|
||||||
|
if (png_ptr->try_row == NULL)
|
||||||
|
png_ptr->try_row = png_voidcast(png_bytep,
|
||||||
|
png_malloc(png_ptr, buf_size));
|
||||||
|
|
||||||
|
if (num_filters > 1)
|
||||||
{
|
{
|
||||||
if (png_ptr->prev_row == NULL)
|
if (png_ptr->tst_row == NULL)
|
||||||
{
|
png_ptr->tst_row = png_voidcast(png_bytep,
|
||||||
png_warning(png_ptr, "Can't add Up filter after starting");
|
png_malloc(png_ptr, buf_size));
|
||||||
png_ptr->do_filter = (png_byte)(png_ptr->do_filter &
|
|
||||||
~PNG_FILTER_UP);
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
png_ptr->up_row = (png_bytep)png_malloc(png_ptr,
|
|
||||||
(png_ptr->rowbytes + 1));
|
|
||||||
png_ptr->up_row[0] = PNG_FILTER_VALUE_UP;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((png_ptr->do_filter & PNG_FILTER_AVG) != 0 &&
|
|
||||||
png_ptr->avg_row == NULL)
|
|
||||||
{
|
|
||||||
if (png_ptr->prev_row == NULL)
|
|
||||||
{
|
|
||||||
png_warning(png_ptr, "Can't add Average filter after starting");
|
|
||||||
png_ptr->do_filter = (png_byte)(png_ptr->do_filter &
|
|
||||||
~PNG_FILTER_AVG);
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
png_ptr->avg_row = (png_bytep)png_malloc(png_ptr,
|
|
||||||
(png_ptr->rowbytes + 1));
|
|
||||||
png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((png_ptr->do_filter & PNG_FILTER_PAETH) != 0 &&
|
|
||||||
png_ptr->paeth_row == NULL)
|
|
||||||
{
|
|
||||||
if (png_ptr->prev_row == NULL)
|
|
||||||
{
|
|
||||||
png_warning(png_ptr, "Can't add Paeth filter after starting");
|
|
||||||
png_ptr->do_filter &= (png_byte)(~PNG_FILTER_PAETH);
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
png_ptr->paeth_row = (png_bytep)png_malloc(png_ptr,
|
|
||||||
(png_ptr->rowbytes + 1));
|
|
||||||
png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (png_ptr->do_filter == PNG_NO_FILTERS)
|
|
||||||
#endif /* WRITE_FILTER */
|
|
||||||
png_ptr->do_filter = PNG_FILTER_NONE;
|
|
||||||
}
|
}
|
||||||
|
png_ptr->do_filter = (png_byte)filters;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
png_error(png_ptr, "Unknown custom filter method");
|
png_error(png_ptr, "Unknown custom filter method");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This allows us to influence the way in which libpng chooses the "best"
|
#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* DEPRECATED */
|
||||||
* filter for the current scanline. While the "minimum-sum-of-absolute-
|
|
||||||
* differences metric is relatively fast and effective, there is some
|
|
||||||
* question as to whether it can be improved upon by trying to keep the
|
|
||||||
* filtered data going to zlib more consistent, hopefully resulting in
|
|
||||||
* better compression.
|
|
||||||
*/
|
|
||||||
#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* GRR 970116 */
|
|
||||||
/* Convenience reset API. */
|
|
||||||
static void
|
|
||||||
png_reset_filter_heuristics(png_structrp png_ptr)
|
|
||||||
{
|
|
||||||
/* Clear out any old values in the 'weights' - this must be done because if
|
|
||||||
* the app calls set_filter_heuristics multiple times with different
|
|
||||||
* 'num_weights' values we would otherwise potentially have wrong sized
|
|
||||||
* arrays.
|
|
||||||
*/
|
|
||||||
png_ptr->num_prev_filters = 0;
|
|
||||||
png_ptr->heuristic_method = PNG_FILTER_HEURISTIC_UNWEIGHTED;
|
|
||||||
if (png_ptr->prev_filters != NULL)
|
|
||||||
{
|
|
||||||
png_bytep old = png_ptr->prev_filters;
|
|
||||||
png_ptr->prev_filters = NULL;
|
|
||||||
png_free(png_ptr, old);
|
|
||||||
}
|
|
||||||
if (png_ptr->filter_weights != NULL)
|
|
||||||
{
|
|
||||||
png_uint_16p old = png_ptr->filter_weights;
|
|
||||||
png_ptr->filter_weights = NULL;
|
|
||||||
png_free(png_ptr, old);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (png_ptr->inv_filter_weights != NULL)
|
|
||||||
{
|
|
||||||
png_uint_16p old = png_ptr->inv_filter_weights;
|
|
||||||
png_ptr->inv_filter_weights = NULL;
|
|
||||||
png_free(png_ptr, old);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Leave the filter_costs - this array is fixed size. */
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
png_init_filter_heuristics(png_structrp png_ptr, int heuristic_method,
|
|
||||||
int num_weights)
|
|
||||||
{
|
|
||||||
if (png_ptr == NULL)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* Clear out the arrays */
|
|
||||||
png_reset_filter_heuristics(png_ptr);
|
|
||||||
|
|
||||||
/* Check arguments; the 'reset' function makes the correct settings for the
|
|
||||||
* unweighted case, but we must handle the weight case by initializing the
|
|
||||||
* arrays for the caller.
|
|
||||||
*/
|
|
||||||
if (heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (num_weights > 0)
|
|
||||||
{
|
|
||||||
png_ptr->prev_filters = (png_bytep)png_malloc(png_ptr,
|
|
||||||
(png_uint_32)((sizeof (png_byte)) * num_weights));
|
|
||||||
|
|
||||||
/* To make sure that the weighting starts out fairly */
|
|
||||||
for (i = 0; i < num_weights; i++)
|
|
||||||
{
|
|
||||||
png_ptr->prev_filters[i] = 255;
|
|
||||||
}
|
|
||||||
|
|
||||||
png_ptr->filter_weights = (png_uint_16p)png_malloc(png_ptr,
|
|
||||||
(png_uint_32)((sizeof (png_uint_16)) * num_weights));
|
|
||||||
|
|
||||||
png_ptr->inv_filter_weights = (png_uint_16p)png_malloc(png_ptr,
|
|
||||||
(png_uint_32)((sizeof (png_uint_16)) * num_weights));
|
|
||||||
|
|
||||||
for (i = 0; i < num_weights; i++)
|
|
||||||
{
|
|
||||||
png_ptr->inv_filter_weights[i] =
|
|
||||||
png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Safe to set this now */
|
|
||||||
png_ptr->num_prev_filters = (png_byte)num_weights;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If, in the future, there are other filter methods, this would
|
|
||||||
* need to be based on png_ptr->filter.
|
|
||||||
*/
|
|
||||||
if (png_ptr->filter_costs == NULL)
|
|
||||||
{
|
|
||||||
png_ptr->filter_costs = (png_uint_16p)png_malloc(png_ptr,
|
|
||||||
(png_uint_32)((sizeof (png_uint_16)) * PNG_FILTER_VALUE_LAST));
|
|
||||||
|
|
||||||
png_ptr->inv_filter_costs = (png_uint_16p)png_malloc(png_ptr,
|
|
||||||
(png_uint_32)((sizeof (png_uint_16)) * PNG_FILTER_VALUE_LAST));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < PNG_FILTER_VALUE_LAST; i++)
|
|
||||||
{
|
|
||||||
png_ptr->inv_filter_costs[i] =
|
|
||||||
png_ptr->filter_costs[i] = PNG_COST_FACTOR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* All the arrays are inited, safe to set this: */
|
|
||||||
png_ptr->heuristic_method = PNG_FILTER_HEURISTIC_WEIGHTED;
|
|
||||||
|
|
||||||
/* Return the 'ok' code. */
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
else if (heuristic_method == PNG_FILTER_HEURISTIC_DEFAULT ||
|
|
||||||
heuristic_method == PNG_FILTER_HEURISTIC_UNWEIGHTED)
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
png_warning(png_ptr, "Unknown filter heuristic method");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Provide floating and fixed point APIs */
|
/* Provide floating and fixed point APIs */
|
||||||
#ifdef PNG_FLOATING_POINT_SUPPORTED
|
#ifdef PNG_FLOATING_POINT_SUPPORTED
|
||||||
void PNGAPI
|
void PNGAPI
|
||||||
@ -1256,52 +1119,11 @@ png_set_filter_heuristics(png_structrp png_ptr, int heuristic_method,
|
|||||||
int num_weights, png_const_doublep filter_weights,
|
int num_weights, png_const_doublep filter_weights,
|
||||||
png_const_doublep filter_costs)
|
png_const_doublep filter_costs)
|
||||||
{
|
{
|
||||||
png_debug(1, "in png_set_filter_heuristics");
|
PNG_UNUSED(png_ptr)
|
||||||
|
PNG_UNUSED(heuristic_method)
|
||||||
/* The internal API allocates all the arrays and ensures that the elements of
|
PNG_UNUSED(num_weights)
|
||||||
* those arrays are set to the default value.
|
PNG_UNUSED(filter_weights)
|
||||||
*/
|
PNG_UNUSED(filter_costs)
|
||||||
if (png_init_filter_heuristics(png_ptr, heuristic_method, num_weights) == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* If using the weighted method copy in the weights. */
|
|
||||||
if (heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < num_weights; i++)
|
|
||||||
{
|
|
||||||
if (filter_weights[i] <= 0.0)
|
|
||||||
{
|
|
||||||
png_ptr->inv_filter_weights[i] =
|
|
||||||
png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR;
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
png_ptr->inv_filter_weights[i] =
|
|
||||||
(png_uint_16)(PNG_WEIGHT_FACTOR*filter_weights[i]+.5);
|
|
||||||
|
|
||||||
png_ptr->filter_weights[i] =
|
|
||||||
(png_uint_16)(PNG_WEIGHT_FACTOR/filter_weights[i]+.5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Here is where we set the relative costs of the different filters. We
|
|
||||||
* should take the desired compression level into account when setting
|
|
||||||
* the costs, so that Paeth, for instance, has a high relative cost at low
|
|
||||||
* compression levels, while it has a lower relative cost at higher
|
|
||||||
* compression settings. The filter types are in order of increasing
|
|
||||||
* relative cost, so it would be possible to do this with an algorithm.
|
|
||||||
*/
|
|
||||||
for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) if (filter_costs[i] >= 1.0)
|
|
||||||
{
|
|
||||||
png_ptr->inv_filter_costs[i] =
|
|
||||||
(png_uint_16)(PNG_COST_FACTOR / filter_costs[i] + .5);
|
|
||||||
|
|
||||||
png_ptr->filter_costs[i] =
|
|
||||||
(png_uint_16)(PNG_COST_FACTOR * filter_costs[i] + .5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif /* FLOATING_POINT */
|
#endif /* FLOATING_POINT */
|
||||||
|
|
||||||
@ -1311,63 +1133,11 @@ png_set_filter_heuristics_fixed(png_structrp png_ptr, int heuristic_method,
|
|||||||
int num_weights, png_const_fixed_point_p filter_weights,
|
int num_weights, png_const_fixed_point_p filter_weights,
|
||||||
png_const_fixed_point_p filter_costs)
|
png_const_fixed_point_p filter_costs)
|
||||||
{
|
{
|
||||||
png_debug(1, "in png_set_filter_heuristics_fixed");
|
PNG_UNUSED(png_ptr)
|
||||||
|
PNG_UNUSED(heuristic_method)
|
||||||
/* The internal API allocates all the arrays and ensures that the elements of
|
PNG_UNUSED(num_weights)
|
||||||
* those arrays are set to the default value.
|
PNG_UNUSED(filter_weights)
|
||||||
*/
|
PNG_UNUSED(filter_costs)
|
||||||
if (png_init_filter_heuristics(png_ptr, heuristic_method, num_weights) == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* If using the weighted method copy in the weights. */
|
|
||||||
if (heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < num_weights; i++)
|
|
||||||
{
|
|
||||||
if (filter_weights[i] <= 0)
|
|
||||||
{
|
|
||||||
png_ptr->inv_filter_weights[i] =
|
|
||||||
png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR;
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
png_ptr->inv_filter_weights[i] = (png_uint_16)
|
|
||||||
((PNG_WEIGHT_FACTOR*filter_weights[i]+PNG_FP_HALF)/PNG_FP_1);
|
|
||||||
|
|
||||||
png_ptr->filter_weights[i] = (png_uint_16)((PNG_WEIGHT_FACTOR*
|
|
||||||
PNG_FP_1+(filter_weights[i]/2))/filter_weights[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Here is where we set the relative costs of the different filters. We
|
|
||||||
* should take the desired compression level into account when setting
|
|
||||||
* the costs, so that Paeth, for instance, has a high relative cost at low
|
|
||||||
* compression levels, while it has a lower relative cost at higher
|
|
||||||
* compression settings. The filter types are in order of increasing
|
|
||||||
* relative cost, so it would be possible to do this with an algorithm.
|
|
||||||
*/
|
|
||||||
for (i = 0; i < PNG_FILTER_VALUE_LAST; i++)
|
|
||||||
if (filter_costs[i] >= PNG_FP_1)
|
|
||||||
{
|
|
||||||
png_uint_32 tmp;
|
|
||||||
|
|
||||||
/* Use a 32 bit unsigned temporary here because otherwise the
|
|
||||||
* intermediate value will be a 32 bit *signed* integer (ANSI rules)
|
|
||||||
* and this will get the wrong answer on division.
|
|
||||||
*/
|
|
||||||
tmp = PNG_COST_FACTOR*PNG_FP_1 + (filter_costs[i]/2);
|
|
||||||
tmp /= filter_costs[i];
|
|
||||||
|
|
||||||
png_ptr->inv_filter_costs[i] = (png_uint_16)tmp;
|
|
||||||
|
|
||||||
tmp = PNG_COST_FACTOR * filter_costs[i] + PNG_FP_HALF;
|
|
||||||
tmp /= PNG_FP_1;
|
|
||||||
|
|
||||||
png_ptr->filter_costs[i] = (png_uint_16)tmp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif /* FIXED_POINT */
|
#endif /* FIXED_POINT */
|
||||||
#endif /* WRITE_WEIGHTED_FILTER */
|
#endif /* WRITE_WEIGHTED_FILTER */
|
||||||
@ -1616,14 +1386,14 @@ png_write_png(png_structrp png_ptr, png_inforp info_ptr,
|
|||||||
* alpha channel.
|
* alpha channel.
|
||||||
*/
|
*/
|
||||||
if ((transforms & (PNG_TRANSFORM_STRIP_FILLER_AFTER|
|
if ((transforms & (PNG_TRANSFORM_STRIP_FILLER_AFTER|
|
||||||
PNG_TRANSFORM_STRIP_FILLER_BEFORE)) != 0)
|
PNG_TRANSFORM_STRIP_FILLER_BEFORE)) != 0)
|
||||||
{
|
{
|
||||||
#ifdef PNG_WRITE_FILLER_SUPPORTED
|
#ifdef PNG_WRITE_FILLER_SUPPORTED
|
||||||
if ((transforms & PNG_TRANSFORM_STRIP_FILLER_AFTER) != 0)
|
if ((transforms & PNG_TRANSFORM_STRIP_FILLER_AFTER) != 0)
|
||||||
{
|
{
|
||||||
if ((transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE) != 0)
|
if ((transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE) != 0)
|
||||||
png_app_error(png_ptr,
|
png_app_error(png_ptr,
|
||||||
"PNG_TRANSFORM_STRIP_FILLER: BEFORE+AFTER not supported");
|
"PNG_TRANSFORM_STRIP_FILLER: BEFORE+AFTER not supported");
|
||||||
|
|
||||||
/* Continue if ignored - this is the pre-1.6.10 behavior */
|
/* Continue if ignored - this is the pre-1.6.10 behavior */
|
||||||
png_set_filler(png_ptr, 0, PNG_FILLER_AFTER);
|
png_set_filler(png_ptr, 0, PNG_FILLER_AFTER);
|
||||||
@ -1682,13 +1452,13 @@ png_write_png(png_structrp png_ptr, png_inforp info_ptr,
|
|||||||
|
|
||||||
|
|
||||||
#ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED
|
#ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED
|
||||||
#ifdef PNG_STDIO_SUPPORTED /* currently required for png_image_write_* */
|
# ifdef PNG_STDIO_SUPPORTED /* currently required for png_image_write_* */
|
||||||
/* Initialize the write structure - general purpose utility. */
|
/* Initialize the write structure - general purpose utility. */
|
||||||
static int
|
static int
|
||||||
png_image_write_init(png_imagep image)
|
png_image_write_init(png_imagep image)
|
||||||
{
|
{
|
||||||
png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, image,
|
png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, image,
|
||||||
png_safe_error, png_safe_warning);
|
png_safe_error, png_safe_warning);
|
||||||
|
|
||||||
if (png_ptr != NULL)
|
if (png_ptr != NULL)
|
||||||
{
|
{
|
||||||
@ -1697,7 +1467,7 @@ png_image_write_init(png_imagep image)
|
|||||||
if (info_ptr != NULL)
|
if (info_ptr != NULL)
|
||||||
{
|
{
|
||||||
png_controlp control = png_voidcast(png_controlp,
|
png_controlp control = png_voidcast(png_controlp,
|
||||||
png_malloc_warn(png_ptr, (sizeof *control)));
|
png_malloc_warn(png_ptr, (sizeof *control)));
|
||||||
|
|
||||||
if (control != NULL)
|
if (control != NULL)
|
||||||
{
|
{
|
||||||
@ -1744,12 +1514,12 @@ static int
|
|||||||
png_write_image_16bit(png_voidp argument)
|
png_write_image_16bit(png_voidp argument)
|
||||||
{
|
{
|
||||||
png_image_write_control *display = png_voidcast(png_image_write_control*,
|
png_image_write_control *display = png_voidcast(png_image_write_control*,
|
||||||
argument);
|
argument);
|
||||||
png_imagep image = display->image;
|
png_imagep image = display->image;
|
||||||
png_structrp png_ptr = image->opaque->png_ptr;
|
png_structrp png_ptr = image->opaque->png_ptr;
|
||||||
|
|
||||||
png_const_uint_16p input_row = png_voidcast(png_const_uint_16p,
|
png_const_uint_16p input_row = png_voidcast(png_const_uint_16p,
|
||||||
display->first_row);
|
display->first_row);
|
||||||
png_uint_16p output_row = png_voidcast(png_uint_16p, display->local_row);
|
png_uint_16p output_row = png_voidcast(png_uint_16p, display->local_row);
|
||||||
png_uint_16p row_end;
|
png_uint_16p row_end;
|
||||||
const int channels = (image->format & PNG_FORMAT_FLAG_COLOR) != 0 ? 3 : 1;
|
const int channels = (image->format & PNG_FORMAT_FLAG_COLOR) != 0 ? 3 : 1;
|
||||||
@ -1758,17 +1528,18 @@ png_write_image_16bit(png_voidp argument)
|
|||||||
|
|
||||||
if ((image->format & PNG_FORMAT_FLAG_ALPHA) != 0)
|
if ((image->format & PNG_FORMAT_FLAG_ALPHA) != 0)
|
||||||
{
|
{
|
||||||
# ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED
|
# ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED
|
||||||
if ((image->format & PNG_FORMAT_FLAG_AFIRST) != 0)
|
if ((image->format & PNG_FORMAT_FLAG_AFIRST) != 0)
|
||||||
{
|
{
|
||||||
aindex = -1;
|
aindex = -1;
|
||||||
++input_row; /* To point to the first component */
|
++input_row; /* To point to the first component */
|
||||||
++output_row;
|
++output_row;
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
# endif
|
aindex = channels;
|
||||||
|
# else
|
||||||
aindex = channels;
|
aindex = channels;
|
||||||
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
@ -1850,7 +1621,7 @@ png_write_image_16bit(png_voidp argument)
|
|||||||
* calculation can be done to 15 bits of accuracy; however, the output needs to
|
* calculation can be done to 15 bits of accuracy; however, the output needs to
|
||||||
* be scaled in the range 0..255*65535, so include that scaling here.
|
* be scaled in the range 0..255*65535, so include that scaling here.
|
||||||
*/
|
*/
|
||||||
#define UNP_RECIPROCAL(alpha) ((((0xffff*0xff)<<7)+(alpha>>1))/alpha)
|
# define UNP_RECIPROCAL(alpha) ((((0xffff*0xff)<<7)+(alpha>>1))/alpha)
|
||||||
|
|
||||||
static png_byte
|
static png_byte
|
||||||
png_unpremultiply(png_uint_32 component, png_uint_32 alpha,
|
png_unpremultiply(png_uint_32 component, png_uint_32 alpha,
|
||||||
@ -1901,12 +1672,12 @@ static int
|
|||||||
png_write_image_8bit(png_voidp argument)
|
png_write_image_8bit(png_voidp argument)
|
||||||
{
|
{
|
||||||
png_image_write_control *display = png_voidcast(png_image_write_control*,
|
png_image_write_control *display = png_voidcast(png_image_write_control*,
|
||||||
argument);
|
argument);
|
||||||
png_imagep image = display->image;
|
png_imagep image = display->image;
|
||||||
png_structrp png_ptr = image->opaque->png_ptr;
|
png_structrp png_ptr = image->opaque->png_ptr;
|
||||||
|
|
||||||
png_const_uint_16p input_row = png_voidcast(png_const_uint_16p,
|
png_const_uint_16p input_row = png_voidcast(png_const_uint_16p,
|
||||||
display->first_row);
|
display->first_row);
|
||||||
png_bytep output_row = png_voidcast(png_bytep, display->local_row);
|
png_bytep output_row = png_voidcast(png_bytep, display->local_row);
|
||||||
png_uint_32 y = image->height;
|
png_uint_32 y = image->height;
|
||||||
const int channels = (image->format & PNG_FORMAT_FLAG_COLOR) != 0 ? 3 : 1;
|
const int channels = (image->format & PNG_FORMAT_FLAG_COLOR) != 0 ? 3 : 1;
|
||||||
@ -1916,17 +1687,17 @@ png_write_image_8bit(png_voidp argument)
|
|||||||
png_bytep row_end;
|
png_bytep row_end;
|
||||||
int aindex;
|
int aindex;
|
||||||
|
|
||||||
# ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED
|
# ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED
|
||||||
if ((image->format & PNG_FORMAT_FLAG_AFIRST) != 0)
|
if ((image->format & PNG_FORMAT_FLAG_AFIRST) != 0)
|
||||||
{
|
{
|
||||||
aindex = -1;
|
aindex = -1;
|
||||||
++input_row; /* To point to the first component */
|
++input_row; /* To point to the first component */
|
||||||
++output_row;
|
++output_row;
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
# endif
|
# endif
|
||||||
aindex = channels;
|
aindex = channels;
|
||||||
|
|
||||||
/* Use row_end in place of a loop counter: */
|
/* Use row_end in place of a loop counter: */
|
||||||
row_end = output_row + image->width * (channels+1);
|
row_end = output_row + image->width * (channels+1);
|
||||||
@ -1960,7 +1731,7 @@ png_write_image_8bit(png_voidp argument)
|
|||||||
} /* while out_ptr < row_end */
|
} /* while out_ptr < row_end */
|
||||||
|
|
||||||
png_write_row(png_ptr, png_voidcast(png_const_bytep,
|
png_write_row(png_ptr, png_voidcast(png_const_bytep,
|
||||||
display->local_row));
|
display->local_row));
|
||||||
input_row += display->row_bytes/(sizeof (png_uint_16));
|
input_row += display->row_bytes/(sizeof (png_uint_16));
|
||||||
} /* while y */
|
} /* while y */
|
||||||
}
|
}
|
||||||
@ -1999,25 +1770,25 @@ png_image_set_PLTE(png_image_write_control *display)
|
|||||||
const png_imagep image = display->image;
|
const png_imagep image = display->image;
|
||||||
const void *cmap = display->colormap;
|
const void *cmap = display->colormap;
|
||||||
const int entries = image->colormap_entries > 256 ? 256 :
|
const int entries = image->colormap_entries > 256 ? 256 :
|
||||||
(int)image->colormap_entries;
|
(int)image->colormap_entries;
|
||||||
|
|
||||||
/* NOTE: the caller must check for cmap != NULL and entries != 0 */
|
/* NOTE: the caller must check for cmap != NULL and entries != 0 */
|
||||||
const png_uint_32 format = image->format;
|
const png_uint_32 format = image->format;
|
||||||
const int channels = PNG_IMAGE_SAMPLE_CHANNELS(format);
|
const int channels = PNG_IMAGE_SAMPLE_CHANNELS(format);
|
||||||
|
|
||||||
# if defined(PNG_FORMAT_BGR_SUPPORTED) &&\
|
# if defined(PNG_FORMAT_BGR_SUPPORTED) &&\
|
||||||
defined(PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED)
|
defined(PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED)
|
||||||
const int afirst = (format & PNG_FORMAT_FLAG_AFIRST) != 0 &&
|
const int afirst = (format & PNG_FORMAT_FLAG_AFIRST) != 0 &&
|
||||||
(format & PNG_FORMAT_FLAG_ALPHA) != 0;
|
(format & PNG_FORMAT_FLAG_ALPHA) != 0;
|
||||||
# else
|
# else
|
||||||
# define afirst 0
|
# define afirst 0
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# ifdef PNG_FORMAT_BGR_SUPPORTED
|
# ifdef PNG_FORMAT_BGR_SUPPORTED
|
||||||
const int bgr = (format & PNG_FORMAT_FLAG_BGR) != 0 ? 2 : 0;
|
const int bgr = (format & PNG_FORMAT_FLAG_BGR) != 0 ? 2 : 0;
|
||||||
# else
|
# else
|
||||||
# define bgr 0
|
# define bgr 0
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
int i, num_trans;
|
int i, num_trans;
|
||||||
png_color palette[256];
|
png_color palette[256];
|
||||||
@ -2042,11 +1813,11 @@ png_image_set_PLTE(png_image_write_control *display)
|
|||||||
if (channels >= 3) /* RGB */
|
if (channels >= 3) /* RGB */
|
||||||
{
|
{
|
||||||
palette[i].blue = (png_byte)PNG_sRGB_FROM_LINEAR(255 *
|
palette[i].blue = (png_byte)PNG_sRGB_FROM_LINEAR(255 *
|
||||||
entry[(2 ^ bgr)]);
|
entry[(2 ^ bgr)]);
|
||||||
palette[i].green = (png_byte)PNG_sRGB_FROM_LINEAR(255 *
|
palette[i].green = (png_byte)PNG_sRGB_FROM_LINEAR(255 *
|
||||||
entry[1]);
|
entry[1]);
|
||||||
palette[i].red = (png_byte)PNG_sRGB_FROM_LINEAR(255 *
|
palette[i].red = (png_byte)PNG_sRGB_FROM_LINEAR(255 *
|
||||||
entry[bgr]);
|
entry[bgr]);
|
||||||
}
|
}
|
||||||
|
|
||||||
else /* Gray */
|
else /* Gray */
|
||||||
@ -2122,12 +1893,12 @@ png_image_set_PLTE(png_image_write_control *display)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifdef afirst
|
# ifdef afirst
|
||||||
# undef afirst
|
# undef afirst
|
||||||
# endif
|
# endif
|
||||||
# ifdef bgr
|
# ifdef bgr
|
||||||
# undef bgr
|
# undef bgr
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
png_set_PLTE(image->opaque->png_ptr, image->opaque->info_ptr, palette,
|
png_set_PLTE(image->opaque->png_ptr, image->opaque->info_ptr, palette,
|
||||||
entries);
|
entries);
|
||||||
@ -2155,10 +1926,10 @@ png_image_write_main(png_voidp argument)
|
|||||||
int alpha = !colormap && (format & PNG_FORMAT_FLAG_ALPHA);
|
int alpha = !colormap && (format & PNG_FORMAT_FLAG_ALPHA);
|
||||||
int write_16bit = linear && !colormap && (display->convert_to_8bit == 0);
|
int write_16bit = linear && !colormap && (display->convert_to_8bit == 0);
|
||||||
|
|
||||||
# ifdef PNG_BENIGN_ERRORS_SUPPORTED
|
# ifdef PNG_BENIGN_ERRORS_SUPPORTED
|
||||||
/* Make sure we error out on any bad situation */
|
/* Make sure we error out on any bad situation */
|
||||||
png_set_benign_errors(png_ptr, 0/*error*/);
|
png_set_benign_errors(png_ptr, 0/*error*/);
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
/* Default the 'row_stride' parameter if required. */
|
/* Default the 'row_stride' parameter if required. */
|
||||||
if (display->row_stride == 0)
|
if (display->row_stride == 0)
|
||||||
@ -2237,23 +2008,23 @@ png_image_write_main(png_voidp argument)
|
|||||||
png_set_swap(png_ptr);
|
png_set_swap(png_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifdef PNG_SIMPLIFIED_WRITE_BGR_SUPPORTED
|
# ifdef PNG_SIMPLIFIED_WRITE_BGR_SUPPORTED
|
||||||
if ((format & PNG_FORMAT_FLAG_BGR) != 0)
|
if ((format & PNG_FORMAT_FLAG_BGR) != 0)
|
||||||
{
|
{
|
||||||
if (colormap == 0 && (format & PNG_FORMAT_FLAG_COLOR) != 0)
|
if (colormap == 0 && (format & PNG_FORMAT_FLAG_COLOR) != 0)
|
||||||
png_set_bgr(png_ptr);
|
png_set_bgr(png_ptr);
|
||||||
format &= ~PNG_FORMAT_FLAG_BGR;
|
format &= ~PNG_FORMAT_FLAG_BGR;
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED
|
# ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED
|
||||||
if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
|
if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
|
||||||
{
|
{
|
||||||
if (colormap == 0 && (format & PNG_FORMAT_FLAG_ALPHA) != 0)
|
if (colormap == 0 && (format & PNG_FORMAT_FLAG_ALPHA) != 0)
|
||||||
png_set_swap_alpha(png_ptr);
|
png_set_swap_alpha(png_ptr);
|
||||||
format &= ~PNG_FORMAT_FLAG_AFIRST;
|
format &= ~PNG_FORMAT_FLAG_AFIRST;
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
/* If there are 16 or fewer color-map entries we wrote a lower bit depth
|
/* If there are 16 or fewer color-map entries we wrote a lower bit depth
|
||||||
* above, but the application data is still byte packed.
|
* above, but the application data is still byte packed.
|
||||||
@ -2289,9 +2060,9 @@ png_image_write_main(png_voidp argument)
|
|||||||
* it about 50 times. The speed-up in pngstest was about 10-20% of the
|
* it about 50 times. The speed-up in pngstest was about 10-20% of the
|
||||||
* total (user) time on a heavily loaded system.
|
* total (user) time on a heavily loaded system.
|
||||||
*/
|
*/
|
||||||
#ifdef PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED
|
# ifdef PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED
|
||||||
png_set_compression_level(png_ptr, 3);
|
png_set_compression_level(png_ptr, 3);
|
||||||
#endif
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check for the cases that currently require a pre-transform on the row
|
/* Check for the cases that currently require a pre-transform on the row
|
||||||
@ -2454,6 +2225,6 @@ png_image_write_to_file(png_imagep image, const char *file_name,
|
|||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif /* STDIO */
|
# endif /* STDIO */
|
||||||
#endif /* SIMPLIFIED_WRITE */
|
#endif /* SIMPLIFIED_WRITE */
|
||||||
#endif /* WRITE */
|
#endif /* WRITE */
|
||||||
|
|||||||
14
pngwtran.c
14
pngwtran.c
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngwtran.c - transforms the data in a row for PNG writers
|
/* pngwtran.c - transforms the data in a row for PNG writers
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.17 [March 26, 2015]
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
@ -71,7 +71,8 @@ png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)
|
|||||||
case 2:
|
case 2:
|
||||||
{
|
{
|
||||||
png_bytep sp, dp;
|
png_bytep sp, dp;
|
||||||
int shift, v;
|
unsigned int shift;
|
||||||
|
int v;
|
||||||
png_uint_32 i;
|
png_uint_32 i;
|
||||||
png_uint_32 row_width = row_info->width;
|
png_uint_32 row_width = row_info->width;
|
||||||
|
|
||||||
@ -110,7 +111,8 @@ png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)
|
|||||||
case 4:
|
case 4:
|
||||||
{
|
{
|
||||||
png_bytep sp, dp;
|
png_bytep sp, dp;
|
||||||
int shift, v;
|
unsigned int shift;
|
||||||
|
int v;
|
||||||
png_uint_32 i;
|
png_uint_32 i;
|
||||||
png_uint_32 row_width = row_info->width;
|
png_uint_32 row_width = row_info->width;
|
||||||
|
|
||||||
@ -422,7 +424,7 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
|
|||||||
*(dp++) = *(sp++);
|
*(dp++) = *(sp++);
|
||||||
*/
|
*/
|
||||||
sp+=3; dp = sp;
|
sp+=3; dp = sp;
|
||||||
*(dp++) = (png_byte)(255 - *(sp++));
|
*dp = (png_byte)(255 - *(sp++));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -446,7 +448,7 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
|
|||||||
*/
|
*/
|
||||||
sp+=6; dp = sp;
|
sp+=6; dp = sp;
|
||||||
*(dp++) = (png_byte)(255 - *(sp++));
|
*(dp++) = (png_byte)(255 - *(sp++));
|
||||||
*(dp++) = (png_byte)(255 - *(sp++));
|
*dp = (png_byte)(255 - *(sp++));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* WRITE_16BIT */
|
#endif /* WRITE_16BIT */
|
||||||
@ -484,7 +486,7 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
|
|||||||
*/
|
*/
|
||||||
sp+=2; dp = sp;
|
sp+=2; dp = sp;
|
||||||
*(dp++) = (png_byte)(255 - *(sp++));
|
*(dp++) = (png_byte)(255 - *(sp++));
|
||||||
*(dp++) = (png_byte)(255 - *(sp++));
|
*dp = (png_byte)(255 - *(sp++));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* WRITE_16BIT */
|
#endif /* WRITE_16BIT */
|
||||||
|
|||||||
866
pngwutil.c
866
pngwutil.c
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
VisualStudio instructions
|
VisualStudio instructions
|
||||||
|
|
||||||
libpng version 1.6.17 - March 26, 2015
|
libpng version 1.6.18 - July 23, 2015
|
||||||
|
|
||||||
Copyright (c) 1998-2010 Glenn Randers-Pehrson
|
Copyright (c) 1998-2010 Glenn Randers-Pehrson
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
<!--
|
<!--
|
||||||
* zlib.props - location of zlib source
|
* zlib.props - location of zlib source
|
||||||
*
|
*
|
||||||
* libpng version 1.6.17 - March 26, 2015
|
* libpng version 1.6.18 - July 23, 2015
|
||||||
*
|
*
|
||||||
* Copyright (c) 1998-2011 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2011 Glenn Randers-Pehrson
|
||||||
*
|
*
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
|
|
||||||
Makefiles for libpng version 1.6.17 - March 26, 2015
|
Makefiles for libpng version 1.6.18 - July 23, 2015
|
||||||
|
|
||||||
pnglibconf.h.prebuilt => Stores configuration settings
|
pnglibconf.h.prebuilt => Stores configuration settings
|
||||||
makefile.linux => Linux/ELF makefile
|
makefile.linux => Linux/ELF makefile
|
||||||
(gcc, creates libpng16.so.16.1.6.17)
|
(gcc, creates libpng16.so.16.1.6.18)
|
||||||
makefile.gcc => Generic makefile (gcc, creates static libpng.a)
|
makefile.gcc => Generic makefile (gcc, creates static libpng.a)
|
||||||
makefile.knr => Archaic UNIX Makefile that converts files with
|
makefile.knr => Archaic UNIX Makefile that converts files with
|
||||||
ansi2knr (Requires ansi2knr.c from
|
ansi2knr (Requires ansi2knr.c from
|
||||||
@ -33,12 +33,12 @@ pnglibconf.h.prebuilt => Stores configuration settings
|
|||||||
makefile.os2 => OS/2 Makefile (gcc and emx, requires libpng.def)
|
makefile.os2 => OS/2 Makefile (gcc and emx, requires libpng.def)
|
||||||
makefile.sco => For SCO OSr5 ELF and Unixware 7 with Native cc
|
makefile.sco => For SCO OSr5 ELF and Unixware 7 with Native cc
|
||||||
makefile.sggcc => Silicon Graphics (gcc,
|
makefile.sggcc => Silicon Graphics (gcc,
|
||||||
creates libpng16.so.16.1.6.17)
|
creates libpng16.so.16.1.6.18)
|
||||||
makefile.sgi => Silicon Graphics IRIX makefile (cc, creates static lib)
|
makefile.sgi => Silicon Graphics IRIX makefile (cc, creates static lib)
|
||||||
makefile.solaris => Solaris 2.X makefile (gcc,
|
makefile.solaris => Solaris 2.X makefile (gcc,
|
||||||
creates libpng16.so.16.1.6.17)
|
creates libpng16.so.16.1.6.18)
|
||||||
makefile.so9 => Solaris 9 makefile (gcc,
|
makefile.so9 => Solaris 9 makefile (gcc,
|
||||||
creates libpng16.so.16.1.6.17)
|
creates libpng16.so.16.1.6.18)
|
||||||
makefile.std => Generic UNIX makefile (cc, creates static libpng.a)
|
makefile.std => Generic UNIX makefile (cc, creates static libpng.a)
|
||||||
makefile.sunos => Sun makefile
|
makefile.sunos => Sun makefile
|
||||||
makefile.32sunu => Sun Ultra 32-bit makefile
|
makefile.32sunu => Sun Ultra 32-bit makefile
|
||||||
|
|||||||
@ -21,7 +21,7 @@ PNG_DFN "OS2 DESCRIPTION "PNG image compression library""
|
|||||||
PNG_DFN "OS2 CODE PRELOAD MOVEABLE DISCARDABLE"
|
PNG_DFN "OS2 CODE PRELOAD MOVEABLE DISCARDABLE"
|
||||||
PNG_DFN ""
|
PNG_DFN ""
|
||||||
PNG_DFN "EXPORTS"
|
PNG_DFN "EXPORTS"
|
||||||
PNG_DFN ";Version 1.6.17"
|
PNG_DFN ";Version 1.6.18"
|
||||||
|
|
||||||
#define PNG_EXPORTA(ordinal, type, name, args, attributes)\
|
#define PNG_EXPORTA(ordinal, type, name, args, attributes)\
|
||||||
PNG_DFN "@" SYMBOL_PREFIX "@@" name "@"
|
PNG_DFN "@" SYMBOL_PREFIX "@@" name "@"
|
||||||
|
|||||||
@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
# Modeled after libxml-config.
|
# Modeled after libxml-config.
|
||||||
|
|
||||||
version=1.6.17
|
version=1.6.18
|
||||||
prefix=""
|
prefix=""
|
||||||
libdir=""
|
libdir=""
|
||||||
libs=""
|
libs=""
|
||||||
|
|||||||
@ -5,6 +5,6 @@ includedir=@includedir@/libpng16
|
|||||||
|
|
||||||
Name: libpng
|
Name: libpng
|
||||||
Description: Loads and saves PNG files
|
Description: Loads and saves PNG files
|
||||||
Version: 1.6.17
|
Version: 1.6.18
|
||||||
Libs: -L${libdir} -lpng16
|
Libs: -L${libdir} -lpng16
|
||||||
Cflags: -I${includedir}
|
Cflags: -I${includedir}
|
||||||
|
|||||||
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
VERMAJ = 1
|
VERMAJ = 1
|
||||||
VERMIN = 6
|
VERMIN = 6
|
||||||
VERMIC = 17
|
VERMIC = 18
|
||||||
VER = $(VERMAJ).$(VERMIN).$(VERMIC)
|
VER = $(VERMAJ).$(VERMIN).$(VERMIC)
|
||||||
NAME = libpng
|
NAME = libpng
|
||||||
PACKAGE = $(NAME)-$(VER)
|
PACKAGE = $(NAME)-$(VER)
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
# Library name:
|
# Library name:
|
||||||
LIBNAME = libpng16
|
LIBNAME = libpng16
|
||||||
PNGMAJ = 16
|
PNGMAJ = 16
|
||||||
RELEASE = 17
|
RELEASE = 18
|
||||||
|
|
||||||
# Shared library names:
|
# Shared library names:
|
||||||
LIBSO=$(LIBNAME).so
|
LIBSO=$(LIBNAME).so
|
||||||
|
|||||||
@ -18,7 +18,7 @@ exec_prefix=$(prefix)
|
|||||||
# Library name:
|
# Library name:
|
||||||
LIBNAME = libpng16
|
LIBNAME = libpng16
|
||||||
PNGMAJ = 16
|
PNGMAJ = 16
|
||||||
RELEASE = 17
|
RELEASE = 18
|
||||||
|
|
||||||
# Shared library names:
|
# Shared library names:
|
||||||
LIBSO=$(LIBNAME).dll
|
LIBSO=$(LIBNAME).dll
|
||||||
|
|||||||
@ -17,7 +17,7 @@ INCSDIR=${LOCALBASE}/include/libpng16
|
|||||||
|
|
||||||
LIB= png16
|
LIB= png16
|
||||||
SHLIB_MAJOR= 0
|
SHLIB_MAJOR= 0
|
||||||
SHLIB_MINOR= 1.6.17
|
SHLIB_MINOR= 1.6.18
|
||||||
SRCS= png.c pngset.c pngget.c pngrutil.c pngtrans.c pngwutil.c \
|
SRCS= png.c pngset.c pngget.c pngrutil.c pngtrans.c pngwutil.c \
|
||||||
pngread.c pngrio.c pngwio.c pngwrite.c pngrtran.c \
|
pngread.c pngrio.c pngwio.c pngwrite.c pngrtran.c \
|
||||||
pngwtran.c pngmem.c pngerror.c pngpread.c
|
pngwtran.c pngmem.c pngerror.c pngpread.c
|
||||||
|
|||||||
@ -17,7 +17,7 @@ INCSDIR=${LOCALBASE}/include
|
|||||||
|
|
||||||
LIB= png
|
LIB= png
|
||||||
SHLIB_MAJOR= 16
|
SHLIB_MAJOR= 16
|
||||||
SHLIB_MINOR= 1.6.17
|
SHLIB_MINOR= 1.6.18
|
||||||
SRCS= png.c pngset.c pngget.c pngrutil.c pngtrans.c pngwutil.c \
|
SRCS= png.c pngset.c pngget.c pngrutil.c pngtrans.c pngwutil.c \
|
||||||
pngread.c pngrio.c pngwio.c pngwrite.c pngrtran.c \
|
pngread.c pngrio.c pngwio.c pngwrite.c pngrtran.c \
|
||||||
pngwtran.c pngmem.c pngerror.c pngpread.c
|
pngwtran.c pngmem.c pngerror.c pngpread.c
|
||||||
|
|||||||
@ -11,7 +11,7 @@ LIBDIR= ${PREFIX}/lib
|
|||||||
MANDIR= ${PREFIX}/man/cat
|
MANDIR= ${PREFIX}/man/cat
|
||||||
|
|
||||||
SHLIB_MAJOR= 16
|
SHLIB_MAJOR= 16
|
||||||
SHLIB_MINOR= 1.6.17
|
SHLIB_MINOR= 1.6.18
|
||||||
|
|
||||||
LIB= png
|
LIB= png
|
||||||
SRCS= png.c pngerror.c pngget.c pngmem.c pngpread.c \
|
SRCS= png.c pngerror.c pngget.c pngmem.c pngpread.c \
|
||||||
|
|||||||
@ -222,7 +222,7 @@ option SET_OPTION disabled
|
|||||||
# with png_set_option
|
# with png_set_option
|
||||||
# ARM_NEON_CHECK: (PNG_ARM_NEON == 1) compile a run-time check to see if Neon
|
# ARM_NEON_CHECK: (PNG_ARM_NEON == 1) compile a run-time check to see if Neon
|
||||||
# extensions are supported. This is poorly supported and
|
# extensions are supported. This is poorly supported and
|
||||||
# deprectated - use the png_set_option API.
|
# deprecated - use the png_set_option API.
|
||||||
setting ARM_NEON_OPT
|
setting ARM_NEON_OPT
|
||||||
option ARM_NEON_API disabled requires ALIGNED_MEMORY enables SET_OPTION,
|
option ARM_NEON_API disabled requires ALIGNED_MEMORY enables SET_OPTION,
|
||||||
sets ARM_NEON_OPT 1
|
sets ARM_NEON_OPT 1
|
||||||
@ -249,6 +249,17 @@ setting Z_DEFAULT_STRATEGY default @Z_FILTERED
|
|||||||
setting Z_DEFAULT_NOFILTER_STRATEGY default @Z_DEFAULT_STRATEGY
|
setting Z_DEFAULT_NOFILTER_STRATEGY default @Z_DEFAULT_STRATEGY
|
||||||
setting ZLIB_VERNUM default @ZLIB_VERNUM
|
setting ZLIB_VERNUM default @ZLIB_VERNUM
|
||||||
|
|
||||||
|
# Linkage of:
|
||||||
|
#
|
||||||
|
# API: libpng API functions
|
||||||
|
# CALLBACK: internal non-file-local callbacks
|
||||||
|
# FUNCTION: internal non-file-local functions
|
||||||
|
# DATA: internal non-file-local (const) data
|
||||||
|
setting LINKAGE_API default extern
|
||||||
|
setting LINKAGE_CALLBACK default extern
|
||||||
|
setting LINKAGE_FUNCTION default extern
|
||||||
|
setting LINKAGE_DATA default extern
|
||||||
|
|
||||||
setting TEXT_Z_DEFAULT_COMPRESSION default @Z_DEFAULT_COMPRESSION
|
setting TEXT_Z_DEFAULT_COMPRESSION default @Z_DEFAULT_COMPRESSION
|
||||||
setting TEXT_Z_DEFAULT_STRATEGY default @Z_DEFAULT_STRATEGY
|
setting TEXT_Z_DEFAULT_STRATEGY default @Z_DEFAULT_STRATEGY
|
||||||
|
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
/* libpng 1.6.17 STANDARD API DEFINITION */
|
/* libpng 1.6.18 STANDARD API DEFINITION */
|
||||||
|
|
||||||
/* pnglibconf.h - library build configuration */
|
/* pnglibconf.h - library build configuration */
|
||||||
|
|
||||||
/* Libpng version 1.6.17 - March 26, 2015 */
|
/* Libpng version 1.6.18 - July 23, 2015 */
|
||||||
|
|
||||||
/* Copyright (c) 1998-2014 Glenn Randers-Pehrson */
|
/* Copyright (c) 1998-2014 Glenn Randers-Pehrson */
|
||||||
|
|
||||||
@ -101,8 +101,6 @@
|
|||||||
#define PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED
|
#define PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED
|
||||||
#define PNG_SEQUENTIAL_READ_SUPPORTED
|
#define PNG_SEQUENTIAL_READ_SUPPORTED
|
||||||
#define PNG_SETJMP_SUPPORTED
|
#define PNG_SETJMP_SUPPORTED
|
||||||
#define PNG_SET_CHUNK_CACHE_LIMIT_SUPPORTED
|
|
||||||
#define PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED
|
|
||||||
#define PNG_SET_OPTION_SUPPORTED
|
#define PNG_SET_OPTION_SUPPORTED
|
||||||
#define PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
|
#define PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
|
||||||
#define PNG_SET_USER_LIMITS_SUPPORTED
|
#define PNG_SET_USER_LIMITS_SUPPORTED
|
||||||
@ -192,6 +190,10 @@
|
|||||||
#define PNG_GAMMA_THRESHOLD_FIXED 5000
|
#define PNG_GAMMA_THRESHOLD_FIXED 5000
|
||||||
#define PNG_IDAT_READ_SIZE PNG_ZBUF_SIZE
|
#define PNG_IDAT_READ_SIZE PNG_ZBUF_SIZE
|
||||||
#define PNG_INFLATE_BUF_SIZE 1024
|
#define PNG_INFLATE_BUF_SIZE 1024
|
||||||
|
#define PNG_LINKAGE_API extern
|
||||||
|
#define PNG_LINKAGE_CALLBACK extern
|
||||||
|
#define PNG_LINKAGE_DATA extern
|
||||||
|
#define PNG_LINKAGE_FUNCTION extern
|
||||||
#define PNG_MAX_GAMMA_8 11
|
#define PNG_MAX_GAMMA_8 11
|
||||||
#define PNG_QUANTIZE_BLUE_BITS 5
|
#define PNG_QUANTIZE_BLUE_BITS 5
|
||||||
#define PNG_QUANTIZE_GREEN_BITS 5
|
#define PNG_QUANTIZE_GREEN_BITS 5
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
;Version 1.6.17
|
;Version 1.6.18
|
||||||
;--------------------------------------------------------------
|
;--------------------------------------------------------------
|
||||||
; LIBPNG symbol list as a Win32 DEF file
|
; LIBPNG symbol list as a Win32 DEF file
|
||||||
; Contains all the symbols that can be exported from libpng
|
; Contains all the symbols that can be exported from libpng
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user