mirror of
https://git.code.sf.net/p/libpng/code.git
synced 2025-07-10 18:04:09 +02:00
Compare commits
140 Commits
v1.5.4beta
...
v1.5.6rc02
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5e823c1fd5 | ||
|
|
8db19980fa | ||
|
|
ef02d563a3 | ||
|
|
b2068640d1 | ||
|
|
93254f66fc | ||
|
|
52093f1776 | ||
|
|
0654d63196 | ||
|
|
4e8aa822dc | ||
|
|
1c42276a39 | ||
|
|
c9e27d026d | ||
|
|
e7db181e5d | ||
|
|
f5c5e53bf5 | ||
|
|
ecb3ad035a | ||
|
|
fb5b3ac013 | ||
|
|
5b84901c55 | ||
|
|
57cbcf6b8f | ||
|
|
07772cba07 | ||
|
|
5c1905caae | ||
|
|
d58251b47e | ||
|
|
d3dcb463d6 | ||
|
|
3dbfd300ff | ||
|
|
ff36991ca2 | ||
|
|
5b3b54e3f6 | ||
|
|
ba55c0770b | ||
|
|
4e68aa7e40 | ||
|
|
76b62317b5 | ||
|
|
4dd0dc6399 | ||
|
|
8be28e3eb6 | ||
|
|
ac8375d000 | ||
|
|
65c0339b5c | ||
|
|
4daae30174 | ||
|
|
d5bc89ef11 | ||
|
|
fa7d7934f6 | ||
|
|
a92a212925 | ||
|
|
435cf87469 | ||
|
|
e51916c0f9 | ||
|
|
997b193f63 | ||
|
|
e29c4b9b93 | ||
|
|
8e25a61277 | ||
|
|
f573ff7792 | ||
|
|
1a16735ce7 | ||
|
|
d02d6a1c7d | ||
|
|
968c231cc8 | ||
|
|
bb5cb1476b | ||
|
|
115020d985 | ||
|
|
3e2263abf2 | ||
|
|
d71f09df4d | ||
|
|
0a456b5d16 | ||
|
|
d3261115a8 | ||
|
|
673a1166fe | ||
|
|
853afe631c | ||
|
|
fe85bafedf | ||
|
|
751561218f | ||
|
|
f0c19e6455 | ||
|
|
ccff383d44 | ||
|
|
f3f7e14727 | ||
|
|
3c2ae60f46 | ||
|
|
95ba417c82 | ||
|
|
b6e4d58e4b | ||
|
|
ef43c17bfe | ||
|
|
ad8b7b71b4 | ||
|
|
83bd94f1f4 | ||
|
|
63071acbd9 | ||
|
|
44271398bd | ||
|
|
90cd362a87 | ||
|
|
b293334e7a | ||
|
|
4ae297867d | ||
|
|
ec3ff78f70 | ||
|
|
6d62ef108a | ||
|
|
b6874f8062 | ||
|
|
8b8aacde83 | ||
|
|
bbd17bd7c4 | ||
|
|
b5cebba675 | ||
|
|
736f40f459 | ||
|
|
0c03fc6f75 | ||
|
|
e61e403d20 | ||
|
|
9d824eb166 | ||
|
|
75d5bfda5b | ||
|
|
9b979b177b | ||
|
|
7b9796539d | ||
|
|
0bc79772c8 | ||
|
|
a45ffbefb9 | ||
|
|
99ffac0838 | ||
|
|
6c98897a64 | ||
|
|
b17c75b222 | ||
|
|
d4e1ddb631 | ||
|
|
aab2aa196d | ||
|
|
03d6b482b5 | ||
|
|
4dcce66295 | ||
|
|
7a28724e6b | ||
|
|
a5bcab7854 | ||
|
|
0a007b743e | ||
|
|
e9ef47f69e | ||
|
|
0532aca928 | ||
|
|
5a77e672e1 | ||
|
|
c2891d0011 | ||
|
|
25e0f55586 | ||
|
|
ce775cc851 | ||
|
|
d0797f5b53 | ||
|
|
a5e5547679 | ||
|
|
4164c6f949 | ||
|
|
4b2237a6a4 | ||
|
|
cb47e20509 | ||
|
|
d3a0b23c1b | ||
|
|
ab38979670 | ||
|
|
628b632419 | ||
|
|
d404b6d488 | ||
|
|
38404a5996 | ||
|
|
05fc4ccd30 | ||
|
|
78bb9dafe1 | ||
|
|
4fca25504e | ||
|
|
9daf91ed5c | ||
|
|
fcd7c13ffd | ||
|
|
5bcd0a8c14 | ||
|
|
8d261262d9 | ||
|
|
c4a8214b77 | ||
|
|
4e47be74e9 | ||
|
|
314ef3e72b | ||
|
|
aee83b43d6 | ||
|
|
9a1e2232ba | ||
|
|
6da2f2d92a | ||
|
|
24145c8869 | ||
|
|
e6a8060a71 | ||
|
|
98f053edbd | ||
|
|
581d29d4c9 | ||
|
|
66b942ce16 | ||
|
|
86cf9b2e89 | ||
|
|
fb29e51dbd | ||
|
|
ab63dd0892 | ||
|
|
a7428d443c | ||
|
|
857dbbe7cc | ||
|
|
3fb7c07ea5 | ||
|
|
60d7c022e5 | ||
|
|
850769f787 | ||
|
|
5f0b9276ec | ||
|
|
733b131545 | ||
|
|
ef217b76a3 | ||
|
|
b0791f75ad | ||
|
|
039ad872fe | ||
|
|
903c64dce8 |
257
ANNOUNCE
257
ANNOUNCE
@@ -1,5 +1,5 @@
|
||||
|
||||
Libpng 1.5.4beta03 - June 15, 2011
|
||||
Libpng 1.5.6rc02 - October 27, 2011
|
||||
|
||||
This is not intended to be a public release. It will be replaced
|
||||
within a few weeks by a public version or by another test version.
|
||||
@@ -9,209 +9,92 @@ Files available for download:
|
||||
Source files with LF line endings (for Unix/Linux) and with a
|
||||
"configure" script
|
||||
|
||||
1.5.4beta03.tar.xz (LZMA-compressed, recommended)
|
||||
1.5.4beta03.tar.gz
|
||||
1.5.4beta03.tar.bz2
|
||||
1.5.6rc02.tar.xz (LZMA-compressed, recommended)
|
||||
1.5.6rc02.tar.gz
|
||||
1.5.6rc02.tar.bz2
|
||||
|
||||
Source files with CRLF line endings (for Windows), without the
|
||||
"configure" script
|
||||
|
||||
lp154b03.7z (LZMA-compressed, recommended)
|
||||
lp154b03.zip
|
||||
lp156r02.7z (LZMA-compressed, recommended)
|
||||
lp156r02.zip
|
||||
|
||||
Other information:
|
||||
|
||||
1.5.4beta03-README.txt
|
||||
1.5.4beta03-LICENSE.txt
|
||||
1.5.6rc02-README.txt
|
||||
1.5.6rc02-LICENSE.txt
|
||||
|
||||
Changes since the last public release (1.5.2):
|
||||
Changes since the last public release (1.5.5):
|
||||
|
||||
Version 1.5.3beta01 [April 1, 2011]
|
||||
Re-initialize the zlib compressor before compressing non-IDAT chunks.
|
||||
Added API functions to set parameters for zlib compression of non-IDAT
|
||||
chunks.
|
||||
Version 1.5.6beta01 [September 22, 2011]
|
||||
Fixed some 64-bit type conversion warnings in pngrtran.c
|
||||
Moved row_info from png_struct to a local variable.
|
||||
The various interlace mask arrays have been made into arrays of
|
||||
bytes and made PNG_CONST and static (previously some arrays were
|
||||
marked PNG_CONST and some weren't).
|
||||
Additional checks have been added to the transform code to validate the
|
||||
pixel depths after the transforms on both read and write.
|
||||
Removed some redundant code from pngwrite.c, in png_desgtroy_write_struct().
|
||||
Changed chunk reading/writing code to use png_uint_32 instead of png_byte[4].
|
||||
This removes the need to allocate temporary strings for chunk names on
|
||||
the stack in the read/write code. Unknown chunk handling still uses the
|
||||
string form because this is exposed in the API.
|
||||
|
||||
Version 1.5.3beta02 [April 3, 2011]
|
||||
Updated scripts/symbols.def with new API functions.
|
||||
Only compile the new zlib re-initializing code when text or iCCP is
|
||||
supported, using PNG_WRITE_COMPRESSED_TEXT_SUPPORTED macro.
|
||||
Improved the optimization of the zlib CMF byte (see libpng-1.2.6beta03).
|
||||
Optimize the zlib CMF byte in non-IDAT compressed chunks
|
||||
Version 1.5.6beta02 [September 26, 2011]
|
||||
Added a note in the manual the png_read_update_info() must be called only
|
||||
once with a particular info_ptr.
|
||||
Fixed a typo in the definition of the new PNG_STRING_FROM_CHUNK(s,c) macro.
|
||||
|
||||
Version 1.5.3beta03 [April 16, 2011]
|
||||
Fixed gcc -ansi -pedantic compile. A strict ANSI system does not have
|
||||
snprintf, and the "__STRICT_ANSI__" detects that condition more reliably
|
||||
than __STDC__ (John Bowler).
|
||||
Removed the PNG_PTR_NORETURN attribute because it too dangerous. It tells
|
||||
the compiler that a user supplied callback (the error handler) does not
|
||||
return, yet there is no guarantee in practice that the application code
|
||||
will correctly implement the error handler because the compiler only
|
||||
issues a warning if there is a mistake (John Bowler).
|
||||
Removed the no-longer-used PNG_DEPSTRUCT macro.
|
||||
Updated the zlib version to 1.2.5 in the VStudio project.
|
||||
Fixed 64-bit builds where png_uint_32 is smaller than png_size_t in
|
||||
pngwutil.c (John Bowler).
|
||||
Fixed bug with stripping the filler or alpha channel when writing, that
|
||||
was introduced in libpng-1.5.2beta01 (bug report by Andrew Church).
|
||||
Version 1.5.6beta03 [September 28, 2011]
|
||||
Revised test-pngtest.sh to report FAIL when pngtest fails.
|
||||
Added "--strict" option to pngtest, to report FAIL when the failure is
|
||||
only because the resulting valid files are different.
|
||||
Revised CMakeLists.txt to work with mingw and removed some material from
|
||||
CMakeLists.txt that is no longer useful in libpng-1.5.
|
||||
|
||||
Version 1.5.3beta04 [April 27, 2011]
|
||||
Updated pngtest.png with the new zlib CMF optimization.
|
||||
Cleaned up conditional compilation code and of background/gamma handling
|
||||
Internal changes only except a new option to avoid compiling the
|
||||
png_build_grayscale_palette API (which is not used at all internally.)
|
||||
The main change is to move the transform tests (READ_TRANSFORMS,
|
||||
WRITE_TRANSFORMS) up one level to the caller of the APIs. This avoids
|
||||
calls to spurious functions if all transforms are disabled and slightly
|
||||
simplifies those functions. Pngvalid modified to handle this.
|
||||
A minor change is to stop the strip_16 and expand_16 interfaces from
|
||||
disabling each other; this allows the future alpha premultiplication
|
||||
code to use 16-bit intermediate values while still producing 8-bit output.
|
||||
png_do_background and png_do_gamma have been simplified to take a single
|
||||
pointer to the png_struct rather than pointers to every item required
|
||||
from the png_struct. This makes no practical difference to the internal
|
||||
code.
|
||||
A serious bug in the pngvalid internal routine 'standard_display_init' has
|
||||
been fixed - this failed to initialize the red channel and accidentally
|
||||
initialized the alpha channel twice.
|
||||
Changed png_struct jmp_buf member name from png_jmpbuf to tmp_jmpbuf to
|
||||
avoid a clash with the png_jmpbuf macro on some platforms.
|
||||
Version 1.5.6beta04 [October 5, 2011]
|
||||
Fixed typo in Makefile.in and Makefile.am ("-M Wl" should be "-M -Wl")."
|
||||
|
||||
Version 1.5.3beta05 [May 6, 2011]
|
||||
Added appropriate feature test macros to ensure libpng sees the correct API
|
||||
_POSIX_SOURCE is defined in pngpriv.h, pngtest.c and pngvalid.c to ensure
|
||||
that POSIX conformant systems disable non-POSIX APIs. _ISOC99_SOURCE is
|
||||
defined in pngpriv.h to obtain the ISO C99 snprintf definition, when
|
||||
available.
|
||||
Removed png_snprintf and added formatted warning messages. This change adds
|
||||
internal APIs to allow png_warning messages to have parameters without
|
||||
requiring the host OS to implement snprintf. As a side effect the
|
||||
dependency of the tIME-supporting RFC1132 code on stdio is removed and
|
||||
PNG_NO_WARNINGS does actually work now.
|
||||
Added PNG_WRITE_OPTIMIZE_CMF_SUPPORTED macro to make the zlib "CMF" byte
|
||||
optimization configureable.
|
||||
IDAT compression failed if preceded by a compressed text chunk (bug
|
||||
introduced in libpng-1.5.3beta01-02). This was because the attempt to
|
||||
reset the zlib stream in png_write_IDAT happened after the first IDAT
|
||||
chunk had been deflated - much too late. In this change internal
|
||||
functions were added to claim/release the z_stream and, hopefully, make
|
||||
the code more robust. Also deflateEnd checking is added - previously
|
||||
libpng would ignore an error at the end of the stream.
|
||||
Version 1.5.6beta05 [October 12, 2011]
|
||||
Speed up png_combine_row() for interlaced images. This reduces the generality
|
||||
of the code, allowing it to be optimized for Adam7 interlace. The masks
|
||||
passed to png_combine_row() are now generated internally, avoiding
|
||||
some code duplication and localizing the interlace handling somewhat.
|
||||
Align png_struct::row_buf - previously it was always unaligned, caused by
|
||||
a bug in the code that attempted to align it; the code needs to subtract
|
||||
one from the pointer to take account of the filter byte prepended to
|
||||
each row.
|
||||
Optimized png_combine_row() when rows are aligned. This gains a small
|
||||
percentage for 16-bit and 32-bit pixels in the typical case where the
|
||||
output row buffers are appropriately aligned. The optimization was not
|
||||
previously possible because the png_struct buffer was always misaligned.
|
||||
Fixed bug in png_write_chunk_header() debug print, introduced in 1.5.6beta01.
|
||||
|
||||
Version 1.5.3beta06 [May 8, 2011]
|
||||
Removed the -D_ALL_SOURCE from definitions for AIX in CMakeLists.txt
|
||||
Implemented premultiplied alpha support: png_set_alpha_mode API
|
||||
Version 1.5.6beta06 [October 17, 2011]
|
||||
Removed two redundant tests for unitialized row.
|
||||
Fixed a relatively harmless memory overwrite in compressed text writing
|
||||
with a 1 byte zlib buffer.
|
||||
Add ability to call png_read_update_info multiple times to pngvalid.c
|
||||
Fixes for multiple calls to png_read_update_info. These fixes attend to
|
||||
most of the errors revealed in pngvalid, however doing the gamma work
|
||||
twice results in inaccuracies that can't be easily fixed. There is now
|
||||
a warning in the code if this is going to happen.
|
||||
Turned on multiple png_read_update_info in pngvalid transform tests.
|
||||
Prevent libpng from overwriting unused bits at the end of the image when
|
||||
it is not byte aligned, while reading. Prior to libpng-1.5.6 libpng would
|
||||
overwrite the partial byte at the end of each row if the row width was not
|
||||
an exact multiple of 8 bits and the image is not interlaced.
|
||||
|
||||
Version 1.5.3beta07 [May 11, 2011]
|
||||
Added expand_16 support to the high level interface.
|
||||
Added named value and 'flag' gamma support to png_set_gamma. Made a minor
|
||||
change from the previous (unreleased) ABI/API to hide the exact value used
|
||||
for Macs - it's not a good idea to embed this in the ABI!
|
||||
Moved macro definitions for PNG_HAVE_IHDR, PNG_HAVE_PLTE, and PNG_AFTER_IDAT
|
||||
from pngpriv.h to png.h because they must be visible to applications
|
||||
that call png_set_unknown_chunks().
|
||||
Check for up->location !PNG_AFTER_IDAT when writing unknown chunks
|
||||
before IDAT.
|
||||
Version 1.5.6beta07 [October 21, 2011]
|
||||
Made png_ptr->prev_row an aligned pointer into png_ptr->big_prev_row
|
||||
(Mans Rullgard).
|
||||
|
||||
Version 1.5.3beta08 [May 16, 2011]
|
||||
Improved "pngvalid --speed" to exclude more of pngvalid from the time.
|
||||
Documented png_set_alpha_mode(), other changes in libpng.3/libpng-manual.txt
|
||||
The cHRM chunk now sets the defaults for png_set_rgb_to_gray() (when negative
|
||||
parameters are supplied by the caller), while in the absence of cHRM
|
||||
sRGB/Rec 709 values are still used.
|
||||
The bKGD chunk no longer overwrites the background value set by
|
||||
png_set_background(), allowing the latter to be used before the file
|
||||
header is read. It never performed any useful function to override
|
||||
the default anyway.
|
||||
Added memory overwrite and palette image checks to pngvalid.c
|
||||
Previously palette image code was poorly checked. Since the transformation
|
||||
code has a special palette path in most cases this was a severe weakness.
|
||||
Minor cleanup and some extra checking in pngrutil.c and pngrtran.c. When
|
||||
expanding an indexed image, always expand to RGBA if transparency is
|
||||
present.
|
||||
Version 1.5.6rc01 [October 26, 2011]
|
||||
Changed misleading "Missing PLTE before cHRM" warning to "Out of place cHRM"
|
||||
|
||||
Version 1.5.3beta09 [May 17, 2011]
|
||||
Reversed earlier 1.5.3 change of transformation order; move png_expand_16 back.
|
||||
The change doesn't work because it requires 16-bit gamma tables when the code
|
||||
only generates 8-bit ones. This fails silently; the libpng code just doesn't
|
||||
do any gamma correction. Moving the tests back leaves the old, inaccurate,
|
||||
8-bit gamma calculations, but these are clearly better than none!
|
||||
|
||||
Version 1.5.3beta10 [May 20, 2011]
|
||||
png_set_background() and png_expand_16() did not work together correctly.
|
||||
This problem is present in 1.5.2; if png_set_background is called with
|
||||
need_expand false and the matching 16 bit color libpng erroneously just
|
||||
treats it as an 8-bit color because of where png_do_expand_16 is in the
|
||||
transform list. This simple fix reduces the supplied colour to 8-bits,
|
||||
so it gets smashed, but this is better than the current behavior.
|
||||
Added tests for expand16, more fixes for palette image tests to pngvalid.
|
||||
Corrects the code for palette image tests and disables attempts to
|
||||
validate palette colors.
|
||||
|
||||
Version 1.5.3rc01 [June 3, 2011]
|
||||
No changes.
|
||||
|
||||
Version 1.5.3rc02 [June 8, 2011]
|
||||
Fixed uninitialized memory read in png_format_buffer() (Bug report by
|
||||
Frank Busse, related to CVE-2004-0421).
|
||||
|
||||
Version 1.5.3beta11 [June 11, 2011]
|
||||
Fixed png_handle_sCAL which is broken in 1.5; added sCAL to pngtest.png
|
||||
Revised documentation about png_set_user_limits() to say that it also affects
|
||||
png writing.
|
||||
Revised handling of png_set_user_limits() so that it can increase the
|
||||
limit beyond the PNG_USER_WIDTH|HEIGHT_MAX; previously it could only
|
||||
reduce it.
|
||||
Make the 16-to-8 scaling accurate. Dividing by 256 with no rounding is
|
||||
wrong (high by one) 25% of the time. Dividing by 257 with rounding is
|
||||
wrong in 128 out of 65536 cases. Getting the right answer all the time
|
||||
without division is easy.
|
||||
Added "_SUPPORTED" to the PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION macro.
|
||||
Added projects/owatcom, an IDE project for OpenWatcom to replace
|
||||
scripts/makefile.watcom. This project works with OpenWatcom 1.9. The
|
||||
IDE autogenerates appropriate makefiles (libpng.mk) for batch processing.
|
||||
The project is configurable, unlike the Visual Studio project, so long
|
||||
as the developer has an awk.
|
||||
Changed png_set_gAMA to limit the gamma value range so that the inverse
|
||||
of the stored value cannot overflow the fixed point representation,
|
||||
and changed other things OpenWatcom warns about.
|
||||
Revised pngvalid.c to test PNG_ALPHA_MODE_SUPPORTED correctly. This allows
|
||||
pngvalid to build when ALPHA_MODE is not supported, which is required if
|
||||
it is to build on libpng 1.4.
|
||||
Removed string/memory macros that are no longer used and are not
|
||||
necessarily fully supportable, particularly png_strncpy and png_snprintf.
|
||||
Added log option to pngvalid.c and attempted to improve gamma messages.
|
||||
|
||||
Version 1.5.3 [omitted]
|
||||
People found the presence of a beta release following an rc release
|
||||
to be confusing; therefore we bump the version to libpng-1.5.4beta01
|
||||
and there will be no libpng-1.5.3 release.
|
||||
|
||||
Version 1.5.4beta01 [June 14, 2011]
|
||||
Made it possible to undefine PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED
|
||||
to get the same (inaccurate) output as libpng-1.5.2 and earlier.
|
||||
Moved definitions of PNG_HAVE_IHDR, PNG_AFTER_IDAT, and PNG_HAVE_PLTE
|
||||
outside of an unknown-chunk block in png.h because they are also
|
||||
needed for other uses.
|
||||
|
||||
Version 1.5.4beta02 [June 14, 2011]
|
||||
Fixed and clarified LEGACY 16-to-8 scaling code.
|
||||
Added png_set_chop_16() API, to match inaccurate results from previous
|
||||
libpng versions.
|
||||
Removed the ACCURATE and LEGACY options (they are no longer useable)
|
||||
Use the old scaling method for background if png_set_chop_16() was
|
||||
called.
|
||||
Made png_set_chop_16() API removeable by disabling PNG_CHOP_16_TO_8_SUPPORTED
|
||||
|
||||
Version 1.5.4beta03 [June 15, 2011]
|
||||
Fixed a problem in png_do_expand_palette() exposed by optimization in
|
||||
1.5.3beta06
|
||||
Also removed a spurious (totally unused and confusing) member from png_info.
|
||||
The palette expand optimization prevented expansion to an intermediate RGBA
|
||||
form if tRNS was present but alpha was marked to be stripped; this exposed
|
||||
a check for tRNS in png_do_expand_palette() which is inconsistent with the
|
||||
code elsewhere in libpng.
|
||||
Correction to the expand_16 code; removed extra instance of
|
||||
png_set_scale_16_to_8 from pngpriv.h
|
||||
Version 1.5.6rc02 [October 27, 2011]
|
||||
Added LSR() macro to defend against buggy compilers that evaluate non-taken
|
||||
code branches and complain about out-of-range shifts.
|
||||
|
||||
Send comments/corrections/commendations to png-mng-implement at lists.sf.net:
|
||||
(subscription required; visit
|
||||
|
||||
218
CHANGES
218
CHANGES
@@ -1,5 +1,4 @@
|
||||
#if 0
|
||||
libpng_changes(){ /*
|
||||
CHANGES - changes for libpng
|
||||
|
||||
Version 0.2
|
||||
@@ -180,7 +179,7 @@ Version 0.96 [May, 1997]
|
||||
Fixed serious bug with < 8bpp images introduced in 0.95
|
||||
Fixed 256-color transparency bug (Greg Roelofs)
|
||||
Fixed up documentation (Greg Roelofs, Laszlo Nyul)
|
||||
Fixed "error" in pngconf.h for Linux setjmp() behaviour
|
||||
Fixed "error" in pngconf.h for Linux setjmp() behavior
|
||||
Fixed DOS medium model support (Tim Wegner)
|
||||
Fixed png_check_keyword() for case with error in static string text
|
||||
Added read of CRC after IEND chunk for embedded PNGs (Laszlo Nyul)
|
||||
@@ -204,8 +203,8 @@ Version 0.97 [January, 1998]
|
||||
Added more conditions for png_do_background, to avoid changing
|
||||
black pixels to background when a background is supplied and
|
||||
no pixels are transparent
|
||||
Repaired PNG_NO_STDIO behaviour
|
||||
Tested NODIV support and made it default behaviour (Greg Roelofs)
|
||||
Repaired PNG_NO_STDIO behavior
|
||||
Tested NODIV support and made it default behavior (Greg Roelofs)
|
||||
Added "-m" option and PNGTEST_DEBUG_MEMORY to pngtest (John Bowler)
|
||||
Regularized version numbering scheme and bumped shared-library major
|
||||
version number to 2 to avoid problems with libpng 0.89 apps (Greg Roelofs)
|
||||
@@ -1778,7 +1777,7 @@ Version 1.2.13beta1 [October 2, 2006]
|
||||
Removed AC_FUNC_MALLOC from configure.ac
|
||||
Work around Intel-Mac compiler bug by setting PNG_NO_MMX_CODE in pngconf.h
|
||||
Change "logical" to "bitwise" throughout documentation.
|
||||
Detect and fix attempt to write wrong iCCP profile length.
|
||||
Detect and fix attempt to write wrong iCCP profile length (CVE-2006-7244)
|
||||
|
||||
Version 1.0.21, 1.2.13 [November 14, 2006]
|
||||
Fix potential buffer overflow in sPLT chunk handler.
|
||||
@@ -2361,7 +2360,7 @@ Version 1.4.0beta72 [August 1, 2009]
|
||||
|
||||
Version 1.4.0beta73 [August 1, 2009]
|
||||
Reject attempt to write iCCP chunk with negative embedded profile length
|
||||
(JD Chen)
|
||||
(JD Chen) (CVE-2009-5063).
|
||||
|
||||
Version 1.4.0beta74 [August 8, 2009]
|
||||
Changed png_ptr and info_ptr member "trans" to "trans_alpha".
|
||||
@@ -3149,8 +3148,8 @@ version 1.5.1beta01 [January 8, 2011]
|
||||
in version 1.5.0beta36 but is not noted in the CHANGES. Similarly,
|
||||
it was changed from png_charpp to png_const_bytepp in png_set_iCCP().
|
||||
Ensure that png_rgb_to_gray ignores palette mapped images, if libpng
|
||||
internally happens to call it with one.
|
||||
Fixed a failure to handle palette mapped images correctly.
|
||||
internally happens to call it with one, and fixed a failure to handle
|
||||
palette mapped images correctly. This fixes CVE-2690.
|
||||
|
||||
Version 1.5.1beta02 [January 14, 2011]
|
||||
Fixed a bug in handling of interlaced images (bero at arklinux.org).
|
||||
@@ -3208,9 +3207,9 @@ Version 1.5.1beta09 [January 24, 2011]
|
||||
pngvalid contains tests of transforms, which tests are currently disabled
|
||||
because they are incompletely tested. gray_to_rgb was failing to expand
|
||||
the bit depth for smaller bit depth images; this seems to be a long
|
||||
standing error and resulted, apparently, in invalid output. The
|
||||
documentation did not accurately describe what libpng really does when
|
||||
converting RGB to gray.
|
||||
standing error and resulted, apparently, in invalid output
|
||||
(CVE-2011-0408, CERT VU#643140). The documentation did not accurately
|
||||
describe what libpng really does when converting RGB to gray.
|
||||
|
||||
Version 1.5.1beta10 [January 27, 2010]
|
||||
Fixed incorrect examples of callback prototypes in the manual, that were
|
||||
@@ -3289,8 +3288,8 @@ Version 1.5.2 [March 31, 2011]
|
||||
|
||||
Version 1.5.3beta01 [April 1, 2011]
|
||||
Re-initialize the zlib compressor before compressing non-IDAT chunks.
|
||||
Added API functions to set parameters for zlib compression of non-IDAT
|
||||
chunks.
|
||||
Added API functions (png_set_text_compression_level() and four others) to
|
||||
set parameters for zlib compression of non-IDAT chunks.
|
||||
|
||||
Version 1.5.3beta02 [April 3, 2011]
|
||||
Updated scripts/symbols.def with new API functions.
|
||||
@@ -3347,7 +3346,7 @@ Version 1.5.3beta05 [May 6, 2011]
|
||||
dependency of the tIME-supporting RFC1132 code on stdio is removed and
|
||||
PNG_NO_WARNINGS does actually work now.
|
||||
Pass "" instead of '\0' to png_default_error() in png_err(). This mistake
|
||||
was introduced in libpng-1.2.20beta01.
|
||||
was introduced in libpng-1.2.20beta01. This fixes CVE-2011-2691.
|
||||
Added PNG_WRITE_OPTIMIZE_CMF_SUPPORTED macro to make the zlib "CMF" byte
|
||||
optimization configureable.
|
||||
IDAT compression failed if preceded by a compressed text chunk (bug
|
||||
@@ -3378,7 +3377,8 @@ Version 1.5.3beta08 [May 16, 2011]
|
||||
Documented png_set_alpha_mode(), other changes in libpng.3/libpng-manual.txt
|
||||
The cHRM chunk now sets the defaults for png_set_rgb_to_gray() (when negative
|
||||
parameters are supplied by the caller), while in the absence of cHRM
|
||||
sRGB/Rec 709 values are still used.
|
||||
sRGB/Rec 709 values are still used. This introduced a divide-by-zero
|
||||
bug in png_handle_cHRM().
|
||||
The bKGD chunk no longer overwrites the background value set by
|
||||
png_set_background(), allowing the latter to be used before the file
|
||||
header is read. It never performed any useful function to override
|
||||
@@ -3415,10 +3415,11 @@ Version 1.5.3rc01 [June 3, 2011]
|
||||
|
||||
Version 1.5.3rc02 [June 8, 2011]
|
||||
Fixed uninitialized memory read in png_format_buffer() (Bug report by
|
||||
Frank Busse, related to CVE-2004-0421).
|
||||
Frank Busse, CVE-2011-2501, related to CVE-2004-0421).
|
||||
|
||||
Version 1.5.3beta11 [June 11, 2011]
|
||||
Fixed png_handle_sCAL which is broken in 1.5; added sCAL to pngtest.png
|
||||
Fixed png_handle_sCAL which is broken in 1.5. This fixes CVE 2011-2692.
|
||||
Added sCAL to pngtest.png
|
||||
Revised documentation about png_set_user_limits() to say that it also affects
|
||||
png writing.
|
||||
Revised handling of png_set_user_limits() so that it can increase the
|
||||
@@ -3468,7 +3469,7 @@ Version 1.5.4beta02 [June 14, 2011]
|
||||
Version 1.5.4beta03 [June 15, 2011]
|
||||
Fixed a problem in png_do_expand_palette() exposed by optimization in
|
||||
1.5.3beta06
|
||||
Also removed a spurious (totally unused and confusing) member from png_info.
|
||||
Also removed a spurious and confusing "trans" member ("trans") from png_info.
|
||||
The palette expand optimization prevented expansion to an intermediate RGBA
|
||||
form if tRNS was present but alpha was marked to be stripped; this exposed
|
||||
a check for tRNS in png_do_expand_palette() which is inconsistent with the
|
||||
@@ -3476,6 +3477,186 @@ Version 1.5.4beta03 [June 15, 2011]
|
||||
Correction to the expand_16 code; removed extra instance of
|
||||
png_set_scale_16_to_8 from pngpriv.h
|
||||
|
||||
Version 1.5.4beta04 [June 16, 2011]
|
||||
Added a missing "#ifdef PNG_READ_BACKGROUND_SUPPORTED/#endif" in pngrtran.c
|
||||
Added PNG_TRANSFORM_CHOP_16 to the high-level read transforms.
|
||||
Made PNG_READ_16_TO_8_ACCURATE_SCALE configurable again. If this is
|
||||
not enabled, png_set_strip_16() and png_do_scale_16_to_8() aren't built.
|
||||
Revised contrib/visupng, gregbook, and pngminim to demonstrate chop_16_to_8
|
||||
|
||||
Version 1.5.4beta05 [June 16, 2011]
|
||||
Renamed png_set_strip_16() to png_set_scale_16() and renamed
|
||||
png_set_chop_16() to png_set_strip(16) in an attempt to minimize the
|
||||
behavior changes between libpng14 and libpng15.
|
||||
|
||||
Version 1.5.4beta06 [June 18, 2011]
|
||||
Fixed new bug that was causing both strip_16 and scale_16 to be applied.
|
||||
|
||||
Version 1.5.4beta07 [June 19, 2011]
|
||||
Fixed pngvalid, simplified macros, added checking for 0 in sCAL.
|
||||
The ACCURATE scale macro is no longer defined in 1.5 - call the
|
||||
png_scale_16_to_8 API. Made sure that PNG_READ_16_TO_8 is still defined
|
||||
if the png_strip_16_to_8 API is present. png_check_fp_number now
|
||||
maintains some state so that positive, negative and zero values are
|
||||
identified. sCAL uses these to be strictly spec conformant.
|
||||
|
||||
Version 1.5.4beta08 [June 23, 2011]
|
||||
Fixed pngvalid if ACCURATE_SCALE is defined.
|
||||
Updated scripts/pnglibconf.h.prebuilt.
|
||||
|
||||
Version 1.5.4rc01 [June 30, 2011]
|
||||
Define PNG_ALLOCATED to "restrict" only if MSC_VER >= 1400.
|
||||
|
||||
Version 1.5.4 [July 7, 2011]
|
||||
No changes.
|
||||
|
||||
Version 1.5.5beta01 [July 13, 2011]
|
||||
Fixed some typos and made other minor changes in the manual.
|
||||
Updated contrib/pngminus/makefile.std (Samuli Souminen)
|
||||
|
||||
Version 1.5.5beta02 [July 14, 2011]
|
||||
Revised Makefile.am and Makefile.in to look in the right directory for
|
||||
pnglibconf.h.prebuilt
|
||||
|
||||
Version 1.5.5beta03 [July 27, 2011]
|
||||
Enabled compilation with g++ compiler. This compiler does not recognize
|
||||
the file extension, so it always compiles with C++ rules. Made minor
|
||||
changes to pngrutil.c to cast results where C++ expects it but C does not.
|
||||
Minor editing of libpng.3 and libpng-manual.txt.
|
||||
|
||||
Version 1.5.5beta04 [July 29, 2011]
|
||||
Revised CMakeLists.txt (Clifford Yapp)
|
||||
Updated commentary about the png_rgb_to_gray() default coefficients
|
||||
in the manual and in pngrtran.c
|
||||
|
||||
Version 1.5.5beta05 [August 17, 2011]
|
||||
Prevent unexpected API exports from non-libpng DLLs on Windows. The "_DLL"
|
||||
is removed from the test of whether a DLL is being built (this erroneously
|
||||
caused the libpng APIs to be marked as DLL exports in static builds under
|
||||
Microsoft Visual Studio). Almost all of the libpng building configuration
|
||||
is moved from pngconf.h to pngpriv.h, but PNG_DLL_EXPORT remains in
|
||||
pngconf.h, though, so that it is colocated with the import definition (it
|
||||
is no longer used anywhere in the installed headers). The VStudio project
|
||||
definitions have been cleaned up: "_USRDLL" has been removed from the
|
||||
static library builds (this was incorrect), and PNG_USE_DLL has been added
|
||||
to pngvalid to test the functionality (pngtest does not supply it,
|
||||
deliberately). The spurious "_EXPORTS" has been removed from the
|
||||
libpng build (all these errors were a result of copy/paste between project
|
||||
configurations.)
|
||||
Added new types and internal functions for CIE RGB end point handling to
|
||||
pngpriv.h (functions yet to be implemented).
|
||||
|
||||
Version 1.5.5beta06 [August 26, 2011]
|
||||
Ensure the CMAKE_LIBRARY_OUTPUT_DIRECTORY is set in CMakeLists.txt
|
||||
(Clifford Yap)
|
||||
Fixes to rgb_to_gray and cHRM XYZ APIs (John Bowler):
|
||||
The rgb_to_gray code had errors when combined with gamma correction.
|
||||
Some pixels were treated as true grey when they weren't and such pixels
|
||||
and true grey ones were not gamma corrected (the original value of the
|
||||
red component was used instead). APIs to get and set cHRM using color
|
||||
space end points have been added and the rgb_to_gray code that defaults
|
||||
based on cHRM, and the divide-by-zero bug in png_handle_cHRM (CERT
|
||||
VU#477046, CVE-2011-3328, introduced in 1.5.4) have been corrected.
|
||||
A considerable number of tests has been added to pngvalid for the
|
||||
rgb_to_gray transform.
|
||||
Arithmetic errors in rgb_to_gray whereby the calculated gray value was
|
||||
truncated to the bit depth rather than rounded have been fixed except in
|
||||
the 8-bit non-gamma-corrected case (where consistency seems more important
|
||||
than correctness.) The code still has considerable inaccuracies in the
|
||||
8-bit case because 8-bit linear arithmetic is used.
|
||||
|
||||
Version 1.5.5beta07 [September 7, 2011]
|
||||
Added "$(ARCH)" option to makefile.darwin
|
||||
Added SunOS support to configure.ac and Makefile.am
|
||||
Changed png_chunk_benign_error() to png_warning() in png.c, in
|
||||
png_XYZ_from_xy_checked().
|
||||
|
||||
Version 1.5.5beta08 [September 10, 2011]
|
||||
Fixed 64-bit compilation errors (gcc). The errors fixed relate
|
||||
to conditions where types that are 32 bits in the GCC 32-bit
|
||||
world (uLong and png_size_t) become 64 bits in the 64-bit
|
||||
world. This produces potential truncation errors which the
|
||||
compiler correctly flags.
|
||||
Relocated new HAVE_SOLARIS_LD definition in configure.ac
|
||||
Constant changes for 64-bit compatibility (removal of L suffixes). The
|
||||
16-bit cases still use "L" as we don't have a 16-bit test system.
|
||||
|
||||
Version 1.5.5rc01 [September 15, 2011]
|
||||
Removed "L" suffixes in pngpriv.h
|
||||
|
||||
Version 1.5.5 [September 22, 2011]
|
||||
No changes.
|
||||
|
||||
Version 1.5.6beta01 [September 22, 2011]
|
||||
Fixed some 64-bit type conversion warnings in pngrtran.c
|
||||
Moved row_info from png_struct to a local variable.
|
||||
The various interlace mask arrays have been made into arrays of
|
||||
bytes and made PNG_CONST and static (previously some arrays were
|
||||
marked PNG_CONST and some weren't).
|
||||
Additional checks have been added to the transform code to validate the
|
||||
pixel depths after the transforms on both read and write.
|
||||
Removed some redundant code from pngwrite.c, in png_destroy_write_struct().
|
||||
Changed chunk reading/writing code to use png_uint_32 instead of png_byte[4].
|
||||
This removes the need to allocate temporary strings for chunk names on
|
||||
the stack in the read/write code. Unknown chunk handling still uses the
|
||||
string form because this is exposed in the API.
|
||||
|
||||
Version 1.5.6beta02 [September 26, 2011]
|
||||
Added a note in the manual the png_read_update_info() must be called only
|
||||
once with a particular info_ptr.
|
||||
Fixed a typo in the definition of the new PNG_STRING_FROM_CHUNK(s,c) macro.
|
||||
|
||||
Version 1.5.6beta03 [September 28, 2011]
|
||||
Revised test-pngtest.sh to report FAIL when pngtest fails.
|
||||
Added "--strict" option to pngtest, to report FAIL when the failure is
|
||||
only because the resulting valid files are different.
|
||||
Revised CMakeLists.txt to work with mingw and removed some material from
|
||||
CMakeLists.txt that is no longer useful in libpng-1.5.
|
||||
|
||||
Version 1.5.6beta04 [October 5, 2011]
|
||||
Fixed typo in Makefile.in and Makefile.am ("-M Wl" should be "-M -Wl")."
|
||||
|
||||
Version 1.5.6beta05 [October 12, 2011]
|
||||
Speed up png_combine_row() for interlaced images. This reduces the generality
|
||||
of the code, allowing it to be optimized for Adam7 interlace. The masks
|
||||
passed to png_combine_row() are now generated internally, avoiding
|
||||
some code duplication and localizing the interlace handling somewhat.
|
||||
Align png_struct::row_buf - previously it was always unaligned, caused by
|
||||
a bug in the code that attempted to align it; the code needs to subtract
|
||||
one from the pointer to take account of the filter byte prepended to
|
||||
each row.
|
||||
Optimized png_combine_row() when rows are aligned. This gains a small
|
||||
percentage for 16-bit and 32-bit pixels in the typical case where the
|
||||
output row buffers are appropriately aligned. The optimization was not
|
||||
previously possible because the png_struct buffer was always misaligned.
|
||||
Fixed bug in png_write_chunk_header() debug print, introduced in 1.5.6beta01.
|
||||
|
||||
Version 1.5.6beta06 [October 17, 2011]
|
||||
Removed two redundant tests for unitialized row.
|
||||
Fixed a relatively harmless memory overwrite in compressed text writing
|
||||
with a 1 byte zlib buffer.
|
||||
Add ability to call png_read_update_info multiple times to pngvalid.c.
|
||||
Fixes for multiple calls to png_read_update_info. These fixes attend to
|
||||
most of the errors revealed in pngvalid, however doing the gamma work
|
||||
twice results in inaccuracies that can't be easily fixed. There is now
|
||||
a warning in the code if this is going to happen.
|
||||
Turned on multiple png_read_update_info in pngvalid transform tests.
|
||||
Prevent libpng from overwriting unused bits at the end of the image when
|
||||
it is not byte aligned, while reading. Prior to libpng-1.5.6 libpng would
|
||||
overwrite the partial byte at the end of each row if the row width was not
|
||||
an exact multiple of 8 bits and the image is not interlaced.
|
||||
|
||||
Version 1.5.6beta07 [October 21, 2011]
|
||||
Made png_ptr->prev_row an aligned pointer into png_ptr->big_prev_row
|
||||
(Mans Rullgard).
|
||||
|
||||
Version 1.5.6rc01 [October 26, 2011]
|
||||
Changed misleading "Missing PLTE before cHRM" warning to "Out of place cHRM"
|
||||
|
||||
Version 1.5.6rc02 [October 27, 2011]
|
||||
Added LSR() macro to defend against buggy compilers that evaluate non-taken
|
||||
code branches and complain about out-of-range shifts.
|
||||
|
||||
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
|
||||
(subscription required; visit
|
||||
https://lists.sourceforge.net/lists/listinfo/png-mng-implement
|
||||
@@ -3483,5 +3664,4 @@ to subscribe)
|
||||
or to glennrp at users.sourceforge.net
|
||||
|
||||
Glenn R-P
|
||||
*/ }
|
||||
#endif
|
||||
|
||||
215
CMakeLists.txt
215
CMakeLists.txt
@@ -1,3 +1,11 @@
|
||||
# CMakeLists.txt
|
||||
|
||||
# Copyright (C) 2007-2011 Glenn Randers-Pehrson
|
||||
|
||||
# This code is released under the libpng license.
|
||||
# For conditions of distribution and use, see the disclaimer
|
||||
# and license in png.h
|
||||
|
||||
cmake_minimum_required(VERSION 2.4.4)
|
||||
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
|
||||
|
||||
@@ -25,15 +33,9 @@ endif()
|
||||
project(libpng C)
|
||||
enable_testing()
|
||||
|
||||
# Copyright (C) 2007-2011 Glenn Randers-Pehrson
|
||||
|
||||
# This code is released under the libpng license.
|
||||
# For conditions of distribution and use, see the disclaimer
|
||||
# and license in png.h
|
||||
|
||||
set(PNGLIB_MAJOR 1)
|
||||
set(PNGLIB_MINOR 5)
|
||||
set(PNGLIB_RELEASE 4)
|
||||
set(PNGLIB_RELEASE 6)
|
||||
set(PNGLIB_NAME libpng${PNGLIB_MAJOR}${PNGLIB_MINOR})
|
||||
set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE})
|
||||
|
||||
@@ -67,39 +69,11 @@ else()
|
||||
option(PNG_STATIC "Build static lib" ON)
|
||||
endif()
|
||||
|
||||
if(MINGW)
|
||||
option(PNG_TESTS "Build pngtest" NO)
|
||||
else()
|
||||
option(PNG_TESTS "Build pngtest" YES)
|
||||
endif()
|
||||
option(PNG_TESTS "Build libpng tests" YES)
|
||||
|
||||
option(PNG_NO_CONSOLE_IO "FIXME" YES)
|
||||
option(PNG_NO_STDIO "FIXME" YES)
|
||||
# Many more configuration options could be added here
|
||||
option(PNG_DEBUG "Build with debug output" NO)
|
||||
option(PNGARG "FIXME" YES)
|
||||
#TODO:
|
||||
# PNG_CONSOLE_IO_SUPPORTED
|
||||
|
||||
# maybe needs improving, but currently I don't know when we can enable what :)
|
||||
set(png_asm_tmp "OFF")
|
||||
if(NOT WIN32)
|
||||
find_program(uname_executable NAMES uname PATHS /bin /usr/bin /usr/local/bin)
|
||||
if(uname_executable)
|
||||
exec_program(${uname_executable}
|
||||
ARGS --machine OUTPUT_VARIABLE uname_output)
|
||||
if("uname_output" MATCHES "^.*i[1-9]86.*$")
|
||||
set(png_asm_tmp "ON")
|
||||
else("uname_output" MATCHES "^.*i[1-9]86.*$")
|
||||
set(png_asm_tmp "OFF")
|
||||
endif("uname_output" MATCHES "^.*i[1-9]86.*$")
|
||||
endif(uname_executable)
|
||||
else()
|
||||
# this env var is normally only set on win64
|
||||
set(TEXT "ProgramFiles(x86)")
|
||||
if("$ENV{${TEXT}}" STREQUAL "")
|
||||
set(png_asm_tmp "ON")
|
||||
endif("$ENV{${TEXT}}" STREQUAL "")
|
||||
endif()
|
||||
option(PNGARG "Disable ANSI-C prototypes" NO)
|
||||
|
||||
# SET LIBNAME
|
||||
set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR})
|
||||
@@ -108,6 +82,9 @@ set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR})
|
||||
set(CMAKE_DEBUG_POSTFIX "d")
|
||||
|
||||
# Use the prebuilt pnglibconf.h file from the scripts folder
|
||||
# TODO: fix this by building with awk; without this no cmake build can be
|
||||
# configured directly (to do so indirectly use your local awk to build a
|
||||
# pnglibconf.h in the build directory.)
|
||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt
|
||||
${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h)
|
||||
include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
||||
@@ -143,40 +120,21 @@ set(libpng_sources
|
||||
set(pngtest_sources
|
||||
pngtest.c
|
||||
)
|
||||
set(pngvalid_sources
|
||||
pngvalid.c
|
||||
)
|
||||
# SOME NEEDED DEFINITIONS
|
||||
|
||||
add_definitions(-DPNG_CONFIGURE_LIBPNG)
|
||||
|
||||
if(MSVC)
|
||||
add_definitions(-DPNG_NO_MODULEDEF -D_CRT_SECURE_NO_DEPRECATE)
|
||||
add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
|
||||
endif(MSVC)
|
||||
|
||||
if(PNG_SHARED OR NOT MSVC)
|
||||
#if building msvc static this has NOT to be defined
|
||||
add_definitions(-DZLIB_DLL)
|
||||
endif()
|
||||
|
||||
|
||||
if(PNG_CONSOLE_IO_SUPPORTED)
|
||||
add_definitions(-DPNG_CONSOLE_IO_SUPPORTED)
|
||||
endif()
|
||||
|
||||
if(PNG_NO_CONSOLE_IO)
|
||||
add_definitions(-DPNG_NO_CONSOLE_IO)
|
||||
endif()
|
||||
|
||||
if(PNG_NO_STDIO)
|
||||
add_definitions(-DPNG_NO_STDIO)
|
||||
endif()
|
||||
|
||||
if(PNG_DEBUG)
|
||||
add_definitions(-DPNG_DEBUG)
|
||||
endif()
|
||||
|
||||
if(NOT M_LIBRARY AND NOT WIN32)
|
||||
add_definitions(-DPNG_NO_FLOATING_POINT_SUPPORTED)
|
||||
endif()
|
||||
|
||||
# NOW BUILD OUR TARGET
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${ZLIB_INCLUDE_DIR})
|
||||
|
||||
@@ -201,7 +159,6 @@ if(PNG_STATIC)
|
||||
target_link_libraries(${PNG_LIB_NAME_STATIC} ${ZLIB_LIBRARY} ${M_LIBRARY})
|
||||
endif()
|
||||
|
||||
|
||||
if(PNG_SHARED AND WIN32)
|
||||
set_target_properties(${PNG_LIB_NAME} PROPERTIES DEFINE_SYMBOL PNG_BUILD_DLL)
|
||||
endif()
|
||||
@@ -211,33 +168,50 @@ if(PNG_TESTS AND PNG_SHARED)
|
||||
add_executable(pngtest ${pngtest_sources})
|
||||
target_link_libraries(pngtest ${PNG_LIB_NAME})
|
||||
add_test(pngtest ./pngtest ${CMAKE_CURRENT_SOURCE_DIR}/pngtest.png)
|
||||
#
|
||||
add_executable(pngvalid ${pngvalid_sources})
|
||||
target_link_libraries(pngvalid ${PNG_LIB_NAME})
|
||||
add_test(pngvalid ./pngvalid)
|
||||
endif()
|
||||
|
||||
#
|
||||
# Ensure the CMAKE_LIBRARY_OUTPUT_DIRECTORY is set
|
||||
IF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
|
||||
IF(WIN32)
|
||||
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "bin")
|
||||
ELSE(WIN32)
|
||||
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "lib")
|
||||
ENDIF(WIN32)
|
||||
ENDIF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
|
||||
|
||||
# Set a variable with CMake code which:
|
||||
# Creates a symlink from src to dest (if possible) or alternatively
|
||||
# copies if different.
|
||||
macro(_png_generate_symlink_code CODE SRC DEST)
|
||||
macro(CREATE_SYMLINK SRC_FILE DEST_FILE)
|
||||
FILE(REMOVE ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})
|
||||
if(WIN32 AND NOT CYGWIN)
|
||||
set(_png_gsc_message "Copying ${SRC} to ${DEST} if needed")
|
||||
set(_png_gsc_operation "copy_if_different")
|
||||
else()
|
||||
set(_png_gsc_message "Symlinking ${SRC} to ${DEST}")
|
||||
set(_png_gsc_operation "create_symlink")
|
||||
endif()
|
||||
|
||||
set(${CODE} "
|
||||
message(STATUS \"${_png_gsc_message}\")
|
||||
execute_process(COMMAND \${CMAKE_COMMAND} -E ${_png_gsc_operation}
|
||||
\"${SRC}\" \"${DEST}\")
|
||||
")
|
||||
ADD_CUSTOM_COMMAND(
|
||||
OUTPUT ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE} ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}
|
||||
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/${SRC_FILE} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE}
|
||||
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/${SRC_FILE} ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}
|
||||
DEPENDS ${PNG_LIB_NAME} ${PNG_LIB_NAME_STATIC}
|
||||
)
|
||||
ADD_CUSTOM_TARGET(${DEST_FILE}_COPY ALL DEPENDS ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})
|
||||
else(WIN32 AND NOT CYGWIN)
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${SRC_FILE} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${SRC_FILE} ${DEST_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
|
||||
endif(WIN32 AND NOT CYGWIN)
|
||||
endmacro()
|
||||
|
||||
# CREATE PKGCONFIG FILES
|
||||
# we use the same files like ./configure, so we have to set its vars
|
||||
# libpng is a library so default to 'lib'
|
||||
if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
|
||||
set(CMAKE_INSTALL_LIBDIR lib)
|
||||
endif(NOT DEFINED CMAKE_INSTALL_LIBDIR)
|
||||
|
||||
# CREATE PKGCONFIG FILES
|
||||
# we use the same files like ./configure, so we have to set its vars
|
||||
# Only do this on Windows for Cygwin - the files don't make much sense outside
|
||||
# a UNIX look alike
|
||||
if(NOT WIN32 OR CYGWIN)
|
||||
set(prefix ${CMAKE_INSTALL_PREFIX})
|
||||
set(exec_prefix ${CMAKE_INSTALL_PREFIX})
|
||||
set(libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
|
||||
@@ -245,22 +219,17 @@ set(includedir ${CMAKE_INSTALL_PREFIX}/include)
|
||||
set(LIBS "-lz -lm")
|
||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng.pc.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc @ONLY)
|
||||
_png_generate_symlink_code(PNG_PC_INSTALL_CODE
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc
|
||||
${CMAKE_CURRENT_BINARY_DIR}/libpng.pc)
|
||||
install(CODE ${PNG_PC_INSTALL_CODE})
|
||||
CREATE_SYMLINK(${PNGLIB_NAME}.pc libpng.pc)
|
||||
|
||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng-config.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config @ONLY)
|
||||
_png_generate_symlink_code(PNG_CONFIG_INSTALL_CODE
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
|
||||
${CMAKE_CURRENT_BINARY_DIR}/libpng-config)
|
||||
install(CODE ${PNG_CONFIG_INSTALL_CODE})
|
||||
CREATE_SYMLINK(${PNGLIB_NAME}-config libpng-config)
|
||||
endif(NOT WIN32 OR CYGWIN)
|
||||
|
||||
# SET UP LINKS
|
||||
if(PNG_SHARED)
|
||||
set_target_properties(${PNG_LIB_NAME} PROPERTIES
|
||||
# VERSION 15.${PNGLIB_RELEASE}.1.5.4beta03
|
||||
# VERSION 15.${PNGLIB_RELEASE}.1.5.6rc02
|
||||
VERSION 15.${PNGLIB_RELEASE}.0
|
||||
SOVERSION 15
|
||||
CLEAN_DIRECT_OUTPUT 1)
|
||||
@@ -296,61 +265,35 @@ if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
|
||||
|
||||
# Create a symlink for libpng.dll.a => libpng15.dll.a on Cygwin
|
||||
if(CYGWIN)
|
||||
_png_generate_symlink_code(PNG_SHARED_IMPLIB_INSTALL_CODE
|
||||
${PNGLIB_NAME}${CMAKE_IMPORT_LIBRARY_SUFFIX}
|
||||
libpng${CMAKE_IMPORT_LIBRARY_SUFFIX})
|
||||
install(CODE ${PNG_SHARED_IMPLIB_INSTALL_CODE})
|
||||
install(FILES
|
||||
${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_IMPORT_LIBRARY_SUFFIX}
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||
endif()
|
||||
get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME} LOCATION_${CMAKE_BUILD_TYPE})
|
||||
get_filename_component(BUILD_TARGET_FILE ${BUILD_TARGET_LOCATION} NAME)
|
||||
CREATE_SYMLINK(${BUILD_TARGET_FILE} libpng${CMAKE_IMPORT_LIBRARY_SUFFIX})
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_IMPORT_LIBRARY_SUFFIX}
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||
endif(CYGWIN)
|
||||
|
||||
if(NOT WIN32)
|
||||
IF(CMAKE_LIBRARY_OUTPUT_DIRECTORY)
|
||||
_png_generate_symlink_code(PNG_SHARED_INSTALL_CODE
|
||||
${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${PNGLIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}
|
||||
${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libpng${CMAKE_SHARED_LIBRARY_SUFFIX})
|
||||
install(CODE ${PNG_SHARED_INSTALL_CODE})
|
||||
install(FILES
|
||||
${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libpng${CMAKE_SHARED_LIBRARY_SUFFIX}
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||
ELSE(CMAKE_LIBRARY_OUTPUT_DIRECTORY)
|
||||
_png_generate_symlink_code(PNG_SHARED_INSTALL_CODE
|
||||
${PNGLIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}
|
||||
libpng${CMAKE_SHARED_LIBRARY_SUFFIX})
|
||||
install(CODE ${PNG_SHARED_INSTALL_CODE})
|
||||
install(FILES
|
||||
${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_SHARED_LIBRARY_SUFFIX}
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||
ENDIF(CMAKE_LIBRARY_OUTPUT_DIRECTORY)
|
||||
endif()
|
||||
endif()
|
||||
get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME} LOCATION_${CMAKE_BUILD_TYPE})
|
||||
get_filename_component(BUILD_TARGET_FILE ${BUILD_TARGET_LOCATION} NAME)
|
||||
CREATE_SYMLINK(${BUILD_TARGET_FILE} libpng${CMAKE_SHARED_LIBRARY_SUFFIX})
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_SHARED_LIBRARY_SUFFIX}
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||
endif(NOT WIN32)
|
||||
endif(PNG_SHARED)
|
||||
|
||||
if(PNG_STATIC)
|
||||
install(TARGETS ${PNG_LIB_NAME_STATIC}
|
||||
${PNG_EXPORT_RULE}
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||
if(NOT WIN32 OR CYGWIN)
|
||||
IF(CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
|
||||
_png_generate_symlink_code(PNG_STATIC_INSTALL_CODE
|
||||
${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/${PNGLIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}
|
||||
${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/libpng${CMAKE_STATIC_LIBRARY_SUFFIX})
|
||||
install(CODE ${PNG_STATIC_INSTALL_CODE})
|
||||
install(FILES
|
||||
${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/libpng${CMAKE_STATIC_LIBRARY_SUFFIX}
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||
ELSE(CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
|
||||
_png_generate_symlink_code(PNG_STATIC_INSTALL_CODE
|
||||
${PNGLIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}
|
||||
libpng${CMAKE_STATIC_LIBRARY_SUFFIX})
|
||||
install(CODE ${PNG_STATIC_INSTALL_CODE})
|
||||
install(FILES
|
||||
${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_STATIC_LIBRARY_SUFFIX}
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||
ENDIF(CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
|
||||
endif()
|
||||
endif()
|
||||
get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME_STATIC} LOCATION_${CMAKE_BUILD_TYPE})
|
||||
get_filename_component(BUILD_TARGET_FILE ${BUILD_TARGET_LOCATION} NAME)
|
||||
CREATE_SYMLINK(${BUILD_TARGET_FILE} libpng${CMAKE_STATIC_LIBRARY_SUFFIX})
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_STATIC_LIBRARY_SUFFIX}
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||
endif(NOT WIN32 OR CYGWIN)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL )
|
||||
@@ -388,11 +331,9 @@ endif()
|
||||
|
||||
# what's with libpng-$VER%.txt and all the extra files?
|
||||
|
||||
|
||||
# UNINSTALL
|
||||
# do we need this?
|
||||
|
||||
|
||||
# DIST
|
||||
# do we need this?
|
||||
|
||||
|
||||
4
LICENSE
4
LICENSE
@@ -10,7 +10,7 @@ this sentence.
|
||||
|
||||
This code is released under the libpng license.
|
||||
|
||||
libpng versions 1.2.6, August 15, 2004, through 1.5.4beta03, June 15, 2011, are
|
||||
libpng versions 1.2.6, August 15, 2004, through 1.5.6rc02, October 27, 2011, are
|
||||
Copyright (c) 2004, 2006-2011 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
|
||||
@@ -108,4 +108,4 @@ certification mark of the Open Source Initiative.
|
||||
|
||||
Glenn Randers-Pehrson
|
||||
glennrp at users.sourceforge.net
|
||||
June 15, 2011
|
||||
October 27, 2011
|
||||
|
||||
20
Makefile.am
20
Makefile.am
@@ -44,11 +44,16 @@ libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_LDFLAGS = -no-undefined -export-dynamic \
|
||||
-version-number @PNGLIB_MAJOR@@PNGLIB_MINOR@:@PNGLIB_RELEASE@:0
|
||||
|
||||
if HAVE_LD_VERSION_SCRIPT
|
||||
# Versioned symbols and restricted exports
|
||||
# Versioned symbols and restricted exports
|
||||
if HAVE_SOLARIS_LD
|
||||
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_LDFLAGS += -Wl,-M -Wl,libpng.vers
|
||||
else
|
||||
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_LDFLAGS += -Wl,--version-script=libpng.vers
|
||||
endif
|
||||
|
||||
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_DEPENDENCIES = libpng.vers
|
||||
else
|
||||
# Only restricted exports when possible
|
||||
# Only restricted exports when possible
|
||||
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_LDFLAGS += -export-symbols libpng.sym
|
||||
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_DEPENDENCIES = libpng.sym
|
||||
endif
|
||||
@@ -97,7 +102,7 @@ $(PNGLIB_BASENAME)-config: libpng-config
|
||||
cp libpng-config $@
|
||||
|
||||
scripts/sym.out scripts/vers.out: png.h pngconf.h pnglibconf.h
|
||||
scripts/symbols.out: png.h pngconf.h scripts/pnglibconf.h.prebuilt
|
||||
scripts/symbols.out: png.h pngconf.h $(srcdir)/scripts/pnglibconf.h.prebuilt
|
||||
|
||||
libpng.sym: scripts/sym.out
|
||||
rm -f $@
|
||||
@@ -108,7 +113,8 @@ libpng.vers: scripts/vers.out
|
||||
pnglibconf.h: pnglibconf.out
|
||||
rm -f $@
|
||||
cp $? $@
|
||||
scripts/pnglibconf.h.prebuilt:
|
||||
$(srcdir)/scripts/pnglibconf.h.prebuilt:
|
||||
@echo "Attempting to build $@" >&2
|
||||
@echo "This is a machine generated file, but if you want to make" >&2
|
||||
@echo "a new one simply make 'scripts/pnglibconf.out' and copy that" >&2
|
||||
@exit 1
|
||||
@@ -119,8 +125,8 @@ scripts/pnglibconf.h.prebuilt:
|
||||
pngvalid.o pngtest.o: pnglibconf.h
|
||||
|
||||
# We must use -DPNG_NO_USE_READ_MACROS here even when the library may actually
|
||||
# be built with PNG_USE_READ_MACROS; this stops the read macros interfering
|
||||
# with the symbol file format.
|
||||
# be built with PNG_USE_READ_MACROS; this prevents the read macros from
|
||||
# interfering with the symbol file format.
|
||||
SYMBOL_CFLAGS = -DPNGLIB_LIBNAME='PNG@PNGLIB_MAJOR@@PNGLIB_MINOR@_0'\
|
||||
-DPNGLIB_VERSION='@PNGLIB_VERSION@'\
|
||||
-DSYMBOL_PREFIX='$(SYMBOL_PREFIX)'\
|
||||
@@ -162,7 +168,7 @@ scripts/pnglibconf.dfn: scripts/pnglibconf.dfa scripts/options.awk
|
||||
test -z "$(CPPFLAGS)"
|
||||
echo "com @PNGLIB_VERSION@ STANDARD API DEFINITION" |\
|
||||
$(AWK) -f ${srcdir}/scripts/options.awk out=dfn1.out\
|
||||
logunsupported=4 - ${srcdir}/scripts/pnglibconf.dfa 1>&2
|
||||
logunsupported=1 - ${srcdir}/scripts/pnglibconf.dfa 1>&2
|
||||
$(AWK) -f ${srcdir}/scripts/options.awk out=dfn2.out dfn1.out 1>&2
|
||||
rm dfn1.out
|
||||
mv dfn2.out $@
|
||||
|
||||
30
Makefile.in
30
Makefile.in
@@ -41,8 +41,12 @@ POST_UNINSTALL = :
|
||||
build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
check_PROGRAMS = pngtest$(EXEEXT) pngvalid$(EXEEXT)
|
||||
@HAVE_LD_VERSION_SCRIPT_TRUE@am__append_1 = -Wl,--version-script=libpng.vers
|
||||
@HAVE_LD_VERSION_SCRIPT_FALSE@am__append_2 = -export-symbols libpng.sym
|
||||
|
||||
# Versioned symbols and restricted exports
|
||||
@HAVE_LD_VERSION_SCRIPT_TRUE@@HAVE_SOLARIS_LD_TRUE@am__append_1 = -Wl,-M -Wl,libpng.vers
|
||||
@HAVE_LD_VERSION_SCRIPT_TRUE@@HAVE_SOLARIS_LD_FALSE@am__append_2 = -Wl,--version-script=libpng.vers
|
||||
# Only restricted exports when possible
|
||||
@HAVE_LD_VERSION_SCRIPT_FALSE@am__append_3 = -export-symbols libpng.sym
|
||||
subdir = .
|
||||
DIST_COMMON = README $(am__configure_deps) $(dist_man_MANS) \
|
||||
$(pkginclude_HEADERS) $(srcdir)/Makefile.am \
|
||||
@@ -330,7 +334,7 @@ libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_CPPFLAGS = @LIBPNG_DEFINES@
|
||||
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_LDFLAGS = -no-undefined \
|
||||
-export-dynamic -version-number \
|
||||
@PNGLIB_MAJOR@@PNGLIB_MINOR@:@PNGLIB_RELEASE@:0 \
|
||||
$(am__append_1) $(am__append_2)
|
||||
$(am__append_1) $(am__append_2) $(am__append_3)
|
||||
@HAVE_LD_VERSION_SCRIPT_FALSE@libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_DEPENDENCIES = libpng.sym
|
||||
@HAVE_LD_VERSION_SCRIPT_TRUE@libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_DEPENDENCIES = libpng.vers
|
||||
pkginclude_HEADERS = png.h pngconf.h
|
||||
@@ -357,8 +361,8 @@ config.sub configure depcomp install-sh ltmain.sh missing
|
||||
SUFFIXES = .chk .dfn .out
|
||||
|
||||
# We must use -DPNG_NO_USE_READ_MACROS here even when the library may actually
|
||||
# be built with PNG_USE_READ_MACROS; this stops the read macros interfering
|
||||
# with the symbol file format.
|
||||
# be built with PNG_USE_READ_MACROS; this prevents the read macros from
|
||||
# interfering with the symbol file format.
|
||||
SYMBOL_CFLAGS = -DPNGLIB_LIBNAME='PNG@PNGLIB_MAJOR@@PNGLIB_MINOR@_0'\
|
||||
-DPNGLIB_VERSION='@PNGLIB_VERSION@'\
|
||||
-DSYMBOL_PREFIX='$(SYMBOL_PREFIX)'\
|
||||
@@ -413,7 +417,7 @@ config.h: stamp-h1
|
||||
stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
|
||||
@rm -f stamp-h1
|
||||
cd $(top_builddir) && $(SHELL) ./config.status config.h
|
||||
$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||
$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||
($(am__cd) $(top_srcdir) && $(AUTOHEADER))
|
||||
rm -f stamp-h1
|
||||
touch $@
|
||||
@@ -455,7 +459,7 @@ clean-libLTLIBRARIES:
|
||||
echo "rm -f \"$${dir}/so_locations\""; \
|
||||
rm -f "$${dir}/so_locations"; \
|
||||
done
|
||||
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@.la: $(libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_OBJECTS) $(libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_DEPENDENCIES)
|
||||
libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@.la: $(libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_OBJECTS) $(libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_DEPENDENCIES)
|
||||
$(libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_LINK) -rpath $(libdir) $(libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_OBJECTS) $(libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@_la_LIBADD) $(LIBS)
|
||||
|
||||
clean-checkPROGRAMS:
|
||||
@@ -466,10 +470,10 @@ clean-checkPROGRAMS:
|
||||
list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
|
||||
echo " rm -f" $$list; \
|
||||
rm -f $$list
|
||||
pngtest$(EXEEXT): $(pngtest_OBJECTS) $(pngtest_DEPENDENCIES)
|
||||
pngtest$(EXEEXT): $(pngtest_OBJECTS) $(pngtest_DEPENDENCIES)
|
||||
@rm -f pngtest$(EXEEXT)
|
||||
$(LINK) $(pngtest_OBJECTS) $(pngtest_LDADD) $(LIBS)
|
||||
pngvalid$(EXEEXT): $(pngvalid_OBJECTS) $(pngvalid_DEPENDENCIES)
|
||||
pngvalid$(EXEEXT): $(pngvalid_OBJECTS) $(pngvalid_DEPENDENCIES)
|
||||
@rm -f pngvalid$(EXEEXT)
|
||||
$(LINK) $(pngvalid_OBJECTS) $(pngvalid_LDADD) $(LIBS)
|
||||
install-binSCRIPTS: $(bin_SCRIPTS)
|
||||
@@ -1255,9 +1259,6 @@ uninstall-man: uninstall-man3 uninstall-man5
|
||||
uninstall-pkgconfigDATA uninstall-pkgincludeHEADERS
|
||||
|
||||
|
||||
@HAVE_LD_VERSION_SCRIPT_TRUE@ # Versioned symbols and restricted exports
|
||||
@HAVE_LD_VERSION_SCRIPT_FALSE@ # Only restricted exports when possible
|
||||
|
||||
$(PNGLIB_BASENAME).pc: libpng.pc
|
||||
cp libpng.pc $@
|
||||
|
||||
@@ -1265,7 +1266,7 @@ $(PNGLIB_BASENAME)-config: libpng-config
|
||||
cp libpng-config $@
|
||||
|
||||
scripts/sym.out scripts/vers.out: png.h pngconf.h pnglibconf.h
|
||||
scripts/symbols.out: png.h pngconf.h scripts/pnglibconf.h.prebuilt
|
||||
scripts/symbols.out: png.h pngconf.h $(srcdir)/scripts/pnglibconf.h.prebuilt
|
||||
|
||||
libpng.sym: scripts/sym.out
|
||||
rm -f $@
|
||||
@@ -1276,7 +1277,8 @@ libpng.vers: scripts/vers.out
|
||||
pnglibconf.h: pnglibconf.out
|
||||
rm -f $@
|
||||
cp $? $@
|
||||
scripts/pnglibconf.h.prebuilt:
|
||||
$(srcdir)/scripts/pnglibconf.h.prebuilt:
|
||||
@echo "Attempting to build $@" >&2
|
||||
@echo "This is a machine generated file, but if you want to make" >&2
|
||||
@echo "a new one simply make 'scripts/pnglibconf.out' and copy that" >&2
|
||||
@exit 1
|
||||
|
||||
2
README
2
README
@@ -1,4 +1,4 @@
|
||||
README for libpng version 1.5.4beta03 - June 15, 2011 (shared library 15.0)
|
||||
README for libpng version 1.5.6rc02 - October 27, 2011 (shared library 15.0)
|
||||
See the note about version numbers near the top of png.h
|
||||
|
||||
See INSTALL for instructions on how to install libpng.
|
||||
|
||||
63
configure
vendored
63
configure
vendored
@@ -1,6 +1,6 @@
|
||||
#! /bin/sh
|
||||
# Guess values for system-dependent variables and create Makefiles.
|
||||
# Generated by GNU Autoconf 2.68 for libpng 1.5.4beta03.
|
||||
# Generated by GNU Autoconf 2.68 for libpng 1.5.6rc02.
|
||||
#
|
||||
# Report bugs to <png-mng-implement@lists.sourceforge.net>.
|
||||
#
|
||||
@@ -570,8 +570,8 @@ MAKEFLAGS=
|
||||
# Identity of this package.
|
||||
PACKAGE_NAME='libpng'
|
||||
PACKAGE_TARNAME='libpng'
|
||||
PACKAGE_VERSION='1.5.4beta03'
|
||||
PACKAGE_STRING='libpng 1.5.4beta03'
|
||||
PACKAGE_VERSION='1.5.6rc02'
|
||||
PACKAGE_STRING='libpng 1.5.6rc02'
|
||||
PACKAGE_BUGREPORT='png-mng-implement@lists.sourceforge.net'
|
||||
PACKAGE_URL=''
|
||||
|
||||
@@ -624,6 +624,8 @@ PNGLIB_VERSION
|
||||
SYMBOL_PREFIX
|
||||
HAVE_LD_VERSION_SCRIPT_FALSE
|
||||
HAVE_LD_VERSION_SCRIPT_TRUE
|
||||
HAVE_SOLARIS_LD_FALSE
|
||||
HAVE_SOLARIS_LD_TRUE
|
||||
LIBPNG_DEFINES
|
||||
LIBOBJS
|
||||
POW_LIB
|
||||
@@ -763,8 +765,7 @@ CFLAGS
|
||||
LDFLAGS
|
||||
LIBS
|
||||
CPPFLAGS
|
||||
CPP
|
||||
CPPFLAGS'
|
||||
CPP'
|
||||
|
||||
|
||||
# Initialize some variables set by options.
|
||||
@@ -1307,7 +1308,7 @@ if test "$ac_init_help" = "long"; then
|
||||
# Omit some internal or obsolete options to make the list less imposing.
|
||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||
cat <<_ACEOF
|
||||
\`configure' configures libpng 1.5.4beta03 to adapt to many kinds of systems.
|
||||
\`configure' configures libpng 1.5.6rc02 to adapt to many kinds of systems.
|
||||
|
||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||
|
||||
@@ -1377,7 +1378,7 @@ fi
|
||||
|
||||
if test -n "$ac_init_help"; then
|
||||
case $ac_init_help in
|
||||
short | recursive ) echo "Configuration of libpng 1.5.4beta03:";;
|
||||
short | recursive ) echo "Configuration of libpng 1.5.6rc02:";;
|
||||
esac
|
||||
cat <<\_ACEOF
|
||||
|
||||
@@ -1485,7 +1486,7 @@ fi
|
||||
test -n "$ac_init_help" && exit $ac_status
|
||||
if $ac_init_version; then
|
||||
cat <<\_ACEOF
|
||||
libpng configure 1.5.4beta03
|
||||
libpng configure 1.5.6rc02
|
||||
generated by GNU Autoconf 2.68
|
||||
|
||||
Copyright (C) 2010 Free Software Foundation, Inc.
|
||||
@@ -1908,7 +1909,7 @@ cat >config.log <<_ACEOF
|
||||
This file contains any messages produced by compilers while
|
||||
running configure, to aid debugging if configure makes a mistake.
|
||||
|
||||
It was created by libpng $as_me 1.5.4beta03, which was
|
||||
It was created by libpng $as_me 1.5.6rc02, which was
|
||||
generated by GNU Autoconf 2.68. Invocation command line was
|
||||
|
||||
$ $0 $@
|
||||
@@ -2723,7 +2724,7 @@ fi
|
||||
|
||||
# Define the identity of the package.
|
||||
PACKAGE='libpng'
|
||||
VERSION='1.5.4beta03'
|
||||
VERSION='1.5.6rc02'
|
||||
|
||||
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
@@ -2787,10 +2788,10 @@ fi
|
||||
|
||||
|
||||
|
||||
PNGLIB_VERSION=1.5.4beta03
|
||||
PNGLIB_VERSION=1.5.6rc02
|
||||
PNGLIB_MAJOR=1
|
||||
PNGLIB_MINOR=5
|
||||
PNGLIB_RELEASE=4
|
||||
PNGLIB_RELEASE=6
|
||||
|
||||
|
||||
|
||||
@@ -12408,6 +12409,28 @@ LIBPNG_DEFINES=$LIBPNG_DEFINES
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if libraries can be versioned" >&5
|
||||
$as_echo_n "checking if libraries can be versioned... " >&6; }
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if using Solaris linker" >&5
|
||||
$as_echo_n "checking if using Solaris linker... " >&6; }
|
||||
SLD=`$LD --version 2>&1 | grep Solaris`
|
||||
if test "$SLD"; then
|
||||
have_solaris_ld=yes
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||
$as_echo "yes" >&6; }
|
||||
else
|
||||
have_solaris_ld=no
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
fi
|
||||
if test "$have_solaris_ld" = "yes"; then
|
||||
HAVE_SOLARIS_LD_TRUE=
|
||||
HAVE_SOLARIS_LD_FALSE='#'
|
||||
else
|
||||
HAVE_SOLARIS_LD_TRUE='#'
|
||||
HAVE_SOLARIS_LD_FALSE=
|
||||
fi
|
||||
|
||||
|
||||
# Special case for PE/COFF platforms: ld reports
|
||||
# support for version-script, but doesn't actually
|
||||
# DO anything with it.
|
||||
@@ -12418,7 +12441,13 @@ case $host in
|
||||
$as_echo "no" >&6; }
|
||||
;;
|
||||
* )
|
||||
GLD=`$LD --help < /dev/null 2>/dev/null | grep version-script`
|
||||
|
||||
if test "$have_solaris_ld" = "yes"; then
|
||||
GLD=`$LD --help < /dev/null 2>&1 | grep 'M mapfile'`
|
||||
else
|
||||
GLD=`$LD --help < /dev/null 2>/dev/null | grep version-script`
|
||||
fi
|
||||
|
||||
if test "$GLD"; then
|
||||
have_ld_version_script=yes
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||
@@ -12627,6 +12656,10 @@ if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
|
||||
as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
|
||||
Usually this means the macro was only invoked conditionally." "$LINENO" 5
|
||||
fi
|
||||
if test -z "${HAVE_SOLARIS_LD_TRUE}" && test -z "${HAVE_SOLARIS_LD_FALSE}"; then
|
||||
as_fn_error $? "conditional \"HAVE_SOLARIS_LD\" was never defined.
|
||||
Usually this means the macro was only invoked conditionally." "$LINENO" 5
|
||||
fi
|
||||
if test -z "${HAVE_LD_VERSION_SCRIPT_TRUE}" && test -z "${HAVE_LD_VERSION_SCRIPT_FALSE}"; then
|
||||
as_fn_error $? "conditional \"HAVE_LD_VERSION_SCRIPT\" was never defined.
|
||||
Usually this means the macro was only invoked conditionally." "$LINENO" 5
|
||||
@@ -13040,7 +13073,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
||||
# report actual input values of CONFIG_FILES etc. instead of their
|
||||
# values after options handling.
|
||||
ac_log="
|
||||
This file was extended by libpng $as_me 1.5.4beta03, which was
|
||||
This file was extended by libpng $as_me 1.5.6rc02, which was
|
||||
generated by GNU Autoconf 2.68. Invocation command line was
|
||||
|
||||
CONFIG_FILES = $CONFIG_FILES
|
||||
@@ -13106,7 +13139,7 @@ _ACEOF
|
||||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
||||
ac_cs_version="\\
|
||||
libpng config.status 1.5.4beta03
|
||||
libpng config.status 1.5.6rc02
|
||||
configured by $0, generated by GNU Autoconf 2.68,
|
||||
with options \\"\$ac_cs_config\\"
|
||||
|
||||
|
||||
26
configure.ac
26
configure.ac
@@ -18,15 +18,15 @@ AC_PREREQ(2.59)
|
||||
|
||||
dnl Version number stuff here:
|
||||
|
||||
AC_INIT([libpng], [1.5.4beta03], [png-mng-implement@lists.sourceforge.net])
|
||||
AC_INIT([libpng], [1.5.6rc02], [png-mng-implement@lists.sourceforge.net])
|
||||
AM_INIT_AUTOMAKE
|
||||
dnl stop configure from automagically running automake
|
||||
AM_MAINTAINER_MODE
|
||||
|
||||
PNGLIB_VERSION=1.5.4beta03
|
||||
PNGLIB_VERSION=1.5.6rc02
|
||||
PNGLIB_MAJOR=1
|
||||
PNGLIB_MINOR=5
|
||||
PNGLIB_RELEASE=4
|
||||
PNGLIB_RELEASE=6
|
||||
|
||||
dnl End of version number stuff
|
||||
|
||||
@@ -95,6 +95,18 @@ LIBPNG_DEFINES=$LIBPNG_DEFINES
|
||||
AC_SUBST(LIBPNG_DEFINES)
|
||||
|
||||
AC_MSG_CHECKING([if libraries can be versioned])
|
||||
|
||||
AC_MSG_CHECKING([if using Solaris linker])
|
||||
SLD=`$LD --version 2>&1 | grep Solaris`
|
||||
if test "$SLD"; then
|
||||
have_solaris_ld=yes
|
||||
AC_MSG_RESULT(yes)
|
||||
else
|
||||
have_solaris_ld=no
|
||||
AC_MSG_RESULT(no)
|
||||
fi
|
||||
AM_CONDITIONAL(HAVE_SOLARIS_LD, test "$have_solaris_ld" = "yes")
|
||||
|
||||
# Special case for PE/COFF platforms: ld reports
|
||||
# support for version-script, but doesn't actually
|
||||
# DO anything with it.
|
||||
@@ -104,7 +116,13 @@ case $host in
|
||||
AC_MSG_RESULT(no)
|
||||
;;
|
||||
* )
|
||||
GLD=`$LD --help < /dev/null 2>/dev/null | grep version-script`
|
||||
|
||||
if test "$have_solaris_ld" = "yes"; then
|
||||
GLD=`$LD --help < /dev/null 2>&1 | grep 'M mapfile'`
|
||||
else
|
||||
GLD=`$LD --help < /dev/null 2>/dev/null | grep version-script`
|
||||
fi
|
||||
|
||||
if test "$GLD"; then
|
||||
have_ld_version_script=yes
|
||||
AC_MSG_RESULT(yes)
|
||||
|
||||
@@ -229,8 +229,14 @@ uch *readpng_get_image(double display_exponent, int *pChannels, ulg *pRowbytes)
|
||||
png_set_expand(png_ptr);
|
||||
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
|
||||
png_set_expand(png_ptr);
|
||||
#ifdef PNG_READ_16_TO_8_SUPPORTED
|
||||
if (bit_depth == 16)
|
||||
# ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
|
||||
png_set_scale_16(png_ptr);
|
||||
# else
|
||||
png_set_strip_16(png_ptr);
|
||||
# endif
|
||||
#endif
|
||||
if (color_type == PNG_COLOR_TYPE_GRAY ||
|
||||
color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
|
||||
png_set_gray_to_rgb(png_ptr);
|
||||
|
||||
@@ -311,8 +311,14 @@ static void readpng2_info_callback(png_structp png_ptr, png_infop info_ptr)
|
||||
png_set_expand(png_ptr);
|
||||
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
|
||||
png_set_expand(png_ptr);
|
||||
#ifdef PNG_READ_16_TO_8_SUPPORTED
|
||||
if (bit_depth == 16)
|
||||
# ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
|
||||
png_set_scale_16(png_ptr);
|
||||
# else
|
||||
png_set_strip_16(png_ptr);
|
||||
# endif
|
||||
#endif
|
||||
if (color_type == PNG_COLOR_TYPE_GRAY ||
|
||||
color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
|
||||
png_set_gray_to_rgb(png_ptr);
|
||||
|
||||
@@ -590,7 +590,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, PSTR cmd, int showmode)
|
||||
"(unexpectedly) while reading PNG image file\n");
|
||||
exit(3);
|
||||
} else /* if (error) */ {
|
||||
// will print error message below
|
||||
/* will print error message below */
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -591,7 +591,7 @@ int main(int argc, char **argv)
|
||||
"(unexpectedly) while reading PNG image file\n");
|
||||
exit(3);
|
||||
} else /* if (error) */ {
|
||||
// will print error message below
|
||||
/* will print error message below */
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -36,4 +36,4 @@ option FLOATING_ARITHMETIC off
|
||||
option SETJMP on
|
||||
option STDIO on
|
||||
option READ_EXPAND on
|
||||
option READ_16_TO_8 on
|
||||
option READ_STRIP_16_TO_8 on
|
||||
|
||||
@@ -36,5 +36,5 @@ option STDIO on
|
||||
option READ_bKGD on
|
||||
option READ_GAMMA on
|
||||
option READ_EXPAND on
|
||||
option READ_16_TO_8 on
|
||||
option READ_STRIP_16_TO_8 on
|
||||
option READ_GRAY_TO_RGB on
|
||||
|
||||
@@ -8,9 +8,9 @@ LD=$(CC)
|
||||
RM=rm -f
|
||||
|
||||
#PNGPATH = /usr/local
|
||||
#PNGINC = -I$(PNGPATH)/include/libpng12
|
||||
#PNGLIB = -L$(PNGPATH)/lib -lpng12
|
||||
#PNGLIBS = $(PNGPATH)/lib/libpng12.a
|
||||
#PNGINC = -I$(PNGPATH)/include/libpng15
|
||||
#PNGLIB = -L$(PNGPATH)/lib -lpng15
|
||||
#PNGLIBS = $(PNGPATH)/lib/libpng15.a
|
||||
PNGINC = -I../..
|
||||
PNGLIB = -L../.. -lpng
|
||||
PNGLIBS = ../../libpng.a
|
||||
@@ -23,9 +23,9 @@ ZINC = -I../../../zlib
|
||||
ZLIB = -L../../../zlib -lz
|
||||
ZLIBS = ../../../zlib/libz.a
|
||||
|
||||
CFLAGS=-O3 $(PNGINC) $(ZINC)
|
||||
LDFLAGS=$(PNGLIB) $(ZLIB)
|
||||
LDFLAGSS=$(PNGLIBS) $(ZLIBS)
|
||||
CFLAGS=$(PNGINC) $(ZINC)
|
||||
LDLIBS=$(PNGLIB) $(ZLIB)
|
||||
LDLIBSS=$(PNGLIBS) $(ZLIBS)
|
||||
C=.c
|
||||
O=.o
|
||||
L=.a
|
||||
@@ -40,19 +40,19 @@ png2pnm$(O): png2pnm$(C)
|
||||
$(CC) -c $(CFLAGS) png2pnm$(C)
|
||||
|
||||
png2pnm$(E): png2pnm$(O)
|
||||
$(LD) -o png2pnm$(E) png2pnm$(O) $(LDFLAGS) -lm
|
||||
$(LD) $(LDFLAGS) -o png2pnm$(E) png2pnm$(O) $(LDLIBS) -lm
|
||||
|
||||
png2pnm-static$(E): png2pnm$(O)
|
||||
$(LD) -o png2pnm-static$(E) png2pnm$(O) $(LDFLAGSS) -lm
|
||||
$(LD) $(LDFLAGS) -o png2pnm-static$(E) png2pnm$(O) $(LDLIBSS) -lm
|
||||
|
||||
pnm2png$(O): pnm2png$(C)
|
||||
$(CC) -c $(CFLAGS) pnm2png$(C)
|
||||
|
||||
pnm2png$(E): pnm2png$(O)
|
||||
$(LD) -o pnm2png$(E) pnm2png$(O) $(LDFLAGS) -lm
|
||||
$(LD) $(LDFLAGS) -o pnm2png$(E) pnm2png$(O) $(LDLIBS) -lm
|
||||
|
||||
pnm2png-static$(E): pnm2png$(O)
|
||||
$(LD) -o pnm2png-static$(E) pnm2png$(O) $(LDFLAGSS) -lm
|
||||
$(LD) $(LDFLAGS) -o pnm2png-static$(E) pnm2png$(O) $(LDLIBSS) -lm
|
||||
|
||||
clean:
|
||||
$(RM) png2pnm$(O)
|
||||
|
||||
@@ -144,7 +144,7 @@ int main(int argc, char *argv[])
|
||||
if (png2pnm (fp_rd, fp_wr, fp_al, raw, alpha) == FALSE)
|
||||
{
|
||||
fprintf (stderr, "PNG2PNM\n");
|
||||
fprintf (stderr, "Error: unsuccessful convertion of PNG-image\n");
|
||||
fprintf (stderr, "Error: unsuccessful conversion of PNG-image\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
//-------------------------------------
|
||||
// PNGFILE.C -- Image File Functions
|
||||
//-------------------------------------
|
||||
|
||||
// Copyright 2000, Willem van Schaik.
|
||||
//
|
||||
// This code is released under the libpng license.
|
||||
// For conditions of distribution and use, see the disclaimer
|
||||
// and license in png.h
|
||||
/*-------------------------------------
|
||||
* PNGFILE.C -- Image File Functions
|
||||
*-------------------------------------
|
||||
*
|
||||
* Copyright 2000, Willem van Schaik.
|
||||
*
|
||||
* This code is released under the libpng license.
|
||||
* For conditions of distribution and use, see the disclaimer
|
||||
* and license in png.h
|
||||
*/
|
||||
|
||||
#include <windows.h>
|
||||
#include <commdlg.h>
|
||||
@@ -28,7 +29,7 @@ static png_structp png_ptr = NULL;
|
||||
static png_infop info_ptr = NULL;
|
||||
|
||||
|
||||
// cexcept interface
|
||||
/* cexcept interface */
|
||||
|
||||
static void
|
||||
png_cexcept_error(png_structp png_ptr, png_const_charp msg)
|
||||
@@ -43,7 +44,7 @@ png_cexcept_error(png_structp png_ptr, png_const_charp msg)
|
||||
}
|
||||
}
|
||||
|
||||
// Windows open-file functions
|
||||
/* Windows open-file functions */
|
||||
|
||||
void PngFileInitialize (HWND hwnd)
|
||||
{
|
||||
@@ -57,13 +58,13 @@ void PngFileInitialize (HWND hwnd)
|
||||
ofn.lpstrCustomFilter = NULL;
|
||||
ofn.nMaxCustFilter = 0;
|
||||
ofn.nFilterIndex = 0;
|
||||
ofn.lpstrFile = NULL; // Set in Open and Close functions
|
||||
ofn.lpstrFile = NULL; /* Set in Open and Close functions */
|
||||
ofn.nMaxFile = MAX_PATH;
|
||||
ofn.lpstrFileTitle = NULL; // Set in Open and Close functions
|
||||
ofn.lpstrFileTitle = NULL; /* Set in Open and Close functions */
|
||||
ofn.nMaxFileTitle = MAX_PATH;
|
||||
ofn.lpstrInitialDir = NULL;
|
||||
ofn.lpstrTitle = NULL;
|
||||
ofn.Flags = 0; // Set in Open and Close functions
|
||||
ofn.Flags = 0; /* Set in Open and Close functions */
|
||||
ofn.nFileOffset = 0;
|
||||
ofn.nFileExtension = 0;
|
||||
ofn.lpstrDefExt = TEXT ("png");
|
||||
@@ -92,7 +93,7 @@ BOOL PngFileSaveDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)
|
||||
return GetSaveFileName (&ofn);
|
||||
}
|
||||
|
||||
// PNG image handler functions
|
||||
/* PNG image handler functions */
|
||||
|
||||
BOOL PngLoadImage (PTSTR pstrFileName, png_byte **ppbImageData,
|
||||
int *piWidth, int *piHeight, int *piChannels, png_color *pBkgColor)
|
||||
@@ -109,7 +110,7 @@ BOOL PngLoadImage (PTSTR pstrFileName, png_byte **ppbImageData,
|
||||
static png_byte **ppbRowPointers = NULL;
|
||||
int i;
|
||||
|
||||
// open the PNG input file
|
||||
/* open the PNG input file */
|
||||
|
||||
if (!pstrFileName)
|
||||
{
|
||||
@@ -123,7 +124,7 @@ BOOL PngLoadImage (PTSTR pstrFileName, png_byte **ppbImageData,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// first check the eight byte PNG signature
|
||||
/* first check the eight byte PNG signature */
|
||||
|
||||
fread(pbSig, 1, 8, pfFile);
|
||||
if (png_sig_cmp(pbSig, 0, 8))
|
||||
@@ -132,7 +133,7 @@ BOOL PngLoadImage (PTSTR pstrFileName, png_byte **ppbImageData,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// create the two png(-info) structures
|
||||
/* create the two png(-info) structures */
|
||||
|
||||
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL,
|
||||
(png_error_ptr)png_cexcept_error, (png_error_ptr)NULL);
|
||||
@@ -153,7 +154,7 @@ BOOL PngLoadImage (PTSTR pstrFileName, png_byte **ppbImageData,
|
||||
Try
|
||||
{
|
||||
|
||||
// initialize the png structure
|
||||
/* initialize the png structure */
|
||||
|
||||
#ifdef PNG_STDIO_SUPPORTED
|
||||
png_init_io(png_ptr, pfFile);
|
||||
@@ -163,20 +164,26 @@ BOOL PngLoadImage (PTSTR pstrFileName, png_byte **ppbImageData,
|
||||
|
||||
png_set_sig_bytes(png_ptr, 8);
|
||||
|
||||
// read all PNG info up to image data
|
||||
/* read all PNG info up to image data */
|
||||
|
||||
png_read_info(png_ptr, info_ptr);
|
||||
|
||||
// get width, height, bit-depth and color-type
|
||||
/* get width, height, bit-depth and color-type */
|
||||
|
||||
png_get_IHDR(png_ptr, info_ptr, piWidth, piHeight, &iBitDepth,
|
||||
&iColorType, NULL, NULL, NULL);
|
||||
|
||||
// expand images of all color-type and bit-depth to 3x8 bit RGB images
|
||||
// let the library process things like alpha, transparency, background
|
||||
/* expand images of all color-type and bit-depth to 3x8-bit RGB */
|
||||
/* let the library process alpha, transparency, background, etc. */
|
||||
|
||||
if (iBitDepth == 16)
|
||||
png_set_strip_16(png_ptr);
|
||||
#ifdef PNG_READ_16_TO_8_SUPPORTED
|
||||
if (iBitDepth == 16)
|
||||
# ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
|
||||
png_set_scale_16(png_ptr);
|
||||
# else
|
||||
png_set_strip_16(png_ptr);
|
||||
# endif
|
||||
#endif
|
||||
if (iColorType == PNG_COLOR_TYPE_PALETTE)
|
||||
png_set_expand(png_ptr);
|
||||
if (iBitDepth < 8)
|
||||
@@ -187,7 +194,7 @@ BOOL PngLoadImage (PTSTR pstrFileName, png_byte **ppbImageData,
|
||||
iColorType == PNG_COLOR_TYPE_GRAY_ALPHA)
|
||||
png_set_gray_to_rgb(png_ptr);
|
||||
|
||||
// set the background color to draw transparent and alpha images over.
|
||||
/* set the background color to draw transparent and alpha images over */
|
||||
if (png_get_bKGD(png_ptr, info_ptr, &pBackground))
|
||||
{
|
||||
png_set_background(png_ptr, pBackground, PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
|
||||
@@ -200,28 +207,28 @@ BOOL PngLoadImage (PTSTR pstrFileName, png_byte **ppbImageData,
|
||||
pBkgColor = NULL;
|
||||
}
|
||||
|
||||
// if required set gamma conversion
|
||||
/* if required set gamma conversion */
|
||||
if (png_get_gAMA(png_ptr, info_ptr, &dGamma))
|
||||
png_set_gamma(png_ptr, (double) 2.2, dGamma);
|
||||
|
||||
// after the transformations have been registered update info_ptr data
|
||||
/* after the transformations are registered, update info_ptr data */
|
||||
|
||||
png_read_update_info(png_ptr, info_ptr);
|
||||
|
||||
// get again width, height and the new bit-depth and color-type
|
||||
/* get again width, height and the new bit-depth and color-type */
|
||||
|
||||
png_get_IHDR(png_ptr, info_ptr, piWidth, piHeight, &iBitDepth,
|
||||
&iColorType, NULL, NULL, NULL);
|
||||
|
||||
|
||||
// row_bytes is the width x number of channels
|
||||
/* row_bytes is the width x number of channels */
|
||||
|
||||
ulRowBytes = png_get_rowbytes(png_ptr, info_ptr);
|
||||
ulChannels = png_get_channels(png_ptr, info_ptr);
|
||||
|
||||
*piChannels = ulChannels;
|
||||
|
||||
// now we can allocate memory to store the image
|
||||
/* now we can allocate memory to store the image */
|
||||
|
||||
if (pbImageData)
|
||||
{
|
||||
@@ -235,7 +242,7 @@ BOOL PngLoadImage (PTSTR pstrFileName, png_byte **ppbImageData,
|
||||
}
|
||||
*ppbImageData = pbImageData;
|
||||
|
||||
// and allocate memory for an array of row-pointers
|
||||
/* and allocate memory for an array of row-pointers */
|
||||
|
||||
if ((ppbRowPointers = (png_bytepp) malloc((*piHeight)
|
||||
* sizeof(png_bytep))) == NULL)
|
||||
@@ -243,25 +250,25 @@ BOOL PngLoadImage (PTSTR pstrFileName, png_byte **ppbImageData,
|
||||
png_error(png_ptr, "Visual PNG: out of memory");
|
||||
}
|
||||
|
||||
// set the individual row-pointers to point at the correct offsets
|
||||
/* set the individual row-pointers to point at the correct offsets */
|
||||
|
||||
for (i = 0; i < (*piHeight); i++)
|
||||
ppbRowPointers[i] = pbImageData + i * ulRowBytes;
|
||||
|
||||
// now we can go ahead and just read the whole image
|
||||
/* now we can go ahead and just read the whole image */
|
||||
|
||||
png_read_image(png_ptr, ppbRowPointers);
|
||||
|
||||
// read the additional chunks in the PNG file (not really needed)
|
||||
/* read the additional chunks in the PNG file (not really needed) */
|
||||
|
||||
png_read_end(png_ptr, NULL);
|
||||
|
||||
// and we're done
|
||||
/* and we're done */
|
||||
|
||||
free (ppbRowPointers);
|
||||
ppbRowPointers = NULL;
|
||||
|
||||
// yepp, done
|
||||
/* yepp, done */
|
||||
}
|
||||
|
||||
Catch (msg)
|
||||
@@ -295,7 +302,7 @@ BOOL PngSaveImage (PTSTR pstrFileName, png_byte *pDiData,
|
||||
static png_byte **ppbRowPointers = NULL;
|
||||
int i;
|
||||
|
||||
// open the PNG output file
|
||||
/* open the PNG output file */
|
||||
|
||||
if (!pstrFileName)
|
||||
return FALSE;
|
||||
@@ -303,7 +310,7 @@ BOOL PngSaveImage (PTSTR pstrFileName, png_byte *pDiData,
|
||||
if (!(pfFile = fopen(pstrFileName, "wb")))
|
||||
return FALSE;
|
||||
|
||||
// prepare the standard PNG structures
|
||||
/* prepare the standard PNG structures */
|
||||
|
||||
png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL,
|
||||
(png_error_ptr)png_cexcept_error, (png_error_ptr)NULL);
|
||||
@@ -322,7 +329,7 @@ BOOL PngSaveImage (PTSTR pstrFileName, png_byte *pDiData,
|
||||
|
||||
Try
|
||||
{
|
||||
// initialize the png structure
|
||||
/* initialize the png structure */
|
||||
|
||||
#ifdef PNG_STDIO_SUPPORTED
|
||||
png_init_io(png_ptr, pfFile);
|
||||
@@ -330,52 +337,52 @@ BOOL PngSaveImage (PTSTR pstrFileName, png_byte *pDiData,
|
||||
png_set_write_fn(png_ptr, (png_voidp)pfFile, png_write_data, png_flush);
|
||||
#endif
|
||||
|
||||
// we're going to write a very simple 3x8 bit RGB image
|
||||
/* we're going to write a very simple 3x8-bit RGB image */
|
||||
|
||||
png_set_IHDR(png_ptr, info_ptr, iWidth, iHeight, ciBitDepth,
|
||||
PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE,
|
||||
PNG_FILTER_TYPE_BASE);
|
||||
|
||||
// write the file header information
|
||||
/* write the file header information */
|
||||
|
||||
png_write_info(png_ptr, info_ptr);
|
||||
|
||||
// swap the BGR pixels in the DiData structure to RGB
|
||||
/* swap the BGR pixels in the DiData structure to RGB */
|
||||
|
||||
png_set_bgr(png_ptr);
|
||||
|
||||
// row_bytes is the width x number of channels
|
||||
/* row_bytes is the width x number of channels */
|
||||
|
||||
ulRowBytes = iWidth * ciChannels;
|
||||
|
||||
// we can allocate memory for an array of row-pointers
|
||||
/* we can allocate memory for an array of row-pointers */
|
||||
|
||||
if ((ppbRowPointers = (png_bytepp) malloc(iHeight * sizeof(png_bytep))) == NULL)
|
||||
Throw "Visualpng: Out of memory";
|
||||
|
||||
// set the individual row-pointers to point at the correct offsets
|
||||
/* set the individual row-pointers to point at the correct offsets */
|
||||
|
||||
for (i = 0; i < iHeight; i++)
|
||||
ppbRowPointers[i] = pDiData + i * (((ulRowBytes + 3) >> 2) << 2);
|
||||
|
||||
// write out the entire image data in one call
|
||||
/* write out the entire image data in one call */
|
||||
|
||||
png_write_image (png_ptr, ppbRowPointers);
|
||||
|
||||
// write the additional chunks to the PNG file (not really needed)
|
||||
/* write the additional chunks to the PNG file (not really needed) */
|
||||
|
||||
png_write_end(png_ptr, info_ptr);
|
||||
|
||||
// and we're done
|
||||
/* and we're done */
|
||||
|
||||
free (ppbRowPointers);
|
||||
ppbRowPointers = NULL;
|
||||
|
||||
// clean up after the write, and free any memory allocated
|
||||
/* clean up after the write, and free any memory allocated */
|
||||
|
||||
png_destroy_write_struct(&png_ptr, (png_infopp) NULL);
|
||||
|
||||
// yepp, done
|
||||
/* yepp, done */
|
||||
}
|
||||
|
||||
Catch (msg)
|
||||
@@ -437,6 +444,7 @@ png_flush(png_structp png_ptr)
|
||||
|
||||
#endif
|
||||
|
||||
//-----------------
|
||||
// end of source
|
||||
//-----------------
|
||||
/*-----------------
|
||||
* end of source
|
||||
*-----------------
|
||||
*/
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
//------------------------------------------
|
||||
// PNGFILE.H -- Header File for pngfile.c
|
||||
//------------------------------------------
|
||||
/*------------------------------------------*/
|
||||
/* PNGFILE.H -- Header File for pngfile.c*/
|
||||
/*------------------------------------------*/
|
||||
|
||||
// Copyright 2000, Willem van Schaik.
|
||||
/* Copyright 2000, Willem van Schaik.*/
|
||||
|
||||
// This code is released under the libpng license.
|
||||
// For conditions of distribution and use, see the disclaimer
|
||||
// and license in png.h
|
||||
/* This code is released under the libpng license.*/
|
||||
/* For conditions of distribution and use, see the disclaimer*/
|
||||
/* and license in png.h*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
@@ -1,41 +1,42 @@
|
||||
//------------------------------------
|
||||
// VisualPng.C -- Shows a PNG image
|
||||
//------------------------------------
|
||||
/*------------------------------------
|
||||
* VisualPng.C -- Shows a PNG image
|
||||
*------------------------------------
|
||||
*
|
||||
* Copyright 2000, Willem van Schaik.
|
||||
*
|
||||
* This code is released under the libpng license.
|
||||
* For conditions of distribution and use, see the disclaimer
|
||||
* and license in png.h
|
||||
*/
|
||||
|
||||
// Copyright 2000, Willem van Schaik.
|
||||
/* switches */
|
||||
|
||||
// This code is released under the libpng license.
|
||||
// For conditions of distribution and use, see the disclaimer
|
||||
// and license in png.h
|
||||
|
||||
// switches
|
||||
|
||||
// defines
|
||||
/* defines */
|
||||
|
||||
#define PROGNAME "VisualPng"
|
||||
#define LONGNAME "Win32 Viewer for PNG-files"
|
||||
#define VERSION "1.0 of 2000 June 07"
|
||||
|
||||
// constants
|
||||
/* constants */
|
||||
|
||||
#define MARGIN 8
|
||||
|
||||
// standard includes
|
||||
/* standard includes */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <windows.h>
|
||||
|
||||
// application includes
|
||||
/* application includes */
|
||||
|
||||
#include "png.h"
|
||||
#include "pngfile.h"
|
||||
#include "resource.h"
|
||||
|
||||
// macros
|
||||
/* macros */
|
||||
|
||||
// function prototypes
|
||||
/* function prototypes */
|
||||
|
||||
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
|
||||
BOOL CALLBACK AboutDlgProc (HWND, UINT, WPARAM, LPARAM) ;
|
||||
@@ -65,14 +66,14 @@ BOOL FillBitmap (
|
||||
BYTE *pbImage, int cxImgSize, int cyImgSize, int cImgChannels,
|
||||
BOOL bStretched);
|
||||
|
||||
// a few global variables
|
||||
/* a few global variables */
|
||||
|
||||
static char *szProgName = PROGNAME;
|
||||
static char *szAppName = LONGNAME;
|
||||
static char *szIconName = PROGNAME;
|
||||
static char szCmdFileName [MAX_PATH];
|
||||
|
||||
// MAIN routine
|
||||
/* MAIN routine */
|
||||
|
||||
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
|
||||
PSTR szCmdLine, int iCmdShow)
|
||||
@@ -90,7 +91,7 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
|
||||
wndclass.hInstance = hInstance;
|
||||
wndclass.hIcon = LoadIcon (hInstance, szIconName) ;
|
||||
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
|
||||
wndclass.hbrBackground = NULL; // (HBRUSH) GetStockObject (GRAY_BRUSH);
|
||||
wndclass.hbrBackground = NULL; /* (HBRUSH) GetStockObject (GRAY_BRUSH); */
|
||||
wndclass.lpszMenuName = szProgName;
|
||||
wndclass.lpszClassName = szProgName;
|
||||
|
||||
@@ -101,7 +102,7 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
|
||||
return 0;
|
||||
}
|
||||
|
||||
// if filename given on commandline, store it
|
||||
/* if filename given on commandline, store it */
|
||||
if ((szCmdLine != NULL) && (*szCmdLine != '\0'))
|
||||
if (szCmdLine[0] == '"')
|
||||
strncpy (szCmdFileName, szCmdLine + 1, strlen(szCmdLine) - 2);
|
||||
@@ -110,20 +111,20 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
|
||||
else
|
||||
strcpy (szCmdFileName, "");
|
||||
|
||||
// calculate size of window-borders
|
||||
/* calculate size of window-borders */
|
||||
ixBorders = 2 * (GetSystemMetrics (SM_CXBORDER) +
|
||||
GetSystemMetrics (SM_CXDLGFRAME));
|
||||
iyBorders = 2 * (GetSystemMetrics (SM_CYBORDER) +
|
||||
GetSystemMetrics (SM_CYDLGFRAME)) +
|
||||
GetSystemMetrics (SM_CYCAPTION) +
|
||||
GetSystemMetrics (SM_CYMENUSIZE) +
|
||||
1; /* WvS: don't ask me why? */
|
||||
1; /* WvS: don't ask me why? */
|
||||
|
||||
hwnd = CreateWindow (szProgName, szAppName,
|
||||
WS_OVERLAPPEDWINDOW,
|
||||
CW_USEDEFAULT, CW_USEDEFAULT,
|
||||
512 + 2 * MARGIN + ixBorders, 384 + 2 * MARGIN + iyBorders,
|
||||
// CW_USEDEFAULT, CW_USEDEFAULT,
|
||||
/* CW_USEDEFAULT, CW_USEDEFAULT, */
|
||||
NULL, NULL, hInstance, NULL);
|
||||
|
||||
ShowWindow (hwnd, iCmdShow);
|
||||
@@ -180,29 +181,29 @@ LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,
|
||||
|
||||
strcpy (szImgPathName, "");
|
||||
|
||||
// in case we process file given on command-line
|
||||
/* in case we process file given on command-line */
|
||||
|
||||
if (szCmdFileName[0] != '\0')
|
||||
{
|
||||
strcpy (szImgPathName, szCmdFileName);
|
||||
|
||||
// read the other png-files in the directory for later
|
||||
// next/previous commands
|
||||
/* read the other png-files in the directory for later */
|
||||
/* next/previous commands */
|
||||
|
||||
BuildPngList (szImgPathName, &pPngFileList, &iPngFileCount,
|
||||
&iPngFileIndex);
|
||||
|
||||
// load the image from file
|
||||
/* load the image from file */
|
||||
|
||||
if (!LoadImageFile (hwnd, szImgPathName,
|
||||
&pbImage, &cxImgSize, &cyImgSize, &cImgChannels, &bkgColor))
|
||||
return 0;
|
||||
|
||||
// invalidate the client area for later update
|
||||
/* invalidate the client area for later update */
|
||||
|
||||
InvalidateRect (hwnd, NULL, TRUE);
|
||||
|
||||
// display the PNG into the DIBitmap
|
||||
/* display the PNG into the DIBitmap */
|
||||
|
||||
DisplayImage (hwnd, &pDib, &pDiData, cxWinSize, cyWinSize,
|
||||
pbImage, cxImgSize, cyImgSize, cImgChannels, bStretched);
|
||||
@@ -214,11 +215,11 @@ LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,
|
||||
cxWinSize = LOWORD (lParam);
|
||||
cyWinSize = HIWORD (lParam);
|
||||
|
||||
// invalidate the client area for later update
|
||||
/* invalidate the client area for later update */
|
||||
|
||||
InvalidateRect (hwnd, NULL, TRUE);
|
||||
|
||||
// display the PNG into the DIBitmap
|
||||
/* display the PNG into the DIBitmap */
|
||||
|
||||
DisplayImage (hwnd, &pDib, &pDiData, cxWinSize, cyWinSize,
|
||||
pbImage, cxImgSize, cyImgSize, cImgChannels, bStretched);
|
||||
@@ -242,28 +243,28 @@ LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,
|
||||
{
|
||||
case IDM_FILE_OPEN:
|
||||
|
||||
// show the File Open dialog box
|
||||
/* show the File Open dialog box */
|
||||
|
||||
if (!PngFileOpenDlg (hwnd, szImgPathName, szTitleName))
|
||||
return 0;
|
||||
|
||||
// read the other png-files in the directory for later
|
||||
// next/previous commands
|
||||
/* read the other png-files in the directory for later */
|
||||
/* next/previous commands */
|
||||
|
||||
BuildPngList (szImgPathName, &pPngFileList, &iPngFileCount,
|
||||
&iPngFileIndex);
|
||||
|
||||
// load the image from file
|
||||
/* load the image from file */
|
||||
|
||||
if (!LoadImageFile (hwnd, szImgPathName,
|
||||
&pbImage, &cxImgSize, &cyImgSize, &cImgChannels, &bkgColor))
|
||||
return 0;
|
||||
|
||||
// invalidate the client area for later update
|
||||
/* invalidate the client area for later update */
|
||||
|
||||
InvalidateRect (hwnd, NULL, TRUE);
|
||||
|
||||
// display the PNG into the DIBitmap
|
||||
/* display the PNG into the DIBitmap */
|
||||
|
||||
DisplayImage (hwnd, &pDib, &pDiData, cxWinSize, cyWinSize,
|
||||
pbImage, cxImgSize, cyImgSize, cImgChannels, bStretched);
|
||||
@@ -272,12 +273,12 @@ LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,
|
||||
|
||||
case IDM_FILE_SAVE:
|
||||
|
||||
// show the File Save dialog box
|
||||
/* show the File Save dialog box */
|
||||
|
||||
if (!PngFileSaveDlg (hwnd, szImgPathName, szTitleName))
|
||||
return 0;
|
||||
|
||||
// save the PNG to a disk file
|
||||
/* save the PNG to a disk file */
|
||||
|
||||
SetCursor (LoadCursor (NULL, IDC_WAIT));
|
||||
ShowCursor (TRUE);
|
||||
@@ -295,7 +296,7 @@ LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,
|
||||
|
||||
case IDM_FILE_NEXT:
|
||||
|
||||
// read next entry in the directory
|
||||
/* read next entry in the directory */
|
||||
|
||||
if (SearchPngList (pPngFileList, iPngFileCount, &iPngFileIndex,
|
||||
NULL, szImgPathName))
|
||||
@@ -303,17 +304,17 @@ LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,
|
||||
if (strcmp (szImgPathName, "") == 0)
|
||||
return 0;
|
||||
|
||||
// load the image from file
|
||||
/* load the image from file */
|
||||
|
||||
if (!LoadImageFile (hwnd, szImgPathName, &pbImage,
|
||||
&cxImgSize, &cyImgSize, &cImgChannels, &bkgColor))
|
||||
return 0;
|
||||
|
||||
// invalidate the client area for later update
|
||||
/* invalidate the client area for later update */
|
||||
|
||||
InvalidateRect (hwnd, NULL, TRUE);
|
||||
|
||||
// display the PNG into the DIBitmap
|
||||
/* display the PNG into the DIBitmap */
|
||||
|
||||
DisplayImage (hwnd, &pDib, &pDiData, cxWinSize, cyWinSize,
|
||||
pbImage, cxImgSize, cyImgSize, cImgChannels, bStretched);
|
||||
@@ -323,7 +324,7 @@ LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,
|
||||
|
||||
case IDM_FILE_PREVIOUS:
|
||||
|
||||
// read previous entry in the directory
|
||||
/* read previous entry in the directory */
|
||||
|
||||
if (SearchPngList (pPngFileList, iPngFileCount, &iPngFileIndex,
|
||||
szImgPathName, NULL))
|
||||
@@ -332,17 +333,17 @@ LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,
|
||||
if (strcmp (szImgPathName, "") == 0)
|
||||
return 0;
|
||||
|
||||
// load the image from file
|
||||
/* load the image from file */
|
||||
|
||||
if (!LoadImageFile (hwnd, szImgPathName, &pbImage, &cxImgSize,
|
||||
&cyImgSize, &cImgChannels, &bkgColor))
|
||||
return 0;
|
||||
|
||||
// invalidate the client area for later update
|
||||
/* invalidate the client area for later update */
|
||||
|
||||
InvalidateRect (hwnd, NULL, TRUE);
|
||||
|
||||
// display the PNG into the DIBitmap
|
||||
/* display the PNG into the DIBitmap */
|
||||
|
||||
DisplayImage (hwnd, &pDib, &pDiData, cxWinSize, cyWinSize,
|
||||
pbImage, cxImgSize, cyImgSize, cImgChannels, bStretched);
|
||||
@@ -352,9 +353,9 @@ LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,
|
||||
|
||||
case IDM_FILE_EXIT:
|
||||
|
||||
// more cleanup needed...
|
||||
/* more cleanup needed... */
|
||||
|
||||
// free image buffer
|
||||
/* free image buffer */
|
||||
|
||||
if (pDib != NULL)
|
||||
{
|
||||
@@ -362,7 +363,7 @@ LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,
|
||||
pDib = NULL;
|
||||
}
|
||||
|
||||
// free file-list
|
||||
/* free file-list */
|
||||
|
||||
if (pPngFileList != NULL)
|
||||
{
|
||||
@@ -370,7 +371,7 @@ LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,
|
||||
pPngFileList = NULL;
|
||||
}
|
||||
|
||||
// let's go ...
|
||||
/* let's go ... */
|
||||
|
||||
exit (0);
|
||||
|
||||
@@ -383,11 +384,11 @@ LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,
|
||||
else
|
||||
CheckMenuItem (hMenu, IDM_OPTIONS_STRETCH, MF_UNCHECKED);
|
||||
|
||||
// invalidate the client area for later update
|
||||
/* invalidate the client area for later update */
|
||||
|
||||
InvalidateRect (hwnd, NULL, TRUE);
|
||||
|
||||
// display the PNG into the DIBitmap
|
||||
/* display the PNG into the DIBitmap */
|
||||
|
||||
DisplayImage (hwnd, &pDib, &pDiData, cxWinSize, cyWinSize,
|
||||
pbImage, cxImgSize, cyImgSize, cImgChannels, bStretched);
|
||||
@@ -398,7 +399,7 @@ LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,
|
||||
DialogBox (hInstance, TEXT ("AboutBox"), hwnd, AboutDlgProc) ;
|
||||
return 0;
|
||||
|
||||
} // end switch
|
||||
} /* end switch */
|
||||
|
||||
break;
|
||||
|
||||
@@ -450,10 +451,10 @@ BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message,
|
||||
return FALSE ;
|
||||
}
|
||||
|
||||
//---------------
|
||||
// CenterAbout
|
||||
//---------------
|
||||
|
||||
/*---------------
|
||||
* CenterAbout
|
||||
*---------------
|
||||
*/
|
||||
BOOL CenterAbout (HWND hwndChild, HWND hwndParent)
|
||||
{
|
||||
RECT rChild, rParent, rWorkArea;
|
||||
@@ -461,19 +462,19 @@ BOOL CenterAbout (HWND hwndChild, HWND hwndParent)
|
||||
int xNew, yNew;
|
||||
BOOL bResult;
|
||||
|
||||
// Get the Height and Width of the child window
|
||||
/* Get the Height and Width of the child window */
|
||||
GetWindowRect (hwndChild, &rChild);
|
||||
wChild = rChild.right - rChild.left;
|
||||
hChild = rChild.bottom - rChild.top;
|
||||
|
||||
// Get the Height and Width of the parent window
|
||||
/* Get the Height and Width of the parent window */
|
||||
GetWindowRect (hwndParent, &rParent);
|
||||
wParent = rParent.right - rParent.left;
|
||||
hParent = rParent.bottom - rParent.top;
|
||||
|
||||
// Get the limits of the 'workarea'
|
||||
/* Get the limits of the 'workarea' */
|
||||
bResult = SystemParametersInfo(
|
||||
SPI_GETWORKAREA, // system parameter to query or set
|
||||
SPI_GETWORKAREA, /* system parameter to query or set */
|
||||
sizeof(RECT),
|
||||
&rWorkArea,
|
||||
0);
|
||||
@@ -483,7 +484,7 @@ BOOL CenterAbout (HWND hwndChild, HWND hwndParent)
|
||||
rWorkArea.bottom = GetSystemMetrics(SM_CYSCREEN);
|
||||
}
|
||||
|
||||
// Calculate new X position, then adjust for workarea
|
||||
/* Calculate new X position, then adjust for workarea */
|
||||
xNew = rParent.left + ((wParent - wChild) /2);
|
||||
if (xNew < rWorkArea.left) {
|
||||
xNew = rWorkArea.left;
|
||||
@@ -491,7 +492,7 @@ BOOL CenterAbout (HWND hwndChild, HWND hwndParent)
|
||||
xNew = rWorkArea.right - wChild;
|
||||
}
|
||||
|
||||
// Calculate new Y position, then adjust for workarea
|
||||
/* Calculate new Y position, then adjust for workarea */
|
||||
yNew = rParent.top + ((hParent - hChild) /2);
|
||||
if (yNew < rWorkArea.top) {
|
||||
yNew = rWorkArea.top;
|
||||
@@ -499,15 +500,15 @@ BOOL CenterAbout (HWND hwndChild, HWND hwndParent)
|
||||
yNew = rWorkArea.bottom - hChild;
|
||||
}
|
||||
|
||||
// Set it, and return
|
||||
/* Set it, and return */
|
||||
return SetWindowPos (hwndChild, NULL, xNew, yNew, 0, 0, SWP_NOSIZE |
|
||||
SWP_NOZORDER);
|
||||
}
|
||||
|
||||
//----------------
|
||||
// BuildPngList
|
||||
//----------------
|
||||
|
||||
/*----------------
|
||||
* BuildPngList
|
||||
*----------------
|
||||
*/
|
||||
BOOL BuildPngList (PTSTR pstrPathName, TCHAR **ppFileList, int *pFileCount,
|
||||
int *pFileIndex)
|
||||
{
|
||||
@@ -523,7 +524,7 @@ BOOL BuildPngList (PTSTR pstrPathName, TCHAR **ppFileList, int *pFileCount,
|
||||
int i, ii;
|
||||
int j, jj;
|
||||
|
||||
// free previous file-list
|
||||
/* free previous file-list */
|
||||
|
||||
if (*ppFileList != NULL)
|
||||
{
|
||||
@@ -531,7 +532,7 @@ BOOL BuildPngList (PTSTR pstrPathName, TCHAR **ppFileList, int *pFileCount,
|
||||
*ppFileList = NULL;
|
||||
}
|
||||
|
||||
// extract foldername, filename and search-name
|
||||
/* extract foldername, filename and search-name */
|
||||
|
||||
strcpy (szImgPathName, pstrPathName);
|
||||
strcpy (szImgFileName, strrchr (pstrPathName, '\\') + 1);
|
||||
@@ -540,7 +541,7 @@ BOOL BuildPngList (PTSTR pstrPathName, TCHAR **ppFileList, int *pFileCount,
|
||||
*(strrchr (szImgFindName, '\\') + 1) = '\0';
|
||||
strcat (szImgFindName, "*.png");
|
||||
|
||||
// first cycle: count number of files in directory for memory allocation
|
||||
/* first cycle: count number of files in directory for memory allocation */
|
||||
|
||||
*pFileCount = 0;
|
||||
|
||||
@@ -554,11 +555,11 @@ BOOL BuildPngList (PTSTR pstrPathName, TCHAR **ppFileList, int *pFileCount,
|
||||
}
|
||||
FindClose(hFind);
|
||||
|
||||
// allocation memory for file-list
|
||||
/* allocation memory for file-list */
|
||||
|
||||
*ppFileList = (TCHAR *) malloc (*pFileCount * MAX_PATH);
|
||||
|
||||
// second cycle: read directory and store filenames in file-list
|
||||
/* second cycle: read directory and store filenames in file-list */
|
||||
|
||||
hFind = FindFirstFile(szImgFindName, &finddata);
|
||||
bOk = (hFind != (HANDLE) -1);
|
||||
@@ -580,7 +581,7 @@ BOOL BuildPngList (PTSTR pstrPathName, TCHAR **ppFileList, int *pFileCount,
|
||||
}
|
||||
FindClose(hFind);
|
||||
|
||||
// finally we must sort the file-list
|
||||
/* finally we must sort the file-list */
|
||||
|
||||
for (i = 0; i < *pFileCount - 1; i++)
|
||||
{
|
||||
@@ -594,7 +595,7 @@ BOOL BuildPngList (PTSTR pstrPathName, TCHAR **ppFileList, int *pFileCount,
|
||||
strcpy (*ppFileList + jj, *ppFileList + ii);
|
||||
strcpy (*ppFileList + ii, szTmp);
|
||||
|
||||
// check if this was the current image that we moved
|
||||
/* check if this was the current image that we moved */
|
||||
|
||||
if (*pFileIndex == i)
|
||||
*pFileIndex = j;
|
||||
@@ -608,9 +609,10 @@ BOOL BuildPngList (PTSTR pstrPathName, TCHAR **ppFileList, int *pFileCount,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//----------------
|
||||
// SearchPngList
|
||||
//----------------
|
||||
/*----------------
|
||||
* SearchPngList
|
||||
*----------------
|
||||
*/
|
||||
|
||||
BOOL SearchPngList (
|
||||
TCHAR *pFileList, int FileCount, int *pFileIndex,
|
||||
@@ -618,7 +620,7 @@ BOOL SearchPngList (
|
||||
{
|
||||
if (FileCount > 0)
|
||||
{
|
||||
// get previous entry
|
||||
/* get previous entry */
|
||||
|
||||
if (pstrPrevName != NULL)
|
||||
{
|
||||
@@ -630,7 +632,7 @@ BOOL SearchPngList (
|
||||
strcpy (pstrPrevName, pFileList + (*pFileIndex * MAX_PATH));
|
||||
}
|
||||
|
||||
// get next entry
|
||||
/* get next entry */
|
||||
|
||||
if (pstrNextName != NULL)
|
||||
{
|
||||
@@ -650,9 +652,10 @@ BOOL SearchPngList (
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------
|
||||
// LoadImageFile
|
||||
//-----------------
|
||||
/*-----------------
|
||||
* LoadImageFile
|
||||
*-----------------
|
||||
*/
|
||||
|
||||
BOOL LoadImageFile (HWND hwnd, PTSTR pstrPathName,
|
||||
png_byte **ppbImage, int *pxImgSize, int *pyImgSize,
|
||||
@@ -660,7 +663,7 @@ BOOL LoadImageFile (HWND hwnd, PTSTR pstrPathName,
|
||||
{
|
||||
static TCHAR szTmp [MAX_PATH];
|
||||
|
||||
// if there's an existing PNG, free the memory
|
||||
/* if there's an existing PNG, free the memory */
|
||||
|
||||
if (*ppbImage)
|
||||
{
|
||||
@@ -668,7 +671,7 @@ BOOL LoadImageFile (HWND hwnd, PTSTR pstrPathName,
|
||||
*ppbImage = NULL;
|
||||
}
|
||||
|
||||
// Load the entire PNG into memory
|
||||
/* Load the entire PNG into memory */
|
||||
|
||||
SetCursor (LoadCursor (NULL, IDC_WAIT));
|
||||
ShowCursor (TRUE);
|
||||
@@ -694,10 +697,10 @@ BOOL LoadImageFile (HWND hwnd, PTSTR pstrPathName,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//----------------
|
||||
// DisplayImage
|
||||
//----------------
|
||||
|
||||
/*----------------
|
||||
* DisplayImage
|
||||
*----------------
|
||||
*/
|
||||
BOOL DisplayImage (HWND hwnd, BYTE **ppDib,
|
||||
BYTE **ppDiData, int cxWinSize, int cyWinSize,
|
||||
BYTE *pbImage, int cxImgSize, int cyImgSize, int cImgChannels,
|
||||
@@ -705,14 +708,14 @@ BOOL DisplayImage (HWND hwnd, BYTE **ppDib,
|
||||
{
|
||||
BYTE *pDib = *ppDib;
|
||||
BYTE *pDiData = *ppDiData;
|
||||
// BITMAPFILEHEADER *pbmfh;
|
||||
/* BITMAPFILEHEADER *pbmfh; */
|
||||
BITMAPINFOHEADER *pbmih;
|
||||
WORD wDIRowBytes;
|
||||
png_color bkgBlack = {0, 0, 0};
|
||||
png_color bkgGray = {127, 127, 127};
|
||||
png_color bkgWhite = {255, 255, 255};
|
||||
|
||||
// allocate memory for the Device Independant bitmap
|
||||
/* allocate memory for the Device Independant bitmap */
|
||||
|
||||
wDIRowBytes = (WORD) ((3 * cxWinSize + 3L) >> 2) << 2;
|
||||
|
||||
@@ -733,7 +736,7 @@ BOOL DisplayImage (HWND hwnd, BYTE **ppDib,
|
||||
*ppDib = pDib;
|
||||
memset (pDib, 0, sizeof(BITMAPINFOHEADER));
|
||||
|
||||
// initialize the dib-structure
|
||||
/* initialize the dib-structure */
|
||||
|
||||
pbmih = (BITMAPINFOHEADER *) pDib;
|
||||
pbmih->biSize = sizeof(BITMAPINFOHEADER);
|
||||
@@ -745,11 +748,11 @@ BOOL DisplayImage (HWND hwnd, BYTE **ppDib,
|
||||
pDiData = pDib + sizeof(BITMAPINFOHEADER);
|
||||
*ppDiData = pDiData;
|
||||
|
||||
// first fill bitmap with gray and image border
|
||||
/* first fill bitmap with gray and image border */
|
||||
|
||||
InitBitmap (pDiData, cxWinSize, cyWinSize);
|
||||
|
||||
// then fill bitmap with image
|
||||
/* then fill bitmap with image */
|
||||
|
||||
if (pbImage)
|
||||
{
|
||||
@@ -762,16 +765,16 @@ BOOL DisplayImage (HWND hwnd, BYTE **ppDib,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//--------------
|
||||
// InitBitmap
|
||||
//--------------
|
||||
|
||||
/*--------------
|
||||
* InitBitmap
|
||||
*--------------
|
||||
*/
|
||||
BOOL InitBitmap (BYTE *pDiData, int cxWinSize, int cyWinSize)
|
||||
{
|
||||
BYTE *dst;
|
||||
int x, y, col;
|
||||
|
||||
// initialize the background with gray
|
||||
/* initialize the background with gray */
|
||||
|
||||
dst = pDiData;
|
||||
for (y = 0; y < cyWinSize; y++)
|
||||
@@ -779,13 +782,13 @@ BOOL InitBitmap (BYTE *pDiData, int cxWinSize, int cyWinSize)
|
||||
col = 0;
|
||||
for (x = 0; x < cxWinSize; x++)
|
||||
{
|
||||
// fill with GRAY
|
||||
/* fill with GRAY */
|
||||
*dst++ = 127;
|
||||
*dst++ = 127;
|
||||
*dst++ = 127;
|
||||
col += 3;
|
||||
}
|
||||
// rows start on 4 byte boundaries
|
||||
/* rows start on 4 byte boundaries */
|
||||
while ((col % 4) != 0)
|
||||
{
|
||||
dst++;
|
||||
@@ -796,10 +799,10 @@ BOOL InitBitmap (BYTE *pDiData, int cxWinSize, int cyWinSize)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//--------------
|
||||
// FillBitmap
|
||||
//--------------
|
||||
|
||||
/*--------------
|
||||
* FillBitmap
|
||||
*--------------
|
||||
*/
|
||||
BOOL FillBitmap (
|
||||
BYTE *pDiData, int cxWinSize, int cyWinSize,
|
||||
BYTE *pbImage, int cxImgSize, int cyImgSize, int cImgChannels,
|
||||
@@ -824,11 +827,12 @@ BOOL FillBitmap (
|
||||
cxNewSize = cxWinSize - 2 * MARGIN;
|
||||
cyNewSize = cyWinSize - 2 * MARGIN;
|
||||
|
||||
// stretch the image to it's window determined size
|
||||
/* stretch the image to it's window determined size */
|
||||
|
||||
// the following two are the same, but the first has side-effects
|
||||
// because of rounding
|
||||
// if ((cyNewSize / cxNewSize) > (cyImgSize / cxImgSize))
|
||||
/* the following two are mathematically the same, but the first
|
||||
* has side-effects because of rounding
|
||||
*/
|
||||
/* if ((cyNewSize / cxNewSize) > (cyImgSize / cxImgSize)) */
|
||||
if ((cyNewSize * cxImgSize) > (cyImgSize * cxNewSize))
|
||||
{
|
||||
cyNewSize = cxNewSize * cyImgSize / cxImgSize;
|
||||
@@ -867,12 +871,12 @@ BOOL FillBitmap (
|
||||
}
|
||||
}
|
||||
|
||||
// calculate row-bytes
|
||||
/* calculate row-bytes */
|
||||
|
||||
wImgRowBytes = cImgChannels * cxNewSize;
|
||||
wDIRowBytes = (WORD) ((cDIChannels * cxWinSize + 3L) >> 2) << 2;
|
||||
|
||||
// copy image to screen
|
||||
/* copy image to screen */
|
||||
|
||||
for (yImg = 0, yWin = cyImgPos; yImg < cyNewSize; yImg++, yWin++)
|
||||
{
|
||||
@@ -888,7 +892,7 @@ BOOL FillBitmap (
|
||||
r = *src++;
|
||||
g = *src++;
|
||||
b = *src++;
|
||||
*dst++ = b; /* note the reverse order */
|
||||
*dst++ = b; /* note the reverse order */
|
||||
*dst++ = g;
|
||||
*dst++ = r;
|
||||
if (cImgChannels == 4)
|
||||
@@ -898,7 +902,7 @@ BOOL FillBitmap (
|
||||
}
|
||||
}
|
||||
|
||||
// free memory
|
||||
/* free memory */
|
||||
|
||||
if (pStretchedImage != NULL)
|
||||
{
|
||||
@@ -908,28 +912,28 @@ BOOL FillBitmap (
|
||||
|
||||
}
|
||||
|
||||
// process the image not-stretched
|
||||
/* process the image not-stretched */
|
||||
|
||||
else
|
||||
{
|
||||
// calculate the central position
|
||||
/* calculate the central position */
|
||||
|
||||
cxImgPos = (cxWinSize - cxImgSize) / 2;
|
||||
cyImgPos = (cyWinSize - cyImgSize) / 2;
|
||||
|
||||
// check for image larger than window
|
||||
/* check for image larger than window */
|
||||
|
||||
if (cxImgPos < MARGIN)
|
||||
cxImgPos = MARGIN;
|
||||
if (cyImgPos < MARGIN)
|
||||
cyImgPos = MARGIN;
|
||||
|
||||
// calculate both row-bytes
|
||||
/* calculate both row-bytes */
|
||||
|
||||
wImgRowBytes = cImgChannels * cxImgSize;
|
||||
wDIRowBytes = (WORD) ((cDIChannels * cxWinSize + 3L) >> 2) << 2;
|
||||
|
||||
// copy image to screen
|
||||
/* copy image to screen */
|
||||
|
||||
for (yImg = 0, yWin = cyImgPos; yImg < cyImgSize; yImg++, yWin++)
|
||||
{
|
||||
@@ -945,7 +949,7 @@ BOOL FillBitmap (
|
||||
r = *src++;
|
||||
g = *src++;
|
||||
b = *src++;
|
||||
*dst++ = b; /* note the reverse order */
|
||||
*dst++ = b; /* note the reverse order */
|
||||
*dst++ = g;
|
||||
*dst++ = r;
|
||||
if (cImgChannels == 4)
|
||||
@@ -959,6 +963,7 @@ BOOL FillBitmap (
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//-----------------
|
||||
// end of source
|
||||
//-----------------
|
||||
/*-----------------
|
||||
* end of source
|
||||
*-----------------
|
||||
*/
|
||||
|
||||
18
example.c
18
example.c
@@ -2,7 +2,7 @@
|
||||
#if 0 /* in case someone actually tries to compile this */
|
||||
|
||||
/* example.c - an example of using libpng
|
||||
* Last changed in libpng 1.5.4 [(PENDING RELEASE)]
|
||||
* Last changed in libpng 1.5.6 [(PENDING RELEASE)]
|
||||
* This file has been placed in the public domain by the authors.
|
||||
* Maintained 1998-2011 Glenn Randers-Pehrson
|
||||
* Maintained 1996, 1997 Andreas Dilger)
|
||||
@@ -187,8 +187,15 @@ void read_png(FILE *fp, unsigned int sig_read) /* File is already open */
|
||||
* are mutually exclusive.
|
||||
*/
|
||||
|
||||
/* Tell libpng to strip 16 bit/color files down to 8 bits/color */
|
||||
/* Tell libpng to strip 16 bit/color files down to 8 bits/color.
|
||||
* Use accurate scaling if it's available, otherwise just chop off the
|
||||
* low byte.
|
||||
*/
|
||||
#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
|
||||
png_set_scale_16(png_ptr);
|
||||
#else
|
||||
png_set_strip_16(png_ptr);
|
||||
#endif
|
||||
|
||||
/* Strip alpha bytes from the input data without combining with the
|
||||
* background (not recommended).
|
||||
@@ -334,11 +341,16 @@ void read_png(FILE *fp, unsigned int sig_read) /* File is already open */
|
||||
/* Add filler (or alpha) byte (before/after each RGB triplet) */
|
||||
png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER);
|
||||
|
||||
#ifdef PNG_READ_INTERLACING_SUPPORTED
|
||||
/* Turn on interlace handling. REQUIRED if you are not using
|
||||
* png_read_image(). To see how to handle interlacing passes,
|
||||
* see the png_read_row() method below:
|
||||
*/
|
||||
number_passes = png_set_interlace_handling(png_ptr);
|
||||
#else
|
||||
number_passes = 1;
|
||||
#endif /* PNG_READ_INTERLACING_SUPPORTED */
|
||||
|
||||
|
||||
/* Optional call to gamma correct and add the background to the palette
|
||||
* and update info structure. REQUIRED if you are expecting libpng to
|
||||
@@ -520,6 +532,7 @@ row_callback(png_structp png_ptr, png_bytep new_row,
|
||||
*/
|
||||
png_bytep old_row = ((png_bytep *)our_data)[row_num];
|
||||
|
||||
#ifdef PNG_READ_INTERLACING_SUPPORTED
|
||||
/* If both rows are allocated then copy the new row
|
||||
* data to the corresponding row data.
|
||||
*/
|
||||
@@ -548,6 +561,7 @@ row_callback(png_structp png_ptr, png_bytep new_row,
|
||||
* to pass the current row as new_row, and the function will combine
|
||||
* the old row and the new row.
|
||||
*/
|
||||
#endif /* PNG_READ_INTERLACING_SUPPORTED */
|
||||
}
|
||||
|
||||
end_callback(png_structp png_ptr, png_infop info)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
libpng-manual.txt - A description on how to use and modify libpng
|
||||
|
||||
libpng version 1.5.4beta03 - June 15, 2011
|
||||
libpng version 1.5.6rc02 - October 27, 2011
|
||||
Updated and distributed by Glenn Randers-Pehrson
|
||||
<glennrp at users.sourceforge.net>
|
||||
Copyright (c) 1998-2011 Glenn Randers-Pehrson
|
||||
@@ -11,7 +11,7 @@ libpng-manual.txt - A description on how to use and modify libpng
|
||||
|
||||
Based on:
|
||||
|
||||
libpng versions 0.97, January 1998, through 1.5.4beta03 - June 15, 2011
|
||||
libpng versions 0.97, January 1998, through 1.5.6rc02 - October 27, 2011
|
||||
Updated and distributed by Glenn Randers-Pehrson
|
||||
Copyright (c) 1998-2011 Glenn Randers-Pehrson
|
||||
|
||||
@@ -107,7 +107,8 @@ PNG file. At one time, the fields of png_info were intended to be
|
||||
directly accessible to the user. However, this tended to cause problems
|
||||
with applications using dynamically loaded libraries, and as a result
|
||||
a set of interface functions for png_info (the png_get_*() and png_set_*()
|
||||
functions) was developed.
|
||||
functions) was developed, and direct access to the png_info fields was
|
||||
deprecated..
|
||||
|
||||
The png_struct structure is the object used by the library to decode a
|
||||
single image. As of 1.5.0 this structure is also not exposed.
|
||||
@@ -116,14 +117,23 @@ Almost all libpng APIs require a pointer to a png_struct as the first argument.
|
||||
Many (in particular the png_set and png_get APIs) also require a pointer
|
||||
to png_info as the second argument. Some application visible macros
|
||||
defined in png.h designed for basic data access (reading and writing
|
||||
integers in the PNG format) break this rule, but it's almost always safe
|
||||
to assume that a (png_struct*) has to be passed to call an API function.
|
||||
integers in the PNG format) don't take a png_info pointer, but it's almost
|
||||
always safe to assume that a (png_struct*) has to be passed to call an API
|
||||
function.
|
||||
|
||||
You can have more than one png_info structure associated with an image,
|
||||
as illustrated in pngtest.c, one for information valid prior to the
|
||||
IDAT chunks and another (called "end_info" below) for things after them.
|
||||
|
||||
The png.h header file is an invaluable reference for programming with libpng.
|
||||
And while I'm on the topic, make sure you include the libpng header file:
|
||||
|
||||
#include <png.h>
|
||||
|
||||
and also (as of libpng-1.5.0) the zlib header file, if you need it:
|
||||
|
||||
#include <zlib.h>
|
||||
|
||||
Types
|
||||
|
||||
The png.h header file defines a number of integral types used by the
|
||||
@@ -137,9 +147,9 @@ the value by multiplying by 100,000. As of libpng 1.5.0 a convenience
|
||||
macro PNG_FP_1 is defined in png.h along with a type (png_fixed_point)
|
||||
which is simply (png_int_32).
|
||||
|
||||
All APIs that take (double) arguments also have an matching API that
|
||||
All APIs that take (double) arguments also have a matching API that
|
||||
takes the corresponding fixed point integer arguments. The fixed point
|
||||
API has the same name as the floating point one with _fixed appended.
|
||||
API has the same name as the floating point one with "_fixed" appended.
|
||||
The actual range of values permitted in the APIs is frequently less than
|
||||
the full range of (png_fixed_point) (-21474 to +21474). When APIs require
|
||||
a non-negative argument the type is recorded as png_uint_32 above. Consult
|
||||
@@ -157,6 +167,10 @@ preprocessing directives of the form:
|
||||
#ifdef PNG_feature_SUPPORTED
|
||||
declare-function
|
||||
#endif
|
||||
...
|
||||
#ifdef PNG_feature_SUPPORTED
|
||||
use-function
|
||||
#endif
|
||||
|
||||
The library can be built without support for these APIs, although a
|
||||
standard build will have all implemented APIs. Application programs
|
||||
@@ -165,7 +179,7 @@ portability. From libpng 1.5.0 the feature macros set during the build
|
||||
of libpng are recorded in the header file "pnglibconf.h" and this file
|
||||
is always included by png.h.
|
||||
|
||||
If you don't need to change the library configuration from the default skip to
|
||||
If you don't need to change the library configuration from the default, skip to
|
||||
the next section ("Reading").
|
||||
|
||||
Notice that some of the makefiles in the 'scripts' directory and (in 1.5.0) all
|
||||
@@ -197,24 +211,25 @@ A variety of methods exist to build libpng. Not all of these support
|
||||
reconfiguration of pnglibconf.h. To reconfigure pnglibconf.h it must either be
|
||||
rebuilt from scripts/pnglibconf.dfa using awk or it must be edited by hand.
|
||||
|
||||
Hand editing is achieved by copying scripts/pnglibconf.h.prebuilt and changing
|
||||
the lines defining the supported features, paying very close attention to the
|
||||
'option' information in scripts/pnglibconf.dfa that describes those features and
|
||||
their requirements. This is easy to get wrong.
|
||||
Hand editing is achieved by copying scripts/pnglibconf.h.prebuilt to
|
||||
pnglibconf.h and changing the lines defining the supported features, paying
|
||||
very close attention to the 'option' information in scripts/pnglibconf.dfa
|
||||
that describes those features and their requirements. This is easy to get
|
||||
wrong.
|
||||
|
||||
B. Configuration using DFA_XTRA
|
||||
|
||||
Rebuilding from pnglibconf.dfa is easy if a functioning 'awk', or a later
|
||||
variant such as 'nawk' or 'gawk', is available. The configure build will
|
||||
automatically find an appropriate awk and build pnglibconf.h.
|
||||
scripts/pnglibconf.mak contains a set of make rules for doing the same thing if
|
||||
configure is not used, and many of the makefiles in the scripts directory use
|
||||
this approach.
|
||||
The scripts/pnglibconf.mak file contains a set of make rules for doing the
|
||||
same thing if configure is not used, and many of the makefiles in the scripts
|
||||
directory use this approach.
|
||||
|
||||
When rebuilding simply write new file containing changed options and set
|
||||
When rebuilding simply write a new file containing changed options and set
|
||||
DFA_XTRA to the name of this file. This causes the build to append the new file
|
||||
to the end of scripts/pnglibconf.dfa. pngusr.dfa should contain lines of the
|
||||
following forms:
|
||||
to the end of scripts/pnglibconf.dfa. The pngusr.dfa file should contain lines
|
||||
of the following forms:
|
||||
|
||||
everything = off
|
||||
|
||||
@@ -238,12 +253,16 @@ source code. Most of these values have performance implications for the library
|
||||
but most of them have no visible effect on the API. Some can also be overridden
|
||||
from the API.
|
||||
|
||||
This method of building a customized pnglibconf.h is illustrated in
|
||||
contrib/pngminim/*. See the "$(PNGCONF):" target in the makefile and
|
||||
pngusr.dfa in these directories.
|
||||
|
||||
C. Configuration using PNG_USR_CONFIG
|
||||
|
||||
If -DPNG_USR_CONFIG is added to the CFLAGS when pnglibconf.h is built the file
|
||||
pngusr.h will automatically be included before the options in
|
||||
scripts/pnglibconf.dfa are processed. pngusr.h should contain only macro
|
||||
definitions turning features on or off or setting settings.
|
||||
scripts/pnglibconf.dfa are processed. Your pngusr.h file should contain only
|
||||
macro definitions turning features on or off or setting settings.
|
||||
|
||||
Apart from the global setting "everything = off" all the options listed above
|
||||
can be set using macros in pngusr.h:
|
||||
@@ -274,6 +293,9 @@ examine the intermediate file pnglibconf.dfn to find the full set of
|
||||
dependency information for each setting and option. Simply locate the
|
||||
feature in the file and read the C comments that precede it.
|
||||
|
||||
This method is also illustrated in the contrib/pngminim/* makefiles and
|
||||
pngusr.h.
|
||||
|
||||
III. Reading
|
||||
|
||||
We'll now walk you through the possible functions to call when reading
|
||||
@@ -557,6 +579,8 @@ according to the "keep" directive. If a chunk is named in successive
|
||||
instances of png_set_keep_unknown_chunks(), the final instance will
|
||||
take precedence. The IHDR and IEND chunks should not be named in
|
||||
chunk_list; if they are, libpng will process them normally anyway.
|
||||
If you know that your application will never make use of some particular
|
||||
chunks, use PNG_HANDLE_CHUNK_NEVER (or 1) as demonstrated below.
|
||||
|
||||
Here is an example of the usage of png_set_keep_unknown_chunks(),
|
||||
where the private "vpAg" chunk will later be processed by a user chunk
|
||||
@@ -647,13 +671,14 @@ If you intend to display the PNG or to incorporate it in other image data you
|
||||
need to tell libpng information about your display or drawing surface so that
|
||||
libpng can convert the values in the image to match the display.
|
||||
|
||||
From libpng-1.5.3 this information can be set before reading the PNG file
|
||||
From libpng-1.5.4 this information can be set before reading the PNG file
|
||||
header. In earlier versions png_set_gamma() existed but behaved incorrectly if
|
||||
called before the PNG file header had been read and png_set_alpha_mode() did not
|
||||
exist.
|
||||
|
||||
If you need to support versions prior to libpng-1.5.3 test the version number
|
||||
and follow the procedures described in the appropriate manual page.
|
||||
If you need to support versions prior to libpng-1.5.4 test the version number
|
||||
as illustrated below using "PNG_LIBPNG_VER >= 10504" and follow the procedures
|
||||
described in the appropriate manual page.
|
||||
|
||||
You give libpng the encoding expected by your system expressed as a 'gamma'
|
||||
value. You can also specify a default encoding for the PNG file in
|
||||
@@ -666,14 +691,14 @@ or you can use the fixed point equivalent:
|
||||
|
||||
png_set_gamma_fixed(png_ptr, PNG_FP_1*screen_gamma, PNG_FP_1/screen_gamma);
|
||||
|
||||
If you don't know the gamma for you system it is probably 2.2 - a good
|
||||
If you don't know the gamma for your system it is probably 2.2 - a good
|
||||
approximation to the IEC standard for display systems (sRGB). If images are
|
||||
too contrasty or washed out you got the value wrong - check your system
|
||||
documentation!
|
||||
|
||||
Many systems permit the system gamma to be changed via a lookup table in the
|
||||
display driver, a few systems, including older Macs, change the response by
|
||||
default. As of 1.5.3 three special values are available to handle common
|
||||
default. As of 1.5.4 three special values are available to handle common
|
||||
situations:
|
||||
|
||||
PNG_DEFAULT_sRGB: Indicates that the system conforms to the IEC 61966-2-1
|
||||
@@ -695,14 +720,18 @@ channel. To display these files correctly you need to compose the data onto a
|
||||
suitable background, as described in the PNG specification.
|
||||
|
||||
Libpng only supports composing onto a single color (using png_set_background;
|
||||
see below.) Otherwise you must do the composition yourself and, in this case,
|
||||
see below). Otherwise you must do the composition yourself and, in this case,
|
||||
you may need to call png_set_alpha_mode:
|
||||
|
||||
#if PNG_LIBPNG_VER >= 10504
|
||||
png_set_alpha_mode(png_ptr, mode, screen_gamma);
|
||||
#else
|
||||
png_set_gamma(png_ptr, screen_gamma, 1.0/screen_gamma);
|
||||
#endif
|
||||
|
||||
The screen_gamma value is the same as the argument to png_set_gamma, however how
|
||||
it affects the output depends on the mode. png_set_alpha_mode() sets the file
|
||||
gamma default to 1/screen_gamma, so normally you don't need to call
|
||||
The screen_gamma value is the same as the argument to png_set_gamma; however,
|
||||
how it affects the output depends on the mode. png_set_alpha_mode() sets the
|
||||
file gamma default to 1/screen_gamma, so normally you don't need to call
|
||||
png_set_gamma. If you need different defaults call png_set_gamma() before
|
||||
png_set_alpha_mode() - if you call it after it will override the settings made
|
||||
by png_set_alpha_mode().
|
||||
@@ -729,10 +758,11 @@ scaled, linear encoded, pre-multiplied component values must
|
||||
be used!
|
||||
|
||||
The remaining modes assume you don't need to do any further color correction or
|
||||
that if you do your color correction software knows all about alpha (it
|
||||
that if you do, your color correction software knows all about alpha (it
|
||||
probably doesn't!)
|
||||
|
||||
PNG_ALPHA_STANDARD: The data libpng produces is encoded in the standard way
|
||||
PNG_ALPHA_STANDARD: The data libpng produces
|
||||
is encoded in the standard way
|
||||
assumed by most correctly written graphics software.
|
||||
The gamma encoding will be removed by libpng and the
|
||||
linear component values will be pre-multiplied by the
|
||||
@@ -762,7 +792,8 @@ dynamic range. To avoid problems, and if your software
|
||||
supports it, use png_set_expand_16() to force all
|
||||
components to 16 bits.
|
||||
|
||||
PNG_ALPHA_OPTIMIZED: This mode is the same as PNG_ALPHA_STANDARD except that
|
||||
PNG_ALPHA_OPTIMIZED: This mode is the same
|
||||
as PNG_ALPHA_STANDARD except that
|
||||
completely opaque pixels are gamma encoded according to
|
||||
the screen_gamma value. Pixels with alpha less than 1.0
|
||||
will still have linear components.
|
||||
@@ -782,10 +813,11 @@ representation of non-opaque pixels are irrelevant.
|
||||
You can also try this format if your software is broken;
|
||||
it might look better.
|
||||
|
||||
PNG_ALPHA_BROKEN: This is PNG_ALPHA_STANDARD however all component values,
|
||||
PNG_ALPHA_BROKEN: This is PNG_ALPHA_STANDARD;
|
||||
however, all component values,
|
||||
including the alpha channel are gamma encoded. This is
|
||||
an appropriate format to try if your software, or more
|
||||
likely hardware, is totally broken: if it performs
|
||||
likely hardware, is totally broken, i.e., if it performs
|
||||
linear arithmetic directly on gamma encoded values.
|
||||
|
||||
In most cases of broken software or hardware the bug in the final display
|
||||
@@ -801,14 +833,14 @@ them, there are three recommended ways of using png_set_alpha_mode():
|
||||
screen_gamma);
|
||||
|
||||
You can do color correction on the result (libpng does not currently
|
||||
support color correction internally.) When you handle the alpha channel
|
||||
support color correction internally). When you handle the alpha channel
|
||||
you need to undo the gamma encoding and multiply out the alpha.
|
||||
|
||||
png_set_alpha_mode(png_ptr, PNG_ALPHA_STANDARD,
|
||||
screen_gamma);
|
||||
png_set_expand_16(png_ptr);
|
||||
|
||||
If you are using the high level interface don't call png_set_expand_16();
|
||||
If you are using the high level interface, don't call png_set_expand_16();
|
||||
instead pass PNG_TRANSFORM_EXPAND_16 to the interface.
|
||||
|
||||
With this mode you can't do color correction, but you can do arithmetic,
|
||||
@@ -820,7 +852,7 @@ including composition and scaling, on the data without further processing.
|
||||
You can avoid the expansion to 16-bit components with this mode, but you
|
||||
lose the ability to scale the image or perform other linear arithmetic.
|
||||
All you can do is compose the result onto a matching output. Since this
|
||||
mode is libpng specific you also need to write your own composition
|
||||
mode is libpng-specific you also need to write your own composition
|
||||
software.
|
||||
|
||||
If you don't need, or can't handle, the alpha channel you can call
|
||||
@@ -833,22 +865,27 @@ transparent parts of this image.
|
||||
|
||||
The background_color is an RGB or grayscale value according to the data format
|
||||
libpng will produce for you. Because you don't yet know the format of the PNG
|
||||
file if you call png_set_background at this point you must arrange for the
|
||||
file, if you call png_set_background at this point you must arrange for the
|
||||
format produced by libpng to always have 8-bit or 16-bit components and then
|
||||
store the color as an 8-bit or 16-bit color as appropriate. The color contains
|
||||
separate gray and RGB component values, so you can let libpng produce gray or
|
||||
RGB output according to the input format, but low bit depth grayscale images
|
||||
must always be converted to at least 8-bit format. (Even low low bit depth
|
||||
must always be converted to at least 8-bit format. (Even though low bit depth
|
||||
grayscale images can't have an alpha channel they can have a transparent
|
||||
color!)
|
||||
|
||||
You set the transforms you need later, either as flags to the high level
|
||||
interface or libpng API calls for the low level interface. For reference the
|
||||
settings required are:
|
||||
settings and API calls required are:
|
||||
|
||||
8-bit values:
|
||||
PNG_TRANSFORM_STRIP_16 | PNG_EXPAND
|
||||
png_set_expand(png_ptr); png_set_strip_16(png_ptr);
|
||||
PNG_TRANSFORM_SCALE_16 | PNG_EXPAND
|
||||
png_set_expand(png_ptr); png_set_scale_16(png_ptr);
|
||||
|
||||
If you must get exactly the same inaccurate results
|
||||
produced by default in versions prior to libpng-1.5.4,
|
||||
use PNG_TRANSFORM_STRIP_16 and png_set_strip_16(png_ptr)
|
||||
instead.
|
||||
|
||||
16-bit values:
|
||||
PNG_TRANSFORM_EXPAND_16
|
||||
@@ -859,9 +896,9 @@ color data you can add PNG_TRANSFORM_GRAY_TO_RGB or png_set_gray_to_rgb(png_ptr)
|
||||
to the list.
|
||||
|
||||
Calling png_set_background before the PNG file header is read will not work
|
||||
prior to libpng-1.5.3. Because the failure may result in unexpected warnings or
|
||||
prior to libpng-1.5.4. Because the failure may result in unexpected warnings or
|
||||
errors it is therefore much safer to call png_set_background after the head has
|
||||
been read. Unfortunately this means that prior to libpng-1.5.3 it cannot be
|
||||
been read. Unfortunately this means that prior to libpng-1.5.4 it cannot be
|
||||
used with the high level interface.
|
||||
|
||||
The high-level read interface
|
||||
@@ -873,8 +910,10 @@ the entire image into memory, and (b) the input transformations
|
||||
you want to do are limited to the following set:
|
||||
|
||||
PNG_TRANSFORM_IDENTITY No transformation
|
||||
PNG_TRANSFORM_STRIP_16 Strip 16-bit samples to
|
||||
8-bit
|
||||
PNG_TRANSFORM_SCALE_16 Strip 16-bit samples to
|
||||
8-bit accurately
|
||||
PNG_TRANSFORM_STRIP_16 Chop 16-bit samples to
|
||||
8-bit less accurately
|
||||
PNG_TRANSFORM_STRIP_ALPHA Discard the alpha channel
|
||||
PNG_TRANSFORM_PACKING Expand 1, 2 and 4-bit
|
||||
samples to bytes
|
||||
@@ -968,9 +1007,9 @@ for use in later transformations. Important information copied in is:
|
||||
1) The PNG file gamma from the gAMA chunk. This overwrites the default value
|
||||
provided by an earlier call to png_set_gamma or png_set_alpha_mode.
|
||||
|
||||
2) Prior to libpng-1.5.3 the background color from a bKGd chunk. This
|
||||
2) Prior to libpng-1.5.4 the background color from a bKGd chunk. This
|
||||
damages the information provided by an earlier call to png_set_background
|
||||
resulting in expected behavior. Libpng-1.5.3 no longer does this.
|
||||
resulting in unexpected behavior. Libpng-1.5.4 no longer does this.
|
||||
|
||||
3) The number of significant bits in each component value. Libpng uses this to
|
||||
optimize gamma handling by reducing the internal lookup table sizes.
|
||||
@@ -1108,6 +1147,28 @@ pointer into the info_ptr is returned for any complex types.
|
||||
int_file_gamma - 100,000 times the gamma at which the
|
||||
file is written
|
||||
|
||||
png_get_cHRM(png_ptr, info_ptr, &white_x, &white_y, &red_x, &red_y,
|
||||
&green_x, &green_y, &blue_x, &blue_y)
|
||||
png_get_cHRM_XYZ(png_ptr, info_ptr, &red_X, &red_Y, &red_Z, &green_X,
|
||||
&green_Y, &green_Z, &blue_X, &blue_Y, &blue_Z)
|
||||
png_get_cHRM_fixed(png_ptr, info_ptr, &int_white_x, &int_white_y,
|
||||
&int_red_x, &int_red_y, &int_green_x, &int_green_y,
|
||||
&int_blue_x, &int_blue_y)
|
||||
png_get_cHRM_XYZ_fixed(png_ptr, info_ptr, &int_red_X, &int_red_Y,
|
||||
&int_red_Z, &int_green_X, &int_green_Y, &int_green_Z,
|
||||
&int_blue_X, &int_blue_Y, &int_blue_Z)
|
||||
|
||||
{white,red,green,blue}_{x,y}
|
||||
A color space encoding specified using the chromaticities
|
||||
of the end points and the white point. (PNG_INFO_cHRM)
|
||||
|
||||
{red,green,blue}_{X,Y,Z}
|
||||
A color space encoding specified using the encoding end
|
||||
points - the CIE tristimulus specification of the intended
|
||||
color of the red, green and blue channels in the PNG RGB
|
||||
data. The white point is simply the sum of the three end
|
||||
points. (PNG_INFO_cHRM)
|
||||
|
||||
png_get_sRGB(png_ptr, info_ptr, &srgb_intent);
|
||||
|
||||
file_srgb_intent - the rendering intent (PNG_INFO_sRGB)
|
||||
@@ -1166,7 +1227,8 @@ pointer into the info_ptr is returned for any complex types.
|
||||
|
||||
png_get_bKGD(png_ptr, info_ptr, &background);
|
||||
|
||||
background - background color (PNG_VALID_bKGD)
|
||||
background - background color (of type
|
||||
png_color_16p) (PNG_VALID_bKGD)
|
||||
valid 16-bit red, green and blue
|
||||
values, regardless of color_type
|
||||
|
||||
@@ -1205,6 +1267,8 @@ pointer into the info_ptr is returned for any complex types.
|
||||
Note that the itxt_length, lang, and lang_key
|
||||
members of the text_ptr structure only exist
|
||||
when the library is built with iTXt chunk support.
|
||||
Prior to libpng-1.4.0, the default build was
|
||||
without iTXt chunk support.
|
||||
|
||||
num_text - number of comments (same as
|
||||
num_comments; you can put NULL here
|
||||
@@ -1229,10 +1293,10 @@ pointer into the info_ptr is returned for any complex types.
|
||||
&unit_type);
|
||||
|
||||
offset_x - positive offset from the left edge
|
||||
of the screen
|
||||
of the screen (can be negative)
|
||||
|
||||
offset_y - positive offset from the top edge
|
||||
of the screen
|
||||
of the screen (can be negative)
|
||||
|
||||
unit_type - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER
|
||||
|
||||
@@ -1264,6 +1328,7 @@ pointer into the info_ptr is returned for any complex types.
|
||||
unit - physical scale units (an integer)
|
||||
|
||||
width - width of a pixel in physical scale units
|
||||
(expressed as a string)
|
||||
|
||||
height - height of a pixel in physical scale units
|
||||
(width and height are strings like "2.54")
|
||||
@@ -1286,6 +1351,12 @@ pointer into the info_ptr is returned for any complex types.
|
||||
chunks were read from the PNG file or inserted with the
|
||||
png_set_unknown_chunks() function.
|
||||
|
||||
The value of "location" is a bitwise "or" of
|
||||
|
||||
PNG_HAVE_IHDR (0x01)
|
||||
PNG_HAVE_PLTE (0x02)
|
||||
PNG_AFTER_IDAT (0x08)
|
||||
|
||||
The data from the pHYs chunk can be retrieved in several convenient
|
||||
forms:
|
||||
|
||||
@@ -1399,12 +1470,12 @@ byte, unless png_set_packing() is called. 8-bit RGB data will be stored
|
||||
in RGB RGB RGB format unless png_set_filler() or png_set_add_alpha()
|
||||
is called to insert filler bytes, either before or after each RGB triplet.
|
||||
16-bit RGB data will be returned RRGGBB RRGGBB, with the most significant
|
||||
byte of the color value first, unless png_set_strip_16() is called to
|
||||
byte of the color value first, unless png_set_scale_16() is called to
|
||||
transform it to regular RGB RGB triplets, or png_set_filler() or
|
||||
png_set_add alpha() is called to insert filler bytes, either before or
|
||||
after each RRGGBB triplet. Similarly, 8-bit or 16-bit grayscale data can
|
||||
be modified with
|
||||
png_set_filler(), png_set_add_alpha(), or png_set_strip_16().
|
||||
be modified with png_set_filler(), png_set_add_alpha(), png_set_strip_16(),
|
||||
or png_set_scale_16().
|
||||
|
||||
The following code transforms grayscale images of less than 8 to 8 bits,
|
||||
changes paletted images to RGB, and adds a full alpha channel if there is
|
||||
@@ -1430,7 +1501,7 @@ As of libpng version 1.2.9, png_set_expand_gray_1_2_4_to_8() was
|
||||
added. It expands the sample depth without changing tRNS to alpha.
|
||||
|
||||
As of libpng version 1.5.2, png_set_expand_16() was added. It behaves as
|
||||
png_set_expand(), however, the resultant channels have 16 bits rather than 8.
|
||||
png_set_expand(); however, the resultant channels have 16 bits rather than 8.
|
||||
Use this when the output color or gray channels are made linear to avoid fairly
|
||||
severe accuracy loss.
|
||||
|
||||
@@ -1441,7 +1512,14 @@ PNG can have files with 16 bits per channel. If you only can handle
|
||||
8 bits per channel, this will strip the pixels down to 8-bit.
|
||||
|
||||
if (bit_depth == 16)
|
||||
#if PNG_LIBPNG_VER >= 10504
|
||||
png_set_scale_16(png_ptr);
|
||||
#else
|
||||
png_set_strip_16(png_ptr);
|
||||
#endif
|
||||
|
||||
(The more accurate "png_set_scale_16()" API became available in libpng version
|
||||
1.5.4).
|
||||
|
||||
If you need to process the alpha channel on the image separately from the image
|
||||
data (for example if you convert it to a bitmap mask) it is possible to have
|
||||
@@ -1619,31 +1697,41 @@ It will return a png_byte that is zero if the image was gray or
|
||||
will be silently converted to grayscale, using the green channel
|
||||
data for sBIT, regardless of the error_action setting.
|
||||
|
||||
The default values come from the PNG file cHRM chunk if present, otherwise the
|
||||
The default values come from the PNG file cHRM chunk if present; otherwise, the
|
||||
defaults correspond to the ITU-R recommendation 709, and also the sRGB color
|
||||
space, as recommended in the Charles Poynton's Colour FAQ,
|
||||
<http://www.poynton.com/>, in section 9:
|
||||
|
||||
<http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC9>
|
||||
|
||||
Y = 0.2126 * R + 0.7152 * G + 0.0722 * B
|
||||
|
||||
Previous versions of this document, 1998 through 2002, recommended a slightly
|
||||
different formula:
|
||||
|
||||
Y = 0.212671 * R + 0.715160 * G + 0.072169 * B
|
||||
|
||||
Libpng uses an integer approximation:
|
||||
|
||||
Y = (6968 * R + 23434 * G + 2366 * B)/32768
|
||||
|
||||
The calculation is done in a linear colorspace, if the image gamma
|
||||
can be determined.
|
||||
|
||||
The png_set_background() function has been described already, it tells libpng to
|
||||
The png_set_background() function has been described already; it tells libpng to
|
||||
composite images with alpha or simple transparency against the supplied
|
||||
background color. For compatibility with versions of libpng earlier than
|
||||
libpng-1.5.3 it is recommended that you call the function after reading the file
|
||||
libpng-1.5.4 it is recommended that you call the function after reading the file
|
||||
header, even if you don't want to use the color in a bKGD chunk, if one exists.
|
||||
|
||||
If the PNG file contains a bKGD chunk (PNG_INFO_bKGD valid),
|
||||
you may use this color, or supply another color more suitable for
|
||||
the current display (e.g., the background color from a web page). You
|
||||
need to tell libpng how the color is represented, both the format of the
|
||||
component values in the color (the number of bits) and the gamme encoding of the
|
||||
component values in the color (the number of bits) and the gamma encoding of the
|
||||
color. The function takes two arguments, background_gamma_mode and need_expand
|
||||
to convey this information, however only two combinations are like to be useful:
|
||||
to convey this information, however only two combinations are likely to be
|
||||
useful:
|
||||
|
||||
png_color_16 my_background;
|
||||
png_color_16p image_background;
|
||||
@@ -1655,7 +1743,6 @@ to convey this information, however only two combinations are like to be useful:
|
||||
png_set_background(png_ptr, &my_background,
|
||||
PNG_BACKGROUND_GAMMA_SCREEN, 0/*do not expand*/, 1);
|
||||
|
||||
|
||||
The second call was described above - my_background is in the format of the
|
||||
final, display, output produced by libpng. Because you now know the format of
|
||||
the PNG it is possible to avoid the need to choose either 8-bit or 16-bit
|
||||
@@ -1671,7 +1758,7 @@ image_background->gray.
|
||||
|
||||
If you didn't call png_set_gamma() before reading the file header, for example
|
||||
if you need your code to remain compatible with older versions of libpng prior
|
||||
to libpng-1.5.3, this is the place to call it.
|
||||
to libpng-1.5.4, this is the place to call it.
|
||||
|
||||
Do not call it if you called png_set_alpha_mode(); doing so will damage the
|
||||
settings put in place by png_set_alpha_mode(). (If png_set_alpha_mode() is
|
||||
@@ -1694,9 +1781,9 @@ file has more entries then will fit on your screen, png_set_quantize()
|
||||
will do that. Note that this is a simple match quantization that merely
|
||||
finds the closest color available. This should work fairly well with
|
||||
optimized palettes, but fairly badly with linear color cubes. If you
|
||||
pass a palette that is larger then maximum_colors, the file will
|
||||
pass a palette that is larger than maximum_colors, the file will
|
||||
reduce the number of colors in the palette so it will fit into
|
||||
maximum_colors. If there is a histogram, it will use it to make
|
||||
maximum_colors. If there is a histogram, libpng will use it to make
|
||||
more intelligent choices when reducing the palette. If there is no
|
||||
histogram, it may not do as good a job.
|
||||
|
||||
@@ -1768,7 +1855,7 @@ after all of the other transformations have been processed. Take care with
|
||||
interlaced images if you do the interlace yourself - the width of the row is the
|
||||
width in 'row_info', not the overall image width.
|
||||
|
||||
If supported libpng provides two information routines that you can use to find
|
||||
If supported, libpng provides two information routines that you can use to find
|
||||
where you are in processing the image:
|
||||
|
||||
png_get_current_pass_number(png_structp png_ptr);
|
||||
@@ -1812,13 +1899,16 @@ of the interlaced image.
|
||||
|
||||
After setting the transformations, libpng can update your png_info
|
||||
structure to reflect any transformations you've requested with this
|
||||
call. This is most useful to update the info structure's rowbytes
|
||||
field so you can use it to allocate your image memory. This function
|
||||
will also update your palette with the correct screen_gamma and
|
||||
background if these have been given with the calls above.
|
||||
call.
|
||||
|
||||
png_read_update_info(png_ptr, info_ptr);
|
||||
|
||||
This is most useful to update the info structure's rowbytes
|
||||
field so you can use it to allocate your image memory. This function
|
||||
will also update your palette with the correct screen_gamma and
|
||||
background if these have been given with the calls above. You may
|
||||
only call png_read_update_info() once with a particular info_ptr.
|
||||
|
||||
After you call png_read_update_info(), you can allocate any
|
||||
memory you need to hold the image. The row data is simply
|
||||
raw byte data for all forms of images. As the actual allocation
|
||||
@@ -1827,7 +1917,7 @@ are allocating one large chunk, you will need to build an
|
||||
array of pointers to each row, as it will be needed for some
|
||||
of the functions below.
|
||||
|
||||
Remember: Before you call png_read_update_info(), the png_get_
|
||||
Remember: Before you call png_read_update_info(), the png_get_*()
|
||||
functions return the values corresponding to the original PNG image.
|
||||
After you call png_read_update_info the values refer to the image
|
||||
that libpng will output. Consequently you must call all the png_set_
|
||||
@@ -2019,7 +2109,7 @@ to load the whole file into memory when it is interlaced.
|
||||
|
||||
libpng includes a test program, pngvalid, that illustrates reading and
|
||||
writing of interlaced images. If you can't get interlacing to work in your
|
||||
code and don't want to leave it to libpng (the recommended approach) see
|
||||
code and don't want to leave it to libpng (the recommended approach), see
|
||||
how pngvalid.c does it.
|
||||
|
||||
Finishing a sequential read
|
||||
@@ -2632,6 +2722,28 @@ width, height, bit_depth, and color_type must be the same in each call.
|
||||
int_file_gamma - 100,000 times the gamma at which
|
||||
the image was created
|
||||
|
||||
png_set_cHRM(png_ptr, info_ptr, white_x, white_y, red_x, red_y,
|
||||
green_x, green_y, blue_x, blue_y)
|
||||
png_set_cHRM_XYZ(png_ptr, info_ptr, red_X, red_Y, red_Z, green_X,
|
||||
green_Y, green_Z, blue_X, blue_Y, blue_Z)
|
||||
png_set_cHRM_fixed(png_ptr, info_ptr, int_white_x, int_white_y,
|
||||
int_red_x, int_red_y, int_green_x, int_green_y,
|
||||
int_blue_x, int_blue_y)
|
||||
png_set_cHRM_XYZ_fixed(png_ptr, info_ptr, int_red_X, int_red_Y,
|
||||
int_red_Z, int_green_X, int_green_Y, int_green_Z,
|
||||
int_blue_X, int_blue_Y, int_blue_Z)
|
||||
|
||||
{white,red,green,blue}_{x,y}
|
||||
A color space encoding specified using the chromaticities
|
||||
of the end points and the white point.
|
||||
|
||||
{red,green,blue}_{X,Y,Z}
|
||||
A color space encoding specified using the encoding end
|
||||
points - the CIE tristimulus specification of the intended
|
||||
color of the red, green and blue channels in the PNG RGB
|
||||
data. The white point is simply the sum of the three end
|
||||
points.
|
||||
|
||||
png_set_sRGB(png_ptr, info_ptr, srgb_intent);
|
||||
|
||||
srgb_intent - the rendering intent
|
||||
@@ -2692,14 +2804,14 @@ width, height, bit_depth, and color_type must be the same in each call.
|
||||
trans_alpha - array of alpha (transparency)
|
||||
entries for palette (PNG_INFO_tRNS)
|
||||
|
||||
num_trans - number of transparent entries
|
||||
(PNG_INFO_tRNS)
|
||||
|
||||
trans_color - graylevel or color sample values
|
||||
(in order red, green, blue) of the
|
||||
single transparent color for
|
||||
non-paletted images (PNG_INFO_tRNS)
|
||||
|
||||
num_trans - number of transparent entries
|
||||
(PNG_INFO_tRNS)
|
||||
|
||||
png_set_hIST(png_ptr, info_ptr, hist);
|
||||
|
||||
hist - histogram of palette (array of
|
||||
@@ -2712,7 +2824,8 @@ width, height, bit_depth, and color_type must be the same in each call.
|
||||
|
||||
png_set_bKGD(png_ptr, info_ptr, background);
|
||||
|
||||
background - background color (PNG_VALID_bKGD)
|
||||
background - background color (of type
|
||||
png_color_16p) (PNG_VALID_bKGD)
|
||||
|
||||
png_set_text(png_ptr, info_ptr, text_ptr, num_text);
|
||||
|
||||
@@ -2739,6 +2852,8 @@ width, height, bit_depth, and color_type must be the same in each call.
|
||||
Note that the itxt_length, lang, and lang_key
|
||||
members of the text_ptr structure only exist
|
||||
when the library is built with iTXt chunk support.
|
||||
Prior to libpng-1.4.0 the library was built by default
|
||||
without iTXt support.
|
||||
|
||||
num_text - number of comments
|
||||
|
||||
@@ -2788,6 +2903,7 @@ width, height, bit_depth, and color_type must be the same in each call.
|
||||
unit - physical scale units (an integer)
|
||||
|
||||
width - width of a pixel in physical scale units
|
||||
expressed as a string
|
||||
|
||||
height - height of a pixel in physical scale units
|
||||
(width and height are strings like "2.54")
|
||||
@@ -2829,7 +2945,7 @@ Because tEXt and zTXt chunks don't have a language field, if you
|
||||
specify PNG_TEXT_COMPRESSION_NONE or PNG_TEXT_COMPRESSION_zTXt
|
||||
any language code or translated keyword will not be written out.
|
||||
|
||||
Until text gets around 1000 bytes, it is not worth compressing it.
|
||||
Until text gets around a few hundred bytes, it is not worth compressing it.
|
||||
After the text has been written out to the file, the compression type
|
||||
is set to PNG_TEXT_COMPRESSION_NONE_WR or PNG_TEXT_COMPRESSION_zTXt_WR,
|
||||
so that it isn't written out again at the end (in case you are calling
|
||||
@@ -3439,7 +3555,8 @@ However, there are some uncertainties about the status of local variables
|
||||
after a longjmp, so the user may want to be careful about doing anything
|
||||
after setjmp returns non-zero besides returning itself. Consult your
|
||||
compiler documentation for more details. For an alternative approach, you
|
||||
may wish to use the "cexcept" facility (see http://cexcept.sourceforge.net).
|
||||
may wish to use the "cexcept" facility (see http://cexcept.sourceforge.net),
|
||||
which is illustrated in pngvalid.c and in contrib/visupng.
|
||||
|
||||
Custom chunks
|
||||
|
||||
@@ -3457,8 +3574,11 @@ and look at how other chunks were designed, so you can do things
|
||||
similarly. Second, check out the sections of libpng that read and
|
||||
write chunks. Try to find a chunk that is similar to yours and use
|
||||
it as a template. More details can be found in the comments inside
|
||||
the code. It is best to handle unknown chunks in a generic method,
|
||||
via callback functions, instead of by modifying libpng functions.
|
||||
the code. It is best to handle private or unknown chunks in a generic method,
|
||||
via callback functions, instead of by modifying libpng functions. This
|
||||
is illustrated in pngtest.c, which uses a callback function to handle a
|
||||
private "vpAg" chunk and the new "sTER" chunk, which are both unknown to
|
||||
libpng.
|
||||
|
||||
If you wish to write your own transformation for the data, look through
|
||||
the part of the code that does the transformations, and check out some of
|
||||
@@ -3486,8 +3606,8 @@ defined, and FAR gets defined to far in pngconf.h, and you should be
|
||||
all set. Everything in the library (except for zlib's structure) is
|
||||
expecting far data. You must use the typedefs with the p or pp on
|
||||
the end for pointers (or at least look at them and be careful). Make
|
||||
note that the rows of data are defined as png_bytepp, which is an
|
||||
unsigned char far * far *.
|
||||
note that the rows of data are defined as png_bytepp, which is
|
||||
an "unsigned char far * far *".
|
||||
|
||||
Configuring for gui/windowing platforms:
|
||||
|
||||
@@ -3505,7 +3625,10 @@ or delete an include, this is the place to do it.
|
||||
The includes that are not needed outside libpng are placed in pngpriv.h,
|
||||
which is only used by the routines inside libpng itself.
|
||||
The files in libpng proper only include pngpriv.h and png.h, which
|
||||
in turn includes pngconf.h.
|
||||
in turn includes pngconf.h and, as of libpng-1.5.0, pnglibconf.h.
|
||||
As of libpng-1.5.0, pngpriv.h also includes three other private header
|
||||
files, pngstruct.h, pnginfo.h, and pngdebug.h, which contain material
|
||||
that previously appeared in the public headers.
|
||||
|
||||
Configuring zlib:
|
||||
|
||||
@@ -3547,8 +3670,28 @@ zlib.h for more information on what these mean.
|
||||
window_bits);
|
||||
|
||||
png_set_compression_method(png_ptr, method);
|
||||
|
||||
png_set_compression_buffer_size(png_ptr, size);
|
||||
|
||||
As of libpng version 1.5.4, additional APIs became
|
||||
available to set these separately for non-IDAT
|
||||
compressed chunks such as zTXt, iTXt, and iCCP:
|
||||
|
||||
#include zlib.h
|
||||
#if PNG_LIBPNG_VER <= 10504
|
||||
png_set_text_compression_level(png_ptr, level);
|
||||
|
||||
png_set_text_compression_mem_level(png_ptr, level);
|
||||
|
||||
png_set_text_compression_strategy(png_ptr,
|
||||
strategy);
|
||||
|
||||
png_set_text_compression_window_bits(png_ptr,
|
||||
window_bits);
|
||||
|
||||
png_set_text_compression_method(png_ptr, method);
|
||||
#endif
|
||||
|
||||
Controlling row filtering
|
||||
|
||||
If you want to control whether libpng uses filtering or not, which
|
||||
@@ -3654,8 +3797,8 @@ capability, which you'll still have).
|
||||
All the reading and writing specific code are in separate files, so the
|
||||
linker should only grab the files it needs. However, if you want to
|
||||
make sure, or if you are building a stand alone library, all the
|
||||
reading files start with pngr and all the writing files start with
|
||||
pngw. The files that don't match either (like png.c, pngtrans.c, etc.)
|
||||
reading files start with "pngr" and all the writing files start with "pngw".
|
||||
The files that don't match either (like png.c, pngtrans.c, etc.)
|
||||
are used for both reading and writing, and always need to be included.
|
||||
The progressive reader is in pngpread.c
|
||||
|
||||
@@ -3774,6 +3917,9 @@ The number libpng_vn is constructed from the major version, minor
|
||||
version with leading zero, and release number with leading zero,
|
||||
(e.g., libpng_vn for version 1.0.7 is 10007).
|
||||
|
||||
Note that this function does not take a png_ptr, so you can call it
|
||||
before you've created one.
|
||||
|
||||
You can also check which version of png.h you used when compiling your
|
||||
application:
|
||||
|
||||
@@ -4010,10 +4156,9 @@ In png_get_iCCP, the type of "profile" was changed from png_charpp
|
||||
to png_bytepp, and in png_set_iCCP, from png_charp to png_const_bytep.
|
||||
|
||||
There are changes of form in png.h, including new and changed macros to
|
||||
declare
|
||||
parts of the API. Some API functions with arguments that are pointers to
|
||||
data not modified within the function have been corrected to declare
|
||||
these arguments with PNG_CONST.
|
||||
declare parts of the API. Some API functions with arguments that are
|
||||
pointers to data not modified within the function have been corrected to
|
||||
declare these arguments with PNG_CONST.
|
||||
|
||||
Much of the internal use of C macros to control the library build has also
|
||||
changed and some of this is visible in the exported header files, in
|
||||
@@ -4033,7 +4178,6 @@ absolutely necessary) interlace an image.
|
||||
|
||||
libpng 1.5.0 adds an API png_longjmp(png_ptr, value). This API calls
|
||||
the application-provided png_longjmp_ptr on the internal, but application
|
||||
initialized, jmpbuf. It is provided as a convenience to avoid the need
|
||||
initialized, longjmp buffer. It is provided as a convenience to avoid
|
||||
the need to use the png_jmpbuf macro, which had the unnecessary side
|
||||
effect of resetting the internal png_longjmp_ptr value.
|
||||
@@ -4088,22 +4232,22 @@ Applications can now choose whether to use these macros or to call the
|
||||
corresponding function by defining PNG_USE_READ_MACROS or
|
||||
PNG_NO_USE_READ_MACROS before including png.h. Notice that this is
|
||||
only supported from 1.5.0 -defining PNG_NO_USE_READ_MACROS prior to 1.5.0
|
||||
will lead to a link failure.
|
||||
will lead to a link failure.
|
||||
|
||||
Prior to libpng-1.5.3, the zlib compressor used the same set of parameters
|
||||
Prior to libpng-1.5.4, the zlib compressor used the same set of parameters
|
||||
when compressing the IDAT data and textual data such as zTXt and iCCP.
|
||||
In libpng-1.5.3 we reinitialized the zlib stream for each type of data.
|
||||
In libpng-1.5.4 we reinitialized the zlib stream for each type of data.
|
||||
We added five png_set_text_*() functions for setting the parameters to
|
||||
use with textual data.
|
||||
|
||||
Prior to libpng-1.5.3, the PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED
|
||||
Prior to libpng-1.5.4, the PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED
|
||||
option was off by default, and slightly inaccurate scaling occurred.
|
||||
This option can no longer be turned off, and 16-to-8 scaling is always
|
||||
accurate. This change will result in some different results while
|
||||
reading 16-bit images, with none of the pixels being off-by-one any
|
||||
longer (see Clause 13.12 of the PNG specification).
|
||||
This option can no longer be turned off, and the choice of accurate
|
||||
or inaccurate 16-to-8 scaling is by using the new png_set_scale_16_to_8()
|
||||
API for accurate scaling or the old png_set_strip_16_to_8() API for simple
|
||||
chopping.
|
||||
|
||||
Prior to libpng-1.5.3, the png_set_user_limits() function could only be
|
||||
Prior to libpng-1.5.4, the png_set_user_limits() function could only be
|
||||
used to reduce the width and height limits from the value of
|
||||
PNG_USER_WIDTH_MAX and PNG_USER_HEIGHT_MAX, although this document said
|
||||
that it could be used to override them. Now this function will reduce or
|
||||
@@ -4112,9 +4256,9 @@ increase the limits.
|
||||
B. Changes to the build and configuration of libpng
|
||||
|
||||
Details of internal changes to the library code can be found in the CHANGES
|
||||
file. These will be of no concern to the vast majority of library users or
|
||||
builders, however the few who configure libpng to a non-default feature
|
||||
set may need to change how this is done.
|
||||
file and in the GIT repository logs. These will be of no concern to the vast
|
||||
majority of library users or builders, however the few who configure libpng
|
||||
to a non-default feature set may need to change how this is done.
|
||||
|
||||
There should be no need for library builders to alter build scripts if
|
||||
these use the distributed build support - configure or the makefiles -
|
||||
@@ -4123,14 +4267,14 @@ to build pnglibconf.h where the corresponding makefile does not do so.
|
||||
|
||||
Building libpng with a non-default configuration has changed completely.
|
||||
The old method using pngusr.h should still work correctly even though the
|
||||
way pngusr.h is used in the build has been changed, however library
|
||||
way pngusr.h is used in the build has been changed; however, library
|
||||
builders will probably want to examine the changes to take advantage of
|
||||
new capabilities and to simplify their build system.
|
||||
|
||||
B.1 Specific changes to library configuration capabilities
|
||||
|
||||
The library now supports a complete fixed point implementation and can
|
||||
thus be used on systems which have no floating point support or very
|
||||
thus be used on systems that have no floating point support or very
|
||||
limited or slow support. Previously gamma correction, an essential part
|
||||
of complete PNG support, required reasonably fast floating point.
|
||||
|
||||
@@ -4146,14 +4290,14 @@ pnglibconf.h
|
||||
As part of this the mechanism used to choose procedure call standards on
|
||||
those systems that allow a choice has been changed. At present this only
|
||||
affects certain Microsoft (DOS, Windows) and IBM (OS/2) operating systems
|
||||
running on Intel processors. As before PNGAPI is defined where required
|
||||
running on Intel processors. As before, PNGAPI is defined where required
|
||||
to control the exported API functions; however, two new macros, PNGCBAPI
|
||||
and PNGCAPI, are used instead for callback functions (PNGCBAPI) and
|
||||
(PNGCAPI) for functions that must match a C library prototype (currently
|
||||
only png_longjmp_ptr, which must match the C longjmp function.) The new
|
||||
approach is documented in pngconf.h
|
||||
|
||||
Despite these changes libpng 1.5.0 only supports the native C function
|
||||
Despite these changes, libpng 1.5.0 only supports the native C function
|
||||
calling standard on those platforms tested so far (__cdecl on Microsoft
|
||||
Windows). This is because the support requirements for alternative
|
||||
calling conventions seem to no longer exist. Developers who find it
|
||||
@@ -4186,8 +4330,10 @@ if the feature is supported or:
|
||||
/*#undef PNG_feature_SUPPORTED*/
|
||||
|
||||
if it is not. Library code consistently checks for the 'SUPPORTED' macro.
|
||||
It does not, and should not, check for the 'NO' macro which will not
|
||||
normally be defined even if the feature is not supported.
|
||||
It does not, and libpng applications should not, check for the 'NO' macro
|
||||
which will not normally be defined even if the feature is not supported.
|
||||
The 'NO' macros are only used internally for setting or not setting the
|
||||
corresponding 'SUPPORTED' macros.
|
||||
|
||||
Compatibility with the old names is provided as follows:
|
||||
|
||||
@@ -4244,10 +4390,10 @@ application built without PNG_USER_CONFIG defined would see the
|
||||
unmodified, default, libpng API and thus would probably fail to link.
|
||||
|
||||
These mechanisms still work in the configure build and in any makefile
|
||||
build that builds pnglibconf.h although the feature selection macros
|
||||
build that builds pnglibconf.h, although the feature selection macros
|
||||
have changed somewhat as described above. In 1.5.0, however, pngusr.h is
|
||||
processed only once, when the exported header file pnglibconf.h is built.
|
||||
pngconf.h no longer includes pngusr.h, therefore it is ignored after the
|
||||
pngconf.h no longer includes pngusr.h, therefore pngusr.h is ignored after the
|
||||
build of pnglibconf.h and it is never included in an application build.
|
||||
|
||||
The rarely used alternative of adding a list of feature macros to the
|
||||
@@ -4261,7 +4407,7 @@ scripts/pnglibconf.dfa. This requires the program awk. Brian Kernighan
|
||||
and all known later implementations (often called by subtly different
|
||||
names - nawk and gawk for example) are adequate to build pnglibconf.h.
|
||||
The Sun Microsystems (now Oracle) program 'awk' is an earlier version
|
||||
and does not work, this may also apply to other systems that have a
|
||||
and does not work; this may also apply to other systems that have a
|
||||
functioning awk called 'nawk'.
|
||||
|
||||
Configuration options are now documented in scripts/pnglibconf.dfa. This
|
||||
@@ -4303,8 +4449,8 @@ the libpng bug tracker at
|
||||
|
||||
We also accept patches built from the tar or zip distributions, and
|
||||
simple verbal discriptions of bug fixes, reported either to the
|
||||
SourceForge bug tracker or to the png-mng-implement at lists.sf.net
|
||||
mailing list.
|
||||
SourceForge bug tracker, to the png-mng-implement at lists.sf.net
|
||||
mailing list, or directly to glennrp.
|
||||
|
||||
XIII. Coding style
|
||||
|
||||
@@ -4409,6 +4555,9 @@ left parenthesis that follows it:
|
||||
We prefer #ifdef and #ifndef to #if defined() and if !defined()
|
||||
when there is only one macro being tested.
|
||||
|
||||
We prefer to express integers that are used as bit masks in hex format,
|
||||
with an even number of lower-case hex digits (e.g., 0x00, 0xff, 0x0100).
|
||||
|
||||
We do not use the TAB character for indentation in the C sources.
|
||||
|
||||
Lines do not exceed 80 characters.
|
||||
@@ -4417,13 +4566,13 @@ Other rules can be inferred by inspecting the libpng source.
|
||||
|
||||
XIV. Y2K Compliance in libpng
|
||||
|
||||
June 15, 2011
|
||||
October 27, 2011
|
||||
|
||||
Since the PNG Development group is an ad-hoc body, we can't make
|
||||
an official declaration.
|
||||
|
||||
This is your unofficial assurance that libpng from version 0.71 and
|
||||
upward through 1.5.4beta03 are Y2K compliant. It is my belief that earlier
|
||||
upward through 1.5.6rc02 are Y2K compliant. It is my belief that earlier
|
||||
versions were also Y2K compliant.
|
||||
|
||||
Libpng only has three year fields. One is a 2-byte unsigned integer that
|
||||
|
||||
429
libpng.3
429
libpng.3
@@ -1,6 +1,6 @@
|
||||
.TH LIBPNG 3 "June 15, 2011"
|
||||
.TH LIBPNG 3 "October 27, 2011"
|
||||
.SH NAME
|
||||
libpng \- Portable Network Graphics (PNG) Reference Library 1.5.4beta03
|
||||
libpng \- Portable Network Graphics (PNG) Reference Library 1.5.6rc02
|
||||
.SH SYNOPSIS
|
||||
\fI\fB
|
||||
|
||||
@@ -128,10 +128,22 @@ libpng \- Portable Network Graphics (PNG) Reference Library 1.5.4beta03
|
||||
|
||||
\fI\fB
|
||||
|
||||
\fBpng_uint_32 png_get_chunk_cache_max (png_const_structp \fIpng_ptr\fP\fB);\fP
|
||||
\fBpng_uint_32 png_get_cHRM_XYZ (png_structp \fIpng_ptr,
|
||||
|
||||
\fBpng_const_infop \fP\fIinfo_ptr\fP\fB, double \fP\fI*red_X\fP\fB, double \fP\fI*red_Y\fP\fB, double \fI*red_Z,
|
||||
|
||||
\fBdouble \fP\fI*green_X\fP\fB, double \fP\fI*green_Y\fP\fB, double \fP\fI*green_Z\fP\fB, double \fI*blue_X,
|
||||
|
||||
\fBdouble \fP\fI*blue_Y\fP\fB, double \fI*blue_Z\fP\fB);\fP
|
||||
|
||||
\fI\fB
|
||||
|
||||
\fBpng_uint_32 png_get_cHRM_XYZ_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_fixed_point \fP\fI*int_red_X\fP\fB, png_fixed_point \fP\fI*int_red_Y\fP\fB, png_fixed_point \fP\fI*int_red_Z\fP\fB, png_fixed_point \fP\fI*int_green_X\fP\fB, png_fixed_point \fP\fI*int_green_Y\fP\fB, png_fixed_point \fP\fI*int_green_Z\fP\fB, png_fixed_point \fP\fI*int_blue_X\fP\fB, png_fixed_point \fP\fI*int_blue_Y\fP\fB, png_fixed_point \fI*int_blue_Z\fP\fB);\fP
|
||||
|
||||
\fI\fB
|
||||
|
||||
\fBpng_uint_32 png_get_chunk_cache_max (png_const_structp \fIpng_ptr\fP\fB);\fP
|
||||
|
||||
\fI\fB
|
||||
|
||||
\fBpng_alloc_size_t png_get_chunk_malloc_max (png_const_structp \fIpng_ptr\fP\fB);\fP
|
||||
@@ -540,10 +552,6 @@ libpng \- Portable Network Graphics (PNG) Reference Library 1.5.4beta03
|
||||
|
||||
\fI\fB
|
||||
|
||||
\fBvoid png_set_chop_16 (png_structp \fIpng_ptr\fP\fB);\fP
|
||||
|
||||
\fI\fB
|
||||
|
||||
\fBvoid png_set_cHRM (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, double \fP\fIwhite_x\fP\fB, double \fP\fIwhite_y\fP\fB, double \fP\fIred_x\fP\fB, double \fP\fIred_y\fP\fB, double \fP\fIgreen_x\fP\fB, double \fP\fIgreen_y\fP\fB, double \fP\fIblue_x\fP\fB, double \fIblue_y\fP\fB);\fP
|
||||
|
||||
\fI\fB
|
||||
@@ -552,6 +560,16 @@ libpng \- Portable Network Graphics (PNG) Reference Library 1.5.4beta03
|
||||
|
||||
\fI\fB
|
||||
|
||||
\fBvoid png_set_cHRM_XYZ (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, double \fP\fIred_X\fP\fB, double \fP\fIred_Y\fP\fB, double \fP\fIred_Z\fP\fB, double \fP\fIgreen_X\fP\fB, double \fIgreen_Y,
|
||||
|
||||
\fBdouble \fP\fIgreen_Z\fP\fB, double \fP\fIblue_X\fP\fB, double \fP\fIblue_Y\fP\fB, double \fIblue_Z\fP\fB);\fP
|
||||
|
||||
\fI\fB
|
||||
|
||||
\fBvoid png_set_cHRM_XYZ_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_fixed_point \fP\fIint_red_X\fP\fB, png_fixed_point \fP\fIint_red_Y\fP\fB, png_fixed_point \fP\fIint_red_Z\fP\fB, png_fixed_point \fP\fIint_green_X\fP\fB, png_fixed_point \fP\fIint_green_Y\fP\fB, png_fixed_point \fP\fIint_green_Z\fP\fB, png_fixed_point \fP\fIint_blue_X\fP\fB, png_fixed_point \fP\fIint_blue_Y\fP\fB, png_fixed_point \fIint_blue_Z\fP\fB);\fP
|
||||
|
||||
\fI\fB
|
||||
|
||||
\fBvoid png_set_chunk_cache_max (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIuser_chunk_cache_max\fP\fB);\fP
|
||||
|
||||
\fI\fB
|
||||
@@ -768,6 +786,10 @@ libpng \- Portable Network Graphics (PNG) Reference Library 1.5.4beta03
|
||||
|
||||
\fI\fB
|
||||
|
||||
\fBvoid png_set_scale_16 (png_structp \fIpng_ptr\fP\fB);\fP
|
||||
|
||||
\fI\fB
|
||||
|
||||
\fBvoid png_set_shift (png_structp \fP\fIpng_ptr\fP\fB, png_color_8p \fItrue_bits\fP\fB);\fP
|
||||
|
||||
\fI\fB
|
||||
@@ -955,7 +977,7 @@ Following is a copy of the libpng-manual.txt file that accompanies libpng.
|
||||
.SH LIBPNG.TXT
|
||||
libpng-manual.txt - A description on how to use and modify libpng
|
||||
|
||||
libpng version 1.5.4beta03 - June 15, 2011
|
||||
libpng version 1.5.6rc02 - October 27, 2011
|
||||
Updated and distributed by Glenn Randers-Pehrson
|
||||
<glennrp at users.sourceforge.net>
|
||||
Copyright (c) 1998-2011 Glenn Randers-Pehrson
|
||||
@@ -966,7 +988,7 @@ libpng-manual.txt - A description on how to use and modify libpng
|
||||
|
||||
Based on:
|
||||
|
||||
libpng versions 0.97, January 1998, through 1.5.4beta03 - June 15, 2011
|
||||
libpng versions 0.97, January 1998, through 1.5.6rc02 - October 27, 2011
|
||||
Updated and distributed by Glenn Randers-Pehrson
|
||||
Copyright (c) 1998-2011 Glenn Randers-Pehrson
|
||||
|
||||
@@ -1062,7 +1084,8 @@ PNG file. At one time, the fields of png_info were intended to be
|
||||
directly accessible to the user. However, this tended to cause problems
|
||||
with applications using dynamically loaded libraries, and as a result
|
||||
a set of interface functions for png_info (the png_get_*() and png_set_*()
|
||||
functions) was developed.
|
||||
functions) was developed, and direct access to the png_info fields was
|
||||
deprecated..
|
||||
|
||||
The png_struct structure is the object used by the library to decode a
|
||||
single image. As of 1.5.0 this structure is also not exposed.
|
||||
@@ -1071,14 +1094,23 @@ Almost all libpng APIs require a pointer to a png_struct as the first argument.
|
||||
Many (in particular the png_set and png_get APIs) also require a pointer
|
||||
to png_info as the second argument. Some application visible macros
|
||||
defined in png.h designed for basic data access (reading and writing
|
||||
integers in the PNG format) break this rule, but it's almost always safe
|
||||
to assume that a (png_struct*) has to be passed to call an API function.
|
||||
integers in the PNG format) don't take a png_info pointer, but it's almost
|
||||
always safe to assume that a (png_struct*) has to be passed to call an API
|
||||
function.
|
||||
|
||||
You can have more than one png_info structure associated with an image,
|
||||
as illustrated in pngtest.c, one for information valid prior to the
|
||||
IDAT chunks and another (called "end_info" below) for things after them.
|
||||
|
||||
The png.h header file is an invaluable reference for programming with libpng.
|
||||
And while I'm on the topic, make sure you include the libpng header file:
|
||||
|
||||
#include <png.h>
|
||||
|
||||
and also (as of libpng-1.5.0) the zlib header file, if you need it:
|
||||
|
||||
#include <zlib.h>
|
||||
|
||||
.SS Types
|
||||
|
||||
The png.h header file defines a number of integral types used by the
|
||||
@@ -1092,9 +1124,9 @@ the value by multiplying by 100,000. As of libpng 1.5.0 a convenience
|
||||
macro PNG_FP_1 is defined in png.h along with a type (png_fixed_point)
|
||||
which is simply (png_int_32).
|
||||
|
||||
All APIs that take (double) arguments also have an matching API that
|
||||
All APIs that take (double) arguments also have a matching API that
|
||||
takes the corresponding fixed point integer arguments. The fixed point
|
||||
API has the same name as the floating point one with _fixed appended.
|
||||
API has the same name as the floating point one with "_fixed" appended.
|
||||
The actual range of values permitted in the APIs is frequently less than
|
||||
the full range of (png_fixed_point) (-21474 to +21474). When APIs require
|
||||
a non-negative argument the type is recorded as png_uint_32 above. Consult
|
||||
@@ -1112,6 +1144,10 @@ preprocessing directives of the form:
|
||||
#ifdef PNG_feature_SUPPORTED
|
||||
declare-function
|
||||
#endif
|
||||
...
|
||||
#ifdef PNG_feature_SUPPORTED
|
||||
use-function
|
||||
#endif
|
||||
|
||||
The library can be built without support for these APIs, although a
|
||||
standard build will have all implemented APIs. Application programs
|
||||
@@ -1120,7 +1156,7 @@ portability. From libpng 1.5.0 the feature macros set during the build
|
||||
of libpng are recorded in the header file "pnglibconf.h" and this file
|
||||
is always included by png.h.
|
||||
|
||||
If you don't need to change the library configuration from the default skip to
|
||||
If you don't need to change the library configuration from the default, skip to
|
||||
the next section ("Reading").
|
||||
|
||||
Notice that some of the makefiles in the 'scripts' directory and (in 1.5.0) all
|
||||
@@ -1152,24 +1188,25 @@ A variety of methods exist to build libpng. Not all of these support
|
||||
reconfiguration of pnglibconf.h. To reconfigure pnglibconf.h it must either be
|
||||
rebuilt from scripts/pnglibconf.dfa using awk or it must be edited by hand.
|
||||
|
||||
Hand editing is achieved by copying scripts/pnglibconf.h.prebuilt and changing
|
||||
the lines defining the supported features, paying very close attention to the
|
||||
'option' information in scripts/pnglibconf.dfa that describes those features and
|
||||
their requirements. This is easy to get wrong.
|
||||
Hand editing is achieved by copying scripts/pnglibconf.h.prebuilt to
|
||||
pnglibconf.h and changing the lines defining the supported features, paying
|
||||
very close attention to the 'option' information in scripts/pnglibconf.dfa
|
||||
that describes those features and their requirements. This is easy to get
|
||||
wrong.
|
||||
|
||||
B. Configuration using DFA_XTRA
|
||||
|
||||
Rebuilding from pnglibconf.dfa is easy if a functioning 'awk', or a later
|
||||
variant such as 'nawk' or 'gawk', is available. The configure build will
|
||||
automatically find an appropriate awk and build pnglibconf.h.
|
||||
scripts/pnglibconf.mak contains a set of make rules for doing the same thing if
|
||||
configure is not used, and many of the makefiles in the scripts directory use
|
||||
this approach.
|
||||
The scripts/pnglibconf.mak file contains a set of make rules for doing the
|
||||
same thing if configure is not used, and many of the makefiles in the scripts
|
||||
directory use this approach.
|
||||
|
||||
When rebuilding simply write new file containing changed options and set
|
||||
When rebuilding simply write a new file containing changed options and set
|
||||
DFA_XTRA to the name of this file. This causes the build to append the new file
|
||||
to the end of scripts/pnglibconf.dfa. pngusr.dfa should contain lines of the
|
||||
following forms:
|
||||
to the end of scripts/pnglibconf.dfa. The pngusr.dfa file should contain lines
|
||||
of the following forms:
|
||||
|
||||
everything = off
|
||||
|
||||
@@ -1193,12 +1230,16 @@ source code. Most of these values have performance implications for the library
|
||||
but most of them have no visible effect on the API. Some can also be overridden
|
||||
from the API.
|
||||
|
||||
This method of building a customized pnglibconf.h is illustrated in
|
||||
contrib/pngminim/*. See the "$(PNGCONF):" target in the makefile and
|
||||
pngusr.dfa in these directories.
|
||||
|
||||
C. Configuration using PNG_USR_CONFIG
|
||||
|
||||
If -DPNG_USR_CONFIG is added to the CFLAGS when pnglibconf.h is built the file
|
||||
pngusr.h will automatically be included before the options in
|
||||
scripts/pnglibconf.dfa are processed. pngusr.h should contain only macro
|
||||
definitions turning features on or off or setting settings.
|
||||
scripts/pnglibconf.dfa are processed. Your pngusr.h file should contain only
|
||||
macro definitions turning features on or off or setting settings.
|
||||
|
||||
Apart from the global setting "everything = off" all the options listed above
|
||||
can be set using macros in pngusr.h:
|
||||
@@ -1229,6 +1270,9 @@ examine the intermediate file pnglibconf.dfn to find the full set of
|
||||
dependency information for each setting and option. Simply locate the
|
||||
feature in the file and read the C comments that precede it.
|
||||
|
||||
This method is also illustrated in the contrib/pngminim/* makefiles and
|
||||
pngusr.h.
|
||||
|
||||
.SH III. Reading
|
||||
|
||||
We'll now walk you through the possible functions to call when reading
|
||||
@@ -1512,6 +1556,8 @@ according to the "keep" directive. If a chunk is named in successive
|
||||
instances of png_set_keep_unknown_chunks(), the final instance will
|
||||
take precedence. The IHDR and IEND chunks should not be named in
|
||||
chunk_list; if they are, libpng will process them normally anyway.
|
||||
If you know that your application will never make use of some particular
|
||||
chunks, use PNG_HANDLE_CHUNK_NEVER (or 1) as demonstrated below.
|
||||
|
||||
Here is an example of the usage of png_set_keep_unknown_chunks(),
|
||||
where the private "vpAg" chunk will later be processed by a user chunk
|
||||
@@ -1602,13 +1648,14 @@ If you intend to display the PNG or to incorporate it in other image data you
|
||||
need to tell libpng information about your display or drawing surface so that
|
||||
libpng can convert the values in the image to match the display.
|
||||
|
||||
From libpng-1.5.3 this information can be set before reading the PNG file
|
||||
From libpng-1.5.4 this information can be set before reading the PNG file
|
||||
header. In earlier versions png_set_gamma() existed but behaved incorrectly if
|
||||
called before the PNG file header had been read and png_set_alpha_mode() did not
|
||||
exist.
|
||||
|
||||
If you need to support versions prior to libpng-1.5.3 test the version number
|
||||
and follow the procedures described in the appropriate manual page.
|
||||
If you need to support versions prior to libpng-1.5.4 test the version number
|
||||
as illustrated below using "PNG_LIBPNG_VER >= 10504" and follow the procedures
|
||||
described in the appropriate manual page.
|
||||
|
||||
You give libpng the encoding expected by your system expressed as a 'gamma'
|
||||
value. You can also specify a default encoding for the PNG file in
|
||||
@@ -1621,14 +1668,14 @@ or you can use the fixed point equivalent:
|
||||
|
||||
png_set_gamma_fixed(png_ptr, PNG_FP_1*screen_gamma, PNG_FP_1/screen_gamma);
|
||||
|
||||
If you don't know the gamma for you system it is probably 2.2 - a good
|
||||
If you don't know the gamma for your system it is probably 2.2 - a good
|
||||
approximation to the IEC standard for display systems (sRGB). If images are
|
||||
too contrasty or washed out you got the value wrong - check your system
|
||||
documentation!
|
||||
|
||||
Many systems permit the system gamma to be changed via a lookup table in the
|
||||
display driver, a few systems, including older Macs, change the response by
|
||||
default. As of 1.5.3 three special values are available to handle common
|
||||
default. As of 1.5.4 three special values are available to handle common
|
||||
situations:
|
||||
|
||||
PNG_DEFAULT_sRGB: Indicates that the system conforms to the IEC 61966-2-1
|
||||
@@ -1650,14 +1697,18 @@ channel. To display these files correctly you need to compose the data onto a
|
||||
suitable background, as described in the PNG specification.
|
||||
|
||||
Libpng only supports composing onto a single color (using png_set_background;
|
||||
see below.) Otherwise you must do the composition yourself and, in this case,
|
||||
see below). Otherwise you must do the composition yourself and, in this case,
|
||||
you may need to call png_set_alpha_mode:
|
||||
|
||||
#if PNG_LIBPNG_VER >= 10504
|
||||
png_set_alpha_mode(png_ptr, mode, screen_gamma);
|
||||
#else
|
||||
png_set_gamma(png_ptr, screen_gamma, 1.0/screen_gamma);
|
||||
#endif
|
||||
|
||||
The screen_gamma value is the same as the argument to png_set_gamma, however how
|
||||
it affects the output depends on the mode. png_set_alpha_mode() sets the file
|
||||
gamma default to 1/screen_gamma, so normally you don't need to call
|
||||
The screen_gamma value is the same as the argument to png_set_gamma; however,
|
||||
how it affects the output depends on the mode. png_set_alpha_mode() sets the
|
||||
file gamma default to 1/screen_gamma, so normally you don't need to call
|
||||
png_set_gamma. If you need different defaults call png_set_gamma() before
|
||||
png_set_alpha_mode() - if you call it after it will override the settings made
|
||||
by png_set_alpha_mode().
|
||||
@@ -1684,10 +1735,11 @@ scaled, linear encoded, pre-multiplied component values must
|
||||
be used!
|
||||
|
||||
The remaining modes assume you don't need to do any further color correction or
|
||||
that if you do your color correction software knows all about alpha (it
|
||||
that if you do, your color correction software knows all about alpha (it
|
||||
probably doesn't!)
|
||||
|
||||
PNG_ALPHA_STANDARD: The data libpng produces is encoded in the standard way
|
||||
PNG_ALPHA_STANDARD: The data libpng produces
|
||||
is encoded in the standard way
|
||||
assumed by most correctly written graphics software.
|
||||
The gamma encoding will be removed by libpng and the
|
||||
linear component values will be pre-multiplied by the
|
||||
@@ -1717,7 +1769,8 @@ dynamic range. To avoid problems, and if your software
|
||||
supports it, use png_set_expand_16() to force all
|
||||
components to 16 bits.
|
||||
|
||||
PNG_ALPHA_OPTIMIZED: This mode is the same as PNG_ALPHA_STANDARD except that
|
||||
PNG_ALPHA_OPTIMIZED: This mode is the same
|
||||
as PNG_ALPHA_STANDARD except that
|
||||
completely opaque pixels are gamma encoded according to
|
||||
the screen_gamma value. Pixels with alpha less than 1.0
|
||||
will still have linear components.
|
||||
@@ -1737,10 +1790,11 @@ representation of non-opaque pixels are irrelevant.
|
||||
You can also try this format if your software is broken;
|
||||
it might look better.
|
||||
|
||||
PNG_ALPHA_BROKEN: This is PNG_ALPHA_STANDARD however all component values,
|
||||
PNG_ALPHA_BROKEN: This is PNG_ALPHA_STANDARD;
|
||||
however, all component values,
|
||||
including the alpha channel are gamma encoded. This is
|
||||
an appropriate format to try if your software, or more
|
||||
likely hardware, is totally broken: if it performs
|
||||
likely hardware, is totally broken, i.e., if it performs
|
||||
linear arithmetic directly on gamma encoded values.
|
||||
|
||||
In most cases of broken software or hardware the bug in the final display
|
||||
@@ -1756,14 +1810,14 @@ them, there are three recommended ways of using png_set_alpha_mode():
|
||||
screen_gamma);
|
||||
|
||||
You can do color correction on the result (libpng does not currently
|
||||
support color correction internally.) When you handle the alpha channel
|
||||
support color correction internally). When you handle the alpha channel
|
||||
you need to undo the gamma encoding and multiply out the alpha.
|
||||
|
||||
png_set_alpha_mode(png_ptr, PNG_ALPHA_STANDARD,
|
||||
screen_gamma);
|
||||
png_set_expand_16(png_ptr);
|
||||
|
||||
If you are using the high level interface don't call png_set_expand_16();
|
||||
If you are using the high level interface, don't call png_set_expand_16();
|
||||
instead pass PNG_TRANSFORM_EXPAND_16 to the interface.
|
||||
|
||||
With this mode you can't do color correction, but you can do arithmetic,
|
||||
@@ -1775,7 +1829,7 @@ including composition and scaling, on the data without further processing.
|
||||
You can avoid the expansion to 16-bit components with this mode, but you
|
||||
lose the ability to scale the image or perform other linear arithmetic.
|
||||
All you can do is compose the result onto a matching output. Since this
|
||||
mode is libpng specific you also need to write your own composition
|
||||
mode is libpng-specific you also need to write your own composition
|
||||
software.
|
||||
|
||||
If you don't need, or can't handle, the alpha channel you can call
|
||||
@@ -1788,22 +1842,27 @@ transparent parts of this image.
|
||||
|
||||
The background_color is an RGB or grayscale value according to the data format
|
||||
libpng will produce for you. Because you don't yet know the format of the PNG
|
||||
file if you call png_set_background at this point you must arrange for the
|
||||
file, if you call png_set_background at this point you must arrange for the
|
||||
format produced by libpng to always have 8-bit or 16-bit components and then
|
||||
store the color as an 8-bit or 16-bit color as appropriate. The color contains
|
||||
separate gray and RGB component values, so you can let libpng produce gray or
|
||||
RGB output according to the input format, but low bit depth grayscale images
|
||||
must always be converted to at least 8-bit format. (Even low low bit depth
|
||||
must always be converted to at least 8-bit format. (Even though low bit depth
|
||||
grayscale images can't have an alpha channel they can have a transparent
|
||||
color!)
|
||||
|
||||
You set the transforms you need later, either as flags to the high level
|
||||
interface or libpng API calls for the low level interface. For reference the
|
||||
settings required are:
|
||||
settings and API calls required are:
|
||||
|
||||
8-bit values:
|
||||
PNG_TRANSFORM_STRIP_16 | PNG_EXPAND
|
||||
png_set_expand(png_ptr); png_set_strip_16(png_ptr);
|
||||
PNG_TRANSFORM_SCALE_16 | PNG_EXPAND
|
||||
png_set_expand(png_ptr); png_set_scale_16(png_ptr);
|
||||
|
||||
If you must get exactly the same inaccurate results
|
||||
produced by default in versions prior to libpng-1.5.4,
|
||||
use PNG_TRANSFORM_STRIP_16 and png_set_strip_16(png_ptr)
|
||||
instead.
|
||||
|
||||
16-bit values:
|
||||
PNG_TRANSFORM_EXPAND_16
|
||||
@@ -1814,9 +1873,9 @@ color data you can add PNG_TRANSFORM_GRAY_TO_RGB or png_set_gray_to_rgb(png_ptr)
|
||||
to the list.
|
||||
|
||||
Calling png_set_background before the PNG file header is read will not work
|
||||
prior to libpng-1.5.3. Because the failure may result in unexpected warnings or
|
||||
prior to libpng-1.5.4. Because the failure may result in unexpected warnings or
|
||||
errors it is therefore much safer to call png_set_background after the head has
|
||||
been read. Unfortunately this means that prior to libpng-1.5.3 it cannot be
|
||||
been read. Unfortunately this means that prior to libpng-1.5.4 it cannot be
|
||||
used with the high level interface.
|
||||
|
||||
.SS The high-level read interface
|
||||
@@ -1828,8 +1887,10 @@ the entire image into memory, and (b) the input transformations
|
||||
you want to do are limited to the following set:
|
||||
|
||||
PNG_TRANSFORM_IDENTITY No transformation
|
||||
PNG_TRANSFORM_STRIP_16 Strip 16-bit samples to
|
||||
8-bit
|
||||
PNG_TRANSFORM_SCALE_16 Strip 16-bit samples to
|
||||
8-bit accurately
|
||||
PNG_TRANSFORM_STRIP_16 Chop 16-bit samples to
|
||||
8-bit less accurately
|
||||
PNG_TRANSFORM_STRIP_ALPHA Discard the alpha channel
|
||||
PNG_TRANSFORM_PACKING Expand 1, 2 and 4-bit
|
||||
samples to bytes
|
||||
@@ -1923,9 +1984,9 @@ for use in later transformations. Important information copied in is:
|
||||
1) The PNG file gamma from the gAMA chunk. This overwrites the default value
|
||||
provided by an earlier call to png_set_gamma or png_set_alpha_mode.
|
||||
|
||||
2) Prior to libpng-1.5.3 the background color from a bKGd chunk. This
|
||||
2) Prior to libpng-1.5.4 the background color from a bKGd chunk. This
|
||||
damages the information provided by an earlier call to png_set_background
|
||||
resulting in expected behavior. Libpng-1.5.3 no longer does this.
|
||||
resulting in unexpected behavior. Libpng-1.5.4 no longer does this.
|
||||
|
||||
3) The number of significant bits in each component value. Libpng uses this to
|
||||
optimize gamma handling by reducing the internal lookup table sizes.
|
||||
@@ -2063,6 +2124,28 @@ pointer into the info_ptr is returned for any complex types.
|
||||
int_file_gamma - 100,000 times the gamma at which the
|
||||
file is written
|
||||
|
||||
png_get_cHRM(png_ptr, info_ptr, &white_x, &white_y, &red_x, &red_y,
|
||||
&green_x, &green_y, &blue_x, &blue_y)
|
||||
png_get_cHRM_XYZ(png_ptr, info_ptr, &red_X, &red_Y, &red_Z, &green_X,
|
||||
&green_Y, &green_Z, &blue_X, &blue_Y, &blue_Z)
|
||||
png_get_cHRM_fixed(png_ptr, info_ptr, &int_white_x, &int_white_y,
|
||||
&int_red_x, &int_red_y, &int_green_x, &int_green_y,
|
||||
&int_blue_x, &int_blue_y)
|
||||
png_get_cHRM_XYZ_fixed(png_ptr, info_ptr, &int_red_X, &int_red_Y,
|
||||
&int_red_Z, &int_green_X, &int_green_Y, &int_green_Z,
|
||||
&int_blue_X, &int_blue_Y, &int_blue_Z)
|
||||
|
||||
{white,red,green,blue}_{x,y}
|
||||
A color space encoding specified using the chromaticities
|
||||
of the end points and the white point. (PNG_INFO_cHRM)
|
||||
|
||||
{red,green,blue}_{X,Y,Z}
|
||||
A color space encoding specified using the encoding end
|
||||
points - the CIE tristimulus specification of the intended
|
||||
color of the red, green and blue channels in the PNG RGB
|
||||
data. The white point is simply the sum of the three end
|
||||
points. (PNG_INFO_cHRM)
|
||||
|
||||
png_get_sRGB(png_ptr, info_ptr, &srgb_intent);
|
||||
|
||||
file_srgb_intent - the rendering intent (PNG_INFO_sRGB)
|
||||
@@ -2121,7 +2204,8 @@ pointer into the info_ptr is returned for any complex types.
|
||||
|
||||
png_get_bKGD(png_ptr, info_ptr, &background);
|
||||
|
||||
background - background color (PNG_VALID_bKGD)
|
||||
background - background color (of type
|
||||
png_color_16p) (PNG_VALID_bKGD)
|
||||
valid 16-bit red, green and blue
|
||||
values, regardless of color_type
|
||||
|
||||
@@ -2160,6 +2244,8 @@ pointer into the info_ptr is returned for any complex types.
|
||||
Note that the itxt_length, lang, and lang_key
|
||||
members of the text_ptr structure only exist
|
||||
when the library is built with iTXt chunk support.
|
||||
Prior to libpng-1.4.0, the default build was
|
||||
without iTXt chunk support.
|
||||
|
||||
num_text - number of comments (same as
|
||||
num_comments; you can put NULL here
|
||||
@@ -2184,10 +2270,10 @@ pointer into the info_ptr is returned for any complex types.
|
||||
&unit_type);
|
||||
|
||||
offset_x - positive offset from the left edge
|
||||
of the screen
|
||||
of the screen (can be negative)
|
||||
|
||||
offset_y - positive offset from the top edge
|
||||
of the screen
|
||||
of the screen (can be negative)
|
||||
|
||||
unit_type - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER
|
||||
|
||||
@@ -2219,6 +2305,7 @@ pointer into the info_ptr is returned for any complex types.
|
||||
unit - physical scale units (an integer)
|
||||
|
||||
width - width of a pixel in physical scale units
|
||||
(expressed as a string)
|
||||
|
||||
height - height of a pixel in physical scale units
|
||||
(width and height are strings like "2.54")
|
||||
@@ -2241,6 +2328,12 @@ pointer into the info_ptr is returned for any complex types.
|
||||
chunks were read from the PNG file or inserted with the
|
||||
png_set_unknown_chunks() function.
|
||||
|
||||
The value of "location" is a bitwise "or" of
|
||||
|
||||
PNG_HAVE_IHDR (0x01)
|
||||
PNG_HAVE_PLTE (0x02)
|
||||
PNG_AFTER_IDAT (0x08)
|
||||
|
||||
The data from the pHYs chunk can be retrieved in several convenient
|
||||
forms:
|
||||
|
||||
@@ -2354,12 +2447,12 @@ byte, unless png_set_packing() is called. 8-bit RGB data will be stored
|
||||
in RGB RGB RGB format unless png_set_filler() or png_set_add_alpha()
|
||||
is called to insert filler bytes, either before or after each RGB triplet.
|
||||
16-bit RGB data will be returned RRGGBB RRGGBB, with the most significant
|
||||
byte of the color value first, unless png_set_strip_16() is called to
|
||||
byte of the color value first, unless png_set_scale_16() is called to
|
||||
transform it to regular RGB RGB triplets, or png_set_filler() or
|
||||
png_set_add alpha() is called to insert filler bytes, either before or
|
||||
after each RRGGBB triplet. Similarly, 8-bit or 16-bit grayscale data can
|
||||
be modified with
|
||||
png_set_filler(), png_set_add_alpha(), or png_set_strip_16().
|
||||
be modified with png_set_filler(), png_set_add_alpha(), png_set_strip_16(),
|
||||
or png_set_scale_16().
|
||||
|
||||
The following code transforms grayscale images of less than 8 to 8 bits,
|
||||
changes paletted images to RGB, and adds a full alpha channel if there is
|
||||
@@ -2385,7 +2478,7 @@ As of libpng version 1.2.9, png_set_expand_gray_1_2_4_to_8() was
|
||||
added. It expands the sample depth without changing tRNS to alpha.
|
||||
|
||||
As of libpng version 1.5.2, png_set_expand_16() was added. It behaves as
|
||||
png_set_expand(), however, the resultant channels have 16 bits rather than 8.
|
||||
png_set_expand(); however, the resultant channels have 16 bits rather than 8.
|
||||
Use this when the output color or gray channels are made linear to avoid fairly
|
||||
severe accuracy loss.
|
||||
|
||||
@@ -2396,7 +2489,14 @@ PNG can have files with 16 bits per channel. If you only can handle
|
||||
8 bits per channel, this will strip the pixels down to 8-bit.
|
||||
|
||||
if (bit_depth == 16)
|
||||
#if PNG_LIBPNG_VER >= 10504
|
||||
png_set_scale_16(png_ptr);
|
||||
#else
|
||||
png_set_strip_16(png_ptr);
|
||||
#endif
|
||||
|
||||
(The more accurate "png_set_scale_16()" API became available in libpng version
|
||||
1.5.4).
|
||||
|
||||
If you need to process the alpha channel on the image separately from the image
|
||||
data (for example if you convert it to a bitmap mask) it is possible to have
|
||||
@@ -2574,31 +2674,41 @@ It will return a png_byte that is zero if the image was gray or
|
||||
will be silently converted to grayscale, using the green channel
|
||||
data for sBIT, regardless of the error_action setting.
|
||||
|
||||
The default values come from the PNG file cHRM chunk if present, otherwise the
|
||||
The default values come from the PNG file cHRM chunk if present; otherwise, the
|
||||
defaults correspond to the ITU-R recommendation 709, and also the sRGB color
|
||||
space, as recommended in the Charles Poynton's Colour FAQ,
|
||||
<http://www.poynton.com/>, in section 9:
|
||||
|
||||
<http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC9>
|
||||
|
||||
Y = 0.2126 * R + 0.7152 * G + 0.0722 * B
|
||||
|
||||
Previous versions of this document, 1998 through 2002, recommended a slightly
|
||||
different formula:
|
||||
|
||||
Y = 0.212671 * R + 0.715160 * G + 0.072169 * B
|
||||
|
||||
Libpng uses an integer approximation:
|
||||
|
||||
Y = (6968 * R + 23434 * G + 2366 * B)/32768
|
||||
|
||||
The calculation is done in a linear colorspace, if the image gamma
|
||||
can be determined.
|
||||
|
||||
The png_set_background() function has been described already, it tells libpng to
|
||||
The png_set_background() function has been described already; it tells libpng to
|
||||
composite images with alpha or simple transparency against the supplied
|
||||
background color. For compatibility with versions of libpng earlier than
|
||||
libpng-1.5.3 it is recommended that you call the function after reading the file
|
||||
libpng-1.5.4 it is recommended that you call the function after reading the file
|
||||
header, even if you don't want to use the color in a bKGD chunk, if one exists.
|
||||
|
||||
If the PNG file contains a bKGD chunk (PNG_INFO_bKGD valid),
|
||||
you may use this color, or supply another color more suitable for
|
||||
the current display (e.g., the background color from a web page). You
|
||||
need to tell libpng how the color is represented, both the format of the
|
||||
component values in the color (the number of bits) and the gamme encoding of the
|
||||
component values in the color (the number of bits) and the gamma encoding of the
|
||||
color. The function takes two arguments, background_gamma_mode and need_expand
|
||||
to convey this information, however only two combinations are like to be useful:
|
||||
to convey this information, however only two combinations are likely to be
|
||||
useful:
|
||||
|
||||
png_color_16 my_background;
|
||||
png_color_16p image_background;
|
||||
@@ -2610,7 +2720,6 @@ to convey this information, however only two combinations are like to be useful:
|
||||
png_set_background(png_ptr, &my_background,
|
||||
PNG_BACKGROUND_GAMMA_SCREEN, 0/*do not expand*/, 1);
|
||||
|
||||
|
||||
The second call was described above - my_background is in the format of the
|
||||
final, display, output produced by libpng. Because you now know the format of
|
||||
the PNG it is possible to avoid the need to choose either 8-bit or 16-bit
|
||||
@@ -2626,7 +2735,7 @@ image_background->gray.
|
||||
|
||||
If you didn't call png_set_gamma() before reading the file header, for example
|
||||
if you need your code to remain compatible with older versions of libpng prior
|
||||
to libpng-1.5.3, this is the place to call it.
|
||||
to libpng-1.5.4, this is the place to call it.
|
||||
|
||||
Do not call it if you called png_set_alpha_mode(); doing so will damage the
|
||||
settings put in place by png_set_alpha_mode(). (If png_set_alpha_mode() is
|
||||
@@ -2649,9 +2758,9 @@ file has more entries then will fit on your screen, png_set_quantize()
|
||||
will do that. Note that this is a simple match quantization that merely
|
||||
finds the closest color available. This should work fairly well with
|
||||
optimized palettes, but fairly badly with linear color cubes. If you
|
||||
pass a palette that is larger then maximum_colors, the file will
|
||||
pass a palette that is larger than maximum_colors, the file will
|
||||
reduce the number of colors in the palette so it will fit into
|
||||
maximum_colors. If there is a histogram, it will use it to make
|
||||
maximum_colors. If there is a histogram, libpng will use it to make
|
||||
more intelligent choices when reducing the palette. If there is no
|
||||
histogram, it may not do as good a job.
|
||||
|
||||
@@ -2723,7 +2832,7 @@ after all of the other transformations have been processed. Take care with
|
||||
interlaced images if you do the interlace yourself - the width of the row is the
|
||||
width in 'row_info', not the overall image width.
|
||||
|
||||
If supported libpng provides two information routines that you can use to find
|
||||
If supported, libpng provides two information routines that you can use to find
|
||||
where you are in processing the image:
|
||||
|
||||
png_get_current_pass_number(png_structp png_ptr);
|
||||
@@ -2767,13 +2876,16 @@ of the interlaced image.
|
||||
|
||||
After setting the transformations, libpng can update your png_info
|
||||
structure to reflect any transformations you've requested with this
|
||||
call. This is most useful to update the info structure's rowbytes
|
||||
field so you can use it to allocate your image memory. This function
|
||||
will also update your palette with the correct screen_gamma and
|
||||
background if these have been given with the calls above.
|
||||
call.
|
||||
|
||||
png_read_update_info(png_ptr, info_ptr);
|
||||
|
||||
This is most useful to update the info structure's rowbytes
|
||||
field so you can use it to allocate your image memory. This function
|
||||
will also update your palette with the correct screen_gamma and
|
||||
background if these have been given with the calls above. You may
|
||||
only call png_read_update_info() once with a particular info_ptr.
|
||||
|
||||
After you call png_read_update_info(), you can allocate any
|
||||
memory you need to hold the image. The row data is simply
|
||||
raw byte data for all forms of images. As the actual allocation
|
||||
@@ -2782,7 +2894,7 @@ are allocating one large chunk, you will need to build an
|
||||
array of pointers to each row, as it will be needed for some
|
||||
of the functions below.
|
||||
|
||||
Remember: Before you call png_read_update_info(), the png_get_
|
||||
Remember: Before you call png_read_update_info(), the png_get_*()
|
||||
functions return the values corresponding to the original PNG image.
|
||||
After you call png_read_update_info the values refer to the image
|
||||
that libpng will output. Consequently you must call all the png_set_
|
||||
@@ -2974,7 +3086,7 @@ to load the whole file into memory when it is interlaced.
|
||||
|
||||
libpng includes a test program, pngvalid, that illustrates reading and
|
||||
writing of interlaced images. If you can't get interlacing to work in your
|
||||
code and don't want to leave it to libpng (the recommended approach) see
|
||||
code and don't want to leave it to libpng (the recommended approach), see
|
||||
how pngvalid.c does it.
|
||||
|
||||
.SS Finishing a sequential read
|
||||
@@ -3587,6 +3699,28 @@ width, height, bit_depth, and color_type must be the same in each call.
|
||||
int_file_gamma - 100,000 times the gamma at which
|
||||
the image was created
|
||||
|
||||
png_set_cHRM(png_ptr, info_ptr, white_x, white_y, red_x, red_y,
|
||||
green_x, green_y, blue_x, blue_y)
|
||||
png_set_cHRM_XYZ(png_ptr, info_ptr, red_X, red_Y, red_Z, green_X,
|
||||
green_Y, green_Z, blue_X, blue_Y, blue_Z)
|
||||
png_set_cHRM_fixed(png_ptr, info_ptr, int_white_x, int_white_y,
|
||||
int_red_x, int_red_y, int_green_x, int_green_y,
|
||||
int_blue_x, int_blue_y)
|
||||
png_set_cHRM_XYZ_fixed(png_ptr, info_ptr, int_red_X, int_red_Y,
|
||||
int_red_Z, int_green_X, int_green_Y, int_green_Z,
|
||||
int_blue_X, int_blue_Y, int_blue_Z)
|
||||
|
||||
{white,red,green,blue}_{x,y}
|
||||
A color space encoding specified using the chromaticities
|
||||
of the end points and the white point.
|
||||
|
||||
{red,green,blue}_{X,Y,Z}
|
||||
A color space encoding specified using the encoding end
|
||||
points - the CIE tristimulus specification of the intended
|
||||
color of the red, green and blue channels in the PNG RGB
|
||||
data. The white point is simply the sum of the three end
|
||||
points.
|
||||
|
||||
png_set_sRGB(png_ptr, info_ptr, srgb_intent);
|
||||
|
||||
srgb_intent - the rendering intent
|
||||
@@ -3647,14 +3781,14 @@ width, height, bit_depth, and color_type must be the same in each call.
|
||||
trans_alpha - array of alpha (transparency)
|
||||
entries for palette (PNG_INFO_tRNS)
|
||||
|
||||
num_trans - number of transparent entries
|
||||
(PNG_INFO_tRNS)
|
||||
|
||||
trans_color - graylevel or color sample values
|
||||
(in order red, green, blue) of the
|
||||
single transparent color for
|
||||
non-paletted images (PNG_INFO_tRNS)
|
||||
|
||||
num_trans - number of transparent entries
|
||||
(PNG_INFO_tRNS)
|
||||
|
||||
png_set_hIST(png_ptr, info_ptr, hist);
|
||||
|
||||
hist - histogram of palette (array of
|
||||
@@ -3667,7 +3801,8 @@ width, height, bit_depth, and color_type must be the same in each call.
|
||||
|
||||
png_set_bKGD(png_ptr, info_ptr, background);
|
||||
|
||||
background - background color (PNG_VALID_bKGD)
|
||||
background - background color (of type
|
||||
png_color_16p) (PNG_VALID_bKGD)
|
||||
|
||||
png_set_text(png_ptr, info_ptr, text_ptr, num_text);
|
||||
|
||||
@@ -3694,6 +3829,8 @@ width, height, bit_depth, and color_type must be the same in each call.
|
||||
Note that the itxt_length, lang, and lang_key
|
||||
members of the text_ptr structure only exist
|
||||
when the library is built with iTXt chunk support.
|
||||
Prior to libpng-1.4.0 the library was built by default
|
||||
without iTXt support.
|
||||
|
||||
num_text - number of comments
|
||||
|
||||
@@ -3743,6 +3880,7 @@ width, height, bit_depth, and color_type must be the same in each call.
|
||||
unit - physical scale units (an integer)
|
||||
|
||||
width - width of a pixel in physical scale units
|
||||
expressed as a string
|
||||
|
||||
height - height of a pixel in physical scale units
|
||||
(width and height are strings like "2.54")
|
||||
@@ -3784,7 +3922,7 @@ Because tEXt and zTXt chunks don't have a language field, if you
|
||||
specify PNG_TEXT_COMPRESSION_NONE or PNG_TEXT_COMPRESSION_zTXt
|
||||
any language code or translated keyword will not be written out.
|
||||
|
||||
Until text gets around 1000 bytes, it is not worth compressing it.
|
||||
Until text gets around a few hundred bytes, it is not worth compressing it.
|
||||
After the text has been written out to the file, the compression type
|
||||
is set to PNG_TEXT_COMPRESSION_NONE_WR or PNG_TEXT_COMPRESSION_zTXt_WR,
|
||||
so that it isn't written out again at the end (in case you are calling
|
||||
@@ -4394,7 +4532,8 @@ However, there are some uncertainties about the status of local variables
|
||||
after a longjmp, so the user may want to be careful about doing anything
|
||||
after setjmp returns non-zero besides returning itself. Consult your
|
||||
compiler documentation for more details. For an alternative approach, you
|
||||
may wish to use the "cexcept" facility (see http://cexcept.sourceforge.net).
|
||||
may wish to use the "cexcept" facility (see http://cexcept.sourceforge.net),
|
||||
which is illustrated in pngvalid.c and in contrib/visupng.
|
||||
|
||||
.SS Custom chunks
|
||||
|
||||
@@ -4412,8 +4551,11 @@ and look at how other chunks were designed, so you can do things
|
||||
similarly. Second, check out the sections of libpng that read and
|
||||
write chunks. Try to find a chunk that is similar to yours and use
|
||||
it as a template. More details can be found in the comments inside
|
||||
the code. It is best to handle unknown chunks in a generic method,
|
||||
via callback functions, instead of by modifying libpng functions.
|
||||
the code. It is best to handle private or unknown chunks in a generic method,
|
||||
via callback functions, instead of by modifying libpng functions. This
|
||||
is illustrated in pngtest.c, which uses a callback function to handle a
|
||||
private "vpAg" chunk and the new "sTER" chunk, which are both unknown to
|
||||
libpng.
|
||||
|
||||
If you wish to write your own transformation for the data, look through
|
||||
the part of the code that does the transformations, and check out some of
|
||||
@@ -4441,8 +4583,8 @@ defined, and FAR gets defined to far in pngconf.h, and you should be
|
||||
all set. Everything in the library (except for zlib's structure) is
|
||||
expecting far data. You must use the typedefs with the p or pp on
|
||||
the end for pointers (or at least look at them and be careful). Make
|
||||
note that the rows of data are defined as png_bytepp, which is an
|
||||
unsigned char far * far *.
|
||||
note that the rows of data are defined as png_bytepp, which is
|
||||
an "unsigned char far * far *".
|
||||
|
||||
.SS Configuring for gui/windowing platforms:
|
||||
|
||||
@@ -4460,7 +4602,11 @@ or delete an include, this is the place to do it.
|
||||
The includes that are not needed outside libpng are placed in pngpriv.h,
|
||||
which is only used by the routines inside libpng itself.
|
||||
The files in libpng proper only include pngpriv.h and png.h, which
|
||||
in turn includes pngconf.h.
|
||||
%14%in turn includes pngconf.h.
|
||||
in turn includes pngconf.h and, as of libpng-1.5.0, pnglibconf.h.
|
||||
As of libpng-1.5.0, pngpriv.h also includes three other private header
|
||||
files, pngstruct.h, pnginfo.h, and pngdebug.h, which contain material
|
||||
that previously appeared in the public headers.
|
||||
|
||||
.SS Configuring zlib:
|
||||
|
||||
@@ -4502,8 +4648,28 @@ zlib.h for more information on what these mean.
|
||||
window_bits);
|
||||
|
||||
png_set_compression_method(png_ptr, method);
|
||||
|
||||
png_set_compression_buffer_size(png_ptr, size);
|
||||
|
||||
As of libpng version 1.5.4, additional APIs became
|
||||
available to set these separately for non-IDAT
|
||||
compressed chunks such as zTXt, iTXt, and iCCP:
|
||||
|
||||
#include zlib.h
|
||||
#if PNG_LIBPNG_VER <= 10504
|
||||
png_set_text_compression_level(png_ptr, level);
|
||||
|
||||
png_set_text_compression_mem_level(png_ptr, level);
|
||||
|
||||
png_set_text_compression_strategy(png_ptr,
|
||||
strategy);
|
||||
|
||||
png_set_text_compression_window_bits(png_ptr,
|
||||
window_bits);
|
||||
|
||||
png_set_text_compression_method(png_ptr, method);
|
||||
#endif
|
||||
|
||||
.SS Controlling row filtering
|
||||
|
||||
If you want to control whether libpng uses filtering or not, which
|
||||
@@ -4609,8 +4775,8 @@ capability, which you'll still have).
|
||||
All the reading and writing specific code are in separate files, so the
|
||||
linker should only grab the files it needs. However, if you want to
|
||||
make sure, or if you are building a stand alone library, all the
|
||||
reading files start with pngr and all the writing files start with
|
||||
pngw. The files that don't match either (like png.c, pngtrans.c, etc.)
|
||||
reading files start with "pngr" and all the writing files start with "pngw".
|
||||
The files that don't match either (like png.c, pngtrans.c, etc.)
|
||||
are used for both reading and writing, and always need to be included.
|
||||
The progressive reader is in pngpread.c
|
||||
|
||||
@@ -4729,6 +4895,9 @@ The number libpng_vn is constructed from the major version, minor
|
||||
version with leading zero, and release number with leading zero,
|
||||
(e.g., libpng_vn for version 1.0.7 is 10007).
|
||||
|
||||
Note that this function does not take a png_ptr, so you can call it
|
||||
before you've created one.
|
||||
|
||||
You can also check which version of png.h you used when compiling your
|
||||
application:
|
||||
|
||||
@@ -4965,10 +5134,9 @@ In png_get_iCCP, the type of "profile" was changed from png_charpp
|
||||
to png_bytepp, and in png_set_iCCP, from png_charp to png_const_bytep.
|
||||
|
||||
There are changes of form in png.h, including new and changed macros to
|
||||
declare
|
||||
parts of the API. Some API functions with arguments that are pointers to
|
||||
data not modified within the function have been corrected to declare
|
||||
these arguments with PNG_CONST.
|
||||
declare parts of the API. Some API functions with arguments that are
|
||||
pointers to data not modified within the function have been corrected to
|
||||
declare these arguments with PNG_CONST.
|
||||
|
||||
Much of the internal use of C macros to control the library build has also
|
||||
changed and some of this is visible in the exported header files, in
|
||||
@@ -4988,7 +5156,6 @@ absolutely necessary) interlace an image.
|
||||
|
||||
libpng 1.5.0 adds an API png_longjmp(png_ptr, value). This API calls
|
||||
the application-provided png_longjmp_ptr on the internal, but application
|
||||
initialized, jmpbuf. It is provided as a convenience to avoid the need
|
||||
initialized, longjmp buffer. It is provided as a convenience to avoid
|
||||
the need to use the png_jmpbuf macro, which had the unnecessary side
|
||||
effect of resetting the internal png_longjmp_ptr value.
|
||||
@@ -5043,22 +5210,22 @@ Applications can now choose whether to use these macros or to call the
|
||||
corresponding function by defining PNG_USE_READ_MACROS or
|
||||
PNG_NO_USE_READ_MACROS before including png.h. Notice that this is
|
||||
only supported from 1.5.0 -defining PNG_NO_USE_READ_MACROS prior to 1.5.0
|
||||
will lead to a link failure.
|
||||
will lead to a link failure.
|
||||
|
||||
Prior to libpng-1.5.3, the zlib compressor used the same set of parameters
|
||||
Prior to libpng-1.5.4, the zlib compressor used the same set of parameters
|
||||
when compressing the IDAT data and textual data such as zTXt and iCCP.
|
||||
In libpng-1.5.3 we reinitialized the zlib stream for each type of data.
|
||||
In libpng-1.5.4 we reinitialized the zlib stream for each type of data.
|
||||
We added five png_set_text_*() functions for setting the parameters to
|
||||
use with textual data.
|
||||
|
||||
Prior to libpng-1.5.3, the PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED
|
||||
Prior to libpng-1.5.4, the PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED
|
||||
option was off by default, and slightly inaccurate scaling occurred.
|
||||
This option can no longer be turned off, and 16-to-8 scaling is always
|
||||
accurate. This change will result in some different results while
|
||||
reading 16-bit images, with none of the pixels being off-by-one any
|
||||
longer (see Clause 13.12 of the PNG specification).
|
||||
This option can no longer be turned off, and the choice of accurate
|
||||
or inaccurate 16-to-8 scaling is by using the new png_set_scale_16_to_8()
|
||||
API for accurate scaling or the old png_set_strip_16_to_8() API for simple
|
||||
chopping.
|
||||
|
||||
Prior to libpng-1.5.3, the png_set_user_limits() function could only be
|
||||
Prior to libpng-1.5.4, the png_set_user_limits() function could only be
|
||||
used to reduce the width and height limits from the value of
|
||||
PNG_USER_WIDTH_MAX and PNG_USER_HEIGHT_MAX, although this document said
|
||||
that it could be used to override them. Now this function will reduce or
|
||||
@@ -5067,9 +5234,9 @@ increase the limits.
|
||||
B. Changes to the build and configuration of libpng
|
||||
|
||||
Details of internal changes to the library code can be found in the CHANGES
|
||||
file. These will be of no concern to the vast majority of library users or
|
||||
builders, however the few who configure libpng to a non-default feature
|
||||
set may need to change how this is done.
|
||||
file and in the GIT repository logs. These will be of no concern to the vast
|
||||
majority of library users or builders, however the few who configure libpng
|
||||
to a non-default feature set may need to change how this is done.
|
||||
|
||||
There should be no need for library builders to alter build scripts if
|
||||
these use the distributed build support - configure or the makefiles -
|
||||
@@ -5078,14 +5245,14 @@ to build pnglibconf.h where the corresponding makefile does not do so.
|
||||
|
||||
Building libpng with a non-default configuration has changed completely.
|
||||
The old method using pngusr.h should still work correctly even though the
|
||||
way pngusr.h is used in the build has been changed, however library
|
||||
way pngusr.h is used in the build has been changed; however, library
|
||||
builders will probably want to examine the changes to take advantage of
|
||||
new capabilities and to simplify their build system.
|
||||
|
||||
B.1 Specific changes to library configuration capabilities
|
||||
|
||||
The library now supports a complete fixed point implementation and can
|
||||
thus be used on systems which have no floating point support or very
|
||||
thus be used on systems that have no floating point support or very
|
||||
limited or slow support. Previously gamma correction, an essential part
|
||||
of complete PNG support, required reasonably fast floating point.
|
||||
|
||||
@@ -5101,14 +5268,14 @@ pnglibconf.h
|
||||
As part of this the mechanism used to choose procedure call standards on
|
||||
those systems that allow a choice has been changed. At present this only
|
||||
affects certain Microsoft (DOS, Windows) and IBM (OS/2) operating systems
|
||||
running on Intel processors. As before PNGAPI is defined where required
|
||||
running on Intel processors. As before, PNGAPI is defined where required
|
||||
to control the exported API functions; however, two new macros, PNGCBAPI
|
||||
and PNGCAPI, are used instead for callback functions (PNGCBAPI) and
|
||||
(PNGCAPI) for functions that must match a C library prototype (currently
|
||||
only png_longjmp_ptr, which must match the C longjmp function.) The new
|
||||
approach is documented in pngconf.h
|
||||
|
||||
Despite these changes libpng 1.5.0 only supports the native C function
|
||||
Despite these changes, libpng 1.5.0 only supports the native C function
|
||||
calling standard on those platforms tested so far (__cdecl on Microsoft
|
||||
Windows). This is because the support requirements for alternative
|
||||
calling conventions seem to no longer exist. Developers who find it
|
||||
@@ -5141,8 +5308,10 @@ if the feature is supported or:
|
||||
/*#undef PNG_feature_SUPPORTED*/
|
||||
|
||||
if it is not. Library code consistently checks for the 'SUPPORTED' macro.
|
||||
It does not, and should not, check for the 'NO' macro which will not
|
||||
normally be defined even if the feature is not supported.
|
||||
It does not, and libpng applications should not, check for the 'NO' macro
|
||||
which will not normally be defined even if the feature is not supported.
|
||||
The 'NO' macros are only used internally for setting or not setting the
|
||||
corresponding 'SUPPORTED' macros.
|
||||
|
||||
Compatibility with the old names is provided as follows:
|
||||
|
||||
@@ -5199,10 +5368,10 @@ application built without PNG_USER_CONFIG defined would see the
|
||||
unmodified, default, libpng API and thus would probably fail to link.
|
||||
|
||||
These mechanisms still work in the configure build and in any makefile
|
||||
build that builds pnglibconf.h although the feature selection macros
|
||||
build that builds pnglibconf.h, although the feature selection macros
|
||||
have changed somewhat as described above. In 1.5.0, however, pngusr.h is
|
||||
processed only once, when the exported header file pnglibconf.h is built.
|
||||
pngconf.h no longer includes pngusr.h, therefore it is ignored after the
|
||||
pngconf.h no longer includes pngusr.h, therefore pngusr.h is ignored after the
|
||||
build of pnglibconf.h and it is never included in an application build.
|
||||
|
||||
The rarely used alternative of adding a list of feature macros to the
|
||||
@@ -5216,7 +5385,7 @@ scripts/pnglibconf.dfa. This requires the program awk. Brian Kernighan
|
||||
and all known later implementations (often called by subtly different
|
||||
names - nawk and gawk for example) are adequate to build pnglibconf.h.
|
||||
The Sun Microsystems (now Oracle) program 'awk' is an earlier version
|
||||
and does not work, this may also apply to other systems that have a
|
||||
and does not work; this may also apply to other systems that have a
|
||||
functioning awk called 'nawk'.
|
||||
|
||||
Configuration options are now documented in scripts/pnglibconf.dfa. This
|
||||
@@ -5258,8 +5427,8 @@ the libpng bug tracker at
|
||||
|
||||
We also accept patches built from the tar or zip distributions, and
|
||||
simple verbal discriptions of bug fixes, reported either to the
|
||||
SourceForge bug tracker or to the png-mng-implement at lists.sf.net
|
||||
mailing list.
|
||||
SourceForge bug tracker, to the png-mng-implement at lists.sf.net
|
||||
mailing list, or directly to glennrp.
|
||||
|
||||
.SH XIII. Coding style
|
||||
|
||||
@@ -5364,6 +5533,9 @@ left parenthesis that follows it:
|
||||
We prefer #ifdef and #ifndef to #if defined() and if !defined()
|
||||
when there is only one macro being tested.
|
||||
|
||||
We prefer to express integers that are used as bit masks in hex format,
|
||||
with an even number of lower-case hex digits (e.g., 0x00, 0xff, 0x0100).
|
||||
|
||||
We do not use the TAB character for indentation in the C sources.
|
||||
|
||||
Lines do not exceed 80 characters.
|
||||
@@ -5372,13 +5544,13 @@ Other rules can be inferred by inspecting the libpng source.
|
||||
|
||||
.SH XIV. Y2K Compliance in libpng
|
||||
|
||||
June 15, 2011
|
||||
October 27, 2011
|
||||
|
||||
Since the PNG Development group is an ad-hoc body, we can't make
|
||||
an official declaration.
|
||||
|
||||
This is your unofficial assurance that libpng from version 0.71 and
|
||||
upward through 1.5.4beta03 are Y2K compliant. It is my belief that earlier
|
||||
upward through 1.5.6rc02 are Y2K compliant. It is my belief that earlier
|
||||
versions were also Y2K compliant.
|
||||
|
||||
Libpng only has three year fields. One is a 2-byte unsigned integer that
|
||||
@@ -5571,7 +5743,14 @@ the first widely used release:
|
||||
1.5.3rc01-02 15 10503 15.so.15.3[.0]
|
||||
1.5.3beta11 15 10503 15.so.15.3[.0]
|
||||
1.5.3 [omitted]
|
||||
1.5.4beta01-03 15 10504 15.so.15.4[.0]
|
||||
1.5.4beta01-08 15 10504 15.so.15.4[.0]
|
||||
1.5.4rc01 15 10504 15.so.15.4[.0]
|
||||
1.5.4 15 10504 15.so.15.4[.0]
|
||||
1.5.5beta01-08 15 10505 15.so.15.5[.0]
|
||||
1.5.5rc01 15 10505 15.so.15.5[.0]
|
||||
1.5.5 15 10505 15.so.15.5[.0]
|
||||
1.5.6beta01-07 15 10506 15.so.15.6[.0]
|
||||
1.5.6rc01-02 15 10506 15.so.15.6[.0]
|
||||
|
||||
Henceforth the source version will match the shared-library minor
|
||||
and patch numbers; the shared-library major version number will be
|
||||
@@ -5628,7 +5807,7 @@ possible without all of you.
|
||||
|
||||
Thanks to Frank J. T. Wojcik for helping with the documentation.
|
||||
|
||||
Libpng version 1.5.4beta03 - June 15, 2011:
|
||||
Libpng version 1.5.6rc02 - October 27, 2011:
|
||||
Initially created in 1995 by Guy Eric Schalnat, then of Group 42, Inc.
|
||||
Currently maintained by Glenn Randers-Pehrson (glennrp at users.sourceforge.net).
|
||||
|
||||
@@ -5651,7 +5830,7 @@ this sentence.
|
||||
|
||||
This code is released under the libpng license.
|
||||
|
||||
libpng versions 1.2.6, August 15, 2004, through 1.5.4beta03, June 15, 2011, are
|
||||
libpng versions 1.2.6, August 15, 2004, through 1.5.6rc02, October 27, 2011, are
|
||||
Copyright (c) 2004,2006-2007 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
|
||||
@@ -5750,7 +5929,7 @@ certification mark of the Open Source Initiative.
|
||||
|
||||
Glenn Randers-Pehrson
|
||||
glennrp at users.sourceforge.net
|
||||
June 15, 2011
|
||||
October 27, 2011
|
||||
|
||||
.\" end of man page
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
.TH LIBPNGPF 3 "June 15, 2011"
|
||||
.TH LIBPNGPF 3 "October 27, 2011"
|
||||
.SH NAME
|
||||
libpng \- Portable Network Graphics (PNG) Reference Library 1.5.4beta03
|
||||
libpng \- Portable Network Graphics (PNG) Reference Library 1.5.6rc02
|
||||
(private functions)
|
||||
.SH SYNOPSIS
|
||||
\fB#include \fI"pngpriv.h"
|
||||
|
||||
2
png.5
2
png.5
@@ -1,4 +1,4 @@
|
||||
.TH PNG 5 "June 15, 2011"
|
||||
.TH PNG 5 "October 27, 2011"
|
||||
.SH NAME
|
||||
png \- Portable Network Graphics (PNG) format
|
||||
.SH DESCRIPTION
|
||||
|
||||
627
png.c
627
png.c
@@ -1,7 +1,7 @@
|
||||
|
||||
/* png.c - location for general purpose libpng functions
|
||||
*
|
||||
* Last changed in libpng 1.5.4 [(PENDING RELEASE)]
|
||||
* Last changed in libpng 1.5.6 [(PENDING RELEASE)]
|
||||
* Copyright (c) 1998-2011 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
@@ -14,7 +14,7 @@
|
||||
#include "pngpriv.h"
|
||||
|
||||
/* Generate a compiler error if there is an old png.h in the search path. */
|
||||
typedef png_libpng_version_1_5_4beta03 Your_png_h_is_not_version_1_5_4beta03;
|
||||
typedef png_libpng_version_1_5_6rc02 Your_png_h_is_not_version_1_5_6rc02;
|
||||
|
||||
/* 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
|
||||
@@ -43,7 +43,7 @@ png_set_sig_bytes(png_structp png_ptr, int num_bytes)
|
||||
* can simply check the remaining bytes for extra assurance. Returns
|
||||
* an integer less than, equal to, or greater than zero if sig is found,
|
||||
* respectively, to be less than, to match, or be greater than the correct
|
||||
* PNG signature (this is the same behaviour as strcmp, memcmp, etc).
|
||||
* PNG signature (this is the same behavior as strcmp, memcmp, etc).
|
||||
*/
|
||||
int PNGAPI
|
||||
png_sig_cmp(png_const_bytep sig, png_size_t start, png_size_t num_to_check)
|
||||
@@ -107,7 +107,8 @@ png_zfree(voidpf png_ptr, voidpf ptr)
|
||||
void /* PRIVATE */
|
||||
png_reset_crc(png_structp png_ptr)
|
||||
{
|
||||
png_ptr->crc = crc32(0, Z_NULL, 0);
|
||||
/* The cast is safe because the crc is a 32 bit value. */
|
||||
png_ptr->crc = (png_uint_32)crc32(0, Z_NULL, 0);
|
||||
}
|
||||
|
||||
/* Calculate the CRC over a section of data. We can only pass as
|
||||
@@ -120,21 +121,48 @@ png_calculate_crc(png_structp png_ptr, png_const_bytep ptr, png_size_t length)
|
||||
{
|
||||
int need_crc = 1;
|
||||
|
||||
if (png_ptr->chunk_name[0] & 0x20) /* ancillary */
|
||||
if (PNG_CHUNK_ANCILLIARY(png_ptr->chunk_name))
|
||||
{
|
||||
if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) ==
|
||||
(PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN))
|
||||
need_crc = 0;
|
||||
}
|
||||
|
||||
else /* critical */
|
||||
else /* critical */
|
||||
{
|
||||
if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE)
|
||||
need_crc = 0;
|
||||
}
|
||||
|
||||
if (need_crc)
|
||||
png_ptr->crc = crc32(png_ptr->crc, ptr, (uInt)length);
|
||||
/* 'uLong' is defined as unsigned long, this means that on some 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 necessary to perform a
|
||||
* loop here.
|
||||
*/
|
||||
if (need_crc && length > 0)
|
||||
{
|
||||
uLong crc = png_ptr->crc; /* Should never issue a warning */
|
||||
|
||||
do
|
||||
{
|
||||
uInt safeLength = (uInt)length;
|
||||
if (safeLength == 0)
|
||||
safeLength = (uInt)-1; /* evil, but safe */
|
||||
|
||||
crc = crc32(crc, ptr, safeLength);
|
||||
|
||||
/* The following should never issue compiler warnings, if they do the
|
||||
* target system has characteristics that will probably violate other
|
||||
* assumptions within the libpng code.
|
||||
*/
|
||||
ptr += safeLength;
|
||||
length -= safeLength;
|
||||
}
|
||||
while (length > 0);
|
||||
|
||||
/* And the following is always safe because the crc is only 32 bits. */
|
||||
png_ptr->crc = (png_uint_32)crc;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check a user supplied version number, called from both read and write
|
||||
@@ -542,8 +570,8 @@ png_get_io_ptr(png_structp png_ptr)
|
||||
/* Initialize the default input/output functions for the PNG file. If you
|
||||
* use your own read or write routines, you can call either png_set_read_fn()
|
||||
* or png_set_write_fn() instead of png_init_io(). If you have defined
|
||||
* PNG_NO_STDIO, you must use a function of your own because "FILE *" isn't
|
||||
* necessarily available.
|
||||
* PNG_NO_STDIO or otherwise disabled PNG_STDIO_SUPPORTED, you must use a
|
||||
* function of your own because "FILE *" isn't necessarily available.
|
||||
*/
|
||||
void PNGAPI
|
||||
png_init_io(png_structp png_ptr, png_FILE_p fp)
|
||||
@@ -617,13 +645,13 @@ png_get_copyright(png_const_structp png_ptr)
|
||||
#else
|
||||
# ifdef __STDC__
|
||||
return PNG_STRING_NEWLINE \
|
||||
"libpng version 1.5.4beta03 - June 15, 2011" PNG_STRING_NEWLINE \
|
||||
"libpng version 1.5.6rc02 - October 27, 2011" PNG_STRING_NEWLINE \
|
||||
"Copyright (c) 1998-2011 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \
|
||||
"Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \
|
||||
"Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \
|
||||
PNG_STRING_NEWLINE;
|
||||
# else
|
||||
return "libpng version 1.5.4beta03 - June 15, 2011\
|
||||
return "libpng version 1.5.6rc02 - October 27, 2011\
|
||||
Copyright (c) 1998-2011 Glenn Randers-Pehrson\
|
||||
Copyright (c) 1996-1997 Andreas Dilger\
|
||||
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.";
|
||||
@@ -670,25 +698,43 @@ png_get_header_version(png_const_structp png_ptr)
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
|
||||
# ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
|
||||
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
|
||||
int PNGAPI
|
||||
png_handle_as_unknown(png_structp png_ptr, png_const_bytep chunk_name)
|
||||
{
|
||||
/* Check chunk_name and return "keep" value if it's on the list, else 0 */
|
||||
int i;
|
||||
png_bytep p;
|
||||
if (png_ptr == NULL || chunk_name == NULL || png_ptr->num_chunk_list<=0)
|
||||
return 0;
|
||||
png_const_bytep p, p_end;
|
||||
|
||||
p = png_ptr->chunk_list + png_ptr->num_chunk_list*5 - 5;
|
||||
for (i = png_ptr->num_chunk_list; i; i--, p -= 5)
|
||||
if (png_ptr == NULL || chunk_name == NULL || png_ptr->num_chunk_list <= 0)
|
||||
return PNG_HANDLE_CHUNK_AS_DEFAULT;
|
||||
|
||||
p_end = png_ptr->chunk_list;
|
||||
p = p_end + png_ptr->num_chunk_list*5; /* beyond end */
|
||||
|
||||
/* The code is the fifth byte after each four byte string. Historically this
|
||||
* code was always searched from the end of the list, so it should continue
|
||||
* to do so in case there are duplicated entries.
|
||||
*/
|
||||
do /* num_chunk_list > 0, so at least one */
|
||||
{
|
||||
p -= 5;
|
||||
if (!png_memcmp(chunk_name, p, 4))
|
||||
return ((int)*(p + 4));
|
||||
return 0;
|
||||
return p[4];
|
||||
}
|
||||
while (p > p_end);
|
||||
|
||||
return PNG_HANDLE_CHUNK_AS_DEFAULT;
|
||||
}
|
||||
# endif
|
||||
#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */
|
||||
|
||||
int /* PRIVATE */
|
||||
png_chunk_unknown_handling(png_structp png_ptr, png_uint_32 chunk_name)
|
||||
{
|
||||
png_byte chunk_string[5];
|
||||
|
||||
PNG_CSTRING_FROM_CHUNK(chunk_string, chunk_name);
|
||||
return png_handle_as_unknown(png_ptr, chunk_string);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_SUPPORTED
|
||||
/* This function, added to libpng-1.0.6g, is untested. */
|
||||
@@ -713,18 +759,9 @@ png_access_version_number(void)
|
||||
|
||||
|
||||
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
|
||||
# ifdef PNG_SIZE_T
|
||||
/* Added at libpng version 1.2.6 */
|
||||
PNG_EXTERN png_size_t PNGAPI png_convert_size PNGARG((size_t size));
|
||||
png_size_t PNGAPI
|
||||
png_convert_size(size_t size)
|
||||
{
|
||||
if (size > (png_size_t)-1)
|
||||
PNG_ABORT(); /* We haven't got access to png_ptr, so no png_error() */
|
||||
|
||||
return ((png_size_t)size);
|
||||
}
|
||||
# endif /* PNG_SIZE_T */
|
||||
/* png_convert_size: a PNGAPI but no longer in png.h, so deleted
|
||||
* at libpng 1.5.5!
|
||||
*/
|
||||
|
||||
/* Added at libpng version 1.2.34 and 1.4.0 (moved from pngset.c) */
|
||||
# ifdef PNG_CHECK_cHRM_SUPPORTED
|
||||
@@ -798,6 +835,326 @@ png_check_cHRM_fixed(png_structp png_ptr,
|
||||
}
|
||||
# endif /* PNG_CHECK_cHRM_SUPPORTED */
|
||||
|
||||
#ifdef PNG_cHRM_SUPPORTED
|
||||
/* Added at libpng-1.5.5 to support read and write of true CIEXYZ values for
|
||||
* cHRM, as opposed to using chromaticities. These internal APIs return
|
||||
* non-zero on a parameter error. The X, Y and Z values are required to be
|
||||
* positive and less than 1.0.
|
||||
*/
|
||||
int png_xy_from_XYZ(png_xy *xy, png_XYZ XYZ)
|
||||
{
|
||||
png_int_32 d, dwhite, whiteX, whiteY;
|
||||
|
||||
d = XYZ.redX + XYZ.redY + XYZ.redZ;
|
||||
if (!png_muldiv(&xy->redx, XYZ.redX, PNG_FP_1, d)) return 1;
|
||||
if (!png_muldiv(&xy->redy, XYZ.redY, PNG_FP_1, d)) return 1;
|
||||
dwhite = d;
|
||||
whiteX = XYZ.redX;
|
||||
whiteY = XYZ.redY;
|
||||
|
||||
d = XYZ.greenX + XYZ.greenY + XYZ.greenZ;
|
||||
if (!png_muldiv(&xy->greenx, XYZ.greenX, PNG_FP_1, d)) return 1;
|
||||
if (!png_muldiv(&xy->greeny, XYZ.greenY, PNG_FP_1, d)) return 1;
|
||||
dwhite += d;
|
||||
whiteX += XYZ.greenX;
|
||||
whiteY += XYZ.greenY;
|
||||
|
||||
d = XYZ.blueX + XYZ.blueY + XYZ.blueZ;
|
||||
if (!png_muldiv(&xy->bluex, XYZ.blueX, PNG_FP_1, d)) return 1;
|
||||
if (!png_muldiv(&xy->bluey, XYZ.blueY, PNG_FP_1, d)) return 1;
|
||||
dwhite += d;
|
||||
whiteX += XYZ.blueX;
|
||||
whiteY += XYZ.blueY;
|
||||
|
||||
/* The reference white is simply the same of the end-point (X,Y,Z) vectors,
|
||||
* thus:
|
||||
*/
|
||||
if (!png_muldiv(&xy->whitex, whiteX, PNG_FP_1, dwhite)) return 1;
|
||||
if (!png_muldiv(&xy->whitey, whiteY, PNG_FP_1, dwhite)) return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int png_XYZ_from_xy(png_XYZ *XYZ, png_xy xy)
|
||||
{
|
||||
png_fixed_point red_inverse, green_inverse, blue_scale;
|
||||
png_fixed_point left, right, denominator;
|
||||
|
||||
/* Check xy and, implicitly, z. Note that wide gamut color spaces typically
|
||||
* have end points with 0 tristimulus values (these are impossible end
|
||||
* points, but they are used to cover the possible colors.)
|
||||
*/
|
||||
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.greenx < 0 || xy.greenx > PNG_FP_1) 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.bluey < 0 || xy.bluey > PNG_FP_1-xy.bluex) 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;
|
||||
|
||||
/* 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
|
||||
* derived values were recorded in the cHRM chunk;
|
||||
* (red,green,blue,white)x(x,y). This loses one degree of freedom and
|
||||
* therefore an arbitrary ninth value has to be introduced to undo the
|
||||
* original transformations.
|
||||
*
|
||||
* Think of the original end-points as points in (X,Y,Z) space. The
|
||||
* chromaticity values (c) have the property:
|
||||
*
|
||||
* C
|
||||
* c = ---------
|
||||
* X + Y + Z
|
||||
*
|
||||
* For each c (x,y,z) from the corresponding original C (X,Y,Z). Thus the
|
||||
* three chromaticity values (x,y,z) for each end-point obey the
|
||||
* relationship:
|
||||
*
|
||||
* x + y + z = 1
|
||||
*
|
||||
* This describes the plane in (X,Y,Z) space that intersects each axis at the
|
||||
* value 1.0; call this the chromaticity plane. Thus the chromaticity
|
||||
* calculation has scaled each end-point so that it is on the x+y+z=1 plane
|
||||
* and chromaticity is the intersection of the vector from the origin to the
|
||||
* (X,Y,Z) value with the chromaticity plane.
|
||||
*
|
||||
* To fully invert the chromaticity calculation we would need the three
|
||||
* end-point scale factors, (red-scale, green-scale, blue-scale), but these
|
||||
* were not recorded. Instead we calculated the reference white (X,Y,Z) and
|
||||
* recorded the chromaticity of this. The reference white (X,Y,Z) would have
|
||||
* given all three of the scale factors since:
|
||||
*
|
||||
* color-C = color-c * color-scale
|
||||
* white-C = red-C + green-C + blue-C
|
||||
* = red-c*red-scale + green-c*green-scale + blue-c*blue-scale
|
||||
*
|
||||
* But cHRM records only white-x and white-y, so we have lost the white scale
|
||||
* factor:
|
||||
*
|
||||
* white-C = white-c*white-scale
|
||||
*
|
||||
* To handle this the inverse transformation makes an arbitrary assumption
|
||||
* about white-scale:
|
||||
*
|
||||
* Assume: white-Y = 1.0
|
||||
* Hence: white-scale = 1/white-y
|
||||
* Or: red-Y + green-Y + blue-Y = 1.0
|
||||
*
|
||||
* Notice the last statement of the assumption gives an equation in three of
|
||||
* the nine values we want to calculate. 8 more equations come from the
|
||||
* above routine as summarised at the top above (the chromaticity
|
||||
* calculation):
|
||||
*
|
||||
* Given: color-x = color-X / (color-X + color-Y + color-Z)
|
||||
* Hence: (color-x - 1)*color-X + color.x*color-Y + color.x*color-Z = 0
|
||||
*
|
||||
* This is 9 simultaneous equations in the 9 variables "color-C" and can be
|
||||
* solved by Cramer's rule. Cramer's rule requires calculating 10 9x9 matrix
|
||||
* determinants, however this is not as bad as it seems because only 28 of
|
||||
* the total of 90 terms in the various matrices are non-zero. Nevertheless
|
||||
* Cramer's rule is notoriously numerically unstable because the determinant
|
||||
* calculation involves the difference of large, but similar, numbers. It is
|
||||
* difficult to be sure that the calculation is stable for real world values
|
||||
* and it is certain that it becomes unstable where the end points are close
|
||||
* together.
|
||||
*
|
||||
* So this code uses the perhaps slighly less optimal but more understandable
|
||||
* and totally obvious approach of calculating color-scale.
|
||||
*
|
||||
* This algorithm depends on the precision in white-scale and that is
|
||||
* (1/white-y), so we can immediately see that as white-y approaches 0 the
|
||||
* accuracy inherent in the cHRM chunk drops off substantially.
|
||||
*
|
||||
* libpng arithmetic: a simple invertion of the above equations
|
||||
* ------------------------------------------------------------
|
||||
*
|
||||
* white_scale = 1/white-y
|
||||
* white-X = white-x * white-scale
|
||||
* white-Y = 1.0
|
||||
* white-Z = (1 - white-x - white-y) * white_scale
|
||||
*
|
||||
* white-C = red-C + green-C + blue-C
|
||||
* = red-c*red-scale + green-c*green-scale + blue-c*blue-scale
|
||||
*
|
||||
* This gives us three equations in (red-scale,green-scale,blue-scale) where
|
||||
* all the coefficients are now known:
|
||||
*
|
||||
* red-x*red-scale + green-x*green-scale + blue-x*blue-scale
|
||||
* = white-x/white-y
|
||||
* red-y*red-scale + green-y*green-scale + blue-y*blue-scale = 1
|
||||
* red-z*red-scale + green-z*green-scale + blue-z*blue-scale
|
||||
* = (1 - white-x - white-y)/white-y
|
||||
*
|
||||
* In the last equation color-z is (1 - color-x - color-y) so we can add all
|
||||
* three equations together to get an alternative third:
|
||||
*
|
||||
* red-scale + green-scale + blue-scale = 1/white-y = white-scale
|
||||
*
|
||||
* So now we have a Cramer's rule solution where the determinants are just
|
||||
* 3x3 - far more tractible. Unfortunately 3x3 determinants still involve
|
||||
* multiplication of three coefficients so we can't guarantee to avoid
|
||||
* overflow in the libpng fixed point representation. Using Cramer's rule in
|
||||
* floating point is probably a good choice here, but it's not an option for
|
||||
* fixed point. Instead proceed to simplify the first two equations by
|
||||
* eliminating what is likely to be the largest value, blue-scale:
|
||||
*
|
||||
* blue-scale = white-scale - red-scale - green-scale
|
||||
*
|
||||
* Hence:
|
||||
*
|
||||
* (red-x - blue-x)*red-scale + (green-x - blue-x)*green-scale =
|
||||
* (white-x - blue-x)*white-scale
|
||||
*
|
||||
* (red-y - blue-y)*red-scale + (green-y - blue-y)*green-scale =
|
||||
* 1 - blue-y*white-scale
|
||||
*
|
||||
* And now we can trivially solve for (red-scale,green-scale):
|
||||
*
|
||||
* green-scale =
|
||||
* (white-x - blue-x)*white-scale - (red-x - blue-x)*red-scale
|
||||
* -----------------------------------------------------------
|
||||
* green-x - blue-x
|
||||
*
|
||||
* red-scale =
|
||||
* 1 - blue-y*white-scale - (green-y - blue-y) * green-scale
|
||||
* ---------------------------------------------------------
|
||||
* red-y - blue-y
|
||||
*
|
||||
* Hence:
|
||||
*
|
||||
* red-scale =
|
||||
* ( (green-x - blue-x) * (white-y - blue-y) -
|
||||
* (green-y - blue-y) * (white-x - blue-x) ) / white-y
|
||||
* -------------------------------------------------------------------------
|
||||
* (green-x - blue-x)*(red-y - blue-y)-(green-y - blue-y)*(red-x - blue-x)
|
||||
*
|
||||
* green-scale =
|
||||
* ( (red-y - blue-y) * (white-x - blue-x) -
|
||||
* (red-x - blue-x) * (white-y - blue-y) ) / white-y
|
||||
* -------------------------------------------------------------------------
|
||||
* (green-x - blue-x)*(red-y - blue-y)-(green-y - blue-y)*(red-x - blue-x)
|
||||
*
|
||||
* Accuracy:
|
||||
* The input values have 5 decimal digits of accuracy. The values are all in
|
||||
* the range 0 < value < 1, so simple products are in the same range but may
|
||||
* need up to 10 decimal digits to preserve the original precision and avoid
|
||||
* underflow. Because we are using a 32-bit signed representation we cannot
|
||||
* match this; the best is a little over 9 decimal digits, less than 10.
|
||||
*
|
||||
* The approach used here is to preserve the maximum precision within the
|
||||
* signed representation. Because the red-scale calculation above uses the
|
||||
* difference between two products of values that must be in the range -1..+1
|
||||
* it is sufficient to divide the product by 7; ceil(100,000/32767*2). The
|
||||
* factor is irrelevant in the calculation because it is applied to both
|
||||
* numerator and denominator.
|
||||
*
|
||||
* Note that the values of the differences of the products of the
|
||||
* chromaticities in the above equations tend to be small, for example for
|
||||
* the sRGB chromaticities they are:
|
||||
*
|
||||
* red numerator: -0.04751
|
||||
* green numerator: -0.08788
|
||||
* denominator: -0.2241 (without white-y multiplication)
|
||||
*
|
||||
* The resultant Y coefficients from the chromaticities of some widely used
|
||||
* color space definitions are (to 15 decimal places):
|
||||
*
|
||||
* sRGB
|
||||
* 0.212639005871510 0.715168678767756 0.072192315360734
|
||||
* Kodak ProPhoto
|
||||
* 0.288071128229293 0.711843217810102 0.000085653960605
|
||||
* Adobe RGB
|
||||
* 0.297344975250536 0.627363566255466 0.075291458493998
|
||||
* Adobe Wide Gamut RGB
|
||||
* 0.258728243040113 0.724682314948566 0.016589442011321
|
||||
*/
|
||||
/* By the argument, above overflow should be impossible here. The return
|
||||
* value of 2 indicates an internal error to the caller.
|
||||
*/
|
||||
if (!png_muldiv(&left, xy.greenx-xy.bluex, xy.redy - xy.bluey, 7)) return 2;
|
||||
if (!png_muldiv(&right, xy.greeny-xy.bluey, xy.redx - xy.bluex, 7)) return 2;
|
||||
denominator = left - right;
|
||||
|
||||
/* Now find the red numerator. */
|
||||
if (!png_muldiv(&left, xy.greenx-xy.bluex, xy.whitey-xy.bluey, 7)) return 2;
|
||||
if (!png_muldiv(&right, xy.greeny-xy.bluey, xy.whitex-xy.bluex, 7)) return 2;
|
||||
|
||||
/* Overflow is possible here and it indicates an extreme set of PNG cHRM
|
||||
* chunk values. This calculation actually returns the reciprocal of the
|
||||
* scale value because this allows us to delay the multiplication of white-y
|
||||
* into the denominator, which tends to produce a small number.
|
||||
*/
|
||||
if (!png_muldiv(&red_inverse, xy.whitey, denominator, left-right) ||
|
||||
red_inverse <= xy.whitey /* r+g+b scales = white scale */)
|
||||
return 1;
|
||||
|
||||
/* Similarly for green_inverse: */
|
||||
if (!png_muldiv(&left, xy.redy-xy.bluey, xy.whitex-xy.bluex, 7)) return 2;
|
||||
if (!png_muldiv(&right, xy.redx-xy.bluex, xy.whitey-xy.bluey, 7)) return 2;
|
||||
if (!png_muldiv(&green_inverse, xy.whitey, denominator, left-right) ||
|
||||
green_inverse <= xy.whitey)
|
||||
return 1;
|
||||
|
||||
/* And the blue scale, the checks above guarantee this can't overflow but it
|
||||
* can still produce 0 for extreme cHRM values.
|
||||
*/
|
||||
blue_scale = png_reciprocal(xy.whitey) - png_reciprocal(red_inverse) -
|
||||
png_reciprocal(green_inverse);
|
||||
if (blue_scale <= 0) return 1;
|
||||
|
||||
|
||||
/* And fill in the png_XYZ: */
|
||||
if (!png_muldiv(&XYZ->redX, xy.redx, PNG_FP_1, red_inverse)) return 1;
|
||||
if (!png_muldiv(&XYZ->redY, xy.redy, PNG_FP_1, red_inverse)) return 1;
|
||||
if (!png_muldiv(&XYZ->redZ, PNG_FP_1 - xy.redx - xy.redy, PNG_FP_1,
|
||||
red_inverse))
|
||||
return 1;
|
||||
|
||||
if (!png_muldiv(&XYZ->greenX, xy.greenx, PNG_FP_1, green_inverse)) return 1;
|
||||
if (!png_muldiv(&XYZ->greenY, xy.greeny, PNG_FP_1, green_inverse)) return 1;
|
||||
if (!png_muldiv(&XYZ->greenZ, PNG_FP_1 - xy.greenx - xy.greeny, PNG_FP_1,
|
||||
green_inverse))
|
||||
return 1;
|
||||
|
||||
if (!png_muldiv(&XYZ->blueX, xy.bluex, blue_scale, PNG_FP_1)) return 1;
|
||||
if (!png_muldiv(&XYZ->blueY, xy.bluey, blue_scale, PNG_FP_1)) return 1;
|
||||
if (!png_muldiv(&XYZ->blueZ, PNG_FP_1 - xy.bluex - xy.bluey, blue_scale,
|
||||
PNG_FP_1))
|
||||
return 1;
|
||||
|
||||
return 0; /*success*/
|
||||
}
|
||||
|
||||
int png_XYZ_from_xy_checked(png_structp png_ptr, png_XYZ *XYZ, png_xy xy)
|
||||
{
|
||||
switch (png_XYZ_from_xy(XYZ, xy))
|
||||
{
|
||||
case 0: /* success */
|
||||
return 1;
|
||||
|
||||
case 1:
|
||||
/* The chunk may be technically valid, but we got png_fixed_point
|
||||
* overflow while trying to get XYZ values out of it. This is
|
||||
* entirely benign - the cHRM chunk is pretty extreme.
|
||||
*/
|
||||
png_warning(png_ptr,
|
||||
"extreme cHRM chunk cannot be converted to tristimulus values");
|
||||
break;
|
||||
|
||||
default:
|
||||
/* libpng is broken; this should be a warning but if it happens we
|
||||
* want error reports so for the moment it is an error.
|
||||
*/
|
||||
png_error(png_ptr, "internal error in png_XYZ_from_xy");
|
||||
break;
|
||||
}
|
||||
|
||||
/* ERROR RETURN */
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
void /* PRIVATE */
|
||||
png_check_IHDR(png_structp png_ptr,
|
||||
png_uint_32 width, png_uint_32 height, int bit_depth,
|
||||
@@ -946,16 +1303,9 @@ png_check_IHDR(png_structp png_ptr,
|
||||
/* Check an ASCII formated floating point value, see the more detailed
|
||||
* comments in pngpriv.h
|
||||
*/
|
||||
/* The following is used internally to preserve the 'valid' flag */
|
||||
/* The following is used internally to preserve the sticky flags */
|
||||
#define png_fp_add(state, flags) ((state) |= (flags))
|
||||
#define png_fp_set(state, value)\
|
||||
((state) = (value) | ((state) & PNG_FP_WAS_VALID))
|
||||
|
||||
/* Internal type codes: bits above the base state! */
|
||||
#define PNG_FP_SIGN 0 /* [+-] */
|
||||
#define PNG_FP_DOT 4 /* . */
|
||||
#define PNG_FP_DIGIT 8 /* [0123456789] */
|
||||
#define PNG_FP_E 12 /* [Ee] */
|
||||
#define png_fp_set(state, value) ((state) = (value) | ((state) & PNG_FP_STICKY))
|
||||
|
||||
int /* PRIVATE */
|
||||
png_check_fp_number(png_const_charp string, png_size_t size, int *statep,
|
||||
@@ -968,55 +1318,55 @@ png_check_fp_number(png_const_charp string, png_size_t size, int *statep,
|
||||
{
|
||||
int type;
|
||||
/* First find the type of the next character */
|
||||
switch (string[i])
|
||||
{
|
||||
char ch = string[i];
|
||||
|
||||
if (ch >= 48 && ch <= 57)
|
||||
type = PNG_FP_DIGIT;
|
||||
|
||||
else switch (ch)
|
||||
{
|
||||
case 43: case 45: type = PNG_FP_SIGN; break;
|
||||
case 46: type = PNG_FP_DOT; break;
|
||||
case 69: case 101: type = PNG_FP_E; break;
|
||||
default: goto PNG_FP_End;
|
||||
}
|
||||
case 43: type = PNG_FP_SAW_SIGN; break;
|
||||
case 45: type = PNG_FP_SAW_SIGN + PNG_FP_NEGATIVE; break;
|
||||
case 46: type = PNG_FP_SAW_DOT; break;
|
||||
case 48: type = PNG_FP_SAW_DIGIT; break;
|
||||
case 49: case 50: case 51: case 52:
|
||||
case 53: case 54: case 55: case 56:
|
||||
case 57: type = PNG_FP_SAW_DIGIT + PNG_FP_NONZERO; break;
|
||||
case 69:
|
||||
case 101: type = PNG_FP_SAW_E; break;
|
||||
default: goto PNG_FP_End;
|
||||
}
|
||||
|
||||
/* Now deal with this type according to the current
|
||||
* state, the type is arranged to not overlap the
|
||||
* bits of the PNG_FP_STATE.
|
||||
*/
|
||||
switch ((state & PNG_FP_STATE) + type)
|
||||
switch ((state & PNG_FP_STATE) + (type & PNG_FP_SAW_ANY))
|
||||
{
|
||||
case PNG_FP_INTEGER + PNG_FP_SIGN:
|
||||
case PNG_FP_INTEGER + PNG_FP_SAW_SIGN:
|
||||
if (state & PNG_FP_SAW_ANY)
|
||||
goto PNG_FP_End; /* not a part of the number */
|
||||
|
||||
png_fp_add(state, PNG_FP_SAW_SIGN);
|
||||
png_fp_add(state, type);
|
||||
break;
|
||||
|
||||
case PNG_FP_INTEGER + PNG_FP_DOT:
|
||||
case PNG_FP_INTEGER + PNG_FP_SAW_DOT:
|
||||
/* Ok as trailer, ok as lead of fraction. */
|
||||
if (state & PNG_FP_SAW_DOT) /* two dots */
|
||||
goto PNG_FP_End;
|
||||
|
||||
else if (state & PNG_FP_SAW_DIGIT) /* trailing dot? */
|
||||
png_fp_add(state, PNG_FP_SAW_DOT);
|
||||
png_fp_add(state, type);
|
||||
|
||||
else
|
||||
png_fp_set(state, PNG_FP_FRACTION | PNG_FP_SAW_DOT);
|
||||
png_fp_set(state, PNG_FP_FRACTION | type);
|
||||
|
||||
break;
|
||||
|
||||
case PNG_FP_INTEGER + PNG_FP_DIGIT:
|
||||
case PNG_FP_INTEGER + PNG_FP_SAW_DIGIT:
|
||||
if (state & PNG_FP_SAW_DOT) /* delayed fraction */
|
||||
png_fp_set(state, PNG_FP_FRACTION | PNG_FP_SAW_DOT);
|
||||
|
||||
png_fp_add(state, PNG_FP_SAW_DIGIT + PNG_FP_WAS_VALID);
|
||||
png_fp_add(state, type | PNG_FP_WAS_VALID);
|
||||
|
||||
break;
|
||||
case PNG_FP_INTEGER + PNG_FP_E:
|
||||
|
||||
case PNG_FP_INTEGER + PNG_FP_SAW_E:
|
||||
if ((state & PNG_FP_SAW_DIGIT) == 0)
|
||||
goto PNG_FP_End;
|
||||
|
||||
@@ -1024,17 +1374,17 @@ png_check_fp_number(png_const_charp string, png_size_t size, int *statep,
|
||||
|
||||
break;
|
||||
|
||||
/* case PNG_FP_FRACTION + PNG_FP_SIGN:
|
||||
goto PNG_FP_End; ** no sign in exponent */
|
||||
/* case PNG_FP_FRACTION + PNG_FP_SAW_SIGN:
|
||||
goto PNG_FP_End; ** no sign in fraction */
|
||||
|
||||
/* case PNG_FP_FRACTION + PNG_FP_DOT:
|
||||
/* case PNG_FP_FRACTION + PNG_FP_SAW_DOT:
|
||||
goto PNG_FP_End; ** Because SAW_DOT is always set */
|
||||
|
||||
case PNG_FP_FRACTION + PNG_FP_DIGIT:
|
||||
png_fp_add(state, PNG_FP_SAW_DIGIT + PNG_FP_WAS_VALID);
|
||||
case PNG_FP_FRACTION + PNG_FP_SAW_DIGIT:
|
||||
png_fp_add(state, type | PNG_FP_WAS_VALID);
|
||||
break;
|
||||
|
||||
case PNG_FP_FRACTION + PNG_FP_E:
|
||||
case PNG_FP_FRACTION + PNG_FP_SAW_E:
|
||||
/* This is correct because the trailing '.' on an
|
||||
* integer is handled above - so we can only get here
|
||||
* with the sequence ".E" (with no preceding digits).
|
||||
@@ -1046,7 +1396,7 @@ png_check_fp_number(png_const_charp string, png_size_t size, int *statep,
|
||||
|
||||
break;
|
||||
|
||||
case PNG_FP_EXPONENT + PNG_FP_SIGN:
|
||||
case PNG_FP_EXPONENT + PNG_FP_SAW_SIGN:
|
||||
if (state & PNG_FP_SAW_ANY)
|
||||
goto PNG_FP_End; /* not a part of the number */
|
||||
|
||||
@@ -1054,15 +1404,15 @@ png_check_fp_number(png_const_charp string, png_size_t size, int *statep,
|
||||
|
||||
break;
|
||||
|
||||
/* case PNG_FP_EXPONENT + PNG_FP_DOT:
|
||||
/* case PNG_FP_EXPONENT + PNG_FP_SAW_DOT:
|
||||
goto PNG_FP_End; */
|
||||
|
||||
case PNG_FP_EXPONENT + PNG_FP_DIGIT:
|
||||
png_fp_add(state, PNG_FP_SAW_DIGIT + PNG_FP_WAS_VALID);
|
||||
case PNG_FP_EXPONENT + PNG_FP_SAW_DIGIT:
|
||||
png_fp_add(state, PNG_FP_SAW_DIGIT | PNG_FP_WAS_VALID);
|
||||
|
||||
break;
|
||||
|
||||
/* case PNG_FP_EXPONEXT + PNG_FP_E:
|
||||
/* case PNG_FP_EXPONEXT + PNG_FP_SAW_E:
|
||||
goto PNG_FP_End; */
|
||||
|
||||
default: goto PNG_FP_End; /* I.e. break 2 */
|
||||
@@ -1090,8 +1440,11 @@ png_check_fp_string(png_const_charp string, png_size_t size)
|
||||
int state=0;
|
||||
png_size_t char_index=0;
|
||||
|
||||
return png_check_fp_number(string, size, &state, &char_index) &&
|
||||
(char_index == size || string[char_index] == 0);
|
||||
if (png_check_fp_number(string, size, &state, &char_index) &&
|
||||
(char_index == size || string[char_index] == 0))
|
||||
return state /* must be non-zero - see above */;
|
||||
|
||||
return 0; /* i.e. fail */
|
||||
}
|
||||
#endif /* pCAL or sCAL */
|
||||
|
||||
@@ -1387,18 +1740,30 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size,
|
||||
size -= cdigits;
|
||||
|
||||
*ascii++ = 69, --size; /* 'E': PLUS 1 TOTAL 2+precision */
|
||||
if (exp_b10 < 0)
|
||||
{
|
||||
*ascii++ = 45, --size; /* '-': PLUS 1 TOTAL 3+precision */
|
||||
exp_b10 = -exp_b10;
|
||||
}
|
||||
|
||||
cdigits = 0;
|
||||
|
||||
while (exp_b10 > 0)
|
||||
/* The following use of an unsigned temporary avoids ambiguities in
|
||||
* the signed arithmetic on exp_b10 and permits GCC at least to do
|
||||
* better optimization.
|
||||
*/
|
||||
{
|
||||
exponent[cdigits++] = (char)(48 + exp_b10 % 10);
|
||||
exp_b10 /= 10;
|
||||
unsigned int uexp_b10;
|
||||
|
||||
if (exp_b10 < 0)
|
||||
{
|
||||
*ascii++ = 45, --size; /* '-': PLUS 1 TOTAL 3+precision */
|
||||
uexp_b10 = -exp_b10;
|
||||
}
|
||||
|
||||
else
|
||||
uexp_b10 = exp_b10;
|
||||
|
||||
cdigits = 0;
|
||||
|
||||
while (uexp_b10 > 0)
|
||||
{
|
||||
exponent[cdigits++] = (char)(48 + uexp_b10 % 10);
|
||||
uexp_b10 /= 10;
|
||||
}
|
||||
}
|
||||
|
||||
/* Need another size check here for the exponent digits, so
|
||||
@@ -1456,7 +1821,7 @@ png_ascii_from_fixed(png_structp png_ptr, png_charp ascii, png_size_t size,
|
||||
else
|
||||
num = fp;
|
||||
|
||||
if (num <= 0x80000000U) /* else overflowed */
|
||||
if (num <= 0x80000000) /* else overflowed */
|
||||
{
|
||||
unsigned int ndigits = 0, first = 16 /* flag value */;
|
||||
char digits[10];
|
||||
@@ -1845,7 +2210,7 @@ png_8bit_l2[128] =
|
||||
#endif
|
||||
};
|
||||
|
||||
static png_int_32
|
||||
PNG_STATIC png_int_32
|
||||
png_log8bit(unsigned int x)
|
||||
{
|
||||
unsigned int lg2 = 0;
|
||||
@@ -1901,7 +2266,7 @@ png_log8bit(unsigned int x)
|
||||
* Zero (257): 0
|
||||
* End (258): 23499
|
||||
*/
|
||||
static png_int_32
|
||||
PNG_STATIC png_int_32
|
||||
png_log16bit(png_uint_32 x)
|
||||
{
|
||||
unsigned int lg2 = 0;
|
||||
@@ -1995,7 +2360,7 @@ for (i=11;i>=0;--i){ print i, " ", (1 - e(-(2^i)/65536*l(2))) * 2^(32-i), "\n"}
|
||||
0 45425.85339951654943850496
|
||||
#endif
|
||||
|
||||
static png_uint_32
|
||||
PNG_STATIC png_uint_32
|
||||
png_exp(png_fixed_point x)
|
||||
{
|
||||
if (x > 0 && x <= 0xfffff) /* Else overflow or zero (underflow) */
|
||||
@@ -2043,7 +2408,7 @@ png_exp(png_fixed_point x)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static png_byte
|
||||
PNG_STATIC png_byte
|
||||
png_exp8bit(png_fixed_point lg2)
|
||||
{
|
||||
/* Get a 32-bit value: */
|
||||
@@ -2057,7 +2422,7 @@ png_exp8bit(png_fixed_point lg2)
|
||||
return (png_byte)((x + 0x7fffffU) >> 24);
|
||||
}
|
||||
|
||||
static png_uint_16
|
||||
PNG_STATIC png_uint_16
|
||||
png_exp16bit(png_fixed_point lg2)
|
||||
{
|
||||
/* Get a 32-bit value: */
|
||||
@@ -2298,6 +2663,60 @@ png_build_8bit_table(png_structp png_ptr, png_bytepp ptable,
|
||||
table[i] = (png_byte)i;
|
||||
}
|
||||
|
||||
/* Used from png_read_destroy and below to release the memory used by the gamma
|
||||
* tables.
|
||||
*/
|
||||
void /* PRIVATE */
|
||||
png_destroy_gamma_table(png_structp png_ptr)
|
||||
{
|
||||
png_free(png_ptr, png_ptr->gamma_table);
|
||||
png_ptr->gamma_table = NULL;
|
||||
|
||||
if (png_ptr->gamma_16_table != NULL)
|
||||
{
|
||||
int i;
|
||||
int istop = (1 << (8 - png_ptr->gamma_shift));
|
||||
for (i = 0; i < istop; i++)
|
||||
{
|
||||
png_free(png_ptr, png_ptr->gamma_16_table[i]);
|
||||
}
|
||||
png_free(png_ptr, png_ptr->gamma_16_table);
|
||||
png_ptr->gamma_16_table = NULL;
|
||||
}
|
||||
|
||||
#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \
|
||||
defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \
|
||||
defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
|
||||
png_free(png_ptr, png_ptr->gamma_from_1);
|
||||
png_ptr->gamma_from_1 = NULL;
|
||||
png_free(png_ptr, png_ptr->gamma_to_1);
|
||||
png_ptr->gamma_to_1 = NULL;
|
||||
|
||||
if (png_ptr->gamma_16_from_1 != NULL)
|
||||
{
|
||||
int i;
|
||||
int istop = (1 << (8 - png_ptr->gamma_shift));
|
||||
for (i = 0; i < istop; i++)
|
||||
{
|
||||
png_free(png_ptr, png_ptr->gamma_16_from_1[i]);
|
||||
}
|
||||
png_free(png_ptr, png_ptr->gamma_16_from_1);
|
||||
png_ptr->gamma_16_from_1 = NULL;
|
||||
}
|
||||
if (png_ptr->gamma_16_to_1 != NULL)
|
||||
{
|
||||
int i;
|
||||
int istop = (1 << (8 - png_ptr->gamma_shift));
|
||||
for (i = 0; i < istop; i++)
|
||||
{
|
||||
png_free(png_ptr, png_ptr->gamma_16_to_1[i]);
|
||||
}
|
||||
png_free(png_ptr, png_ptr->gamma_16_to_1);
|
||||
png_ptr->gamma_16_to_1 = NULL;
|
||||
}
|
||||
#endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */
|
||||
}
|
||||
|
||||
/* We build the 8- or 16-bit gamma tables here. Note that for 16-bit
|
||||
* tables, we don't make a full table if we are reducing to 8-bit in
|
||||
* the future. Note also how the gamma_16 tables are segmented so that
|
||||
@@ -2308,6 +2727,18 @@ png_build_gamma_table(png_structp png_ptr, int bit_depth)
|
||||
{
|
||||
png_debug(1, "in png_build_gamma_table");
|
||||
|
||||
/* Remove any existing table; this copes with multiple calls to
|
||||
* png_read_update_info. The warning is because building the gamma tables
|
||||
* multiple times is a performance hit - it's harmless but the ability to call
|
||||
* png_read_update_info() multiple times is new in 1.5.6 so it seems sensible
|
||||
* to warn if the app introduces such a hit.
|
||||
*/
|
||||
if (png_ptr->gamma_table != NULL || png_ptr->gamma_16_table != NULL)
|
||||
{
|
||||
png_warning(png_ptr, "gamma table being rebuilt");
|
||||
png_destroy_gamma_table(png_ptr);
|
||||
}
|
||||
|
||||
if (bit_depth <= 8)
|
||||
{
|
||||
png_build_8bit_table(png_ptr, &png_ptr->gamma_table,
|
||||
@@ -2369,7 +2800,7 @@ png_build_gamma_table(png_structp png_ptr, int bit_depth)
|
||||
else
|
||||
shift = 0; /* keep all 16 bits */
|
||||
|
||||
if (png_ptr->transformations & (PNG_16_TO_8 | PNG_CHOP_16_TO_8))
|
||||
if (png_ptr->transformations & (PNG_16_TO_8 | PNG_SCALE_16_TO_8))
|
||||
{
|
||||
/* PNG_MAX_GAMMA_8 is the number of bits to keep - effectively
|
||||
* the significant bits in the *input* when the output will
|
||||
@@ -2385,12 +2816,12 @@ png_build_gamma_table(png_structp png_ptr, int bit_depth)
|
||||
png_ptr->gamma_shift = shift;
|
||||
|
||||
#ifdef PNG_16BIT_SUPPORTED
|
||||
/* NOTE: prior to 1.5.3 this test used to include PNG_BACKGROUND (now
|
||||
/* NOTE: prior to 1.5.4 this test used to include PNG_BACKGROUND (now
|
||||
* PNG_COMPOSE). This effectively smashed the background calculation for
|
||||
* 16-bit output because the 8-bit table assumes the result will be reduced
|
||||
* to 8 bits.
|
||||
*/
|
||||
if (png_ptr->transformations & (PNG_16_TO_8 | PNG_CHOP_16_TO_8))
|
||||
if (png_ptr->transformations & (PNG_16_TO_8 | PNG_SCALE_16_TO_8))
|
||||
#endif
|
||||
png_build_16to8_table(png_ptr, &png_ptr->gamma_16_table, shift,
|
||||
png_ptr->screen_gamma > 0 ? png_product2(png_ptr->gamma,
|
||||
|
||||
121
png.h
121
png.h
@@ -1,7 +1,7 @@
|
||||
|
||||
/* png.h - header file for PNG reference library
|
||||
*
|
||||
* libpng version 1.5.4beta03 - June 15, 2011
|
||||
* libpng version 1.5.6rc02 - October 27, 2011
|
||||
* Copyright (c) 1998-2011 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
@@ -11,7 +11,7 @@
|
||||
* Authors and maintainers:
|
||||
* 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.97, January 1998, through 1.5.4beta03 - June 15, 2011: Glenn
|
||||
* libpng versions 0.97, January 1998, through 1.5.6rc02 - October 27, 2011: Glenn
|
||||
* See also "Contributing Authors", below.
|
||||
*
|
||||
* Note about libpng version numbers:
|
||||
@@ -154,7 +154,14 @@
|
||||
* 1.5.3rc01-02 15 10503 15.so.15.3[.0]
|
||||
* 1.5.3beta11 15 10503 15.so.15.3[.0]
|
||||
* 1.5.3 [omitted]
|
||||
* 1.5.4beta01-03 15 10504 15.so.15.4[.0]
|
||||
* 1.5.4beta01-08 15 10504 15.so.15.4[.0]
|
||||
* 1.5.4rc01 15 10504 15.so.15.4[.0]
|
||||
* 1.5.4 15 10504 15.so.15.4[.0]
|
||||
* 1.5.5beta01-08 15 10505 15.so.15.5[.0]
|
||||
* 1.5.5rc01 15 10505 15.so.15.5[.0]
|
||||
* 1.5.5 15 10505 15.so.15.5[.0]
|
||||
* 1.5.6beta01-07 15 10506 15.so.15.6[.0]
|
||||
* 1.5.6rc01-02 15 10506 15.so.15.6[.0]
|
||||
*
|
||||
* Henceforth the source version will match the shared-library major
|
||||
* and minor numbers; the shared-library major version number will be
|
||||
@@ -186,7 +193,7 @@
|
||||
*
|
||||
* This code is released under the libpng license.
|
||||
*
|
||||
* libpng versions 1.2.6, August 15, 2004, through 1.5.4beta03, June 15, 2011, are
|
||||
* libpng versions 1.2.6, August 15, 2004, through 1.5.6rc02, October 27, 2011, are
|
||||
* Copyright (c) 2004, 2006-2011 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:
|
||||
@@ -298,13 +305,13 @@
|
||||
* Y2K compliance in libpng:
|
||||
* =========================
|
||||
*
|
||||
* June 15, 2011
|
||||
* October 27, 2011
|
||||
*
|
||||
* Since the PNG Development group is an ad-hoc body, we can't make
|
||||
* an official declaration.
|
||||
*
|
||||
* This is your unofficial assurance that libpng from version 0.71 and
|
||||
* upward through 1.5.4beta03 are Y2K compliant. It is my belief that
|
||||
* upward through 1.5.6rc02 are Y2K compliant. It is my belief that
|
||||
* earlier versions were also Y2K compliant.
|
||||
*
|
||||
* Libpng only has two year fields. One is a 2-byte unsigned integer
|
||||
@@ -359,9 +366,9 @@
|
||||
*/
|
||||
|
||||
/* Version information for png.h - this should match the version in png.c */
|
||||
#define PNG_LIBPNG_VER_STRING "1.5.4beta03"
|
||||
#define PNG_LIBPNG_VER_STRING "1.5.6rc02"
|
||||
#define PNG_HEADER_VERSION_STRING \
|
||||
" libpng version 1.5.4beta03 - June 15, 2011\n"
|
||||
" libpng version 1.5.6rc02 - October 27, 2011\n"
|
||||
|
||||
#define PNG_LIBPNG_VER_SONUM 15
|
||||
#define PNG_LIBPNG_VER_DLLNUM 15
|
||||
@@ -369,12 +376,12 @@
|
||||
/* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
|
||||
#define PNG_LIBPNG_VER_MAJOR 1
|
||||
#define PNG_LIBPNG_VER_MINOR 5
|
||||
#define PNG_LIBPNG_VER_RELEASE 4
|
||||
#define PNG_LIBPNG_VER_RELEASE 6
|
||||
/* This should match the numeric part of the final component of
|
||||
* PNG_LIBPNG_VER_STRING, omitting any leading zero:
|
||||
*/
|
||||
|
||||
#define PNG_LIBPNG_VER_BUILD 03
|
||||
#define PNG_LIBPNG_VER_BUILD 02
|
||||
|
||||
/* Release Status */
|
||||
#define PNG_LIBPNG_BUILD_ALPHA 1
|
||||
@@ -399,7 +406,7 @@
|
||||
* 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
|
||||
*/
|
||||
#define PNG_LIBPNG_VER 10504 /* 1.5.4 */
|
||||
#define PNG_LIBPNG_VER 10506 /* 1.5.6 */
|
||||
|
||||
/* Library configuration: these options cannot be changed after
|
||||
* the library has been built.
|
||||
@@ -521,7 +528,7 @@ extern "C" {
|
||||
/* This triggers a compiler error in png.c, if png.c and png.h
|
||||
* do not agree upon the version number.
|
||||
*/
|
||||
typedef char* png_libpng_version_1_5_4beta03;
|
||||
typedef char* png_libpng_version_1_5_6rc02;
|
||||
|
||||
/* Three color definitions. The order of the red, green, and blue, (and the
|
||||
* exact size) is not important, although the size of the fields need to
|
||||
@@ -791,7 +798,7 @@ typedef png_info FAR * FAR * png_infopp;
|
||||
#define PNG_INFO_iCCP 0x1000 /* ESR, 1.0.6 */
|
||||
#define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */
|
||||
#define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */
|
||||
#define PNG_INFO_IDAT 0x8000L /* ESR, 1.0.6 */
|
||||
#define PNG_INFO_IDAT 0x8000 /* ESR, 1.0.6 */
|
||||
|
||||
/* This is used for the transformation routines, as some of them
|
||||
* change these values for the row. It also should enable using
|
||||
@@ -900,8 +907,9 @@ PNG_FUNCTION(void, (PNGCAPI *png_longjmp_ptr), PNGARG((jmp_buf, int)), typedef);
|
||||
#define PNG_TRANSFORM_STRIP_FILLER_AFTER 0x1000 /* write only */
|
||||
/* Added to libpng-1.4.0 */
|
||||
#define PNG_TRANSFORM_GRAY_TO_RGB 0x2000 /* read only */
|
||||
/* Added to libpng-1.5.3 */
|
||||
/* Added to libpng-1.5.4 */
|
||||
#define PNG_TRANSFORM_EXPAND_16 0x4000 /* read only */
|
||||
#define PNG_TRANSFORM_SCALE_16 0x8000 /* read only */
|
||||
|
||||
/* Flags for MNG supported features */
|
||||
#define PNG_FLAG_MNG_EMPTY_PLTE 0x01
|
||||
@@ -1404,7 +1412,7 @@ PNG_EXPORT(46, void, png_set_invert_mono, (png_structp png_ptr));
|
||||
|
||||
#ifdef PNG_READ_BACKGROUND_SUPPORTED
|
||||
/* Handle alpha and tRNS by replacing with a background color. Prior to
|
||||
* libpng-1.5.3 this API must not be called before the PNG file header has been
|
||||
* libpng-1.5.4 this API must not be called before the PNG file header has been
|
||||
* read. Doing so will result in unexpected behavior and possible warnings or
|
||||
* errors if the PNG file contains a bKGD chunk.
|
||||
*/
|
||||
@@ -1422,15 +1430,15 @@ PNG_FIXED_EXPORT(215, void, png_set_background_fixed, (png_structp png_ptr,
|
||||
# define PNG_BACKGROUND_GAMMA_UNIQUE 3
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_16_TO_8_SUPPORTED
|
||||
/* The following is always done from 1.5.4: */
|
||||
#define PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED
|
||||
#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
|
||||
/* Scale a 16-bit depth file down to 8-bit, accurately. */
|
||||
PNG_EXPORT(48, void, png_set_strip_16, (png_structp png_ptr));
|
||||
# ifdef PNG_READ_CHOP_16_TO_8_SUPPORTED
|
||||
PNG_EXPORT(229, void, png_set_scale_16, (png_structp png_ptr));
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
|
||||
#define PNG_READ_16_TO_8 SUPPORTED /* Name prior to 1.5.4 */
|
||||
/* Strip the second byte of information from a 16-bit depth file. */
|
||||
PNG_EXPORT(229, void, png_set_chop_16, (png_structp png_ptr));
|
||||
# endif
|
||||
PNG_EXPORT(48, void, png_set_strip_16, (png_structp png_ptr));
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_QUANTIZE_SUPPORTED
|
||||
@@ -1824,6 +1832,7 @@ PNG_EXPORT(219, png_size_t, png_process_data_pause, (png_structp, int save));
|
||||
*/
|
||||
PNG_EXPORT(220, png_uint_32, png_process_data_skip, (png_structp));
|
||||
|
||||
#ifdef PNG_READ_INTERLACING_SUPPORTED
|
||||
/* Function that combines rows. 'new_row' is a flag that should come from
|
||||
* the callback and be non-NULL if anything needs to be done; the library
|
||||
* stores its own version of the new data internally and ignores the passed
|
||||
@@ -1831,6 +1840,7 @@ PNG_EXPORT(220, png_uint_32, png_process_data_skip, (png_structp));
|
||||
*/
|
||||
PNG_EXPORT(93, void, png_progressive_combine_row, (png_structp png_ptr,
|
||||
png_bytep old_row, png_const_bytep new_row));
|
||||
#endif /* PNG_READ_INTERLACING_SUPPORTED */
|
||||
#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
|
||||
|
||||
PNG_EXPORTA(94, png_voidp, png_malloc,
|
||||
@@ -2044,6 +2054,10 @@ PNG_FP_EXPORT(133, png_uint_32, png_get_cHRM, (png_const_structp png_ptr,
|
||||
png_const_infop info_ptr, double *white_x, double *white_y, double *red_x,
|
||||
double *red_y, double *green_x, double *green_y, double *blue_x,
|
||||
double *blue_y));
|
||||
PNG_FP_EXPORT(230, png_uint_32, png_get_cHRM_XYZ, (png_structp png_ptr,
|
||||
png_const_infop info_ptr, double *red_X, double *red_Y, double *red_Z,
|
||||
double *green_X, double *green_Y, double *green_Z, double *blue_X,
|
||||
double *blue_Y, double *blue_Z));
|
||||
#ifdef PNG_FIXED_POINT_SUPPORTED /* Otherwise not implemented */
|
||||
PNG_FIXED_EXPORT(134, png_uint_32, png_get_cHRM_fixed,
|
||||
(png_const_structp png_ptr,
|
||||
@@ -2053,6 +2067,13 @@ PNG_FIXED_EXPORT(134, png_uint_32, png_get_cHRM_fixed,
|
||||
png_fixed_point *int_green_y, png_fixed_point *int_blue_x,
|
||||
png_fixed_point *int_blue_y));
|
||||
#endif
|
||||
PNG_FIXED_EXPORT(231, png_uint_32, png_get_cHRM_XYZ_fixed,
|
||||
(png_structp png_ptr, png_const_infop info_ptr,
|
||||
png_fixed_point *int_red_X, png_fixed_point *int_red_Y,
|
||||
png_fixed_point *int_red_Z, png_fixed_point *int_green_X,
|
||||
png_fixed_point *int_green_Y, png_fixed_point *int_green_Z,
|
||||
png_fixed_point *int_blue_X, png_fixed_point *int_blue_Y,
|
||||
png_fixed_point *int_blue_Z));
|
||||
#endif
|
||||
|
||||
#ifdef PNG_cHRM_SUPPORTED
|
||||
@@ -2060,12 +2081,22 @@ PNG_FP_EXPORT(135, void, png_set_cHRM,
|
||||
(png_structp png_ptr, png_infop info_ptr,
|
||||
double white_x, double white_y, double red_x, double red_y, double green_x,
|
||||
double green_y, double blue_x, double blue_y));
|
||||
PNG_FP_EXPORT(232, void, png_set_cHRM_XYZ, (png_structp png_ptr,
|
||||
png_infop info_ptr, double red_X, double red_Y, double red_Z,
|
||||
double green_X, double green_Y, double green_Z, double blue_X,
|
||||
double blue_Y, double blue_Z));
|
||||
PNG_FIXED_EXPORT(136, void, png_set_cHRM_fixed, (png_structp png_ptr,
|
||||
png_infop info_ptr, png_fixed_point int_white_x,
|
||||
png_fixed_point int_white_y, png_fixed_point int_red_x,
|
||||
png_fixed_point int_red_y, png_fixed_point int_green_x,
|
||||
png_fixed_point int_green_y, png_fixed_point int_blue_x,
|
||||
png_fixed_point int_blue_y));
|
||||
PNG_FIXED_EXPORT(233, void, png_set_cHRM_XYZ_fixed, (png_structp png_ptr,
|
||||
png_infop info_ptr, png_fixed_point int_red_X, png_fixed_point int_red_Y,
|
||||
png_fixed_point int_red_Z, png_fixed_point int_green_X,
|
||||
png_fixed_point int_green_Y, png_fixed_point int_green_Z,
|
||||
png_fixed_point int_blue_X, png_fixed_point int_blue_Y,
|
||||
png_fixed_point int_blue_Z));
|
||||
#endif
|
||||
|
||||
#ifdef PNG_gAMA_SUPPORTED
|
||||
@@ -2278,15 +2309,21 @@ PNG_EXPORT(171, void, png_set_sCAL_s,
|
||||
/* Provide a list of chunks and how they are to be handled, if the built-in
|
||||
handling or default unknown chunk handling is not desired. Any chunks not
|
||||
listed will be handled in the default manner. The IHDR and IEND chunks
|
||||
must not be listed.
|
||||
keep = 0: follow default behaviour
|
||||
= 1: do not keep
|
||||
= 2: keep only if safe-to-copy
|
||||
= 3: keep even if unsafe-to-copy
|
||||
must not be listed. Because this turns off the default handling for chunks
|
||||
that would otherwise be recognized the behavior of libpng transformations may
|
||||
well become incorrect!
|
||||
keep = 0: PNG_HANDLE_CHUNK_AS_DEFAULT: follow default behavior
|
||||
= 1: PNG_HANDLE_CHUNK_NEVER: do not keep
|
||||
= 2: PNG_HANDLE_CHUNK_IF_SAFE: keep only if safe-to-copy
|
||||
= 3: PNG_HANDLE_CHUNK_ALWAYS: keep even if unsafe-to-copy
|
||||
*/
|
||||
PNG_EXPORT(172, void, png_set_keep_unknown_chunks,
|
||||
(png_structp png_ptr, int keep,
|
||||
png_const_bytep chunk_list, int num_chunks));
|
||||
|
||||
/* The handling code is returned; the result is therefore true (non-zero) if
|
||||
* special handling is required, false for the default handling.
|
||||
*/
|
||||
PNG_EXPORT(173, int, png_handle_as_unknown, (png_structp png_ptr,
|
||||
png_const_bytep chunk_name));
|
||||
#endif
|
||||
@@ -2426,8 +2463,16 @@ PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type,
|
||||
* full, image which appears in a given pass. 'pass' is in the range 0
|
||||
* to 6 and the result is in the range 0 to 7.
|
||||
*/
|
||||
#define PNG_PASS_START_ROW(pass) (((1U&~(pass))<<(3-((pass)>>1)))&7)
|
||||
#define PNG_PASS_START_COL(pass) (((1U& (pass))<<(3-(((pass)+1)>>1)))&7)
|
||||
#define PNG_PASS_START_ROW(pass) (((1&~(pass))<<(3-((pass)>>1)))&7)
|
||||
#define PNG_PASS_START_COL(pass) (((1& (pass))<<(3-(((pass)+1)>>1)))&7)
|
||||
|
||||
/* A macro to return the offset between pixels in the output row for a pair of
|
||||
* pixels in the input - effectively the inverse of the 'COL_SHIFT' macro that
|
||||
* follows. Note that ROW_OFFSET is the offset from one row to the next whereas
|
||||
* COL_OFFSET is from one column to the next, within a row.
|
||||
*/
|
||||
#define PNG_PASS_ROW_OFFSET(pass) ((pass)>2?(8>>(((pass)-1)>>1)):8)
|
||||
#define PNG_PASS_COL_OFFSET(pass) (1<<((7-(pass))>>1))
|
||||
|
||||
/* Two macros to help evaluate the number of rows or columns in each
|
||||
* pass. This is expressed as a shift - effectively log2 of the number or
|
||||
@@ -2462,8 +2507,8 @@ PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type,
|
||||
* the tile.
|
||||
*/
|
||||
#define PNG_PASS_MASK(pass,off) ( \
|
||||
((0x110145AFU>>(((7-(off))-(pass))<<2)) & 0xFU) | \
|
||||
((0x01145AF0U>>(((7-(off))-(pass))<<2)) & 0xF0U))
|
||||
((0x110145AF>>(((7-(off))-(pass))<<2)) & 0xF) | \
|
||||
((0x01145AF0>>(((7-(off))-(pass))<<2)) & 0xF0))
|
||||
|
||||
#define PNG_ROW_IN_INTERLACE_PASS(y, pass) \
|
||||
((PNG_PASS_MASK(pass,0) >> ((y)&7)) & 1)
|
||||
@@ -2489,14 +2534,14 @@ PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type,
|
||||
{ png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) \
|
||||
* (png_uint_16)(alpha) \
|
||||
+ (png_uint_16)(bg)*(png_uint_16)(255 \
|
||||
- (png_uint_16)(alpha)) + (png_uint_16)128); \
|
||||
- (png_uint_16)(alpha)) + 128); \
|
||||
(composite) = (png_byte)((temp + (temp >> 8)) >> 8); }
|
||||
|
||||
# define png_composite_16(composite, fg, alpha, bg) \
|
||||
{ png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) \
|
||||
* (png_uint_32)(alpha) \
|
||||
+ (png_uint_32)(bg)*(png_uint_32)(65535L \
|
||||
- (png_uint_32)(alpha)) + (png_uint_32)32768L); \
|
||||
+ (png_uint_32)(bg)*(65535 \
|
||||
- (png_uint_32)(alpha)) + 32768); \
|
||||
(composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); }
|
||||
|
||||
#else /* Standard method using integer division */
|
||||
@@ -2504,12 +2549,12 @@ PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type,
|
||||
# define png_composite(composite, fg, alpha, bg) \
|
||||
(composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) + \
|
||||
(png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \
|
||||
(png_uint_16)127) / 255)
|
||||
127) / 255)
|
||||
|
||||
# define png_composite_16(composite, fg, alpha, bg) \
|
||||
(composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \
|
||||
(png_uint_32)(bg)*(png_uint_32)(65535L - (png_uint_32)(alpha)) + \
|
||||
(png_uint_32)32767) / (png_uint_32)65535L)
|
||||
(png_uint_32)(bg)*(png_uint_32)(65535 - (png_uint_32)(alpha)) + \
|
||||
32767) / 65535)
|
||||
#endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */
|
||||
|
||||
#ifdef PNG_READ_INT_FUNCTIONS_SUPPORTED
|
||||
@@ -2573,7 +2618,7 @@ PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i));
|
||||
* scripts/symbols.def as well.
|
||||
*/
|
||||
#ifdef PNG_EXPORT_LAST_ORDINAL
|
||||
PNG_EXPORT_LAST_ORDINAL(229);
|
||||
PNG_EXPORT_LAST_ORDINAL(233);
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
81
pngconf.h
81
pngconf.h
@@ -1,7 +1,7 @@
|
||||
|
||||
/* pngconf.h - machine configurable file for libpng
|
||||
*
|
||||
* libpng version 1.5.4beta03 - June 15, 2011
|
||||
* libpng version 1.5.6rc02 - October 27, 2011
|
||||
*
|
||||
* Copyright (c) 1998-2011 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
@@ -164,7 +164,9 @@
|
||||
* 'type', compiler specific.
|
||||
*
|
||||
* PNG_DLL_EXPORT Set to the magic to use during a libpng build to
|
||||
* make a symbol exported from the DLL.
|
||||
* make a symbol exported from the DLL. Not used in the
|
||||
* public header files; see pngpriv.h for how it is used
|
||||
* in the libpng build.
|
||||
*
|
||||
* PNG_DLL_IMPORT Set to the magic to force the libpng symbols to come
|
||||
* from a DLL - used to define PNG_IMPEXP when
|
||||
@@ -258,25 +260,14 @@
|
||||
# define PNGAPI PNGCAPI
|
||||
#endif
|
||||
|
||||
/* The default for PNG_IMPEXP depends on whether the library is
|
||||
* being built or used.
|
||||
/* PNG_IMPEXP may be set on the compilation system command line or (if not set)
|
||||
* then in an internal header file when building the library, otherwise (when
|
||||
* using the library) it is set here.
|
||||
*/
|
||||
#ifndef PNG_IMPEXP
|
||||
# ifdef PNGLIB_BUILD
|
||||
/* Building the library */
|
||||
# if (defined(DLL_EXPORT)/*from libtool*/ ||\
|
||||
defined(_WINDLL) || defined(_DLL) || defined(__DLL__) ||\
|
||||
defined(_USRDLL) ||\
|
||||
defined(PNG_BUILD_DLL)) && defined(PNG_DLL_EXPORT)
|
||||
/* Building a DLL. */
|
||||
# define PNG_IMPEXP PNG_DLL_EXPORT
|
||||
# endif /* DLL */
|
||||
# else
|
||||
/* Using the library */
|
||||
# if defined(PNG_USE_DLL) && defined(PNG_DLL_IMPORT)
|
||||
/* This forces use of a DLL, disallowing static linking */
|
||||
# define PNG_IMPEXP PNG_DLL_IMPORT
|
||||
# endif
|
||||
# if defined(PNG_USE_DLL) && defined(PNG_DLL_IMPORT)
|
||||
/* This forces use of a DLL, disallowing static linking */
|
||||
# define PNG_IMPEXP PNG_DLL_IMPORT
|
||||
# endif
|
||||
|
||||
# ifndef PNG_IMPEXP
|
||||
@@ -356,25 +347,18 @@
|
||||
# ifndef PNG_ALLOCATED
|
||||
# define PNG_ALLOCATED __attribute__((__malloc__))
|
||||
# endif
|
||||
|
||||
/* This specifically protects structure members that should only be
|
||||
* accessed from within the library, therefore should be empty during
|
||||
* a library build.
|
||||
*/
|
||||
# ifndef PNGLIB_BUILD
|
||||
# ifndef PNG_DEPRECATED
|
||||
# define PNG_DEPRECATED __attribute__((__deprecated__))
|
||||
# ifndef PNG_DEPRECATED
|
||||
# define PNG_DEPRECATED __attribute__((__deprecated__))
|
||||
# endif
|
||||
# ifndef PNG_PRIVATE
|
||||
# if 0 /* Doesn't work so we use deprecated instead*/
|
||||
# define PNG_PRIVATE \
|
||||
__attribute__((warning("This function is not exported by libpng.")))
|
||||
# else
|
||||
# define PNG_PRIVATE \
|
||||
__attribute__((__deprecated__))
|
||||
# endif
|
||||
# ifndef PNG_PRIVATE
|
||||
# if 0 /* Doesn't work so we use deprecated instead*/
|
||||
# define PNG_PRIVATE \
|
||||
__attribute__((warning("This function is not exported by libpng.")))
|
||||
# else
|
||||
# define PNG_PRIVATE \
|
||||
__attribute__((__deprecated__))
|
||||
# endif
|
||||
# endif
|
||||
# endif /* PNGLIB_BUILD */
|
||||
# endif
|
||||
# endif /* __GNUC__ */
|
||||
|
||||
# if defined(_MSC_VER) && (_MSC_VER >= 1300)
|
||||
@@ -385,21 +369,16 @@
|
||||
# define PNG_NORETURN __declspec(noreturn)
|
||||
# endif
|
||||
# ifndef PNG_ALLOCATED
|
||||
# define PNG_ALLOCATED __declspec(restrict)
|
||||
# if defined(_MSC_VER) && (_MSC_VER >= 1300)
|
||||
# define PNG_ALLOCATED __declspec(restrict)
|
||||
# endif
|
||||
# endif
|
||||
# ifndef PNG_DEPRECATED
|
||||
# define PNG_DEPRECATED __declspec(deprecated)
|
||||
# endif
|
||||
# ifndef PNG_PRIVATE
|
||||
# define PNG_PRIVATE __declspec(deprecated)
|
||||
# endif
|
||||
|
||||
/* This specifically protects structure members that should only be
|
||||
* accessed from within the library, therefore should be empty during
|
||||
* a library build.
|
||||
*/
|
||||
# ifndef PNGLIB_BUILD
|
||||
# ifndef PNG_DEPRECATED
|
||||
# define PNG_DEPRECATED __declspec(deprecated)
|
||||
# endif
|
||||
# ifndef PNG_PRIVATE
|
||||
# define PNG_PRIVATE __declspec(deprecated)
|
||||
# endif
|
||||
# endif /* PNGLIB_BUILD */
|
||||
# endif /* _MSC_VER */
|
||||
#endif /* PNG_PEDANTIC_WARNINGS */
|
||||
|
||||
|
||||
18
pngerror.c
18
pngerror.c
@@ -1,7 +1,7 @@
|
||||
|
||||
/* pngerror.c - stub functions for i/o and memory allocation
|
||||
*
|
||||
* Last changed in libpng 1.5.4 [(PENDING RELEASE)]
|
||||
* Last changed in libpng 1.5.6 [(PENDING RELEASE)]
|
||||
* Copyright (c) 1998-2011 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
@@ -374,11 +374,14 @@ static void /* PRIVATE */
|
||||
png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp
|
||||
error_message)
|
||||
{
|
||||
int iout = 0, iin = 0;
|
||||
png_uint_32 chunk_name = png_ptr->chunk_name;
|
||||
int iout = 0, ishift = 24;
|
||||
|
||||
while (iin < 4)
|
||||
while (ishift >= 0)
|
||||
{
|
||||
int c = png_ptr->chunk_name[iin++];
|
||||
int c = (int)(chunk_name >> ishift) & 0xff;
|
||||
|
||||
ishift -= 8;
|
||||
if (isnonalpha(c))
|
||||
{
|
||||
buffer[iout++] = PNG_LITERAL_LEFT_SQUARE_BRACKET;
|
||||
@@ -389,7 +392,7 @@ png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp
|
||||
|
||||
else
|
||||
{
|
||||
buffer[iout++] = (png_byte)c;
|
||||
buffer[iout++] = (char)c;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -398,10 +401,11 @@ png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp
|
||||
|
||||
else
|
||||
{
|
||||
int iin = 0;
|
||||
|
||||
buffer[iout++] = ':';
|
||||
buffer[iout++] = ' ';
|
||||
|
||||
iin = 0;
|
||||
while (iin < PNG_MAX_ERROR_TEXT-1 && error_message[iin] != '\0')
|
||||
buffer[iout++] = error_message[iin++];
|
||||
|
||||
@@ -507,7 +511,7 @@ png_default_error,(png_structp png_ptr, png_const_charp error_message),
|
||||
{
|
||||
#ifdef PNG_CONSOLE_IO_SUPPORTED
|
||||
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
|
||||
/* Check on NULL only added in 1.5.3 */
|
||||
/* Check on NULL only added in 1.5.4 */
|
||||
if (error_message != NULL && *error_message == PNG_LITERAL_SHARP)
|
||||
{
|
||||
/* Strip "#nnnn " from beginning of error message. */
|
||||
|
||||
113
pngget.c
113
pngget.c
@@ -1,7 +1,7 @@
|
||||
|
||||
/* pngget.c - retrieval of values from info struct
|
||||
*
|
||||
* Last changed in libpng 1.5.1 [February 3, 2011]
|
||||
* Last changed in libpng 1.5.6 [(PENDING RELEASE)]
|
||||
* Copyright (c) 1998-2011 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
@@ -459,6 +459,65 @@ png_get_bKGD(png_const_structp png_ptr, png_infop info_ptr,
|
||||
#endif
|
||||
|
||||
#ifdef PNG_cHRM_SUPPORTED
|
||||
/* The XYZ APIs were added in 1.5.5 to take advantage of the code added at the
|
||||
* same time to correct the rgb grayscale coefficient defaults obtained from the
|
||||
* cHRM chunk in 1.5.4
|
||||
*/
|
||||
png_uint_32 PNGFAPI
|
||||
png_get_cHRM_XYZ_fixed(png_structp png_ptr, png_const_infop info_ptr,
|
||||
png_fixed_point *int_red_X, png_fixed_point *int_red_Y,
|
||||
png_fixed_point *int_red_Z, png_fixed_point *int_green_X,
|
||||
png_fixed_point *int_green_Y, png_fixed_point *int_green_Z,
|
||||
png_fixed_point *int_blue_X, png_fixed_point *int_blue_Y,
|
||||
png_fixed_point *int_blue_Z)
|
||||
{
|
||||
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM))
|
||||
{
|
||||
png_xy xy;
|
||||
png_XYZ XYZ;
|
||||
|
||||
png_debug1(1, "in %s retrieval function", "cHRM_XYZ");
|
||||
|
||||
xy.whitex = info_ptr->x_white;
|
||||
xy.whitey = info_ptr->y_white;
|
||||
xy.redx = info_ptr->x_red;
|
||||
xy.redy = info_ptr->y_red;
|
||||
xy.greenx = info_ptr->x_green;
|
||||
xy.greeny = info_ptr->y_green;
|
||||
xy.bluex = info_ptr->x_blue;
|
||||
xy.bluey = info_ptr->y_blue;
|
||||
|
||||
/* The *_checked function handles error reporting, so just return 0 if
|
||||
* there is a failure here.
|
||||
*/
|
||||
if (png_XYZ_from_xy_checked(png_ptr, &XYZ, xy))
|
||||
{
|
||||
if (int_red_X != NULL)
|
||||
*int_red_X = XYZ.redX;
|
||||
if (int_red_Y != NULL)
|
||||
*int_red_Y = XYZ.redY;
|
||||
if (int_red_Z != NULL)
|
||||
*int_red_Z = XYZ.redZ;
|
||||
if (int_green_X != NULL)
|
||||
*int_green_X = XYZ.greenX;
|
||||
if (int_green_Y != NULL)
|
||||
*int_green_Y = XYZ.greenY;
|
||||
if (int_green_Z != NULL)
|
||||
*int_green_Z = XYZ.greenZ;
|
||||
if (int_blue_X != NULL)
|
||||
*int_blue_X = XYZ.blueX;
|
||||
if (int_blue_Y != NULL)
|
||||
*int_blue_Y = XYZ.blueY;
|
||||
if (int_blue_Z != NULL)
|
||||
*int_blue_Z = XYZ.blueZ;
|
||||
|
||||
return (PNG_INFO_cHRM);
|
||||
}
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
# ifdef PNG_FLOATING_POINT_SUPPORTED
|
||||
png_uint_32 PNGAPI
|
||||
png_get_cHRM(png_const_structp png_ptr, png_const_infop info_ptr,
|
||||
@@ -490,6 +549,42 @@ png_get_cHRM(png_const_structp png_ptr, png_const_infop info_ptr,
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
png_uint_32 PNGAPI
|
||||
png_get_cHRM_XYZ(png_structp png_ptr, png_const_infop info_ptr,
|
||||
double *red_X, double *red_Y, double *red_Z, double *green_X,
|
||||
double *green_Y, double *green_Z, double *blue_X, double *blue_Y,
|
||||
double *blue_Z)
|
||||
{
|
||||
png_XYZ XYZ;
|
||||
|
||||
if (png_get_cHRM_XYZ_fixed(png_ptr, info_ptr,
|
||||
&XYZ.redX, &XYZ.redY, &XYZ.redZ, &XYZ.greenX, &XYZ.greenY, &XYZ.greenZ,
|
||||
&XYZ.blueX, &XYZ.blueY, &XYZ.blueZ) & PNG_INFO_cHRM)
|
||||
{
|
||||
if (red_X != NULL)
|
||||
*red_X = png_float(png_ptr, XYZ.redX, "cHRM red X");
|
||||
if (red_Y != NULL)
|
||||
*red_Y = png_float(png_ptr, XYZ.redY, "cHRM red Y");
|
||||
if (red_Z != NULL)
|
||||
*red_Z = png_float(png_ptr, XYZ.redZ, "cHRM red Z");
|
||||
if (green_X != NULL)
|
||||
*green_X = png_float(png_ptr, XYZ.greenX, "cHRM green X");
|
||||
if (green_Y != NULL)
|
||||
*green_Y = png_float(png_ptr, XYZ.greenY, "cHRM green Y");
|
||||
if (green_Z != NULL)
|
||||
*green_Z = png_float(png_ptr, XYZ.greenZ, "cHRM green Z");
|
||||
if (blue_X != NULL)
|
||||
*blue_X = png_float(png_ptr, XYZ.blueX, "cHRM blue X");
|
||||
if (blue_Y != NULL)
|
||||
*blue_Y = png_float(png_ptr, XYZ.blueY, "cHRM blue Y");
|
||||
if (blue_Z != NULL)
|
||||
*blue_Z = png_float(png_ptr, XYZ.blueZ, "cHRM blue Z");
|
||||
return (PNG_INFO_cHRM);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
# endif
|
||||
|
||||
# ifdef PNG_FIXED_POINT_SUPPORTED
|
||||
@@ -855,9 +950,8 @@ png_get_text(png_const_structp png_ptr, png_const_infop info_ptr,
|
||||
{
|
||||
if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0)
|
||||
{
|
||||
png_debug1(1, "in %s retrieval function",
|
||||
(png_ptr->chunk_name[0] == '\0' ? "text" :
|
||||
(png_const_charp)png_ptr->chunk_name));
|
||||
png_debug1(1, "in 0x%lx retrieval function",
|
||||
(unsigned long)png_ptr->chunk_name);
|
||||
|
||||
if (text_ptr != NULL)
|
||||
*text_ptr = info_ptr->text;
|
||||
@@ -971,10 +1065,9 @@ png_get_user_chunk_ptr(png_const_structp png_ptr)
|
||||
png_size_t PNGAPI
|
||||
png_get_compression_buffer_size(png_const_structp png_ptr)
|
||||
{
|
||||
return (png_ptr ? png_ptr->zbuf_size : 0L);
|
||||
return (png_ptr ? png_ptr->zbuf_size : 0);
|
||||
}
|
||||
|
||||
|
||||
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
|
||||
/* These functions were added to libpng 1.2.6 and were enabled
|
||||
* by default in libpng-1.4.0 */
|
||||
@@ -1016,16 +1109,14 @@ png_get_io_state (png_structp png_ptr)
|
||||
png_uint_32 PNGAPI
|
||||
png_get_io_chunk_type (png_const_structp png_ptr)
|
||||
{
|
||||
return ((png_ptr->chunk_name[0] << 24) +
|
||||
(png_ptr->chunk_name[1] << 16) +
|
||||
(png_ptr->chunk_name[2] << 8) +
|
||||
(png_ptr->chunk_name[3]));
|
||||
return png_ptr->chunk_name;
|
||||
}
|
||||
|
||||
png_const_bytep PNGAPI
|
||||
png_get_io_chunk_name (png_structp png_ptr)
|
||||
{
|
||||
return png_ptr->chunk_name;
|
||||
PNG_CSTRING_FROM_CHUNK(png_ptr->io_chunk_string, png_ptr->chunk_name);
|
||||
return png_ptr->io_chunk_string;
|
||||
}
|
||||
#endif /* ?PNG_IO_STATE_SUPPORTED */
|
||||
|
||||
|
||||
2
pngmem.c
2
pngmem.c
@@ -1,7 +1,7 @@
|
||||
|
||||
/* pngmem.c - stub functions for memory allocation
|
||||
*
|
||||
* Last changed in libpng 1.5.4 [(PENDING RELEASE)]
|
||||
* Last changed in libpng 1.5.4 [July 7, 2011]
|
||||
* Copyright (c) 1998-2011 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
|
||||
244
pngpread.c
244
pngpread.c
@@ -1,7 +1,7 @@
|
||||
|
||||
/* pngpread.c - read a png file in push mode
|
||||
*
|
||||
* Last changed in libpng 1.5.2 [March 31, 2011]
|
||||
* Last changed in libpng 1.5.6 [(PENDING RELEASE)]
|
||||
* Copyright (c) 1998-2011 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
@@ -208,61 +208,7 @@ png_push_read_sig(png_structp png_ptr, png_infop info_ptr)
|
||||
void /* PRIVATE */
|
||||
png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||
{
|
||||
PNG_IHDR;
|
||||
PNG_IDAT;
|
||||
PNG_IEND;
|
||||
PNG_PLTE;
|
||||
#ifdef PNG_READ_bKGD_SUPPORTED
|
||||
PNG_bKGD;
|
||||
#endif
|
||||
#ifdef PNG_READ_cHRM_SUPPORTED
|
||||
PNG_cHRM;
|
||||
#endif
|
||||
#ifdef PNG_READ_gAMA_SUPPORTED
|
||||
PNG_gAMA;
|
||||
#endif
|
||||
#ifdef PNG_READ_hIST_SUPPORTED
|
||||
PNG_hIST;
|
||||
#endif
|
||||
#ifdef PNG_READ_iCCP_SUPPORTED
|
||||
PNG_iCCP;
|
||||
#endif
|
||||
#ifdef PNG_READ_iTXt_SUPPORTED
|
||||
PNG_iTXt;
|
||||
#endif
|
||||
#ifdef PNG_READ_oFFs_SUPPORTED
|
||||
PNG_oFFs;
|
||||
#endif
|
||||
#ifdef PNG_READ_pCAL_SUPPORTED
|
||||
PNG_pCAL;
|
||||
#endif
|
||||
#ifdef PNG_READ_pHYs_SUPPORTED
|
||||
PNG_pHYs;
|
||||
#endif
|
||||
#ifdef PNG_READ_sBIT_SUPPORTED
|
||||
PNG_sBIT;
|
||||
#endif
|
||||
#ifdef PNG_READ_sCAL_SUPPORTED
|
||||
PNG_sCAL;
|
||||
#endif
|
||||
#ifdef PNG_READ_sRGB_SUPPORTED
|
||||
PNG_sRGB;
|
||||
#endif
|
||||
#ifdef PNG_READ_sPLT_SUPPORTED
|
||||
PNG_sPLT;
|
||||
#endif
|
||||
#ifdef PNG_READ_tEXt_SUPPORTED
|
||||
PNG_tEXt;
|
||||
#endif
|
||||
#ifdef PNG_READ_tIME_SUPPORTED
|
||||
PNG_tIME;
|
||||
#endif
|
||||
#ifdef PNG_READ_tRNS_SUPPORTED
|
||||
PNG_tRNS;
|
||||
#endif
|
||||
#ifdef PNG_READ_zTXt_SUPPORTED
|
||||
PNG_zTXt;
|
||||
#endif
|
||||
png_uint_32 chunk_name;
|
||||
|
||||
/* First we make sure we have enough data for the 4 byte chunk name
|
||||
* and the 4 byte chunk length before proceeding with decoding the
|
||||
@@ -273,6 +219,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||
if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
|
||||
{
|
||||
png_byte chunk_length[4];
|
||||
png_byte chunk_tag[4];
|
||||
|
||||
if (png_ptr->buffer_size < 8)
|
||||
{
|
||||
@@ -283,16 +230,27 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||
png_push_fill_buffer(png_ptr, chunk_length, 4);
|
||||
png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length);
|
||||
png_reset_crc(png_ptr);
|
||||
png_crc_read(png_ptr, png_ptr->chunk_name, 4);
|
||||
png_crc_read(png_ptr, chunk_tag, 4);
|
||||
png_ptr->chunk_name = PNG_CHUNK_FROM_STRING(chunk_tag);
|
||||
png_check_chunk_name(png_ptr, png_ptr->chunk_name);
|
||||
png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
|
||||
}
|
||||
|
||||
if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
|
||||
chunk_name = png_ptr->chunk_name;
|
||||
|
||||
if (chunk_name == png_IDAT)
|
||||
{
|
||||
/* This is here above the if/else case statement below because if the
|
||||
* unknown handling marks 'IDAT' as unknown then the IDAT handling case is
|
||||
* completely skipped.
|
||||
*
|
||||
* TODO: there must be a better way of doing this.
|
||||
*/
|
||||
if (png_ptr->mode & PNG_AFTER_IDAT)
|
||||
png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
|
||||
}
|
||||
|
||||
if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4))
|
||||
if (chunk_name == png_IHDR)
|
||||
{
|
||||
if (png_ptr->push_length != 13)
|
||||
png_error(png_ptr, "Invalid IHDR length");
|
||||
@@ -306,7 +264,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||
png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length);
|
||||
}
|
||||
|
||||
else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4))
|
||||
else if (chunk_name == png_IEND)
|
||||
{
|
||||
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
|
||||
{
|
||||
@@ -321,7 +279,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||
}
|
||||
|
||||
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
|
||||
else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name))
|
||||
else if (png_chunk_unknown_handling(png_ptr, chunk_name))
|
||||
{
|
||||
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
|
||||
{
|
||||
@@ -329,15 +287,15 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||
return;
|
||||
}
|
||||
|
||||
if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
|
||||
if (chunk_name == png_IDAT)
|
||||
png_ptr->mode |= PNG_HAVE_IDAT;
|
||||
|
||||
png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length);
|
||||
|
||||
if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
|
||||
if (chunk_name == png_PLTE)
|
||||
png_ptr->mode |= PNG_HAVE_PLTE;
|
||||
|
||||
else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
|
||||
else if (chunk_name == png_IDAT)
|
||||
{
|
||||
if (!(png_ptr->mode & PNG_HAVE_IHDR))
|
||||
png_error(png_ptr, "Missing IHDR before IDAT");
|
||||
@@ -349,7 +307,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||
}
|
||||
|
||||
#endif
|
||||
else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
|
||||
else if (chunk_name == png_PLTE)
|
||||
{
|
||||
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
|
||||
{
|
||||
@@ -359,7 +317,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||
png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length);
|
||||
}
|
||||
|
||||
else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
|
||||
else if (chunk_name == png_IDAT)
|
||||
{
|
||||
/* If we reach an IDAT chunk, this means we have read all of the
|
||||
* header chunks, and we can start reading the image (or if this
|
||||
@@ -395,7 +353,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||
}
|
||||
|
||||
#ifdef PNG_READ_gAMA_SUPPORTED
|
||||
else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4))
|
||||
else if (png_ptr->chunk_name == png_gAMA)
|
||||
{
|
||||
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
|
||||
{
|
||||
@@ -408,7 +366,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||
|
||||
#endif
|
||||
#ifdef PNG_READ_sBIT_SUPPORTED
|
||||
else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4))
|
||||
else if (png_ptr->chunk_name == png_sBIT)
|
||||
{
|
||||
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
|
||||
{
|
||||
@@ -421,7 +379,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||
|
||||
#endif
|
||||
#ifdef PNG_READ_cHRM_SUPPORTED
|
||||
else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4))
|
||||
else if (png_ptr->chunk_name == png_cHRM)
|
||||
{
|
||||
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
|
||||
{
|
||||
@@ -434,7 +392,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||
|
||||
#endif
|
||||
#ifdef PNG_READ_sRGB_SUPPORTED
|
||||
else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4))
|
||||
else if (chunk_name == png_sRGB)
|
||||
{
|
||||
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
|
||||
{
|
||||
@@ -447,7 +405,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||
|
||||
#endif
|
||||
#ifdef PNG_READ_iCCP_SUPPORTED
|
||||
else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4))
|
||||
else if (png_ptr->chunk_name == png_iCCP)
|
||||
{
|
||||
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
|
||||
{
|
||||
@@ -460,7 +418,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||
|
||||
#endif
|
||||
#ifdef PNG_READ_sPLT_SUPPORTED
|
||||
else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4))
|
||||
else if (chunk_name == png_sPLT)
|
||||
{
|
||||
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
|
||||
{
|
||||
@@ -473,7 +431,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||
|
||||
#endif
|
||||
#ifdef PNG_READ_tRNS_SUPPORTED
|
||||
else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4))
|
||||
else if (chunk_name == png_tRNS)
|
||||
{
|
||||
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
|
||||
{
|
||||
@@ -486,7 +444,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||
|
||||
#endif
|
||||
#ifdef PNG_READ_bKGD_SUPPORTED
|
||||
else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4))
|
||||
else if (chunk_name == png_bKGD)
|
||||
{
|
||||
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
|
||||
{
|
||||
@@ -499,7 +457,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||
|
||||
#endif
|
||||
#ifdef PNG_READ_hIST_SUPPORTED
|
||||
else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4))
|
||||
else if (chunk_name == png_hIST)
|
||||
{
|
||||
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
|
||||
{
|
||||
@@ -512,7 +470,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||
|
||||
#endif
|
||||
#ifdef PNG_READ_pHYs_SUPPORTED
|
||||
else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4))
|
||||
else if (chunk_name == png_pHYs)
|
||||
{
|
||||
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
|
||||
{
|
||||
@@ -525,7 +483,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||
|
||||
#endif
|
||||
#ifdef PNG_READ_oFFs_SUPPORTED
|
||||
else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4))
|
||||
else if (chunk_name == png_oFFs)
|
||||
{
|
||||
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
|
||||
{
|
||||
@@ -538,7 +496,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_pCAL_SUPPORTED
|
||||
else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4))
|
||||
else if (chunk_name == png_pCAL)
|
||||
{
|
||||
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
|
||||
{
|
||||
@@ -551,7 +509,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||
|
||||
#endif
|
||||
#ifdef PNG_READ_sCAL_SUPPORTED
|
||||
else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4))
|
||||
else if (chunk_name == png_sCAL)
|
||||
{
|
||||
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
|
||||
{
|
||||
@@ -564,7 +522,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||
|
||||
#endif
|
||||
#ifdef PNG_READ_tIME_SUPPORTED
|
||||
else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4))
|
||||
else if (chunk_name == png_tIME)
|
||||
{
|
||||
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
|
||||
{
|
||||
@@ -577,7 +535,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||
|
||||
#endif
|
||||
#ifdef PNG_READ_tEXt_SUPPORTED
|
||||
else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4))
|
||||
else if (chunk_name == png_tEXt)
|
||||
{
|
||||
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
|
||||
{
|
||||
@@ -590,7 +548,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||
|
||||
#endif
|
||||
#ifdef PNG_READ_zTXt_SUPPORTED
|
||||
else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4))
|
||||
else if (chunk_name == png_zTXt)
|
||||
{
|
||||
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
|
||||
{
|
||||
@@ -603,7 +561,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||
|
||||
#endif
|
||||
#ifdef PNG_READ_iTXt_SUPPORTED
|
||||
else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4))
|
||||
else if (chunk_name == png_iTXt)
|
||||
{
|
||||
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
|
||||
{
|
||||
@@ -809,11 +767,12 @@ png_push_restore_buffer(png_structp png_ptr, png_bytep buffer,
|
||||
void /* PRIVATE */
|
||||
png_push_read_IDAT(png_structp png_ptr)
|
||||
{
|
||||
PNG_IDAT;
|
||||
if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
|
||||
{
|
||||
png_byte chunk_length[4];
|
||||
png_byte chunk_tag[4];
|
||||
|
||||
/* TODO: this code can be commoned up with the same code in push_read */
|
||||
if (png_ptr->buffer_size < 8)
|
||||
{
|
||||
png_push_save_buffer(png_ptr);
|
||||
@@ -823,10 +782,11 @@ png_push_read_IDAT(png_structp png_ptr)
|
||||
png_push_fill_buffer(png_ptr, chunk_length, 4);
|
||||
png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length);
|
||||
png_reset_crc(png_ptr);
|
||||
png_crc_read(png_ptr, png_ptr->chunk_name, 4);
|
||||
png_crc_read(png_ptr, chunk_tag, 4);
|
||||
png_ptr->chunk_name = PNG_CHUNK_FROM_STRING(chunk_tag);
|
||||
png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
|
||||
|
||||
if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
|
||||
if (png_ptr->chunk_name != png_IDAT)
|
||||
{
|
||||
png_ptr->process_mode = PNG_READ_CHUNK_MODE;
|
||||
|
||||
@@ -838,6 +798,7 @@ png_push_read_IDAT(png_structp png_ptr)
|
||||
|
||||
png_ptr->idat_size = png_ptr->push_length;
|
||||
}
|
||||
|
||||
if (png_ptr->idat_size && png_ptr->save_buffer_size)
|
||||
{
|
||||
png_size_t save_size = png_ptr->save_buffer_size;
|
||||
@@ -1011,36 +972,56 @@ png_process_IDAT_data(png_structp png_ptr, png_bytep buffer,
|
||||
void /* PRIVATE */
|
||||
png_push_process_row(png_structp png_ptr)
|
||||
{
|
||||
png_ptr->row_info.color_type = png_ptr->color_type;
|
||||
png_ptr->row_info.width = png_ptr->iwidth;
|
||||
png_ptr->row_info.channels = png_ptr->channels;
|
||||
png_ptr->row_info.bit_depth = png_ptr->bit_depth;
|
||||
png_ptr->row_info.pixel_depth = png_ptr->pixel_depth;
|
||||
/* 1.5.6: row_info moved out of png_struct to a local here. */
|
||||
png_row_info row_info;
|
||||
|
||||
png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,
|
||||
png_ptr->row_info.width);
|
||||
row_info.width = png_ptr->iwidth; /* NOTE: width of current interlaced row */
|
||||
row_info.color_type = png_ptr->color_type;
|
||||
row_info.bit_depth = png_ptr->bit_depth;
|
||||
row_info.channels = png_ptr->channels;
|
||||
row_info.pixel_depth = png_ptr->pixel_depth;
|
||||
row_info.rowbytes = PNG_ROWBYTES(row_info.pixel_depth, row_info.width);
|
||||
|
||||
png_read_filter_row(png_ptr, &(png_ptr->row_info),
|
||||
png_ptr->row_buf + 1, png_ptr->prev_row + 1,
|
||||
(int)(png_ptr->row_buf[0]));
|
||||
if (png_ptr->row_buf[0] > PNG_FILTER_VALUE_NONE)
|
||||
{
|
||||
if (png_ptr->row_buf[0] < PNG_FILTER_VALUE_LAST)
|
||||
png_read_filter_row(&row_info, png_ptr->row_buf + 1,
|
||||
png_ptr->prev_row + 1, png_ptr->row_buf[0]);
|
||||
else
|
||||
png_error(png_ptr, "bad adaptive filter value");
|
||||
}
|
||||
|
||||
png_memcpy(png_ptr->prev_row, png_ptr->row_buf, png_ptr->rowbytes + 1);
|
||||
/* libpng 1.5.6: the following line was copying png_ptr->rowbytes before
|
||||
* 1.5.6, while the buffer really is this big in current versions of libpng
|
||||
* it may not be in the future, so this was changed just to copy the
|
||||
* interlaced row count:
|
||||
*/
|
||||
png_memcpy(png_ptr->prev_row, png_ptr->row_buf, row_info.rowbytes + 1);
|
||||
|
||||
#ifdef PNG_READ_TRANSFORMS_SUPPORTED
|
||||
if (png_ptr->transformations)
|
||||
png_do_read_transformations(png_ptr);
|
||||
png_do_read_transformations(png_ptr, &row_info);
|
||||
#endif
|
||||
|
||||
/* The transformed pixel depth should match the depth now in row_info. */
|
||||
if (png_ptr->transformed_pixel_depth == 0)
|
||||
{
|
||||
png_ptr->transformed_pixel_depth = row_info.pixel_depth;
|
||||
if (row_info.pixel_depth > png_ptr->maximum_pixel_depth)
|
||||
png_error(png_ptr, "progressive row overflow");
|
||||
}
|
||||
|
||||
else if (png_ptr->transformed_pixel_depth != row_info.pixel_depth)
|
||||
png_error(png_ptr, "internal progressive row size calculation error");
|
||||
|
||||
|
||||
#ifdef PNG_READ_INTERLACING_SUPPORTED
|
||||
/* Blow up interlaced rows to full size */
|
||||
if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
|
||||
{
|
||||
if (png_ptr->pass < 6)
|
||||
/* old interface (pre-1.0.9):
|
||||
png_do_read_interlace(&(png_ptr->row_info),
|
||||
png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations);
|
||||
*/
|
||||
png_do_read_interlace(png_ptr);
|
||||
png_do_read_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass,
|
||||
png_ptr->transformations);
|
||||
|
||||
switch (png_ptr->pass)
|
||||
{
|
||||
@@ -1223,20 +1204,20 @@ png_read_push_finish_row(png_structp png_ptr)
|
||||
/* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
|
||||
|
||||
/* Start of interlace block */
|
||||
PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
|
||||
static PNG_CONST png_byte FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
|
||||
|
||||
/* Offset to next interlace block */
|
||||
PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
|
||||
static PNG_CONST png_byte FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
|
||||
|
||||
/* Start of interlace block in the y direction */
|
||||
PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
|
||||
static PNG_CONST png_byte FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
|
||||
|
||||
/* Offset to next interlace block in the y direction */
|
||||
PNG_CONST int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
|
||||
static PNG_CONST png_byte FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
|
||||
|
||||
/* Height of interlace block. This is not currently used - if you need
|
||||
* it, uncomment it here and in png.h
|
||||
PNG_CONST int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1};
|
||||
static PNG_CONST png_byte FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1};
|
||||
*/
|
||||
|
||||
png_ptr->row_number++;
|
||||
@@ -1714,11 +1695,12 @@ png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32
|
||||
length)
|
||||
{
|
||||
png_uint_32 skip = 0;
|
||||
png_uint_32 chunk_name = png_ptr->chunk_name;
|
||||
|
||||
if (!(png_ptr->chunk_name[0] & 0x20))
|
||||
if (PNG_CHUNK_CRITICAL(chunk_name))
|
||||
{
|
||||
#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
|
||||
if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
|
||||
if (png_chunk_unknown_handling(png_ptr, chunk_name) !=
|
||||
PNG_HANDLE_CHUNK_ALWAYS
|
||||
#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
|
||||
&& png_ptr->read_user_chunk_fn == NULL
|
||||
@@ -1731,22 +1713,26 @@ png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32
|
||||
}
|
||||
|
||||
#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
|
||||
/* TODO: the code below is apparently just using the
|
||||
* png_struct::unknown_chunk member as a temporarily variable, it should be
|
||||
* possible to eliminate both it and the temporary buffer.
|
||||
*/
|
||||
if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS)
|
||||
{
|
||||
#ifdef PNG_MAX_MALLOC_64K
|
||||
if (length > (png_uint_32)65535L)
|
||||
if (length > 65535)
|
||||
{
|
||||
png_warning(png_ptr, "unknown chunk too large to fit in memory");
|
||||
skip = length - (png_uint_32)65535L;
|
||||
length = (png_uint_32)65535L;
|
||||
skip = length - 65535;
|
||||
length = 65535;
|
||||
}
|
||||
#endif
|
||||
png_memcpy((png_charp)png_ptr->unknown_chunk.name,
|
||||
(png_charp)png_ptr->chunk_name,
|
||||
png_sizeof(png_ptr->unknown_chunk.name));
|
||||
png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name) - 1]
|
||||
= '\0';
|
||||
/* This is just a record for the user; libpng doesn't use the character
|
||||
* form of the name.
|
||||
*/
|
||||
PNG_CSTRING_FROM_CHUNK(png_ptr->unknown_chunk.name, png_ptr->chunk_name);
|
||||
|
||||
/* The following cast should be safe because of the check above. */
|
||||
png_ptr->unknown_chunk.size = (png_size_t)length;
|
||||
|
||||
if (length == 0)
|
||||
@@ -1755,8 +1741,9 @@ png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32
|
||||
else
|
||||
{
|
||||
png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr,
|
||||
(png_size_t)length);
|
||||
png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length);
|
||||
png_ptr->unknown_chunk.size);
|
||||
png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data,
|
||||
png_ptr->unknown_chunk.size);
|
||||
}
|
||||
|
||||
#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
|
||||
@@ -1772,8 +1759,8 @@ png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32
|
||||
|
||||
if (ret == 0)
|
||||
{
|
||||
if (!(png_ptr->chunk_name[0] & 0x20))
|
||||
if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
|
||||
if (PNG_CHUNK_CRITICAL(png_ptr->chunk_name))
|
||||
if (png_chunk_unknown_handling(png_ptr, chunk_name) !=
|
||||
PNG_HANDLE_CHUNK_ALWAYS)
|
||||
png_chunk_error(png_ptr, "unknown critical chunk");
|
||||
png_set_unknown_chunks(png_ptr, info_ptr,
|
||||
@@ -1816,19 +1803,22 @@ png_push_have_row(png_structp png_ptr, png_bytep row)
|
||||
(int)png_ptr->pass);
|
||||
}
|
||||
|
||||
#ifdef PNG_READ_INTERLACING_SUPPORTED
|
||||
void PNGAPI
|
||||
png_progressive_combine_row (png_structp png_ptr, png_bytep old_row,
|
||||
png_const_bytep new_row)
|
||||
{
|
||||
PNG_CONST int FARDATA png_pass_dsp_mask[7] =
|
||||
{0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff};
|
||||
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
|
||||
if (new_row != NULL) /* new_row must == png_ptr->row_buf here. */
|
||||
png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]);
|
||||
/* new_row is a flag here - if it is NULL then the app callback was called
|
||||
* from an empty row (see the calls to png_struct::row_fn below), otherwise
|
||||
* it must be png_ptr->row_buf+1
|
||||
*/
|
||||
if (new_row != NULL)
|
||||
png_combine_row(png_ptr, old_row, 1/*display*/);
|
||||
}
|
||||
#endif /* PNG_READ_INTERLACING_SUPPORTED */
|
||||
|
||||
void PNGAPI
|
||||
png_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr,
|
||||
|
||||
433
pngpriv.h
433
pngpriv.h
@@ -6,7 +6,7 @@
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
*
|
||||
* Last changed in libpng 1.5.4 [(PENDING RELEASE)]
|
||||
* Last changed in libpng 1.5.6 [(PENDING RELEASE)]
|
||||
*
|
||||
* This code is released under the libpng license.
|
||||
* For conditions of distribution and use, see the disclaimer
|
||||
@@ -44,7 +44,11 @@
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
|
||||
#define PNGLIB_BUILD
|
||||
/* This is used to find 'offsetof', used below for alignment tests. */
|
||||
#include <stddef.h>
|
||||
|
||||
#define PNGLIB_BUILD /*libpng is being built, not used*/
|
||||
|
||||
#ifdef PNG_USER_CONFIG
|
||||
# include "pngusr.h"
|
||||
/* These should have been defined in pngusr.h */
|
||||
@@ -55,10 +59,80 @@
|
||||
# define PNG_USER_DLLFNAME_POSTFIX "Cb"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Is this a build of a DLL where compilation of the object modules requires
|
||||
* different preprocessor settings to those required for a simple library? If
|
||||
* so PNG_BUILD_DLL must be set.
|
||||
*
|
||||
* If libpng is used inside a DLL but that DLL does not export the libpng APIs
|
||||
* PNG_BUILD_DLL must not be set. To avoid the code below kicking in build a
|
||||
* static library of libpng then link the DLL against that.
|
||||
*/
|
||||
#ifndef PNG_BUILD_DLL
|
||||
# ifdef DLL_EXPORT
|
||||
/* This is set by libtool when files are compiled for a DLL; libtool
|
||||
* always compiles twice, even on systems where it isn't necessary. Set
|
||||
* PNG_BUILD_DLL in case it is necessary:
|
||||
*/
|
||||
# define PNG_BUILD_DLL
|
||||
# else
|
||||
# ifdef _WINDLL
|
||||
/* This is set by the Microsoft Visual Studio IDE in projects that
|
||||
* build a DLL. It can't easily be removed from those projects (it
|
||||
* isn't visible in the Visual Studio UI) so it is a fairly reliable
|
||||
* indication that PNG_IMPEXP needs to be set to the DLL export
|
||||
* attributes.
|
||||
*/
|
||||
# define PNG_BUILD_DLL
|
||||
# else
|
||||
# ifdef __DLL__
|
||||
/* This is set by the Borland C system when compiling for a DLL
|
||||
* (as above.)
|
||||
*/
|
||||
# define PNG_BUILD_DLL
|
||||
# else
|
||||
/* Add additional compiler cases here. */
|
||||
# endif
|
||||
# endif
|
||||
# endif
|
||||
#endif /* Setting PNG_BUILD_DLL if required */
|
||||
|
||||
/* See pngconf.h for more details: the builder of the library may set this on
|
||||
* the command line to the right thing for the specific compilation system or it
|
||||
* may be automagically set above (at present we know of no system where it does
|
||||
* need to be set on the command line.)
|
||||
*
|
||||
* PNG_IMPEXP must be set here when building the library to prevent pngconf.h
|
||||
* setting it to the "import" setting for a DLL build.
|
||||
*/
|
||||
#ifndef PNG_IMPEXP
|
||||
# ifdef PNG_BUILD_DLL
|
||||
# define PNG_IMPEXP PNG_DLL_EXPORT
|
||||
# else
|
||||
/* Not building a DLL, or the DLL doesn't require specific export
|
||||
* definitions.
|
||||
*/
|
||||
# define PNG_IMPEXP
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* No warnings for private or deprecated functions in the build: */
|
||||
#ifndef PNG_DEPRECATED
|
||||
# define PNG_DEPRECATED
|
||||
#endif
|
||||
#ifndef PNG_PRIVATE
|
||||
# define PNG_PRIVATE
|
||||
#endif
|
||||
|
||||
#include "png.h"
|
||||
#include "pnginfo.h"
|
||||
#include "pngstruct.h"
|
||||
|
||||
/* pngconf.h does not set PNG_DLL_EXPORT unless it is required, so: */
|
||||
#ifndef PNG_DLL_EXPORT
|
||||
# define PNG_DLL_EXPORT
|
||||
#endif
|
||||
|
||||
/* This is used for 16 bit gamma tables - only the top level pointers are const,
|
||||
* this could be changed:
|
||||
*/
|
||||
@@ -115,8 +189,15 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
|
||||
# define PNG_ZBUF_SIZE 65536L
|
||||
#endif
|
||||
|
||||
/* PNG_STATIC is used to mark internal file scope functions if they need to be
|
||||
* accessed for implementation tests (see the code in tests/?*).
|
||||
*/
|
||||
#ifndef PNG_STATIC
|
||||
# define PNG_STATIC static
|
||||
#endif
|
||||
|
||||
/* If warnings or errors are turned off the code is disabled or redirected here.
|
||||
* From 1.5.3 functions have been added to allow very limited formatting of
|
||||
* From 1.5.4 functions have been added to allow very limited formatting of
|
||||
* error and warning messages - this code will also be disabled here.
|
||||
*/
|
||||
#ifdef PNG_WARNINGS_SUPPORTED
|
||||
@@ -243,6 +324,52 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
|
||||
# define png_memset memset
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* These macros may need to be architecture dependent. */
|
||||
#define PNG_ALIGN_NONE 0 /* do not use data alignment */
|
||||
#define PNG_ALIGN_ALWAYS 1 /* assume unaligned accesses are OK */
|
||||
#ifdef offsetof
|
||||
# define PNG_ALIGN_OFFSET 2 /* use offsetof to determine alignment */
|
||||
#else
|
||||
# define PNG_ALIGN_OFFSET -1 /* prevent the use of this */
|
||||
#endif
|
||||
#define PNG_ALIGN_SIZE 3 /* use sizeof to determine alignment */
|
||||
|
||||
#ifndef PNG_ALIGN_TYPE
|
||||
/* Default to using aligned access optimizations and requiring alignment to a
|
||||
* multiple of the data type size. Override in a compiler specific fashion
|
||||
* if necessary by inserting tests here:
|
||||
*/
|
||||
# define PNG_ALIGN_TYPE PNG_ALIGN_SIZE
|
||||
#endif
|
||||
|
||||
#if PNG_ALIGN_TYPE == PNG_ALIGN_SIZE
|
||||
/* This is used because in some compiler implementations non-aligned
|
||||
* structure members are supported, so the offsetof approach below fails.
|
||||
* Set PNG_ALIGN_TO_SIZE=0 for compiler combinations where unaligned access
|
||||
* is good for performance. Do not do this unless you have tested the result
|
||||
* and understand it.
|
||||
*/
|
||||
# define png_alignof(type) (sizeof (type))
|
||||
#else
|
||||
# if PNG_ALIGN_TYPE == PNG_ALIGN_OFFSET
|
||||
# define png_alignof(type) offsetof(struct{char c; type t;}, t)
|
||||
# else
|
||||
# if PNG_ALIGN_TYPE == PNG_ALIGN_ALWAYS
|
||||
# define png_alignof(type) (1)
|
||||
# endif
|
||||
/* Else leave png_alignof undefined to prevent use thereof */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* This implicitly assumes alignment is always to a power of 2. */
|
||||
#ifdef png_alignof
|
||||
# define png_isaligned(ptr, type)\
|
||||
((((const char*)ptr-(const char*)0) & (png_alignof(type)-1)) == 0)
|
||||
#else
|
||||
# define png_isaligned(ptr, type) 0
|
||||
#endif
|
||||
|
||||
/* End of memory model/platform independent support */
|
||||
/* End of 1.5.0beta36 move from pngconf.h */
|
||||
|
||||
@@ -281,29 +408,28 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
|
||||
#define PNG_COMPOSE 0x0080 /* Was PNG_BACKGROUND */
|
||||
#define PNG_BACKGROUND_EXPAND 0x0100
|
||||
#define PNG_EXPAND_16 0x0200 /* Added to libpng 1.5.2 */
|
||||
#define PNG_16_TO_8 0x0400
|
||||
#define PNG_16_TO_8 0x0400 /* Becomes 'chop' in 1.5.4 */
|
||||
#define PNG_RGBA 0x0800
|
||||
#define PNG_EXPAND 0x1000
|
||||
#define PNG_GAMMA 0x2000
|
||||
#define PNG_GRAY_TO_RGB 0x4000
|
||||
#define PNG_FILLER 0x8000L
|
||||
#define PNG_PACKSWAP 0x10000L
|
||||
#define PNG_SWAP_ALPHA 0x20000L
|
||||
#define PNG_STRIP_ALPHA 0x40000L
|
||||
#define PNG_INVERT_ALPHA 0x80000L
|
||||
#define PNG_USER_TRANSFORM 0x100000L
|
||||
#define PNG_RGB_TO_GRAY_ERR 0x200000L
|
||||
#define PNG_RGB_TO_GRAY_WARN 0x400000L
|
||||
#define PNG_RGB_TO_GRAY 0x600000L /* two bits, RGB_TO_GRAY_ERR|WARN */
|
||||
#define PNG_ENCODE_ALPHA 0x800000L /* Added to libpng-1.5.3 */
|
||||
#define PNG_ADD_ALPHA 0x1000000L /* Added to libpng-1.2.7 */
|
||||
#define PNG_EXPAND_tRNS 0x2000000L /* Added to libpng-1.2.9 */
|
||||
#define PNG_CHOP_16_TO_8 0x4000000L
|
||||
/* 0x8000000L unused */
|
||||
/* 0x10000000L unused */
|
||||
/* 0x20000000L unused */
|
||||
/* 0x40000000L unused */
|
||||
|
||||
#define PNG_FILLER 0x8000
|
||||
#define PNG_PACKSWAP 0x10000
|
||||
#define PNG_SWAP_ALPHA 0x20000
|
||||
#define PNG_STRIP_ALPHA 0x40000
|
||||
#define PNG_INVERT_ALPHA 0x80000
|
||||
#define PNG_USER_TRANSFORM 0x100000
|
||||
#define PNG_RGB_TO_GRAY_ERR 0x200000
|
||||
#define PNG_RGB_TO_GRAY_WARN 0x400000
|
||||
#define PNG_RGB_TO_GRAY 0x600000 /* two bits, RGB_TO_GRAY_ERR|WARN */
|
||||
#define PNG_ENCODE_ALPHA 0x800000 /* Added to libpng-1.5.4 */
|
||||
#define PNG_ADD_ALPHA 0x1000000 /* Added to libpng-1.2.7 */
|
||||
#define PNG_EXPAND_tRNS 0x2000000 /* Added to libpng-1.2.9 */
|
||||
#define PNG_SCALE_16_TO_8 0x4000000 /* Added to libpng-1.5.4 */
|
||||
/* 0x8000000 unused */
|
||||
/* 0x10000000 unused */
|
||||
/* 0x20000000 unused */
|
||||
/* 0x40000000 unused */
|
||||
/* Flags for png_create_struct */
|
||||
#define PNG_STRUCT_PNG 0x0001
|
||||
#define PNG_STRUCT_INFO 0x0002
|
||||
@@ -325,25 +451,25 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
|
||||
#define PNG_FLAG_CRC_ANCILLARY_NOWARN 0x0200
|
||||
#define PNG_FLAG_CRC_CRITICAL_USE 0x0400
|
||||
#define PNG_FLAG_CRC_CRITICAL_IGNORE 0x0800
|
||||
#define PNG_FLAG_ASSUME_sRGB 0x1000 /* Added to libpng-1.5.3 */
|
||||
#define PNG_FLAG_OPTIMIZE_ALPHA 0x2000 /* Added to libpng-1.5.3 */
|
||||
#define PNG_FLAG_DETECT_UNINITIALIZED 0x4000 /* Added to libpng-1.5.3 */
|
||||
#define PNG_FLAG_KEEP_UNKNOWN_CHUNKS 0x8000L
|
||||
#define PNG_FLAG_KEEP_UNSAFE_CHUNKS 0x10000L
|
||||
#define PNG_FLAG_LIBRARY_MISMATCH 0x20000L
|
||||
#define PNG_FLAG_STRIP_ERROR_NUMBERS 0x40000L
|
||||
#define PNG_FLAG_STRIP_ERROR_TEXT 0x80000L
|
||||
#define PNG_FLAG_MALLOC_NULL_MEM_OK 0x100000L
|
||||
/* 0x200000L unused */
|
||||
/* 0x400000L unused */
|
||||
#define PNG_FLAG_BENIGN_ERRORS_WARN 0x800000L /* Added to libpng-1.4.0 */
|
||||
#define PNG_FLAG_ZTXT_CUSTOM_STRATEGY 0x1000000L /* 5 lines added */
|
||||
#define PNG_FLAG_ZTXT_CUSTOM_LEVEL 0x2000000L /* to libpng-1.5.3 */
|
||||
#define PNG_FLAG_ZTXT_CUSTOM_MEM_LEVEL 0x4000000L
|
||||
#define PNG_FLAG_ZTXT_CUSTOM_WINDOW_BITS 0x8000000L
|
||||
#define PNG_FLAG_ZTXT_CUSTOM_METHOD 0x10000000L
|
||||
/* 0x20000000L unused */
|
||||
/* 0x40000000L unused */
|
||||
#define PNG_FLAG_ASSUME_sRGB 0x1000 /* Added to libpng-1.5.4 */
|
||||
#define PNG_FLAG_OPTIMIZE_ALPHA 0x2000 /* Added to libpng-1.5.4 */
|
||||
#define PNG_FLAG_DETECT_UNINITIALIZED 0x4000 /* Added to libpng-1.5.4 */
|
||||
#define PNG_FLAG_KEEP_UNKNOWN_CHUNKS 0x8000
|
||||
#define PNG_FLAG_KEEP_UNSAFE_CHUNKS 0x10000
|
||||
#define PNG_FLAG_LIBRARY_MISMATCH 0x20000
|
||||
#define PNG_FLAG_STRIP_ERROR_NUMBERS 0x40000
|
||||
#define PNG_FLAG_STRIP_ERROR_TEXT 0x80000
|
||||
#define PNG_FLAG_MALLOC_NULL_MEM_OK 0x100000
|
||||
/* 0x200000 unused */
|
||||
/* 0x400000 unused */
|
||||
#define PNG_FLAG_BENIGN_ERRORS_WARN 0x800000 /* Added to libpng-1.4.0 */
|
||||
#define PNG_FLAG_ZTXT_CUSTOM_STRATEGY 0x1000000 /* 5 lines added */
|
||||
#define PNG_FLAG_ZTXT_CUSTOM_LEVEL 0x2000000 /* to libpng-1.5.4 */
|
||||
#define PNG_FLAG_ZTXT_CUSTOM_MEM_LEVEL 0x4000000
|
||||
#define PNG_FLAG_ZTXT_CUSTOM_WINDOW_BITS 0x8000000
|
||||
#define PNG_FLAG_ZTXT_CUSTOM_METHOD 0x10000000
|
||||
/* 0x20000000 unused */
|
||||
/* 0x40000000 unused */
|
||||
|
||||
#define PNG_FLAG_CRC_ANCILLARY_MASK (PNG_FLAG_CRC_ANCILLARY_USE | \
|
||||
PNG_FLAG_CRC_ANCILLARY_NOWARN)
|
||||
@@ -425,34 +551,72 @@ PNG_EXTERN png_fixed_point png_fixed PNGARG((png_structp png_ptr, double fp,
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Constant strings for known chunk types. If you need to add a chunk,
|
||||
* define the name here, and add an invocation of the macro wherever it's
|
||||
* needed.
|
||||
/* Constants for known chunk types. If you need to add a chunk, define the name
|
||||
* here. For historical reasons these constants have the form png_<name>; i.e.
|
||||
* the prefix is lower case. Please use decimal values as the parameters to
|
||||
* match the ISO PNG specification and to avoid relying on the C locale
|
||||
* interpretation of character values.
|
||||
*
|
||||
* Prior to 1.5.6 these constants were strings, as of 1.5.6 png_uint_32 values
|
||||
* are computed and a new macro (PNG_STRING_FROM_CHUNK) added to allow a string
|
||||
* to be generated if required.
|
||||
*
|
||||
* PNG_32b correctly produces a value shifted by up to 24 bits, even on
|
||||
* architectures where (int) is only 16 bits.
|
||||
*/
|
||||
#define PNG_IHDR PNG_CONST png_byte png_IHDR[5] = { 73, 72, 68, 82, '\0'}
|
||||
#define PNG_IDAT PNG_CONST png_byte png_IDAT[5] = { 73, 68, 65, 84, '\0'}
|
||||
#define PNG_IEND PNG_CONST png_byte png_IEND[5] = { 73, 69, 78, 68, '\0'}
|
||||
#define PNG_PLTE PNG_CONST png_byte png_PLTE[5] = { 80, 76, 84, 69, '\0'}
|
||||
#define PNG_bKGD PNG_CONST png_byte png_bKGD[5] = { 98, 75, 71, 68, '\0'}
|
||||
#define PNG_cHRM PNG_CONST png_byte png_cHRM[5] = { 99, 72, 82, 77, '\0'}
|
||||
#define PNG_gAMA PNG_CONST png_byte png_gAMA[5] = {103, 65, 77, 65, '\0'}
|
||||
#define PNG_hIST PNG_CONST png_byte png_hIST[5] = {104, 73, 83, 84, '\0'}
|
||||
#define PNG_iCCP PNG_CONST png_byte png_iCCP[5] = {105, 67, 67, 80, '\0'}
|
||||
#define PNG_iTXt PNG_CONST png_byte png_iTXt[5] = {105, 84, 88, 116, '\0'}
|
||||
#define PNG_oFFs PNG_CONST png_byte png_oFFs[5] = {111, 70, 70, 115, '\0'}
|
||||
#define PNG_pCAL PNG_CONST png_byte png_pCAL[5] = {112, 67, 65, 76, '\0'}
|
||||
#define PNG_sCAL PNG_CONST png_byte png_sCAL[5] = {115, 67, 65, 76, '\0'}
|
||||
#define PNG_pHYs PNG_CONST png_byte png_pHYs[5] = {112, 72, 89, 115, '\0'}
|
||||
#define PNG_sBIT PNG_CONST png_byte png_sBIT[5] = {115, 66, 73, 84, '\0'}
|
||||
#define PNG_sPLT PNG_CONST png_byte png_sPLT[5] = {115, 80, 76, 84, '\0'}
|
||||
#define PNG_sRGB PNG_CONST png_byte png_sRGB[5] = {115, 82, 71, 66, '\0'}
|
||||
#define PNG_sTER PNG_CONST png_byte png_sTER[5] = {115, 84, 69, 82, '\0'}
|
||||
#define PNG_tEXt PNG_CONST png_byte png_tEXt[5] = {116, 69, 88, 116, '\0'}
|
||||
#define PNG_tIME PNG_CONST png_byte png_tIME[5] = {116, 73, 77, 69, '\0'}
|
||||
#define PNG_tRNS PNG_CONST png_byte png_tRNS[5] = {116, 82, 78, 83, '\0'}
|
||||
#define PNG_zTXt PNG_CONST png_byte png_zTXt[5] = {122, 84, 88, 116, '\0'}
|
||||
#define PNG_32b(b,s) ((png_uint_32)(b) << (s))
|
||||
#define PNG_CHUNK(b1,b2,b3,b4) \
|
||||
(PNG_32b(b1,24) | PNG_32b(b2,16) | PNG_32b(b3,8) | PNG_32b(b4,0))
|
||||
|
||||
/* Gamma values (new at libpng-1.5.3): */
|
||||
#define png_IHDR PNG_CHUNK( 73, 72, 68, 82)
|
||||
#define png_IDAT PNG_CHUNK( 73, 68, 65, 84)
|
||||
#define png_IEND PNG_CHUNK( 73, 69, 78, 68)
|
||||
#define png_PLTE PNG_CHUNK( 80, 76, 84, 69)
|
||||
#define png_bKGD PNG_CHUNK( 98, 75, 71, 68)
|
||||
#define png_cHRM PNG_CHUNK( 99, 72, 82, 77)
|
||||
#define png_gAMA PNG_CHUNK(103, 65, 77, 65)
|
||||
#define png_hIST PNG_CHUNK(104, 73, 83, 84)
|
||||
#define png_iCCP PNG_CHUNK(105, 67, 67, 80)
|
||||
#define png_iTXt PNG_CHUNK(105, 84, 88, 116)
|
||||
#define png_oFFs PNG_CHUNK(111, 70, 70, 115)
|
||||
#define png_pCAL PNG_CHUNK(112, 67, 65, 76)
|
||||
#define png_sCAL PNG_CHUNK(115, 67, 65, 76)
|
||||
#define png_pHYs PNG_CHUNK(112, 72, 89, 115)
|
||||
#define png_sBIT PNG_CHUNK(115, 66, 73, 84)
|
||||
#define png_sPLT PNG_CHUNK(115, 80, 76, 84)
|
||||
#define png_sRGB PNG_CHUNK(115, 82, 71, 66)
|
||||
#define png_sTER PNG_CHUNK(115, 84, 69, 82)
|
||||
#define png_tEXt PNG_CHUNK(116, 69, 88, 116)
|
||||
#define png_tIME PNG_CHUNK(116, 73, 77, 69)
|
||||
#define png_tRNS PNG_CHUNK(116, 82, 78, 83)
|
||||
#define png_zTXt PNG_CHUNK(122, 84, 88, 116)
|
||||
|
||||
/* The following will work on (signed char*) strings, whereas the get_uint_32
|
||||
* macro will fail on top-bit-set values because of the sign extension.
|
||||
*/
|
||||
#define PNG_CHUNK_FROM_STRING(s)\
|
||||
PNG_CHUNK(0xff&(s)[0], 0xff&(s)[1], 0xff&(s)[2], 0xff&(s)[3])
|
||||
|
||||
/* This uses (char), not (png_byte) to avoid warnings on systems where (char) is
|
||||
* signed and the argument is a (char[]) This macro will fail miserably on
|
||||
* systems where (char) is more than 8 bits.
|
||||
*/
|
||||
#define PNG_STRING_FROM_CHUNK(s,c)\
|
||||
(void)(((char*)(s))[0]=(char)((c)>>24), ((char*)(s))[1]=(char)((c)>>16),\
|
||||
((char*)(s))[2]=(char)((c)>>8), ((char*)(s))[3]=(char)((c)))
|
||||
|
||||
/* Do the same but terminate with a null character. */
|
||||
#define PNG_CSTRING_FROM_CHUNK(s,c)\
|
||||
(void)(PNG_STRING_FROM_CHUNK(s,c), ((char*)(s))[4] = 0)
|
||||
|
||||
/* Test on flag values as defined in the spec (section 5.4): */
|
||||
#define PNG_CHUNK_ANCILLIARY(c) (1 & ((c) >> 29))
|
||||
#define PNG_CHUNK_CRITICAL(c) (!PNG_CHUNK_ANCILLIARY(c))
|
||||
#define PNG_CHUNK_PRIVATE(c) (1 & ((c) >> 21))
|
||||
#define PNG_CHUNK_RESERVED(c) (1 & ((c) >> 13))
|
||||
#define PNG_CHUNK_SAFE_TO_COPY(c) (1 & ((c) >> 5))
|
||||
|
||||
/* Gamma values (new at libpng-1.5.4): */
|
||||
#define PNG_GAMMA_MAC_OLD 151724 /* Assume '1.8' is really 2.2/1.45! */
|
||||
#define PNG_GAMMA_MAC_INVERSE 65909
|
||||
#define PNG_GAMMA_sRGB_INVERSE 45455
|
||||
@@ -707,17 +871,44 @@ PNG_EXTERN void png_write_finish_row PNGARG((png_structp png_ptr));
|
||||
/* Internal use only. Called before first row of data */
|
||||
PNG_EXTERN void png_write_start_row PNGARG((png_structp png_ptr));
|
||||
|
||||
/* Combine a row of data, dealing with alpha, etc. if requested */
|
||||
/* Combine a row of data, dealing with alpha, etc. if requested. 'row' is an
|
||||
* array of png_ptr->width pixels. If the image is not interlaced or this
|
||||
* is the final pass this just does a png_memcpy, otherwise the "display" flag
|
||||
* is used to determine whether to copy pixels that are not in the current pass.
|
||||
*
|
||||
* Because 'png_do_read_interlace' (below) replicates pixels this allows this
|
||||
* function to achieve the documented 'blocky' appearance during interlaced read
|
||||
* if display is 1 and the 'sparkle' appearance, where existing pixels in 'row'
|
||||
* are not changed if they are not in the current pass, when display is 0.
|
||||
*
|
||||
* 'display' must be 0 or 1, otherwise the memcpy will be done regardless.
|
||||
*
|
||||
* The API always reads from the png_struct row buffer and always assumes that
|
||||
* it is full width (png_do_read_interlace has already been called.)
|
||||
*
|
||||
* This function is only ever used to write to row buffers provided by the
|
||||
* caller of the relevant libpng API and the row must have already been
|
||||
* transformed by the read transformations.
|
||||
*
|
||||
* The PNG_USE_COMPILE_TIME_MASKS option causes generation of pre-computed
|
||||
* bitmasks for use within the code, otherwise runtime generated masks are used.
|
||||
* The default is compile time masks.
|
||||
*/
|
||||
#ifndef PNG_USE_COMPILE_TIME_MASKS
|
||||
# define PNG_USE_COMPILE_TIME_MASKS 1
|
||||
#endif
|
||||
PNG_EXTERN void png_combine_row PNGARG((png_structp png_ptr, png_bytep row,
|
||||
int mask));
|
||||
int display));
|
||||
|
||||
#ifdef PNG_READ_INTERLACING_SUPPORTED
|
||||
/* Expand an interlaced row */
|
||||
/* OLD pre-1.0.9 interface:
|
||||
/* Expand an interlaced row: the 'row_info' describes the pass data that has
|
||||
* been read in and must correspond to the pixels in 'row', the pixels are
|
||||
* expanded (moved apart) in 'row' to match the final layout, when doing this
|
||||
* the pixels are *replicated* to the intervening space. This is essential for
|
||||
* the correct operation of png_combine_row, above.
|
||||
*/
|
||||
PNG_EXTERN void png_do_read_interlace PNGARG((png_row_infop row_info,
|
||||
png_bytep row, int pass, png_uint_32 transformations));
|
||||
*/
|
||||
PNG_EXTERN void png_do_read_interlace PNGARG((png_structp png_ptr));
|
||||
#endif
|
||||
|
||||
/* GRR TO DO (2.0 or whenever): simplify other internal calling interfaces */
|
||||
@@ -728,10 +919,11 @@ PNG_EXTERN void png_do_write_interlace PNGARG((png_row_infop row_info,
|
||||
png_bytep row, int pass));
|
||||
#endif
|
||||
|
||||
/* Unfilter a row */
|
||||
PNG_EXTERN void png_read_filter_row PNGARG((png_structp png_ptr,
|
||||
png_row_infop row_info, png_bytep row, png_const_bytep prev_row,
|
||||
int filter));
|
||||
/* Unfilter a row: check the filter value before calling this, there is no point
|
||||
* calling it for PNG_FILTER_VALUE_NONE.
|
||||
*/
|
||||
PNG_EXTERN void png_read_filter_row PNGARG((png_row_infop row_info,
|
||||
png_bytep row, png_const_bytep prev_row, int filter));
|
||||
|
||||
/* Choose the best filter to use and filter the row data */
|
||||
PNG_EXTERN void png_write_find_filter PNGARG((png_structp png_ptr,
|
||||
@@ -819,15 +1011,15 @@ PNG_EXTERN void png_do_invert PNGARG((png_row_infop row_info,
|
||||
png_bytep row));
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_16_TO_8_SUPPORTED
|
||||
#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
|
||||
PNG_EXTERN void png_do_scale_16_to_8 PNGARG((png_row_infop row_info,
|
||||
png_bytep row));
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_CHOP_16_TO_8_SUPPORTED
|
||||
#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
|
||||
PNG_EXTERN void png_do_chop PNGARG((png_row_infop row_info,
|
||||
png_bytep row));
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_QUANTIZE_SUPPORTED
|
||||
PNG_EXTERN void png_do_quantize PNGARG((png_row_infop row_info,
|
||||
@@ -981,18 +1173,30 @@ PNG_EXTERN void png_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr,
|
||||
png_uint_32 length));
|
||||
#endif
|
||||
|
||||
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
|
||||
PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr,
|
||||
png_infop info_ptr, png_uint_32 length));
|
||||
#endif
|
||||
|
||||
PNG_EXTERN void png_check_chunk_name PNGARG((png_structp png_ptr,
|
||||
png_const_bytep chunk_name));
|
||||
png_uint_32 chunk_name));
|
||||
|
||||
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
|
||||
/* Exactly as png_handle_as_unknown() except that the argument is a 32-bit chunk
|
||||
* name, not a string.
|
||||
*/
|
||||
PNG_EXTERN int png_chunk_unknown_handling PNGARG((png_structp png_ptr,
|
||||
png_uint_32 chunk_name));
|
||||
#endif
|
||||
|
||||
/* Handle the transformations for reading and writing */
|
||||
#ifdef PNG_READ_TRANSFORMS_SUPPORTED
|
||||
PNG_EXTERN void png_do_read_transformations PNGARG((png_structp png_ptr));
|
||||
PNG_EXTERN void png_do_read_transformations PNGARG((png_structp png_ptr,
|
||||
png_row_infop row_info));
|
||||
#endif
|
||||
#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED
|
||||
PNG_EXTERN void png_do_write_transformations PNGARG((png_structp png_ptr));
|
||||
PNG_EXTERN void png_do_write_transformations PNGARG((png_structp png_ptr,
|
||||
png_row_infop row_info));
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_TRANSFORMS_SUPPORTED
|
||||
@@ -1071,6 +1275,35 @@ PNG_EXTERN void png_64bit_product PNGARG((long v1, long v2,
|
||||
unsigned long *hi_product, unsigned long *lo_product));
|
||||
#endif
|
||||
|
||||
#ifdef PNG_cHRM_SUPPORTED
|
||||
/* Added at libpng version 1.5.5 */
|
||||
typedef struct png_xy
|
||||
{
|
||||
png_fixed_point redx, redy;
|
||||
png_fixed_point greenx, greeny;
|
||||
png_fixed_point bluex, bluey;
|
||||
png_fixed_point whitex, whitey;
|
||||
} png_xy;
|
||||
|
||||
typedef struct png_XYZ
|
||||
{
|
||||
png_fixed_point redX, redY, redZ;
|
||||
png_fixed_point greenX, greenY, greenZ;
|
||||
png_fixed_point blueX, blueY, blueZ;
|
||||
} png_XYZ;
|
||||
|
||||
/* The conversion APIs return 0 on success, non-zero on a parameter error. They
|
||||
* allow conversion between the above representations of a color encoding. When
|
||||
* converting from XYZ end points to chromaticities the absolute magnitude of
|
||||
* the end points is lost, when converting back the sum of the Y values of the
|
||||
* three end points will be 1.0
|
||||
*/
|
||||
PNG_EXTERN int png_xy_from_XYZ PNGARG((png_xy *xy, png_XYZ XYZ));
|
||||
PNG_EXTERN int png_XYZ_from_xy PNGARG((png_XYZ *XYZ, png_xy xy));
|
||||
PNG_EXTERN int png_XYZ_from_xy_checked PNGARG((png_structp png_ptr,
|
||||
png_XYZ *XYZ, png_xy xy));
|
||||
#endif
|
||||
|
||||
/* Added at libpng version 1.4.0 */
|
||||
PNG_EXTERN void png_check_IHDR PNGARG((png_structp png_ptr,
|
||||
png_uint_32 width, png_uint_32 height, int bit_depth,
|
||||
@@ -1133,7 +1366,7 @@ PNG_EXTERN png_charp png_format_number(png_const_charp start, png_charp end,
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WARNINGS_SUPPORTED
|
||||
/* New defines and members adding in libpng-1.5.3 */
|
||||
/* New defines and members adding in libpng-1.5.4 */
|
||||
# define PNG_WARNING_PARAMETER_SIZE 32
|
||||
# define PNG_WARNING_PARAMETER_COUNT 8
|
||||
|
||||
@@ -1226,8 +1459,18 @@ PNG_EXTERN void png_ascii_from_fixed PNGARG((png_structp png_ptr,
|
||||
#define PNG_FP_SAW_DOT 16 /* Saw a dot in current state */
|
||||
#define PNG_FP_SAW_E 32 /* Saw an E (or e) in current state */
|
||||
#define PNG_FP_SAW_ANY 60 /* Saw any of the above 4 */
|
||||
|
||||
/* These three values don't affect the parser. They are set but not used.
|
||||
*/
|
||||
#define PNG_FP_WAS_VALID 64 /* Preceding substring is a valid fp number */
|
||||
#define PNG_FP_INVALID 128 /* Available for callers as a distinct value */
|
||||
#define PNG_FP_NEGATIVE 128 /* A negative number, including "-0" */
|
||||
#define PNG_FP_NONZERO 256 /* A non-zero value */
|
||||
#define PNG_FP_STICKY 448 /* The above three flags */
|
||||
|
||||
/* This is available for the caller to store in 'state' if required. Do not
|
||||
* call the parser after setting it (the parser sometimes clears it.)
|
||||
*/
|
||||
#define PNG_FP_INVALID 512 /* Available for callers as a distinct value */
|
||||
|
||||
/* Result codes for the parser (boolean - true meants ok, false means
|
||||
* not ok yet.)
|
||||
@@ -1235,6 +1478,20 @@ PNG_EXTERN void png_ascii_from_fixed PNGARG((png_structp png_ptr,
|
||||
#define PNG_FP_MAYBE 0 /* The number may be valid in the future */
|
||||
#define PNG_FP_OK 1 /* The number is valid */
|
||||
|
||||
/* Tests on the sticky non-zero and negative flags. To pass these checks
|
||||
* the state must also indicate that the whole number is valid - this is
|
||||
* achieved by testing PNG_FP_SAW_DIGIT (see the implementation for why this
|
||||
* is equivalent to PNG_FP_OK above.)
|
||||
*/
|
||||
#define PNG_FP_NZ_MASK (PNG_FP_SAW_DIGIT | PNG_FP_NEGATIVE | PNG_FP_NONZERO)
|
||||
/* NZ_MASK: the string is valid and a non-zero negative value */
|
||||
#define PNG_FP_Z_MASK (PNG_FP_SAW_DIGIT | PNG_FP_NONZERO)
|
||||
/* Z MASK: the string is valid and a non-zero value. */
|
||||
/* PNG_FP_SAW_DIGIT: the string is valid. */
|
||||
#define PNG_FP_IS_ZERO(state) (((state) & PNG_FP_Z_MASK) == PNG_FP_SAW_DIGIT)
|
||||
#define PNG_FP_IS_POSITIVE(state) (((state) & PNG_FP_NZ_MASK) == PNG_FP_Z_MASK)
|
||||
#define PNG_FP_IS_NEGATIVE(state) (((state) & PNG_FP_NZ_MASK) == PNG_FP_NZ_MASK)
|
||||
|
||||
/* The actual parser. This can be called repeatedly, it updates
|
||||
* the index into the string and the state variable (which must
|
||||
* be initialzed to 0). It returns a result code, as above. There
|
||||
@@ -1254,7 +1511,10 @@ PNG_EXTERN int png_check_fp_number PNGARG((png_const_charp string,
|
||||
png_size_t size, int *statep, png_size_tp whereami));
|
||||
|
||||
/* This is the same but it checks a complete string and returns true
|
||||
* only if it just contains a floating point number.
|
||||
* only if it just contains a floating point number. As of 1.5.4 this
|
||||
* function also returns the state at the end of parsing the number if
|
||||
* it was valid (otherwise it returns 0.) This can be used for testing
|
||||
* for negative or zero values using the sticky flag.
|
||||
*/
|
||||
PNG_EXTERN int png_check_fp_string PNGARG((png_const_charp string,
|
||||
png_size_t size));
|
||||
@@ -1308,6 +1568,7 @@ PNG_EXTERN png_uint_16 png_gamma_16bit_correct PNGARG((unsigned int value,
|
||||
png_fixed_point gamma_value));
|
||||
PNG_EXTERN png_byte png_gamma_8bit_correct PNGARG((unsigned int value,
|
||||
png_fixed_point gamma_value));
|
||||
PNG_EXTERN void png_destroy_gamma_table(png_structp png_ptr);
|
||||
PNG_EXTERN void png_build_gamma_table PNGARG((png_structp png_ptr,
|
||||
int bit_depth));
|
||||
#endif
|
||||
|
||||
409
pngread.c
409
pngread.c
@@ -1,7 +1,7 @@
|
||||
|
||||
/* pngread.c - read a PNG file
|
||||
*
|
||||
* Last changed in libpng 1.5.4 [(PENDING RELEASE)]
|
||||
* Last changed in libpng 1.5.6 [(PENDING RELEASE)]
|
||||
* Copyright (c) 1998-2011 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
@@ -190,89 +190,35 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)
|
||||
|
||||
for (;;)
|
||||
{
|
||||
PNG_IHDR;
|
||||
PNG_IDAT;
|
||||
PNG_IEND;
|
||||
PNG_PLTE;
|
||||
#ifdef PNG_READ_bKGD_SUPPORTED
|
||||
PNG_bKGD;
|
||||
#endif
|
||||
#ifdef PNG_READ_cHRM_SUPPORTED
|
||||
PNG_cHRM;
|
||||
#endif
|
||||
#ifdef PNG_READ_gAMA_SUPPORTED
|
||||
PNG_gAMA;
|
||||
#endif
|
||||
#ifdef PNG_READ_hIST_SUPPORTED
|
||||
PNG_hIST;
|
||||
#endif
|
||||
#ifdef PNG_READ_iCCP_SUPPORTED
|
||||
PNG_iCCP;
|
||||
#endif
|
||||
#ifdef PNG_READ_iTXt_SUPPORTED
|
||||
PNG_iTXt;
|
||||
#endif
|
||||
#ifdef PNG_READ_oFFs_SUPPORTED
|
||||
PNG_oFFs;
|
||||
#endif
|
||||
#ifdef PNG_READ_pCAL_SUPPORTED
|
||||
PNG_pCAL;
|
||||
#endif
|
||||
#ifdef PNG_READ_pHYs_SUPPORTED
|
||||
PNG_pHYs;
|
||||
#endif
|
||||
#ifdef PNG_READ_sBIT_SUPPORTED
|
||||
PNG_sBIT;
|
||||
#endif
|
||||
#ifdef PNG_READ_sCAL_SUPPORTED
|
||||
PNG_sCAL;
|
||||
#endif
|
||||
#ifdef PNG_READ_sPLT_SUPPORTED
|
||||
PNG_sPLT;
|
||||
#endif
|
||||
#ifdef PNG_READ_sRGB_SUPPORTED
|
||||
PNG_sRGB;
|
||||
#endif
|
||||
#ifdef PNG_READ_tEXt_SUPPORTED
|
||||
PNG_tEXt;
|
||||
#endif
|
||||
#ifdef PNG_READ_tIME_SUPPORTED
|
||||
PNG_tIME;
|
||||
#endif
|
||||
#ifdef PNG_READ_tRNS_SUPPORTED
|
||||
PNG_tRNS;
|
||||
#endif
|
||||
#ifdef PNG_READ_zTXt_SUPPORTED
|
||||
PNG_zTXt;
|
||||
#endif
|
||||
png_uint_32 length = png_read_chunk_header(png_ptr);
|
||||
PNG_CONST png_bytep chunk_name = png_ptr->chunk_name;
|
||||
png_uint_32 chunk_name = png_ptr->chunk_name;
|
||||
|
||||
/* This should be a binary subdivision search or a hash for
|
||||
* matching the chunk name rather than a linear search.
|
||||
*/
|
||||
if (!png_memcmp(chunk_name, png_IDAT, 4))
|
||||
if (chunk_name == png_IDAT)
|
||||
if (png_ptr->mode & PNG_AFTER_IDAT)
|
||||
png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
|
||||
|
||||
if (!png_memcmp(chunk_name, png_IHDR, 4))
|
||||
if (chunk_name == png_IHDR)
|
||||
png_handle_IHDR(png_ptr, info_ptr, length);
|
||||
|
||||
else if (!png_memcmp(chunk_name, png_IEND, 4))
|
||||
else if (chunk_name == png_IEND)
|
||||
png_handle_IEND(png_ptr, info_ptr, length);
|
||||
|
||||
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
|
||||
else if (png_handle_as_unknown(png_ptr, chunk_name))
|
||||
else if (png_chunk_unknown_handling(png_ptr, chunk_name) !=
|
||||
PNG_HANDLE_CHUNK_AS_DEFAULT)
|
||||
{
|
||||
if (!png_memcmp(chunk_name, png_IDAT, 4))
|
||||
if (chunk_name == png_IDAT)
|
||||
png_ptr->mode |= PNG_HAVE_IDAT;
|
||||
|
||||
png_handle_unknown(png_ptr, info_ptr, length);
|
||||
|
||||
if (!png_memcmp(chunk_name, png_PLTE, 4))
|
||||
if (chunk_name == png_PLTE)
|
||||
png_ptr->mode |= PNG_HAVE_PLTE;
|
||||
|
||||
else if (!png_memcmp(chunk_name, png_IDAT, 4))
|
||||
else if (chunk_name == png_IDAT)
|
||||
{
|
||||
if (!(png_ptr->mode & PNG_HAVE_IHDR))
|
||||
png_error(png_ptr, "Missing IHDR before IDAT");
|
||||
@@ -285,10 +231,10 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)
|
||||
}
|
||||
}
|
||||
#endif
|
||||
else if (!png_memcmp(chunk_name, png_PLTE, 4))
|
||||
else if (chunk_name == png_PLTE)
|
||||
png_handle_PLTE(png_ptr, info_ptr, length);
|
||||
|
||||
else if (!png_memcmp(chunk_name, png_IDAT, 4))
|
||||
else if (chunk_name == png_IDAT)
|
||||
{
|
||||
if (!(png_ptr->mode & PNG_HAVE_IHDR))
|
||||
png_error(png_ptr, "Missing IHDR before IDAT");
|
||||
@@ -303,87 +249,87 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)
|
||||
}
|
||||
|
||||
#ifdef PNG_READ_bKGD_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_bKGD, 4))
|
||||
else if (chunk_name == png_bKGD)
|
||||
png_handle_bKGD(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_cHRM_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_cHRM, 4))
|
||||
else if (chunk_name == png_cHRM)
|
||||
png_handle_cHRM(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_gAMA_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_gAMA, 4))
|
||||
else if (chunk_name == png_gAMA)
|
||||
png_handle_gAMA(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_hIST_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_hIST, 4))
|
||||
else if (chunk_name == png_hIST)
|
||||
png_handle_hIST(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_oFFs_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_oFFs, 4))
|
||||
else if (chunk_name == png_oFFs)
|
||||
png_handle_oFFs(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_pCAL_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_pCAL, 4))
|
||||
else if (chunk_name == png_pCAL)
|
||||
png_handle_pCAL(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_sCAL_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_sCAL, 4))
|
||||
else if (chunk_name == png_sCAL)
|
||||
png_handle_sCAL(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_pHYs_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_pHYs, 4))
|
||||
else if (chunk_name == png_pHYs)
|
||||
png_handle_pHYs(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_sBIT_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_sBIT, 4))
|
||||
else if (chunk_name == png_sBIT)
|
||||
png_handle_sBIT(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_sRGB_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_sRGB, 4))
|
||||
else if (chunk_name == png_sRGB)
|
||||
png_handle_sRGB(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_iCCP_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_iCCP, 4))
|
||||
else if (chunk_name == png_iCCP)
|
||||
png_handle_iCCP(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_sPLT_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_sPLT, 4))
|
||||
else if (chunk_name == png_sPLT)
|
||||
png_handle_sPLT(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_tEXt_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_tEXt, 4))
|
||||
else if (chunk_name == png_tEXt)
|
||||
png_handle_tEXt(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_tIME_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_tIME, 4))
|
||||
else if (chunk_name == png_tIME)
|
||||
png_handle_tIME(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_tRNS_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_tRNS, 4))
|
||||
else if (chunk_name == png_tRNS)
|
||||
png_handle_tRNS(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_zTXt_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_zTXt, 4))
|
||||
else if (chunk_name == png_zTXt)
|
||||
png_handle_zTXt(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_iTXt_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_iTXt, 4))
|
||||
else if (chunk_name == png_iTXt)
|
||||
png_handle_iTXt(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
@@ -402,13 +348,7 @@ png_read_update_info(png_structp png_ptr, png_infop info_ptr)
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
|
||||
if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
|
||||
png_read_start_row(png_ptr);
|
||||
|
||||
else
|
||||
png_warning(png_ptr,
|
||||
"Ignoring extra png_read_update_info() call;"
|
||||
" row buffer not reallocated");
|
||||
png_read_start_row(png_ptr);
|
||||
|
||||
#ifdef PNG_READ_TRANSFORMS_SUPPORTED
|
||||
png_read_transform_info(png_ptr, info_ptr);
|
||||
@@ -428,15 +368,8 @@ png_start_read_image(png_structp png_ptr)
|
||||
{
|
||||
png_debug(1, "in png_start_read_image");
|
||||
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
|
||||
if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
|
||||
png_read_start_row(png_ptr);
|
||||
else
|
||||
png_warning(png_ptr,
|
||||
"Ignoring extra png_start_read_image() call;"
|
||||
" row buffer not reallocated");
|
||||
if (png_ptr != NULL)
|
||||
png_read_start_row(png_ptr);
|
||||
}
|
||||
#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
|
||||
|
||||
@@ -444,23 +377,30 @@ png_start_read_image(png_structp png_ptr)
|
||||
void PNGAPI
|
||||
png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
|
||||
{
|
||||
PNG_IDAT;
|
||||
#ifdef PNG_READ_INTERLACING_SUPPORTED
|
||||
PNG_CONST int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55,
|
||||
0xff};
|
||||
PNG_CONST int png_pass_mask[7] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff};
|
||||
#endif
|
||||
int ret;
|
||||
|
||||
png_row_info row_info;
|
||||
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
|
||||
png_debug2(1, "in png_read_row (row %lu, pass %d)",
|
||||
(unsigned long)png_ptr->row_number, png_ptr->pass);
|
||||
|
||||
/* png_read_start_row sets the information (in particular iwidth) for this
|
||||
* interlace pass.
|
||||
*/
|
||||
if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
|
||||
png_read_start_row(png_ptr);
|
||||
|
||||
/* 1.5.6: row_info moved out of png_struct to a local here. */
|
||||
row_info.width = png_ptr->iwidth; /* NOTE: width of current interlaced row */
|
||||
row_info.color_type = png_ptr->color_type;
|
||||
row_info.bit_depth = png_ptr->bit_depth;
|
||||
row_info.channels = png_ptr->channels;
|
||||
row_info.pixel_depth = png_ptr->pixel_depth;
|
||||
row_info.rowbytes = PNG_ROWBYTES(row_info.pixel_depth, row_info.width);
|
||||
|
||||
if (png_ptr->row_number == 0 && png_ptr->pass == 0)
|
||||
{
|
||||
/* Check for transforms that have been set but were defined out */
|
||||
@@ -502,7 +442,12 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
|
||||
}
|
||||
|
||||
#ifdef PNG_READ_INTERLACING_SUPPORTED
|
||||
/* If interlaced and we do not need a new row, combine row and return */
|
||||
/* If interlaced and we do not need a new row, combine row and return.
|
||||
* Notice that the pixels we have from previous rows have been transformed
|
||||
* already; we can only combine like with like (transformed or
|
||||
* untransformed) and, because of the libpng API for interlaced images, this
|
||||
* means we must transform before de-interlacing.
|
||||
*/
|
||||
if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
|
||||
{
|
||||
switch (png_ptr->pass)
|
||||
@@ -511,8 +456,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
|
||||
if (png_ptr->row_number & 0x07)
|
||||
{
|
||||
if (dsp_row != NULL)
|
||||
png_combine_row(png_ptr, dsp_row,
|
||||
png_pass_dsp_mask[png_ptr->pass]);
|
||||
png_combine_row(png_ptr, dsp_row, 1/*display*/);
|
||||
png_read_finish_row(png_ptr);
|
||||
return;
|
||||
}
|
||||
@@ -522,8 +466,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
|
||||
if ((png_ptr->row_number & 0x07) || png_ptr->width < 5)
|
||||
{
|
||||
if (dsp_row != NULL)
|
||||
png_combine_row(png_ptr, dsp_row,
|
||||
png_pass_dsp_mask[png_ptr->pass]);
|
||||
png_combine_row(png_ptr, dsp_row, 1/*display*/);
|
||||
|
||||
png_read_finish_row(png_ptr);
|
||||
return;
|
||||
@@ -534,8 +477,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
|
||||
if ((png_ptr->row_number & 0x07) != 4)
|
||||
{
|
||||
if (dsp_row != NULL && (png_ptr->row_number & 4))
|
||||
png_combine_row(png_ptr, dsp_row,
|
||||
png_pass_dsp_mask[png_ptr->pass]);
|
||||
png_combine_row(png_ptr, dsp_row, 1/*display*/);
|
||||
|
||||
png_read_finish_row(png_ptr);
|
||||
return;
|
||||
@@ -546,8 +488,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
|
||||
if ((png_ptr->row_number & 3) || png_ptr->width < 3)
|
||||
{
|
||||
if (dsp_row != NULL)
|
||||
png_combine_row(png_ptr, dsp_row,
|
||||
png_pass_dsp_mask[png_ptr->pass]);
|
||||
png_combine_row(png_ptr, dsp_row, 1/*display*/);
|
||||
|
||||
png_read_finish_row(png_ptr);
|
||||
return;
|
||||
@@ -558,8 +499,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
|
||||
if ((png_ptr->row_number & 3) != 2)
|
||||
{
|
||||
if (dsp_row != NULL && (png_ptr->row_number & 2))
|
||||
png_combine_row(png_ptr, dsp_row,
|
||||
png_pass_dsp_mask[png_ptr->pass]);
|
||||
png_combine_row(png_ptr, dsp_row, 1/*display*/);
|
||||
|
||||
png_read_finish_row(png_ptr);
|
||||
return;
|
||||
@@ -569,8 +509,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
|
||||
if ((png_ptr->row_number & 1) || png_ptr->width < 2)
|
||||
{
|
||||
if (dsp_row != NULL)
|
||||
png_combine_row(png_ptr, dsp_row,
|
||||
png_pass_dsp_mask[png_ptr->pass]);
|
||||
png_combine_row(png_ptr, dsp_row, 1/*display*/);
|
||||
|
||||
png_read_finish_row(png_ptr);
|
||||
return;
|
||||
@@ -606,7 +545,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
|
||||
png_crc_finish(png_ptr, 0);
|
||||
|
||||
png_ptr->idat_size = png_read_chunk_header(png_ptr);
|
||||
if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
|
||||
if (png_ptr->chunk_name != png_IDAT)
|
||||
png_error(png_ptr, "Not enough image data");
|
||||
}
|
||||
png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size;
|
||||
@@ -636,63 +575,72 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
|
||||
|
||||
} while (png_ptr->zstream.avail_out);
|
||||
|
||||
png_ptr->row_info.color_type = png_ptr->color_type;
|
||||
png_ptr->row_info.width = png_ptr->iwidth;
|
||||
png_ptr->row_info.channels = png_ptr->channels;
|
||||
png_ptr->row_info.bit_depth = png_ptr->bit_depth;
|
||||
png_ptr->row_info.pixel_depth = png_ptr->pixel_depth;
|
||||
png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,
|
||||
png_ptr->row_info.width);
|
||||
if (png_ptr->row_buf[0] > PNG_FILTER_VALUE_NONE)
|
||||
{
|
||||
if (png_ptr->row_buf[0] < PNG_FILTER_VALUE_LAST)
|
||||
png_read_filter_row(&row_info, png_ptr->row_buf + 1,
|
||||
png_ptr->prev_row + 1, png_ptr->row_buf[0]);
|
||||
else
|
||||
png_error(png_ptr, "bad adaptive filter value");
|
||||
}
|
||||
|
||||
if (png_ptr->row_buf[0])
|
||||
png_read_filter_row(png_ptr, &(png_ptr->row_info),
|
||||
png_ptr->row_buf + 1, png_ptr->prev_row + 1,
|
||||
(int)(png_ptr->row_buf[0]));
|
||||
|
||||
png_memcpy(png_ptr->prev_row, png_ptr->row_buf, png_ptr->rowbytes + 1);
|
||||
/* libpng 1.5.6: the following line was copying png_ptr->rowbytes before
|
||||
* 1.5.6, while the buffer really is this big in current versions of libpng
|
||||
* it may not be in the future, so this was changed just to copy the
|
||||
* interlaced count:
|
||||
*/
|
||||
png_memcpy(png_ptr->prev_row, png_ptr->row_buf, row_info.rowbytes + 1);
|
||||
|
||||
#ifdef PNG_MNG_FEATURES_SUPPORTED
|
||||
if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
|
||||
(png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING))
|
||||
{
|
||||
/* Intrapixel differencing */
|
||||
png_do_read_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1);
|
||||
png_do_read_intrapixel(&row_info, png_ptr->row_buf + 1);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef PNG_READ_TRANSFORMS_SUPPORTED
|
||||
if (png_ptr->transformations)
|
||||
png_do_read_transformations(png_ptr);
|
||||
png_do_read_transformations(png_ptr, &row_info);
|
||||
#endif
|
||||
|
||||
/* The transformed pixel depth should match the depth now in row_info. */
|
||||
if (png_ptr->transformed_pixel_depth == 0)
|
||||
{
|
||||
png_ptr->transformed_pixel_depth = row_info.pixel_depth;
|
||||
if (row_info.pixel_depth > png_ptr->maximum_pixel_depth)
|
||||
png_error(png_ptr, "sequential row overflow");
|
||||
}
|
||||
|
||||
else if (png_ptr->transformed_pixel_depth != row_info.pixel_depth)
|
||||
png_error(png_ptr, "internal sequential row size calculation error");
|
||||
|
||||
#ifdef PNG_READ_INTERLACING_SUPPORTED
|
||||
/* Blow up interlaced rows to full size */
|
||||
if (png_ptr->interlaced &&
|
||||
(png_ptr->transformations & PNG_INTERLACE))
|
||||
{
|
||||
if (png_ptr->pass < 6)
|
||||
/* Old interface (pre-1.0.9):
|
||||
* png_do_read_interlace(&(png_ptr->row_info),
|
||||
* png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations);
|
||||
*/
|
||||
png_do_read_interlace(png_ptr);
|
||||
png_do_read_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass,
|
||||
png_ptr->transformations);
|
||||
|
||||
if (dsp_row != NULL)
|
||||
png_combine_row(png_ptr, dsp_row, png_pass_dsp_mask[png_ptr->pass]);
|
||||
png_combine_row(png_ptr, dsp_row, 1/*display*/);
|
||||
|
||||
if (row != NULL)
|
||||
png_combine_row(png_ptr, row, png_pass_mask[png_ptr->pass]);
|
||||
png_combine_row(png_ptr, row, 0/*row*/);
|
||||
}
|
||||
|
||||
else
|
||||
#endif
|
||||
{
|
||||
if (row != NULL)
|
||||
png_combine_row(png_ptr, row, 0xff);
|
||||
png_combine_row(png_ptr, row, -1/*ignored*/);
|
||||
|
||||
if (dsp_row != NULL)
|
||||
png_combine_row(png_ptr, dsp_row, 0xff);
|
||||
png_combine_row(png_ptr, dsp_row, -1/*ignored*/);
|
||||
}
|
||||
png_read_finish_row(png_ptr);
|
||||
|
||||
@@ -858,85 +806,31 @@ png_read_end(png_structp png_ptr, png_infop info_ptr)
|
||||
|
||||
do
|
||||
{
|
||||
PNG_IHDR;
|
||||
PNG_IDAT;
|
||||
PNG_IEND;
|
||||
PNG_PLTE;
|
||||
#ifdef PNG_READ_bKGD_SUPPORTED
|
||||
PNG_bKGD;
|
||||
#endif
|
||||
#ifdef PNG_READ_cHRM_SUPPORTED
|
||||
PNG_cHRM;
|
||||
#endif
|
||||
#ifdef PNG_READ_gAMA_SUPPORTED
|
||||
PNG_gAMA;
|
||||
#endif
|
||||
#ifdef PNG_READ_hIST_SUPPORTED
|
||||
PNG_hIST;
|
||||
#endif
|
||||
#ifdef PNG_READ_iCCP_SUPPORTED
|
||||
PNG_iCCP;
|
||||
#endif
|
||||
#ifdef PNG_READ_iTXt_SUPPORTED
|
||||
PNG_iTXt;
|
||||
#endif
|
||||
#ifdef PNG_READ_oFFs_SUPPORTED
|
||||
PNG_oFFs;
|
||||
#endif
|
||||
#ifdef PNG_READ_pCAL_SUPPORTED
|
||||
PNG_pCAL;
|
||||
#endif
|
||||
#ifdef PNG_READ_pHYs_SUPPORTED
|
||||
PNG_pHYs;
|
||||
#endif
|
||||
#ifdef PNG_READ_sBIT_SUPPORTED
|
||||
PNG_sBIT;
|
||||
#endif
|
||||
#ifdef PNG_READ_sCAL_SUPPORTED
|
||||
PNG_sCAL;
|
||||
#endif
|
||||
#ifdef PNG_READ_sPLT_SUPPORTED
|
||||
PNG_sPLT;
|
||||
#endif
|
||||
#ifdef PNG_READ_sRGB_SUPPORTED
|
||||
PNG_sRGB;
|
||||
#endif
|
||||
#ifdef PNG_READ_tEXt_SUPPORTED
|
||||
PNG_tEXt;
|
||||
#endif
|
||||
#ifdef PNG_READ_tIME_SUPPORTED
|
||||
PNG_tIME;
|
||||
#endif
|
||||
#ifdef PNG_READ_tRNS_SUPPORTED
|
||||
PNG_tRNS;
|
||||
#endif
|
||||
#ifdef PNG_READ_zTXt_SUPPORTED
|
||||
PNG_zTXt;
|
||||
#endif
|
||||
png_uint_32 length = png_read_chunk_header(png_ptr);
|
||||
PNG_CONST png_bytep chunk_name = png_ptr->chunk_name;
|
||||
png_uint_32 chunk_name = png_ptr->chunk_name;
|
||||
|
||||
if (!png_memcmp(chunk_name, png_IHDR, 4))
|
||||
if (chunk_name == png_IHDR)
|
||||
png_handle_IHDR(png_ptr, info_ptr, length);
|
||||
|
||||
else if (!png_memcmp(chunk_name, png_IEND, 4))
|
||||
else if (chunk_name == png_IEND)
|
||||
png_handle_IEND(png_ptr, info_ptr, length);
|
||||
|
||||
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
|
||||
else if (png_handle_as_unknown(png_ptr, chunk_name))
|
||||
else if (png_chunk_unknown_handling(png_ptr, chunk_name) !=
|
||||
PNG_HANDLE_CHUNK_AS_DEFAULT)
|
||||
{
|
||||
if (!png_memcmp(chunk_name, png_IDAT, 4))
|
||||
if (chunk_name == png_IDAT)
|
||||
{
|
||||
if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT))
|
||||
png_benign_error(png_ptr, "Too many IDATs found");
|
||||
}
|
||||
png_handle_unknown(png_ptr, info_ptr, length);
|
||||
if (!png_memcmp(chunk_name, png_PLTE, 4))
|
||||
if (chunk_name == png_PLTE)
|
||||
png_ptr->mode |= PNG_HAVE_PLTE;
|
||||
}
|
||||
#endif
|
||||
|
||||
else if (!png_memcmp(chunk_name, png_IDAT, 4))
|
||||
else if (chunk_name == png_IDAT)
|
||||
{
|
||||
/* Zero length IDATs are legal after the last IDAT has been
|
||||
* read, but not after other chunks have been read.
|
||||
@@ -946,91 +840,91 @@ png_read_end(png_structp png_ptr, png_infop info_ptr)
|
||||
|
||||
png_crc_finish(png_ptr, length);
|
||||
}
|
||||
else if (!png_memcmp(chunk_name, png_PLTE, 4))
|
||||
else if (chunk_name == png_PLTE)
|
||||
png_handle_PLTE(png_ptr, info_ptr, length);
|
||||
|
||||
#ifdef PNG_READ_bKGD_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_bKGD, 4))
|
||||
else if (chunk_name == png_bKGD)
|
||||
png_handle_bKGD(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_cHRM_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_cHRM, 4))
|
||||
else if (chunk_name == png_cHRM)
|
||||
png_handle_cHRM(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_gAMA_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_gAMA, 4))
|
||||
else if (chunk_name == png_gAMA)
|
||||
png_handle_gAMA(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_hIST_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_hIST, 4))
|
||||
else if (chunk_name == png_hIST)
|
||||
png_handle_hIST(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_oFFs_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_oFFs, 4))
|
||||
else if (chunk_name == png_oFFs)
|
||||
png_handle_oFFs(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_pCAL_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_pCAL, 4))
|
||||
else if (chunk_name == png_pCAL)
|
||||
png_handle_pCAL(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_sCAL_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_sCAL, 4))
|
||||
else if (chunk_name == png_sCAL)
|
||||
png_handle_sCAL(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_pHYs_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_pHYs, 4))
|
||||
else if (chunk_name == png_pHYs)
|
||||
png_handle_pHYs(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_sBIT_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_sBIT, 4))
|
||||
else if (chunk_name == png_sBIT)
|
||||
png_handle_sBIT(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_sRGB_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_sRGB, 4))
|
||||
else if (chunk_name == png_sRGB)
|
||||
png_handle_sRGB(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_iCCP_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_iCCP, 4))
|
||||
else if (chunk_name == png_iCCP)
|
||||
png_handle_iCCP(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_sPLT_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_sPLT, 4))
|
||||
else if (chunk_name == png_sPLT)
|
||||
png_handle_sPLT(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_tEXt_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_tEXt, 4))
|
||||
else if (chunk_name == png_tEXt)
|
||||
png_handle_tEXt(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_tIME_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_tIME, 4))
|
||||
else if (chunk_name == png_tIME)
|
||||
png_handle_tIME(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_tRNS_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_tRNS, 4))
|
||||
else if (chunk_name == png_tRNS)
|
||||
png_handle_tRNS(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_zTXt_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_zTXt, 4))
|
||||
else if (chunk_name == png_zTXt)
|
||||
png_handle_zTXt(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_iTXt_SUPPORTED
|
||||
else if (!png_memcmp(chunk_name, png_iTXt, 4))
|
||||
else if (chunk_name == png_iTXt)
|
||||
png_handle_iTXt(png_ptr, info_ptr, length);
|
||||
#endif
|
||||
|
||||
@@ -1138,9 +1032,13 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr,
|
||||
if (end_info_ptr != NULL)
|
||||
png_info_destroy(png_ptr, end_info_ptr);
|
||||
|
||||
#ifdef PNG_READ_GAMMA_SUPPORTED
|
||||
png_destroy_gamma_table(png_ptr);
|
||||
#endif
|
||||
|
||||
png_free(png_ptr, png_ptr->zbuf);
|
||||
png_free(png_ptr, png_ptr->big_row_buf);
|
||||
png_free(png_ptr, png_ptr->prev_row);
|
||||
png_free(png_ptr, png_ptr->big_prev_row);
|
||||
png_free(png_ptr, png_ptr->chunkdata);
|
||||
|
||||
#ifdef PNG_READ_QUANTIZE_SUPPORTED
|
||||
@@ -1148,15 +1046,6 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr,
|
||||
png_free(png_ptr, png_ptr->quantize_index);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_GAMMA_SUPPORTED
|
||||
png_free(png_ptr, png_ptr->gamma_table);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_BACKGROUND_SUPPORTED
|
||||
png_free(png_ptr, png_ptr->gamma_from_1);
|
||||
png_free(png_ptr, png_ptr->gamma_to_1);
|
||||
#endif
|
||||
|
||||
if (png_ptr->free_me & PNG_FREE_PLTE)
|
||||
png_zfree(png_ptr, png_ptr->palette);
|
||||
png_ptr->free_me &= ~PNG_FREE_PLTE;
|
||||
@@ -1174,42 +1063,6 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr,
|
||||
png_ptr->free_me &= ~PNG_FREE_HIST;
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_GAMMA_SUPPORTED
|
||||
if (png_ptr->gamma_16_table != NULL)
|
||||
{
|
||||
int i;
|
||||
int istop = (1 << (8 - png_ptr->gamma_shift));
|
||||
for (i = 0; i < istop; i++)
|
||||
{
|
||||
png_free(png_ptr, png_ptr->gamma_16_table[i]);
|
||||
}
|
||||
png_free(png_ptr, png_ptr->gamma_16_table);
|
||||
}
|
||||
|
||||
#ifdef PNG_READ_BACKGROUND_SUPPORTED
|
||||
if (png_ptr->gamma_16_from_1 != NULL)
|
||||
{
|
||||
int i;
|
||||
int istop = (1 << (8 - png_ptr->gamma_shift));
|
||||
for (i = 0; i < istop; i++)
|
||||
{
|
||||
png_free(png_ptr, png_ptr->gamma_16_from_1[i]);
|
||||
}
|
||||
png_free(png_ptr, png_ptr->gamma_16_from_1);
|
||||
}
|
||||
if (png_ptr->gamma_16_to_1 != NULL)
|
||||
{
|
||||
int i;
|
||||
int istop = (1 << (8 - png_ptr->gamma_shift));
|
||||
for (i = 0; i < istop; i++)
|
||||
{
|
||||
png_free(png_ptr, png_ptr->gamma_16_to_1[i]);
|
||||
}
|
||||
png_free(png_ptr, png_ptr->gamma_16_to_1);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
inflateEnd(&png_ptr->zstream);
|
||||
|
||||
#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
|
||||
@@ -1286,9 +1139,23 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,
|
||||
|
||||
/* -------------- image transformations start here ------------------- */
|
||||
|
||||
#ifdef PNG_READ_16_TO_8_SUPPORTED
|
||||
#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
|
||||
/* Tell libpng to strip 16-bit/color files down to 8 bits per color.
|
||||
*/
|
||||
if (transforms & PNG_TRANSFORM_SCALE_16)
|
||||
{
|
||||
/* 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.
|
||||
*/
|
||||
png_set_scale_16(png_ptr);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
|
||||
/* If both SCALE and STRIP are required pngrtran will effectively cancel the
|
||||
* latter by doing SCALE first. This is ok and allows apps not to check for
|
||||
* which is supported to get the right answer.
|
||||
*/
|
||||
if (transforms & PNG_TRANSFORM_STRIP_16)
|
||||
png_set_strip_16(png_ptr);
|
||||
#endif
|
||||
@@ -1387,7 +1254,7 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,
|
||||
png_set_gray_to_rgb(png_ptr);
|
||||
#endif
|
||||
|
||||
/* Added at libpng-1.5.3 */
|
||||
/* Added at libpng-1.5.4 */
|
||||
#ifdef PNG_READ_EXPAND_16_SUPPORTED
|
||||
if (transforms & PNG_TRANSFORM_EXPAND_16)
|
||||
png_set_expand_16(png_ptr);
|
||||
|
||||
957
pngrtran.c
957
pngrtran.c
File diff suppressed because it is too large
Load Diff
965
pngrutil.c
965
pngrutil.c
File diff suppressed because it is too large
Load Diff
75
pngset.c
75
pngset.c
@@ -1,7 +1,7 @@
|
||||
|
||||
/* pngset.c - storage of image information into info struct
|
||||
*
|
||||
* Last changed in libpng 1.5.4 [(PENDING RELEASE)]
|
||||
* Last changed in libpng 1.5.6 [(PENDING RELEASE)]
|
||||
* Copyright (c) 1998-2011 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
@@ -64,6 +64,39 @@ png_set_cHRM_fixed(png_structp png_ptr, png_infop info_ptr,
|
||||
}
|
||||
}
|
||||
|
||||
void PNGFAPI
|
||||
png_set_cHRM_XYZ_fixed(png_structp png_ptr, png_infop info_ptr,
|
||||
png_fixed_point int_red_X, png_fixed_point int_red_Y,
|
||||
png_fixed_point int_red_Z, png_fixed_point int_green_X,
|
||||
png_fixed_point int_green_Y, png_fixed_point int_green_Z,
|
||||
png_fixed_point int_blue_X, png_fixed_point int_blue_Y,
|
||||
png_fixed_point int_blue_Z)
|
||||
{
|
||||
png_XYZ XYZ;
|
||||
png_xy xy;
|
||||
|
||||
png_debug1(1, "in %s storage function", "cHRM XYZ fixed");
|
||||
|
||||
if (png_ptr == NULL || info_ptr == NULL)
|
||||
return;
|
||||
|
||||
XYZ.redX = int_red_X;
|
||||
XYZ.redY = int_red_Y;
|
||||
XYZ.redZ = int_red_Z;
|
||||
XYZ.greenX = int_green_X;
|
||||
XYZ.greenY = int_green_Y;
|
||||
XYZ.greenZ = int_green_Z;
|
||||
XYZ.blueX = int_blue_X;
|
||||
XYZ.blueY = int_blue_Y;
|
||||
XYZ.blueZ = int_blue_Z;
|
||||
|
||||
if (png_xy_from_XYZ(&xy, XYZ))
|
||||
png_error(png_ptr, "XYZ values out of representable range");
|
||||
|
||||
png_set_cHRM_fixed(png_ptr, info_ptr, xy.whitex, xy.whitey, xy.redx, xy.redy,
|
||||
xy.greenx, xy.greeny, xy.bluex, xy.bluey);
|
||||
}
|
||||
|
||||
# ifdef PNG_FLOATING_POINT_SUPPORTED
|
||||
void PNGAPI
|
||||
png_set_cHRM(png_structp png_ptr, png_infop info_ptr,
|
||||
@@ -80,6 +113,23 @@ png_set_cHRM(png_structp png_ptr, png_infop info_ptr,
|
||||
png_fixed(png_ptr, blue_x, "cHRM Blue X"),
|
||||
png_fixed(png_ptr, blue_y, "cHRM Blue Y"));
|
||||
}
|
||||
|
||||
void PNGAPI
|
||||
png_set_cHRM_XYZ(png_structp png_ptr, png_infop info_ptr, double red_X,
|
||||
double red_Y, double red_Z, double green_X, double green_Y, double green_Z,
|
||||
double blue_X, double blue_Y, double blue_Z)
|
||||
{
|
||||
png_set_cHRM_XYZ_fixed(png_ptr, info_ptr,
|
||||
png_fixed(png_ptr, red_X, "cHRM Red X"),
|
||||
png_fixed(png_ptr, red_Y, "cHRM Red Y"),
|
||||
png_fixed(png_ptr, red_Z, "cHRM Red Z"),
|
||||
png_fixed(png_ptr, green_X, "cHRM Red X"),
|
||||
png_fixed(png_ptr, green_Y, "cHRM Red Y"),
|
||||
png_fixed(png_ptr, green_Z, "cHRM Red Z"),
|
||||
png_fixed(png_ptr, blue_X, "cHRM Red X"),
|
||||
png_fixed(png_ptr, blue_Y, "cHRM Red Y"),
|
||||
png_fixed(png_ptr, blue_Z, "cHRM Red Z"));
|
||||
}
|
||||
# endif /* PNG_FLOATING_POINT_SUPPORTED */
|
||||
|
||||
#endif /* PNG_cHRM_SUPPORTED */
|
||||
@@ -99,7 +149,7 @@ png_set_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, png_fixed_point
|
||||
* possible for 1/gamma to overflow the limit of 21474 and this means the
|
||||
* gamma value must be at least 5/100000 and hence at most 20000.0. For
|
||||
* safety the limits here are a little narrower. The values are 0.00016 to
|
||||
* 6250.0, which are truely ridiculous gammma values (and will produce
|
||||
* 6250.0, which are truly ridiculous gammma values (and will produce
|
||||
* displays that are all black or all white.)
|
||||
*/
|
||||
if (file_gamma < 16 || file_gamma > 625000000)
|
||||
@@ -552,10 +602,10 @@ png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr,
|
||||
# ifdef PNG_cHRM_SUPPORTED
|
||||
png_set_cHRM_fixed(png_ptr, info_ptr,
|
||||
/* color x y */
|
||||
/* white */ 31270L, 32900L,
|
||||
/* red */ 64000L, 33000L,
|
||||
/* green */ 30000L, 60000L,
|
||||
/* blue */ 15000L, 6000L
|
||||
/* white */ 31270, 32900,
|
||||
/* red */ 64000, 33000,
|
||||
/* green */ 30000, 60000,
|
||||
/* blue */ 15000, 6000
|
||||
);
|
||||
# endif /* cHRM */
|
||||
}
|
||||
@@ -570,7 +620,7 @@ png_set_iCCP(png_structp png_ptr, png_infop info_ptr,
|
||||
{
|
||||
png_charp new_iccp_name;
|
||||
png_bytep new_iccp_profile;
|
||||
png_uint_32 length;
|
||||
png_size_t length;
|
||||
|
||||
png_debug1(1, "in %s storage function", "iCCP");
|
||||
|
||||
@@ -631,9 +681,8 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr,
|
||||
{
|
||||
int i;
|
||||
|
||||
png_debug1(1, "in %s storage function", ((png_ptr == NULL ||
|
||||
png_ptr->chunk_name[0] == '\0') ?
|
||||
"text" : (png_const_charp)png_ptr->chunk_name));
|
||||
png_debug1(1, "in %lx storage function", png_ptr == NULL ? "unexpected" :
|
||||
(unsigned long)png_ptr->chunk_name);
|
||||
|
||||
if (png_ptr == NULL || info_ptr == NULL || num_text == 0)
|
||||
return(0);
|
||||
@@ -916,10 +965,10 @@ png_set_sPLT(png_structp png_ptr,
|
||||
{
|
||||
png_sPLT_tp to = np + info_ptr->splt_palettes_num + i;
|
||||
png_const_sPLT_tp from = entries + i;
|
||||
png_uint_32 length;
|
||||
png_size_t length;
|
||||
|
||||
length = png_strlen(from->name) + 1;
|
||||
to->name = (png_charp)png_malloc_warn(png_ptr, (png_size_t)length);
|
||||
to->name = (png_charp)png_malloc_warn(png_ptr, length);
|
||||
|
||||
if (to->name == NULL)
|
||||
{
|
||||
@@ -930,7 +979,7 @@ png_set_sPLT(png_structp png_ptr,
|
||||
|
||||
png_memcpy(to->name, from->name, length);
|
||||
to->entries = (png_sPLT_entryp)png_malloc_warn(png_ptr,
|
||||
(png_size_t)(from->nentries * png_sizeof(png_sPLT_entry)));
|
||||
from->nentries * png_sizeof(png_sPLT_entry));
|
||||
|
||||
if (to->entries == NULL)
|
||||
{
|
||||
|
||||
58
pngstruct.h
58
pngstruct.h
@@ -5,7 +5,7 @@
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
*
|
||||
* Last changed in libpng 1.5.4 [(PENDING RELEASE)]
|
||||
* Last changed in libpng 1.5.5 [September 22, 2011]
|
||||
*
|
||||
* This code is released under the libpng license.
|
||||
* For conditions of distribution and use, see the disclaimer
|
||||
@@ -68,7 +68,7 @@ struct png_struct_def
|
||||
uInt zbuf_size; /* size of zbuf (typically 65536) */
|
||||
#ifdef PNG_WRITE_SUPPORTED
|
||||
|
||||
/* Added in 1.5.3: state to keep track of whether the zstream has been
|
||||
/* Added in 1.5.4: state to keep track of whether the zstream has been
|
||||
* initialized and if so whether it is for IDAT or some other chunk.
|
||||
*/
|
||||
#define PNG_ZLIB_UNINITIALIZED 0
|
||||
@@ -78,7 +78,7 @@ struct png_struct_def
|
||||
#define PNG_ZLIB_IN_USE 4 /* a flag value */
|
||||
|
||||
png_uint_32 zlib_state; /* State of zlib initialization */
|
||||
/* End of material added at libpng 1.5.3 */
|
||||
/* End of material added at libpng 1.5.4 */
|
||||
|
||||
int zlib_level; /* holds zlib compression level */
|
||||
int zlib_method; /* holds zlib compression method */
|
||||
@@ -86,7 +86,7 @@ struct png_struct_def
|
||||
int zlib_mem_level; /* holds zlib compression memory level */
|
||||
int zlib_strategy; /* holds zlib compression strategy */
|
||||
#endif
|
||||
/* Added at libpng 1.5.3 */
|
||||
/* Added at libpng 1.5.4 */
|
||||
#if defined(PNG_WRITE_COMPRESSED_TEXT_SUPPORTED) || \
|
||||
defined(PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED)
|
||||
int zlib_text_level; /* holds zlib compression level */
|
||||
@@ -95,7 +95,7 @@ struct png_struct_def
|
||||
int zlib_text_mem_level; /* holds zlib compression memory level */
|
||||
int zlib_text_strategy; /* holds zlib compression strategy */
|
||||
#endif
|
||||
/* End of material added at libpng 1.5.3 */
|
||||
/* End of material added at libpng 1.5.4 */
|
||||
|
||||
png_uint_32 width; /* width of image in pixels */
|
||||
png_uint_32 height; /* height of image in pixels */
|
||||
@@ -104,21 +104,24 @@ struct png_struct_def
|
||||
png_size_t rowbytes; /* size of row in bytes */
|
||||
png_uint_32 iwidth; /* width of current interlaced row in pixels */
|
||||
png_uint_32 row_number; /* current row in interlace pass */
|
||||
png_bytep prev_row; /* buffer to save previous (unfiltered) row */
|
||||
png_bytep row_buf; /* buffer to save current (unfiltered) row */
|
||||
png_uint_32 chunk_name; /* PNG_CHUNK() id of current chunk */
|
||||
png_bytep prev_row; /* buffer to save previous (unfiltered) row.
|
||||
* This is a pointer into big_prev_row
|
||||
*/
|
||||
png_bytep row_buf; /* buffer to save current (unfiltered) row.
|
||||
* This is a pointer into big_row_buf
|
||||
*/
|
||||
png_bytep sub_row; /* buffer to save "sub" row when filtering */
|
||||
png_bytep up_row; /* buffer to save "up" 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 */
|
||||
png_row_info row_info; /* used for transformation routines */
|
||||
png_size_t info_rowbytes; /* Added in 1.5.3: cache of updated row bytes */
|
||||
png_size_t info_rowbytes; /* Added in 1.5.4: cache of updated row bytes */
|
||||
|
||||
png_uint_32 idat_size; /* current IDAT size for read */
|
||||
png_uint_32 crc; /* current chunk CRC value */
|
||||
png_colorp palette; /* palette from the input file */
|
||||
png_uint_16 num_palette; /* number of color entries in palette */
|
||||
png_uint_16 num_trans; /* number of transparency values */
|
||||
png_byte chunk_name[5]; /* null-terminated name of current chunk */
|
||||
png_byte compression; /* file compression type (always 0) */
|
||||
png_byte filter; /* file filter type (always 0) */
|
||||
png_byte interlaced; /* PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */
|
||||
@@ -126,11 +129,17 @@ struct png_struct_def
|
||||
png_byte do_filter; /* row filter flags (see PNG_FILTER_ below ) */
|
||||
png_byte color_type; /* color type of file */
|
||||
png_byte bit_depth; /* bit depth of file */
|
||||
png_byte usr_bit_depth; /* bit depth of users row */
|
||||
png_byte usr_bit_depth; /* bit depth of users row: write only */
|
||||
png_byte pixel_depth; /* number of bits per pixel */
|
||||
png_byte channels; /* number of channels in file */
|
||||
png_byte usr_channels; /* channels at start of write */
|
||||
png_byte usr_channels; /* channels at start of write: write only */
|
||||
png_byte sig_bytes; /* magic bytes read/written from start of file */
|
||||
png_byte maximum_pixel_depth;
|
||||
/* pixel depth used for the row buffers */
|
||||
png_byte transformed_pixel_depth;
|
||||
/* pixel depth after read/write transforms */
|
||||
png_byte io_chunk_string[5];
|
||||
/* string name of chunk */
|
||||
|
||||
#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
|
||||
png_uint_16 filler; /* filler bytes for pixel expansion */
|
||||
@@ -152,19 +161,21 @@ struct png_struct_def
|
||||
png_uint_32 flush_rows; /* number of rows written since last flush */
|
||||
#endif
|
||||
|
||||
#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
|
||||
#ifdef PNG_READ_GAMMA_SUPPORTED
|
||||
int gamma_shift; /* number of "insignificant" bits in 16-bit gamma */
|
||||
png_fixed_point gamma; /* file gamma value */
|
||||
png_fixed_point screen_gamma; /* screen gamma value (display_exponent) */
|
||||
#endif
|
||||
|
||||
#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
|
||||
png_bytep gamma_table; /* gamma table for 8-bit depth files */
|
||||
png_uint_16pp gamma_16_table; /* gamma table for 16-bit depth files */
|
||||
#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \
|
||||
defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \
|
||||
defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
|
||||
png_bytep gamma_from_1; /* converts from 1.0 to screen */
|
||||
png_bytep gamma_to_1; /* converts from file to 1.0 */
|
||||
png_uint_16pp gamma_16_table; /* gamma table for 16-bit depth files */
|
||||
png_uint_16pp gamma_16_from_1; /* converts from 1.0 to screen */
|
||||
png_uint_16pp gamma_16_to_1; /* converts from file to 1.0 */
|
||||
#endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */
|
||||
#endif
|
||||
|
||||
#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_sBIT_SUPPORTED)
|
||||
@@ -255,13 +266,20 @@ struct png_struct_def
|
||||
png_bytep chunk_list;
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_sRGB_SUPPORTED
|
||||
/* Added in 1.5.5 to record an sRGB chunk in the png. */
|
||||
png_byte is_sRGB;
|
||||
#endif
|
||||
|
||||
/* New members added in libpng-1.0.3 */
|
||||
#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
|
||||
png_byte rgb_to_gray_status;
|
||||
/* Added in libpng 1.5.5 to record setting of coefficients: */
|
||||
png_byte rgb_to_gray_coefficients_set;
|
||||
/* These were changed from png_byte in libpng-1.0.6 */
|
||||
png_uint_16 rgb_to_gray_red_coeff;
|
||||
png_uint_16 rgb_to_gray_green_coeff;
|
||||
png_uint_16 rgb_to_gray_blue_coeff;
|
||||
/* deleted in 1.5.5: rgb_to_gray_blue_coeff; */
|
||||
#endif
|
||||
|
||||
/* New member added in libpng-1.0.4 (renamed in 1.0.9) */
|
||||
@@ -322,9 +340,8 @@ struct png_struct_def
|
||||
png_unknown_chunk unknown_chunk;
|
||||
#endif
|
||||
|
||||
/* New members added in libpng-1.2.26 */
|
||||
/* New member added in libpng-1.2.26 */
|
||||
png_size_t old_big_row_buf_size;
|
||||
png_size_t old_prev_row_size;
|
||||
|
||||
/* New member added in libpng-1.2.30 */
|
||||
png_charp chunkdata; /* buffer for reading chunk data */
|
||||
@@ -333,5 +350,8 @@ struct png_struct_def
|
||||
/* New member added in libpng-1.4.0 */
|
||||
png_uint_32 io_state;
|
||||
#endif
|
||||
|
||||
/* New member added in libpng-1.5.6 */
|
||||
png_bytep big_prev_row;
|
||||
};
|
||||
#endif /* PNGSTRUCT_H */
|
||||
|
||||
29
pngtest.c
29
pngtest.c
@@ -1,7 +1,7 @@
|
||||
|
||||
/* pngtest.c - a simple test program to test libpng
|
||||
*
|
||||
* Last changed in libpng 1.5.4 [(PENDING RELEASE)]
|
||||
* Last changed in libpng 1.5.6 [(PENDING RELEASE)]
|
||||
* Copyright (c) 1998-2011 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
@@ -98,6 +98,7 @@ static char tIME_string[PNG_tIME_STRING_LENGTH] = "tIME chunk is not present";
|
||||
#endif
|
||||
|
||||
static int verbose = 0;
|
||||
static int strict = 0;
|
||||
|
||||
int test_one_file PNGARG((PNG_CONST char *inname, PNG_CONST char *outname));
|
||||
|
||||
@@ -918,7 +919,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
|
||||
#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
|
||||
/* Normally one would use Z_DEFAULT_STRATEGY for text compression.
|
||||
* This is here just to make pngtest replicate the results from libpng
|
||||
* versions prior to 1.5.3, and to test this new API.
|
||||
* versions prior to 1.5.4, and to test this new API.
|
||||
*/
|
||||
png_set_text_compression_strategy(write_ptr, Z_FILTERED);
|
||||
#endif
|
||||
@@ -1479,7 +1480,12 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
|
||||
|
||||
FCLOSE(fpin);
|
||||
FCLOSE(fpout);
|
||||
return (0);
|
||||
|
||||
if (strict != 0)
|
||||
return (1);
|
||||
|
||||
else
|
||||
return (0);
|
||||
}
|
||||
|
||||
if (!num_in)
|
||||
@@ -1504,7 +1510,12 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
|
||||
|
||||
FCLOSE(fpin);
|
||||
FCLOSE(fpout);
|
||||
return (0);
|
||||
|
||||
if (strict != 0)
|
||||
return (1);
|
||||
|
||||
else
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1586,6 +1597,14 @@ main(int argc, char *argv[])
|
||||
inname = argv[2];
|
||||
}
|
||||
|
||||
else if (strcmp(argv[1], "--strict") == 0)
|
||||
{
|
||||
status_dots_requested = 0;
|
||||
verbose = 1;
|
||||
inname = argv[2];
|
||||
strict++;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
inname = argv[1];
|
||||
@@ -1794,4 +1813,4 @@ main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
/* Generate a compiler error if there is an old png.h in the search path. */
|
||||
typedef png_libpng_version_1_5_4beta03 Your_png_h_is_not_version_1_5_4beta03;
|
||||
typedef png_libpng_version_1_5_6rc02 Your_png_h_is_not_version_1_5_6rc02;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
/* pngtrans.c - transforms the data in a row (used by both readers and writers)
|
||||
*
|
||||
* Last changed in libpng 1.5.4 [(PENDING RELEASE)]
|
||||
* Last changed in libpng 1.5.4 [July 7, 2011]
|
||||
* Copyright (c) 1998-2011 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
|
||||
1979
pngvalid.c
1979
pngvalid.c
File diff suppressed because it is too large
Load Diff
63
pngwrite.c
63
pngwrite.c
@@ -1,7 +1,7 @@
|
||||
|
||||
/* pngwrite.c - general routines to write a PNG file
|
||||
*
|
||||
* Last changed in libpng 1.5.4 [(PENDING RELEASE)]
|
||||
* Last changed in libpng 1.5.6 [(PENDING RELEASE)]
|
||||
* Copyright (c) 1998-2011 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
@@ -608,6 +608,9 @@ png_write_image(png_structp png_ptr, png_bytepp image)
|
||||
void PNGAPI
|
||||
png_write_row(png_structp png_ptr, png_const_bytep row)
|
||||
{
|
||||
/* 1.5.6: moved from png_struct to be a local structure: */
|
||||
png_row_info row_info;
|
||||
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
|
||||
@@ -731,36 +734,31 @@ png_write_row(png_structp png_ptr, png_const_bytep row)
|
||||
#endif
|
||||
|
||||
/* Set up row info for transformations */
|
||||
png_ptr->row_info.color_type = png_ptr->color_type;
|
||||
png_ptr->row_info.width = png_ptr->usr_width;
|
||||
png_ptr->row_info.channels = png_ptr->usr_channels;
|
||||
png_ptr->row_info.bit_depth = png_ptr->usr_bit_depth;
|
||||
png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth *
|
||||
png_ptr->row_info.channels);
|
||||
row_info.color_type = png_ptr->color_type;
|
||||
row_info.width = png_ptr->usr_width;
|
||||
row_info.channels = png_ptr->usr_channels;
|
||||
row_info.bit_depth = png_ptr->usr_bit_depth;
|
||||
row_info.pixel_depth = (png_byte)(row_info.bit_depth * row_info.channels);
|
||||
row_info.rowbytes = PNG_ROWBYTES(row_info.pixel_depth, row_info.width);
|
||||
|
||||
png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,
|
||||
png_ptr->row_info.width);
|
||||
|
||||
png_debug1(3, "row_info->color_type = %d", png_ptr->row_info.color_type);
|
||||
png_debug1(3, "row_info->width = %u", png_ptr->row_info.width);
|
||||
png_debug1(3, "row_info->channels = %d", png_ptr->row_info.channels);
|
||||
png_debug1(3, "row_info->bit_depth = %d", png_ptr->row_info.bit_depth);
|
||||
png_debug1(3, "row_info->pixel_depth = %d", png_ptr->row_info.pixel_depth);
|
||||
png_debug1(3, "row_info->rowbytes = %lu",
|
||||
(unsigned long)png_ptr->row_info.rowbytes);
|
||||
png_debug1(3, "row_info->color_type = %d", row_info.color_type);
|
||||
png_debug1(3, "row_info->width = %u", row_info.width);
|
||||
png_debug1(3, "row_info->channels = %d", row_info.channels);
|
||||
png_debug1(3, "row_info->bit_depth = %d", row_info.bit_depth);
|
||||
png_debug1(3, "row_info->pixel_depth = %d", row_info.pixel_depth);
|
||||
png_debug1(3, "row_info->rowbytes = %lu", (unsigned long)row_info.rowbytes);
|
||||
|
||||
/* Copy user's row into buffer, leaving room for filter byte. */
|
||||
png_memcpy(png_ptr->row_buf + 1, row, png_ptr->row_info.rowbytes);
|
||||
png_memcpy(png_ptr->row_buf + 1, row, row_info.rowbytes);
|
||||
|
||||
#ifdef PNG_WRITE_INTERLACING_SUPPORTED
|
||||
/* Handle interlacing */
|
||||
if (png_ptr->interlaced && png_ptr->pass < 6 &&
|
||||
(png_ptr->transformations & PNG_INTERLACE))
|
||||
{
|
||||
png_do_write_interlace(&(png_ptr->row_info),
|
||||
png_ptr->row_buf + 1, png_ptr->pass);
|
||||
png_do_write_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass);
|
||||
/* This should always get caught above, but still ... */
|
||||
if (!(png_ptr->row_info.width))
|
||||
if (!(row_info.width))
|
||||
{
|
||||
png_write_finish_row(png_ptr);
|
||||
return;
|
||||
@@ -771,9 +769,16 @@ png_write_row(png_structp png_ptr, png_const_bytep row)
|
||||
#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED
|
||||
/* Handle other transformations */
|
||||
if (png_ptr->transformations)
|
||||
png_do_write_transformations(png_ptr);
|
||||
png_do_write_transformations(png_ptr, &row_info);
|
||||
#endif
|
||||
|
||||
/* At this point the row_info pixel depth must match the 'transformed' depth,
|
||||
* which is also the output depth.
|
||||
*/
|
||||
if (row_info.pixel_depth != png_ptr->pixel_depth ||
|
||||
row_info.pixel_depth != png_ptr->transformed_pixel_depth)
|
||||
png_error(png_ptr, "internal write transform logic error");
|
||||
|
||||
#ifdef PNG_MNG_FEATURES_SUPPORTED
|
||||
/* Write filter_method 64 (intrapixel differencing) only if
|
||||
* 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and
|
||||
@@ -788,12 +793,12 @@ png_write_row(png_structp png_ptr, png_const_bytep row)
|
||||
(png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING))
|
||||
{
|
||||
/* Intrapixel differencing */
|
||||
png_do_write_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1);
|
||||
png_do_write_intrapixel(&row_info, png_ptr->row_buf + 1);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Find a filter if necessary, filter the row and write it out. */
|
||||
png_write_find_filter(png_ptr, &(png_ptr->row_info));
|
||||
png_write_find_filter(png_ptr, &row_info);
|
||||
|
||||
if (png_ptr->write_row_fn != NULL)
|
||||
(*(png_ptr->write_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass);
|
||||
@@ -879,13 +884,7 @@ png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)
|
||||
png_debug(1, "in png_destroy_write_struct");
|
||||
|
||||
if (png_ptr_ptr != NULL)
|
||||
{
|
||||
png_ptr = *png_ptr_ptr;
|
||||
#ifdef PNG_USER_MEM_SUPPORTED
|
||||
free_fn = png_ptr->free_fn;
|
||||
mem_ptr = png_ptr->mem_ptr;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef PNG_USER_MEM_SUPPORTED
|
||||
if (png_ptr != NULL)
|
||||
@@ -1458,7 +1457,7 @@ png_set_compression_method(png_structp png_ptr, int method)
|
||||
png_ptr->zlib_method = method;
|
||||
}
|
||||
|
||||
/* The following were added to libpng-1.5.3 */
|
||||
/* The following were added to libpng-1.5.4 */
|
||||
#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
|
||||
void PNGAPI
|
||||
png_set_text_compression_level(png_structp png_ptr, int level)
|
||||
@@ -1539,7 +1538,7 @@ png_set_text_compression_method(png_structp png_ptr, int method)
|
||||
png_ptr->zlib_text_method = method;
|
||||
}
|
||||
#endif /* PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED */
|
||||
/* end of API added to libpng-1.5.3 */
|
||||
/* end of API added to libpng-1.5.4 */
|
||||
|
||||
void PNGAPI
|
||||
png_set_write_status_fn(png_structp png_ptr, png_write_status_ptr write_row_fn)
|
||||
|
||||
26
pngwtran.c
26
pngwtran.c
@@ -1,7 +1,7 @@
|
||||
|
||||
/* pngwtran.c - transforms the data in a row for PNG writers
|
||||
*
|
||||
* Last changed in libpng 1.5.4 [(PENDING RELEASE)]
|
||||
* Last changed in libpng 1.5.6 [(PENDING RELEASE)]
|
||||
* Copyright (c) 1998-2011 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
@@ -20,7 +20,7 @@
|
||||
* transformations is significant.
|
||||
*/
|
||||
void /* PRIVATE */
|
||||
png_do_write_transformations(png_structp png_ptr)
|
||||
png_do_write_transformations(png_structp png_ptr, png_row_infop row_info)
|
||||
{
|
||||
png_debug(1, "in png_do_write_transformations");
|
||||
|
||||
@@ -32,8 +32,8 @@ png_do_write_transformations(png_structp png_ptr)
|
||||
if (png_ptr->write_user_transform_fn != NULL)
|
||||
(*(png_ptr->write_user_transform_fn)) /* User write transform
|
||||
function */
|
||||
(png_ptr, /* png_ptr */
|
||||
&(png_ptr->row_info), /* row_info: */
|
||||
(png_ptr, /* png_ptr */
|
||||
row_info, /* row_info: */
|
||||
/* png_uint_32 width; width of row */
|
||||
/* png_size_t rowbytes; number of bytes in row */
|
||||
/* png_byte color_type; color type of pixels */
|
||||
@@ -45,50 +45,50 @@ png_do_write_transformations(png_structp png_ptr)
|
||||
|
||||
#ifdef PNG_WRITE_FILLER_SUPPORTED
|
||||
if (png_ptr->transformations & PNG_FILLER)
|
||||
png_do_strip_channel(&(png_ptr->row_info), png_ptr->row_buf + 1,
|
||||
png_do_strip_channel(row_info, png_ptr->row_buf + 1,
|
||||
!(png_ptr->flags & PNG_FLAG_FILLER_AFTER));
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_PACKSWAP_SUPPORTED
|
||||
if (png_ptr->transformations & PNG_PACKSWAP)
|
||||
png_do_packswap(&(png_ptr->row_info), png_ptr->row_buf + 1);
|
||||
png_do_packswap(row_info, png_ptr->row_buf + 1);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_PACK_SUPPORTED
|
||||
if (png_ptr->transformations & PNG_PACK)
|
||||
png_do_pack(&(png_ptr->row_info), png_ptr->row_buf + 1,
|
||||
png_do_pack(row_info, png_ptr->row_buf + 1,
|
||||
(png_uint_32)png_ptr->bit_depth);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_SWAP_SUPPORTED
|
||||
if (png_ptr->transformations & PNG_SWAP_BYTES)
|
||||
png_do_swap(&(png_ptr->row_info), png_ptr->row_buf + 1);
|
||||
png_do_swap(row_info, png_ptr->row_buf + 1);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_SHIFT_SUPPORTED
|
||||
if (png_ptr->transformations & PNG_SHIFT)
|
||||
png_do_shift(&(png_ptr->row_info), png_ptr->row_buf + 1,
|
||||
png_do_shift(row_info, png_ptr->row_buf + 1,
|
||||
&(png_ptr->shift));
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED
|
||||
if (png_ptr->transformations & PNG_SWAP_ALPHA)
|
||||
png_do_write_swap_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1);
|
||||
png_do_write_swap_alpha(row_info, png_ptr->row_buf + 1);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED
|
||||
if (png_ptr->transformations & PNG_INVERT_ALPHA)
|
||||
png_do_write_invert_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1);
|
||||
png_do_write_invert_alpha(row_info, png_ptr->row_buf + 1);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_BGR_SUPPORTED
|
||||
if (png_ptr->transformations & PNG_BGR)
|
||||
png_do_bgr(&(png_ptr->row_info), png_ptr->row_buf + 1);
|
||||
png_do_bgr(row_info, png_ptr->row_buf + 1);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_INVERT_SUPPORTED
|
||||
if (png_ptr->transformations & PNG_INVERT_MONO)
|
||||
png_do_invert(&(png_ptr->row_info), png_ptr->row_buf + 1);
|
||||
png_do_invert(row_info, png_ptr->row_buf + 1);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
235
pngwutil.c
235
pngwutil.c
@@ -1,7 +1,7 @@
|
||||
|
||||
/* pngwutil.c - utilities to write a PNG file
|
||||
*
|
||||
* Last changed in libpng 1.5.4 [(PENDING RELEASE)]
|
||||
* Last changed in libpng 1.5.6 [(PENDING RELEASE)]
|
||||
* Copyright (c) 1998-2011 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
@@ -82,39 +82,20 @@ png_write_sig(png_structp png_ptr)
|
||||
png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE;
|
||||
}
|
||||
|
||||
/* Write a PNG chunk all at once. The type is an array of ASCII characters
|
||||
* representing the chunk name. The array must be at least 4 bytes in
|
||||
* length, and does not need to be null terminated. To be safe, pass the
|
||||
* pre-defined chunk names here, and if you need a new one, define it
|
||||
* where the others are defined. The length is the length of the data.
|
||||
* All the data must be present. If that is not possible, use the
|
||||
* png_write_chunk_start(), png_write_chunk_data(), and png_write_chunk_end()
|
||||
* functions instead.
|
||||
*/
|
||||
void PNGAPI
|
||||
png_write_chunk(png_structp png_ptr, png_const_bytep chunk_name,
|
||||
png_const_bytep data, png_size_t length)
|
||||
{
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
|
||||
png_write_chunk_start(png_ptr, chunk_name, (png_uint_32)length);
|
||||
png_write_chunk_data(png_ptr, data, (png_size_t)length);
|
||||
png_write_chunk_end(png_ptr);
|
||||
}
|
||||
|
||||
/* Write the start of a PNG chunk. The type is the chunk type.
|
||||
* The total_length is the sum of the lengths of all the data you will be
|
||||
* passing in png_write_chunk_data().
|
||||
*/
|
||||
void PNGAPI
|
||||
png_write_chunk_start(png_structp png_ptr, png_const_bytep chunk_name,
|
||||
static void
|
||||
png_write_chunk_header(png_structp png_ptr, png_uint_32 chunk_name,
|
||||
png_uint_32 length)
|
||||
{
|
||||
png_byte buf[8];
|
||||
|
||||
png_debug2(0, "Writing %s chunk, length = %lu", chunk_name,
|
||||
(unsigned long)length);
|
||||
#if defined(PNG_DEBUG) && (PNG_DEBUG > 0)
|
||||
PNG_CSTRING_FROM_CHUNK(buf, chunk_name);
|
||||
png_debug2(0, "Writing %s chunk, length = %lu", buf, (unsigned long)length);
|
||||
#endif
|
||||
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
@@ -128,16 +109,16 @@ png_write_chunk_start(png_structp png_ptr, png_const_bytep chunk_name,
|
||||
|
||||
/* Write the length and the chunk name */
|
||||
png_save_uint_32(buf, length);
|
||||
png_memcpy(buf + 4, chunk_name, 4);
|
||||
png_write_data(png_ptr, buf, (png_size_t)8);
|
||||
png_save_uint_32(buf + 4, chunk_name);
|
||||
png_write_data(png_ptr, buf, 8);
|
||||
|
||||
/* Put the chunk name into png_ptr->chunk_name */
|
||||
png_memcpy(png_ptr->chunk_name, chunk_name, 4);
|
||||
png_ptr->chunk_name = chunk_name;
|
||||
|
||||
/* Reset the crc and run it over the chunk name */
|
||||
png_reset_crc(png_ptr);
|
||||
|
||||
png_calculate_crc(png_ptr, chunk_name, 4);
|
||||
png_calculate_crc(png_ptr, buf + 4, 4);
|
||||
|
||||
#ifdef PNG_IO_STATE_SUPPORTED
|
||||
/* Inform the I/O callback that chunk data will (possibly) be written.
|
||||
@@ -147,10 +128,17 @@ png_write_chunk_start(png_structp png_ptr, png_const_bytep chunk_name,
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Write the data of a PNG chunk started with png_write_chunk_start().
|
||||
void PNGAPI
|
||||
png_write_chunk_start(png_structp png_ptr, png_const_bytep chunk_string,
|
||||
png_uint_32 length)
|
||||
{
|
||||
png_write_chunk_header(png_ptr, PNG_CHUNK_FROM_STRING(chunk_string), length);
|
||||
}
|
||||
|
||||
/* Write the data of a PNG chunk started with png_write_chunk_header().
|
||||
* Note that multiple calls to this function are allowed, and that the
|
||||
* sum of the lengths from these calls *must* add up to the total_length
|
||||
* given to png_write_chunk_start().
|
||||
* given to png_write_chunk_header().
|
||||
*/
|
||||
void PNGAPI
|
||||
png_write_chunk_data(png_structp png_ptr, png_const_bytep data,
|
||||
@@ -171,7 +159,7 @@ png_write_chunk_data(png_structp png_ptr, png_const_bytep data,
|
||||
}
|
||||
}
|
||||
|
||||
/* Finish a chunk started with png_write_chunk_start(). */
|
||||
/* Finish a chunk started with png_write_chunk_header(). */
|
||||
void PNGAPI
|
||||
png_write_chunk_end(png_structp png_ptr)
|
||||
{
|
||||
@@ -192,6 +180,40 @@ png_write_chunk_end(png_structp png_ptr)
|
||||
png_write_data(png_ptr, buf, (png_size_t)4);
|
||||
}
|
||||
|
||||
/* Write a PNG chunk all at once. The type is an array of ASCII characters
|
||||
* representing the chunk name. The array must be at least 4 bytes in
|
||||
* length, and does not need to be null terminated. To be safe, pass the
|
||||
* pre-defined chunk names here, and if you need a new one, define it
|
||||
* where the others are defined. The length is the length of the data.
|
||||
* All the data must be present. If that is not possible, use the
|
||||
* png_write_chunk_start(), png_write_chunk_data(), and png_write_chunk_end()
|
||||
* functions instead.
|
||||
*/
|
||||
static void
|
||||
png_write_complete_chunk(png_structp png_ptr, png_uint_32 chunk_name,
|
||||
png_const_bytep data, png_size_t length)
|
||||
{
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
|
||||
/* On 64 bit architectures 'length' may not fit in a png_uint_32. */
|
||||
if (length > PNG_UINT_32_MAX)
|
||||
png_error(png_ptr, "length exceeds PNG maxima");
|
||||
|
||||
png_write_chunk_header(png_ptr, chunk_name, (png_uint_32)length);
|
||||
png_write_chunk_data(png_ptr, data, length);
|
||||
png_write_chunk_end(png_ptr);
|
||||
}
|
||||
|
||||
/* This is the API that calls the internal function above. */
|
||||
void PNGAPI
|
||||
png_write_chunk(png_structp png_ptr, png_const_bytep chunk_string,
|
||||
png_const_bytep data, png_size_t length)
|
||||
{
|
||||
png_write_complete_chunk(png_ptr, PNG_CHUNK_FROM_STRING(chunk_string), data,
|
||||
length);
|
||||
}
|
||||
|
||||
/* Initialize the compressor for the appropriate type of compression. */
|
||||
static void
|
||||
png_zlib_claim(png_structp png_ptr, png_uint_32 state)
|
||||
@@ -560,7 +582,10 @@ png_write_compressed_data_out(png_structp png_ptr, compression_state *comp)
|
||||
}
|
||||
|
||||
#ifdef PNG_WRITE_OPTIMIZE_CMF_SUPPORTED
|
||||
if (comp->input_len >= 2 && comp->input_len < 16384)
|
||||
/* The zbuf_size test is because the code below doesn't work if zbuf_size is
|
||||
* '1'; simply skip it to avoid memory overwrite.
|
||||
*/
|
||||
if (comp->input_len >= 2 && comp->input_len < 16384 && png_ptr->zbuf_size > 1)
|
||||
{
|
||||
unsigned int z_cmf; /* zlib compression method and flags */
|
||||
|
||||
@@ -652,8 +677,6 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
|
||||
int bit_depth, int color_type, int compression_type, int filter_type,
|
||||
int interlace_type)
|
||||
{
|
||||
PNG_IHDR;
|
||||
|
||||
png_byte buf[13]; /* Buffer to store the IHDR info */
|
||||
|
||||
png_debug(1, "in png_write_IHDR");
|
||||
@@ -795,7 +818,7 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
|
||||
buf[12] = (png_byte)interlace_type;
|
||||
|
||||
/* Write the chunk */
|
||||
png_write_chunk(png_ptr, png_IHDR, buf, (png_size_t)13);
|
||||
png_write_complete_chunk(png_ptr, png_IHDR, buf, (png_size_t)13);
|
||||
|
||||
/* Initialize zlib with PNG info */
|
||||
png_ptr->zstream.zalloc = png_zalloc;
|
||||
@@ -872,7 +895,6 @@ void /* PRIVATE */
|
||||
png_write_PLTE(png_structp png_ptr, png_const_colorp palette,
|
||||
png_uint_32 num_pal)
|
||||
{
|
||||
PNG_PLTE;
|
||||
png_uint_32 i;
|
||||
png_const_colorp pal_ptr;
|
||||
png_byte buf[3];
|
||||
@@ -908,7 +930,7 @@ png_write_PLTE(png_structp png_ptr, png_const_colorp palette,
|
||||
png_ptr->num_palette = (png_uint_16)num_pal;
|
||||
png_debug1(3, "num_palette = %d", png_ptr->num_palette);
|
||||
|
||||
png_write_chunk_start(png_ptr, png_PLTE, (png_uint_32)(num_pal * 3));
|
||||
png_write_chunk_header(png_ptr, png_PLTE, (png_uint_32)(num_pal * 3));
|
||||
#ifdef PNG_POINTER_INDEXING_SUPPORTED
|
||||
|
||||
for (i = 0, pal_ptr = palette; i < num_pal; i++, pal_ptr++)
|
||||
@@ -942,8 +964,6 @@ png_write_PLTE(png_structp png_ptr, png_const_colorp palette,
|
||||
void /* PRIVATE */
|
||||
png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length)
|
||||
{
|
||||
PNG_IDAT;
|
||||
|
||||
png_debug(1, "in png_write_IDAT");
|
||||
|
||||
#ifdef PNG_WRITE_OPTIMIZE_CMF_SUPPORTED
|
||||
@@ -1014,10 +1034,10 @@ png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length)
|
||||
}
|
||||
#endif /* PNG_WRITE_OPTIMIZE_CMF_SUPPORTED */
|
||||
|
||||
png_write_chunk(png_ptr, png_IDAT, data, length);
|
||||
png_write_complete_chunk(png_ptr, png_IDAT, data, length);
|
||||
png_ptr->mode |= PNG_HAVE_IDAT;
|
||||
|
||||
/* Prior to 1.5.3 this code was replicated in every caller (except at the
|
||||
/* Prior to 1.5.4 this code was replicated in every caller (except at the
|
||||
* end, where it isn't technically necessary). Since this function has
|
||||
* flushed the data we can safely reset the zlib output buffer here.
|
||||
*/
|
||||
@@ -1029,11 +1049,9 @@ png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length)
|
||||
void /* PRIVATE */
|
||||
png_write_IEND(png_structp png_ptr)
|
||||
{
|
||||
PNG_IEND;
|
||||
|
||||
png_debug(1, "in png_write_IEND");
|
||||
|
||||
png_write_chunk(png_ptr, png_IEND, NULL, (png_size_t)0);
|
||||
png_write_complete_chunk(png_ptr, png_IEND, NULL, (png_size_t)0);
|
||||
png_ptr->mode |= PNG_HAVE_IEND;
|
||||
}
|
||||
|
||||
@@ -1042,14 +1060,13 @@ png_write_IEND(png_structp png_ptr)
|
||||
void /* PRIVATE */
|
||||
png_write_gAMA_fixed(png_structp png_ptr, png_fixed_point file_gamma)
|
||||
{
|
||||
PNG_gAMA;
|
||||
png_byte buf[4];
|
||||
|
||||
png_debug(1, "in png_write_gAMA");
|
||||
|
||||
/* file_gamma is saved in 1/100,000ths */
|
||||
png_save_uint_32(buf, (png_uint_32)file_gamma);
|
||||
png_write_chunk(png_ptr, png_gAMA, buf, (png_size_t)4);
|
||||
png_write_complete_chunk(png_ptr, png_gAMA, buf, (png_size_t)4);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1058,7 +1075,6 @@ png_write_gAMA_fixed(png_structp png_ptr, png_fixed_point file_gamma)
|
||||
void /* PRIVATE */
|
||||
png_write_sRGB(png_structp png_ptr, int srgb_intent)
|
||||
{
|
||||
PNG_sRGB;
|
||||
png_byte buf[1];
|
||||
|
||||
png_debug(1, "in png_write_sRGB");
|
||||
@@ -1068,7 +1084,7 @@ png_write_sRGB(png_structp png_ptr, int srgb_intent)
|
||||
"Invalid sRGB rendering intent specified");
|
||||
|
||||
buf[0]=(png_byte)srgb_intent;
|
||||
png_write_chunk(png_ptr, png_sRGB, buf, (png_size_t)1);
|
||||
png_write_complete_chunk(png_ptr, png_sRGB, buf, (png_size_t)1);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1078,7 +1094,6 @@ void /* PRIVATE */
|
||||
png_write_iCCP(png_structp png_ptr, png_const_charp name, int compression_type,
|
||||
png_const_charp profile, int profile_len)
|
||||
{
|
||||
PNG_iCCP;
|
||||
png_size_t name_len;
|
||||
png_charp new_name;
|
||||
compression_state comp;
|
||||
@@ -1139,7 +1154,7 @@ png_write_iCCP(png_structp png_ptr, png_const_charp name, int compression_type,
|
||||
(png_size_t)profile_len, PNG_COMPRESSION_TYPE_BASE, &comp);
|
||||
|
||||
/* Make sure we include the NULL after the name and the compression type */
|
||||
png_write_chunk_start(png_ptr, png_iCCP,
|
||||
png_write_chunk_header(png_ptr, png_iCCP,
|
||||
(png_uint_32)(name_len + profile_len + 2));
|
||||
|
||||
new_name[name_len + 1] = 0x00;
|
||||
@@ -1163,7 +1178,6 @@ png_write_iCCP(png_structp png_ptr, png_const_charp name, int compression_type,
|
||||
void /* PRIVATE */
|
||||
png_write_sPLT(png_structp png_ptr, png_const_sPLT_tp spalette)
|
||||
{
|
||||
PNG_sPLT;
|
||||
png_size_t name_len;
|
||||
png_charp new_name;
|
||||
png_byte entrybuf[10];
|
||||
@@ -1180,7 +1194,7 @@ png_write_sPLT(png_structp png_ptr, png_const_sPLT_tp spalette)
|
||||
return;
|
||||
|
||||
/* Make sure we include the NULL after the name */
|
||||
png_write_chunk_start(png_ptr, png_sPLT,
|
||||
png_write_chunk_header(png_ptr, png_sPLT,
|
||||
(png_uint_32)(name_len + 2 + palette_size));
|
||||
|
||||
png_write_chunk_data(png_ptr, (png_bytep)new_name,
|
||||
@@ -1248,7 +1262,6 @@ png_write_sPLT(png_structp png_ptr, png_const_sPLT_tp spalette)
|
||||
void /* PRIVATE */
|
||||
png_write_sBIT(png_structp png_ptr, png_const_color_8p sbit, int color_type)
|
||||
{
|
||||
PNG_sBIT;
|
||||
png_byte buf[4];
|
||||
png_size_t size;
|
||||
|
||||
@@ -1299,7 +1312,7 @@ png_write_sBIT(png_structp png_ptr, png_const_color_8p sbit, int color_type)
|
||||
buf[size++] = sbit->alpha;
|
||||
}
|
||||
|
||||
png_write_chunk(png_ptr, png_sBIT, buf, size);
|
||||
png_write_complete_chunk(png_ptr, png_sBIT, buf, size);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1311,7 +1324,6 @@ png_write_cHRM_fixed(png_structp png_ptr, png_fixed_point white_x,
|
||||
png_fixed_point green_x, png_fixed_point green_y, png_fixed_point blue_x,
|
||||
png_fixed_point blue_y)
|
||||
{
|
||||
PNG_cHRM;
|
||||
png_byte buf[32];
|
||||
|
||||
png_debug(1, "in png_write_cHRM");
|
||||
@@ -1334,7 +1346,7 @@ png_write_cHRM_fixed(png_structp png_ptr, png_fixed_point white_x,
|
||||
png_save_uint_32(buf + 24, (png_uint_32)blue_x);
|
||||
png_save_uint_32(buf + 28, (png_uint_32)blue_y);
|
||||
|
||||
png_write_chunk(png_ptr, png_cHRM, buf, (png_size_t)32);
|
||||
png_write_complete_chunk(png_ptr, png_cHRM, buf, (png_size_t)32);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -1345,7 +1357,6 @@ void /* PRIVATE */
|
||||
png_write_tRNS(png_structp png_ptr, png_const_bytep trans_alpha,
|
||||
png_const_color_16p tran, int num_trans, int color_type)
|
||||
{
|
||||
PNG_tRNS;
|
||||
png_byte buf[6];
|
||||
|
||||
png_debug(1, "in png_write_tRNS");
|
||||
@@ -1359,7 +1370,7 @@ png_write_tRNS(png_structp png_ptr, png_const_bytep trans_alpha,
|
||||
}
|
||||
|
||||
/* Write the chunk out as it is */
|
||||
png_write_chunk(png_ptr, png_tRNS, trans_alpha, (png_size_t)num_trans);
|
||||
png_write_complete_chunk(png_ptr, png_tRNS, trans_alpha, (png_size_t)num_trans);
|
||||
}
|
||||
|
||||
else if (color_type == PNG_COLOR_TYPE_GRAY)
|
||||
@@ -1374,7 +1385,7 @@ png_write_tRNS(png_structp png_ptr, png_const_bytep trans_alpha,
|
||||
}
|
||||
|
||||
png_save_uint_16(buf, tran->gray);
|
||||
png_write_chunk(png_ptr, png_tRNS, buf, (png_size_t)2);
|
||||
png_write_complete_chunk(png_ptr, png_tRNS, buf, (png_size_t)2);
|
||||
}
|
||||
|
||||
else if (color_type == PNG_COLOR_TYPE_RGB)
|
||||
@@ -1394,7 +1405,7 @@ png_write_tRNS(png_structp png_ptr, png_const_bytep trans_alpha,
|
||||
return;
|
||||
}
|
||||
|
||||
png_write_chunk(png_ptr, png_tRNS, buf, (png_size_t)6);
|
||||
png_write_complete_chunk(png_ptr, png_tRNS, buf, (png_size_t)6);
|
||||
}
|
||||
|
||||
else
|
||||
@@ -1409,7 +1420,6 @@ png_write_tRNS(png_structp png_ptr, png_const_bytep trans_alpha,
|
||||
void /* PRIVATE */
|
||||
png_write_bKGD(png_structp png_ptr, png_const_color_16p back, int color_type)
|
||||
{
|
||||
PNG_bKGD;
|
||||
png_byte buf[6];
|
||||
|
||||
png_debug(1, "in png_write_bKGD");
|
||||
@@ -1428,7 +1438,7 @@ png_write_bKGD(png_structp png_ptr, png_const_color_16p back, int color_type)
|
||||
}
|
||||
|
||||
buf[0] = back->index;
|
||||
png_write_chunk(png_ptr, png_bKGD, buf, (png_size_t)1);
|
||||
png_write_complete_chunk(png_ptr, png_bKGD, buf, (png_size_t)1);
|
||||
}
|
||||
|
||||
else if (color_type & PNG_COLOR_MASK_COLOR)
|
||||
@@ -1448,7 +1458,7 @@ png_write_bKGD(png_structp png_ptr, png_const_color_16p back, int color_type)
|
||||
return;
|
||||
}
|
||||
|
||||
png_write_chunk(png_ptr, png_bKGD, buf, (png_size_t)6);
|
||||
png_write_complete_chunk(png_ptr, png_bKGD, buf, (png_size_t)6);
|
||||
}
|
||||
|
||||
else
|
||||
@@ -1462,7 +1472,7 @@ png_write_bKGD(png_structp png_ptr, png_const_color_16p back, int color_type)
|
||||
}
|
||||
|
||||
png_save_uint_16(buf, back->gray);
|
||||
png_write_chunk(png_ptr, png_bKGD, buf, (png_size_t)2);
|
||||
png_write_complete_chunk(png_ptr, png_bKGD, buf, (png_size_t)2);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -1472,7 +1482,6 @@ png_write_bKGD(png_structp png_ptr, png_const_color_16p back, int color_type)
|
||||
void /* PRIVATE */
|
||||
png_write_hIST(png_structp png_ptr, png_const_uint_16p hist, int num_hist)
|
||||
{
|
||||
PNG_hIST;
|
||||
int i;
|
||||
png_byte buf[3];
|
||||
|
||||
@@ -1487,7 +1496,7 @@ png_write_hIST(png_structp png_ptr, png_const_uint_16p hist, int num_hist)
|
||||
return;
|
||||
}
|
||||
|
||||
png_write_chunk_start(png_ptr, png_hIST, (png_uint_32)(num_hist * 2));
|
||||
png_write_chunk_header(png_ptr, png_hIST, (png_uint_32)(num_hist * 2));
|
||||
|
||||
for (i = 0; i < num_hist; i++)
|
||||
{
|
||||
@@ -1637,7 +1646,6 @@ void /* PRIVATE */
|
||||
png_write_tEXt(png_structp png_ptr, png_const_charp key, png_const_charp text,
|
||||
png_size_t text_len)
|
||||
{
|
||||
PNG_tEXt;
|
||||
png_size_t key_len;
|
||||
png_charp new_key;
|
||||
|
||||
@@ -1653,7 +1661,7 @@ png_write_tEXt(png_structp png_ptr, png_const_charp key, png_const_charp text,
|
||||
text_len = png_strlen(text);
|
||||
|
||||
/* Make sure we include the 0 after the key */
|
||||
png_write_chunk_start(png_ptr, png_tEXt,
|
||||
png_write_chunk_header(png_ptr, png_tEXt,
|
||||
(png_uint_32)(key_len + text_len + 1));
|
||||
/*
|
||||
* We leave it to the application to meet PNG-1.0 requirements on the
|
||||
@@ -1679,7 +1687,6 @@ void /* PRIVATE */
|
||||
png_write_zTXt(png_structp png_ptr, png_const_charp key, png_const_charp text,
|
||||
png_size_t text_len, int compression)
|
||||
{
|
||||
PNG_zTXt;
|
||||
png_size_t key_len;
|
||||
png_byte buf;
|
||||
png_charp new_key;
|
||||
@@ -1713,7 +1720,7 @@ png_write_zTXt(png_structp png_ptr, png_const_charp key, png_const_charp text,
|
||||
&comp);
|
||||
|
||||
/* Write start of chunk */
|
||||
png_write_chunk_start(png_ptr, png_zTXt,
|
||||
png_write_chunk_header(png_ptr, png_zTXt,
|
||||
(png_uint_32)(key_len+text_len + 2));
|
||||
|
||||
/* Write key */
|
||||
@@ -1742,7 +1749,6 @@ void /* PRIVATE */
|
||||
png_write_iTXt(png_structp png_ptr, int compression, png_const_charp key,
|
||||
png_const_charp lang, png_const_charp lang_key, png_const_charp text)
|
||||
{
|
||||
PNG_iTXt;
|
||||
png_size_t lang_len, key_len, lang_key_len, text_len;
|
||||
png_charp new_lang;
|
||||
png_charp new_key = NULL;
|
||||
@@ -1787,7 +1793,7 @@ png_write_iTXt(png_structp png_ptr, int compression, png_const_charp key,
|
||||
* and the NULs after the key, lang, and lang_key parts
|
||||
*/
|
||||
|
||||
png_write_chunk_start(png_ptr, png_iTXt, (png_uint_32)(
|
||||
png_write_chunk_header(png_ptr, png_iTXt, (png_uint_32)(
|
||||
5 /* comp byte, comp flag, terminators for key, lang and lang_key */
|
||||
+ key_len
|
||||
+ lang_len
|
||||
@@ -1836,7 +1842,6 @@ void /* PRIVATE */
|
||||
png_write_oFFs(png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset,
|
||||
int unit_type)
|
||||
{
|
||||
PNG_oFFs;
|
||||
png_byte buf[9];
|
||||
|
||||
png_debug(1, "in png_write_oFFs");
|
||||
@@ -1848,7 +1853,7 @@ png_write_oFFs(png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset,
|
||||
png_save_int_32(buf + 4, y_offset);
|
||||
buf[8] = (png_byte)unit_type;
|
||||
|
||||
png_write_chunk(png_ptr, png_oFFs, buf, (png_size_t)9);
|
||||
png_write_complete_chunk(png_ptr, png_oFFs, buf, (png_size_t)9);
|
||||
}
|
||||
#endif
|
||||
#ifdef PNG_WRITE_pCAL_SUPPORTED
|
||||
@@ -1858,9 +1863,8 @@ png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0,
|
||||
png_int_32 X1, int type, int nparams, png_const_charp units,
|
||||
png_charpp params)
|
||||
{
|
||||
PNG_pCAL;
|
||||
png_size_t purpose_len, units_len, total_len;
|
||||
png_uint_32p params_len;
|
||||
png_size_tp params_len;
|
||||
png_byte buf[10];
|
||||
png_charp new_purpose;
|
||||
int i;
|
||||
@@ -1876,8 +1880,8 @@ png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0,
|
||||
png_debug1(3, "pCAL units length = %d", (int)units_len);
|
||||
total_len = purpose_len + units_len + 10;
|
||||
|
||||
params_len = (png_uint_32p)png_malloc(png_ptr,
|
||||
(png_alloc_size_t)(nparams * png_sizeof(png_uint_32)));
|
||||
params_len = (png_size_tp)png_malloc(png_ptr,
|
||||
(png_alloc_size_t)(nparams * png_sizeof(png_size_t)));
|
||||
|
||||
/* Find the length of each parameter, making sure we don't count the
|
||||
* null terminator for the last parameter.
|
||||
@@ -1887,13 +1891,12 @@ png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0,
|
||||
params_len[i] = png_strlen(params[i]) + (i == nparams - 1 ? 0 : 1);
|
||||
png_debug2(3, "pCAL parameter %d length = %lu", i,
|
||||
(unsigned long)params_len[i]);
|
||||
total_len += (png_size_t)params_len[i];
|
||||
total_len += params_len[i];
|
||||
}
|
||||
|
||||
png_debug1(3, "pCAL total length = %d", (int)total_len);
|
||||
png_write_chunk_start(png_ptr, png_pCAL, (png_uint_32)total_len);
|
||||
png_write_chunk_data(png_ptr, (png_const_bytep)new_purpose,
|
||||
(png_size_t)purpose_len);
|
||||
png_write_chunk_header(png_ptr, png_pCAL, (png_uint_32)total_len);
|
||||
png_write_chunk_data(png_ptr, (png_const_bytep)new_purpose, purpose_len);
|
||||
png_save_int_32(buf, X0);
|
||||
png_save_int_32(buf + 4, X1);
|
||||
buf[8] = (png_byte)type;
|
||||
@@ -1905,8 +1908,7 @@ png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0,
|
||||
|
||||
for (i = 0; i < nparams; i++)
|
||||
{
|
||||
png_write_chunk_data(png_ptr, (png_const_bytep)params[i],
|
||||
(png_size_t)params_len[i]);
|
||||
png_write_chunk_data(png_ptr, (png_const_bytep)params[i], params_len[i]);
|
||||
}
|
||||
|
||||
png_free(png_ptr, params_len);
|
||||
@@ -1920,7 +1922,6 @@ void /* PRIVATE */
|
||||
png_write_sCAL_s(png_structp png_ptr, int unit, png_const_charp width,
|
||||
png_const_charp height)
|
||||
{
|
||||
PNG_sCAL;
|
||||
png_byte buf[64];
|
||||
png_size_t wlen, hlen, total_len;
|
||||
|
||||
@@ -1941,7 +1942,7 @@ png_write_sCAL_s(png_structp png_ptr, int unit, png_const_charp width,
|
||||
png_memcpy(buf + wlen + 2, height, hlen); /* Do NOT append the '\0' here */
|
||||
|
||||
png_debug1(3, "sCAL total length = %u", (unsigned int)total_len);
|
||||
png_write_chunk(png_ptr, png_sCAL, buf, total_len);
|
||||
png_write_complete_chunk(png_ptr, png_sCAL, buf, total_len);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1952,7 +1953,6 @@ png_write_pHYs(png_structp png_ptr, png_uint_32 x_pixels_per_unit,
|
||||
png_uint_32 y_pixels_per_unit,
|
||||
int unit_type)
|
||||
{
|
||||
PNG_pHYs;
|
||||
png_byte buf[9];
|
||||
|
||||
png_debug(1, "in png_write_pHYs");
|
||||
@@ -1964,7 +1964,7 @@ png_write_pHYs(png_structp png_ptr, png_uint_32 x_pixels_per_unit,
|
||||
png_save_uint_32(buf + 4, y_pixels_per_unit);
|
||||
buf[8] = (png_byte)unit_type;
|
||||
|
||||
png_write_chunk(png_ptr, png_pHYs, buf, (png_size_t)9);
|
||||
png_write_complete_chunk(png_ptr, png_pHYs, buf, (png_size_t)9);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1975,7 +1975,6 @@ png_write_pHYs(png_structp png_ptr, png_uint_32 x_pixels_per_unit,
|
||||
void /* PRIVATE */
|
||||
png_write_tIME(png_structp png_ptr, png_const_timep mod_time)
|
||||
{
|
||||
PNG_tIME;
|
||||
png_byte buf[7];
|
||||
|
||||
png_debug(1, "in png_write_tIME");
|
||||
@@ -1995,7 +1994,7 @@ png_write_tIME(png_structp png_ptr, png_const_timep mod_time)
|
||||
buf[5] = mod_time->minute;
|
||||
buf[6] = mod_time->second;
|
||||
|
||||
png_write_chunk(png_ptr, png_tIME, buf, (png_size_t)7);
|
||||
png_write_complete_chunk(png_ptr, png_tIME, buf, (png_size_t)7);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -2007,28 +2006,32 @@ png_write_start_row(png_structp png_ptr)
|
||||
/* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
|
||||
|
||||
/* Start of interlace block */
|
||||
int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
|
||||
static PNG_CONST png_byte png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
|
||||
|
||||
/* Offset to next interlace block */
|
||||
int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
|
||||
static PNG_CONST png_byte png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
|
||||
|
||||
/* Start of interlace block in the y direction */
|
||||
int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
|
||||
static PNG_CONST png_byte png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
|
||||
|
||||
/* Offset to next interlace block in the y direction */
|
||||
int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
|
||||
static PNG_CONST png_byte png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
|
||||
#endif
|
||||
|
||||
png_size_t buf_size;
|
||||
png_alloc_size_t buf_size;
|
||||
int usr_pixel_depth;
|
||||
|
||||
png_debug(1, "in png_write_start_row");
|
||||
|
||||
buf_size = (png_size_t)(PNG_ROWBYTES(
|
||||
png_ptr->usr_channels*png_ptr->usr_bit_depth, png_ptr->width) + 1);
|
||||
usr_pixel_depth = png_ptr->usr_channels * png_ptr->usr_bit_depth;
|
||||
buf_size = PNG_ROWBYTES(usr_pixel_depth, png_ptr->width) + 1;
|
||||
|
||||
/* 1.5.6: added to allow checking in the row write code. */
|
||||
png_ptr->transformed_pixel_depth = png_ptr->pixel_depth;
|
||||
png_ptr->maximum_pixel_depth = (png_byte)usr_pixel_depth;
|
||||
|
||||
/* Set up row buffer */
|
||||
png_ptr->row_buf = (png_bytep)png_malloc(png_ptr,
|
||||
(png_alloc_size_t)buf_size);
|
||||
png_ptr->row_buf = (png_bytep)png_malloc(png_ptr, buf_size);
|
||||
|
||||
png_ptr->row_buf[0] = PNG_FILTER_VALUE_NONE;
|
||||
|
||||
@@ -2045,8 +2048,7 @@ png_write_start_row(png_structp png_ptr)
|
||||
if (png_ptr->do_filter & (PNG_FILTER_AVG | PNG_FILTER_UP | PNG_FILTER_PAETH))
|
||||
{
|
||||
/* Set up previous row buffer */
|
||||
png_ptr->prev_row = (png_bytep)png_calloc(png_ptr,
|
||||
(png_alloc_size_t)buf_size);
|
||||
png_ptr->prev_row = (png_bytep)png_calloc(png_ptr, buf_size);
|
||||
|
||||
if (png_ptr->do_filter & PNG_FILTER_UP)
|
||||
{
|
||||
@@ -2114,16 +2116,16 @@ png_write_finish_row(png_structp png_ptr)
|
||||
/* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
|
||||
|
||||
/* Start of interlace block */
|
||||
int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
|
||||
static PNG_CONST png_byte png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
|
||||
|
||||
/* Offset to next interlace block */
|
||||
int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
|
||||
static PNG_CONST png_byte png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
|
||||
|
||||
/* Start of interlace block in the y direction */
|
||||
int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
|
||||
static PNG_CONST png_byte png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
|
||||
|
||||
/* Offset to next interlace block in the y direction */
|
||||
int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
|
||||
static PNG_CONST png_byte png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
|
||||
#endif
|
||||
|
||||
int ret;
|
||||
@@ -2241,10 +2243,10 @@ png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass)
|
||||
/* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
|
||||
|
||||
/* Start of interlace block */
|
||||
int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
|
||||
static PNG_CONST png_byte png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
|
||||
|
||||
/* Offset to next interlace block */
|
||||
int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
|
||||
static PNG_CONST png_byte png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
|
||||
|
||||
png_debug(1, "in png_do_write_interlace");
|
||||
|
||||
@@ -2412,7 +2414,8 @@ png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass)
|
||||
* been specified by the application, and then writes the row out with the
|
||||
* chosen filter.
|
||||
*/
|
||||
static void png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row);
|
||||
static void png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row,
|
||||
png_size_t row_bytes);
|
||||
|
||||
#define PNG_MAXSUM (((png_uint_32)(-1)) >> 1)
|
||||
#define PNG_HISHIFT 10
|
||||
@@ -2428,7 +2431,7 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
|
||||
png_byte filter_to_do = png_ptr->do_filter;
|
||||
png_size_t row_bytes = row_info->rowbytes;
|
||||
#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
|
||||
int num_p_filters = (int)png_ptr->num_prev_filters;
|
||||
int num_p_filters = png_ptr->num_prev_filters;
|
||||
#endif
|
||||
|
||||
png_debug(1, "in png_write_find_filter");
|
||||
@@ -3065,9 +3068,9 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
|
||||
}
|
||||
}
|
||||
#endif /* PNG_WRITE_FILTER_SUPPORTED */
|
||||
/* Do the actual writing of the filtered row data from the chosen filter. */
|
||||
|
||||
png_write_filtered_row(png_ptr, best_row);
|
||||
/* Do the actual writing of the filtered row data from the chosen filter. */
|
||||
png_write_filtered_row(png_ptr, best_row, row_info->rowbytes+1);
|
||||
|
||||
#ifdef PNG_WRITE_FILTER_SUPPORTED
|
||||
#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
|
||||
@@ -3090,10 +3093,9 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
|
||||
|
||||
/* Do the actual writing of a previously filtered row. */
|
||||
static void
|
||||
png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row)
|
||||
png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row,
|
||||
png_size_t avail/*includes filter byte*/)
|
||||
{
|
||||
png_size_t avail;
|
||||
|
||||
png_debug(1, "in png_write_filtered_row");
|
||||
|
||||
png_debug1(2, "filter = %d", filtered_row[0]);
|
||||
@@ -3101,7 +3103,6 @@ png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row)
|
||||
|
||||
png_ptr->zstream.next_in = filtered_row;
|
||||
png_ptr->zstream.avail_in = 0;
|
||||
avail = png_ptr->row_info.rowbytes + 1;
|
||||
/* Repeat until we have compressed all the data */
|
||||
do
|
||||
{
|
||||
|
||||
@@ -118,7 +118,7 @@
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<FloatingPointExceptions>false</FloatingPointExceptions>
|
||||
@@ -175,7 +175,7 @@
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<FloatingPointExceptions>false</FloatingPointExceptions>
|
||||
<TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
|
||||
<PrecompiledHeaderFile>pngpriv.h</PrecompiledHeaderFile>
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;PNG_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>$(ZLibSrcDir);..\..\..\scripts;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<DisableSpecificWarnings>4996;4127</DisableSpecificWarnings>
|
||||
<CompileAsManaged>false</CompileAsManaged>
|
||||
@@ -146,7 +146,7 @@
|
||||
<Optimization>Full</Optimization>
|
||||
<FunctionLevelLinking>false</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;PNG_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>$(ZLibSrcDir);..\..\..\scripts;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<DisableSpecificWarnings>4996;4127</DisableSpecificWarnings>
|
||||
<CompileAsManaged>false</CompileAsManaged>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
VisualStudio instructions
|
||||
|
||||
libpng version 1.5.4beta03 - June 15, 2011
|
||||
libpng version 1.5.6rc02 - October 27, 2011
|
||||
|
||||
Copyright (c) 1998-2010 Glenn Randers-Pehrson
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<!--
|
||||
* zlib.props - location of zlib source
|
||||
*
|
||||
* libpng version 1.5.4beta03 - June 15, 2011
|
||||
* libpng version 1.5.6rc02 - October 27, 2011
|
||||
*
|
||||
* Copyright (c) 1998-2011 Glenn Randers-Pehrson
|
||||
*
|
||||
@@ -19,11 +19,14 @@
|
||||
<PropertyGroup Label="Globals">
|
||||
<!-- Place the name of the directory containing the source of zlib used for
|
||||
debugging in this property.
|
||||
|
||||
The directory need only contain the '.c' and '.h' files from the
|
||||
source.
|
||||
|
||||
If you use a relative directory name (as below) then it must be
|
||||
relative to the project directories; these are one level deepers than
|
||||
the directories containing this file.
|
||||
|
||||
If the version of zlib you use does not match that used when the
|
||||
distribution was built you will get warnings from pngtest that the zlib
|
||||
versions do not match. The zlib version used in this build is recorded
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Library|Win32'">
|
||||
<ClCompile>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<WarningLevel>TurnOffAllWarnings</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
@@ -99,7 +99,7 @@
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<WarningLevel>TurnOffAllWarnings</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<Optimization>Disabled</Optimization>
|
||||
@@ -156,7 +156,7 @@
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;DEBUGZLIB_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
|
||||
Makefiles for libpng version 1.5.4beta03 - June 15, 2011
|
||||
Makefiles for libpng version 1.5.6rc02 - October 27, 2011
|
||||
|
||||
pnglibconf.h.prebuilt => Stores configuration settings
|
||||
makefile.linux => Linux/ELF makefile
|
||||
(gcc, creates libpng15.so.15.1.5.4beta03)
|
||||
(gcc, creates libpng15.so.15.1.5.6rc02)
|
||||
makefile.gcc => Generic makefile (gcc, creates static libpng.a)
|
||||
makefile.knr => Archaic UNIX Makefile that converts files with
|
||||
ansi2knr (Requires ansi2knr.c from
|
||||
@@ -20,7 +20,7 @@ pnglibconf.h.prebuilt => Stores configuration settings
|
||||
makefile.dec => DEC Alpha UNIX makefile
|
||||
makefile.dj2 => DJGPP 2 makefile
|
||||
makefile.elf => Linux/ELF makefile symbol versioning,
|
||||
(gcc, creates libpng15.so.15.1.5.4beta03)
|
||||
(gcc, creates libpng15.so.15.1.5.6rc02)
|
||||
makefile.freebsd => FreeBSD makefile
|
||||
makefile.gcc => Generic gcc makefile
|
||||
makefile.hpgcc => HPUX makefile using gcc
|
||||
@@ -35,12 +35,12 @@ pnglibconf.h.prebuilt => Stores configuration settings
|
||||
makefile.os2 => OS/2 Makefile (gcc and emx, requires libpng.def)
|
||||
makefile.sco => For SCO OSr5 ELF and Unixware 7 with Native cc
|
||||
makefile.sggcc => Silicon Graphics (gcc,
|
||||
creates libpng15.so.15.1.5.4beta03)
|
||||
creates libpng15.so.15.1.5.6rc02)
|
||||
makefile.sgi => Silicon Graphics IRIX makefile (cc, creates static lib)
|
||||
makefile.solaris => Solaris 2.X makefile (gcc,
|
||||
creates libpng15.so.15.1.5.4beta03)
|
||||
creates libpng15.so.15.1.5.6rc02)
|
||||
makefile.so9 => Solaris 9 makefile (gcc,
|
||||
creates libpng15.so.15.1.5.4beta03)
|
||||
creates libpng15.so.15.1.5.6rc02)
|
||||
makefile.std => Generic UNIX makefile (cc, creates static libpng.a)
|
||||
makefile.sunos => Sun makefile
|
||||
makefile.32sunu => Sun Ultra 32-bit makefile
|
||||
@@ -57,7 +57,7 @@ Other supporting scripts:
|
||||
libpng-config-body.in => used by several makefiles to create libpng-config
|
||||
libpng-config-head.in => used by several makefiles to create libpng-config
|
||||
libpng.pc.in => Used by several makefiles to create libpng.pc
|
||||
pngwin.rc => Used by the visualc6 and visualc71 projects.
|
||||
pngwin.rc => Used by the visualc71 project.
|
||||
pngwin.def => Used by makefile.os2
|
||||
pngwin.dfn => Used to maintain pngwin.def
|
||||
SCOPTIONS.ppc => Used with smakefile.ppc
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
# Modeled after libxml-config.
|
||||
|
||||
version=1.5.4beta03
|
||||
version=1.5.6rc02
|
||||
prefix=""
|
||||
libdir=""
|
||||
libs=""
|
||||
|
||||
@@ -5,6 +5,6 @@ includedir=@includedir@/libpng15
|
||||
|
||||
Name: libpng
|
||||
Description: Loads and saves PNG files
|
||||
Version: 1.5.4beta03
|
||||
Version: 1.5.6rc02
|
||||
Libs: -L${libdir} -lpng15
|
||||
Cflags: -I${includedir}
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
VERMAJ = 1
|
||||
VERMIN = 5
|
||||
VERMIC = 4
|
||||
VERMIC = 6
|
||||
VER = $(VERMAJ).$(VERMIN).$(VERMIC)
|
||||
NAME = libpng
|
||||
PACKAGE = $(NAME)-$(VER)
|
||||
|
||||
@@ -37,10 +37,11 @@ MKDIR_P=mkdir -p
|
||||
LN_SF=ln -sf
|
||||
RANLIB=ranlib
|
||||
RM_F=/bin/rm -f
|
||||
ARCH="-arch i386 -arch x86_64"
|
||||
|
||||
# CFLAGS=-I$(ZLIBINC) -W -Wall -O3 -funroll-loops
|
||||
CFLAGS=-I$(ZLIBINC) -W -Wall -O -funroll-loops
|
||||
LDFLAGS=-L. -L$(ZLIBLIB) -lpng15 -lz
|
||||
CFLAGS=-I$(ZLIBINC) -W -Wall -O -funroll-loops $(ARCH)
|
||||
LDFLAGS=-L. -L$(ZLIBLIB) -lpng15 -lz $(ARCH)
|
||||
|
||||
INCPATH=$(prefix)/include
|
||||
LIBPATH=$(exec_prefix)/lib
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
# Library name:
|
||||
LIBNAME = libpng15
|
||||
PNGMAJ = 15
|
||||
RELEASE = 4
|
||||
RELEASE = 6
|
||||
|
||||
# Shared library names:
|
||||
LIBSO=$(LIBNAME).so
|
||||
|
||||
@@ -17,7 +17,7 @@ INCSDIR=${LOCALBASE}/include/libpng15
|
||||
|
||||
LIB= png15
|
||||
SHLIB_MAJOR= 0
|
||||
SHLIB_MINOR= 1.5.4beta03
|
||||
SHLIB_MINOR= 1.5.6rc02
|
||||
SRCS= png.c pngset.c pngget.c pngrutil.c pngtrans.c pngwutil.c \
|
||||
pngread.c pngrio.c pngwio.c pngwrite.c pngrtran.c \
|
||||
pngwtran.c pngmem.c pngerror.c pngpread.c
|
||||
|
||||
@@ -17,7 +17,7 @@ INCSDIR=${LOCALBASE}/include
|
||||
|
||||
LIB= png
|
||||
SHLIB_MAJOR= 15
|
||||
SHLIB_MINOR= 1.5.4beta03
|
||||
SHLIB_MINOR= 1.5.6rc02
|
||||
SRCS= png.c pngset.c pngget.c pngrutil.c pngtrans.c pngwutil.c \
|
||||
pngread.c pngrio.c pngwio.c pngwrite.c pngrtran.c \
|
||||
pngwtran.c pngmem.c pngerror.c pngpread.c
|
||||
|
||||
@@ -11,7 +11,7 @@ LIBDIR= ${PREFIX}/lib
|
||||
MANDIR= ${PREFIX}/man/cat
|
||||
|
||||
SHLIB_MAJOR= 15
|
||||
SHLIB_MINOR= 1.5.4beta03
|
||||
SHLIB_MINOR= 1.5.6rc02
|
||||
|
||||
LIB= png
|
||||
SRCS= png.c pngerror.c pngget.c pngmem.c pngpread.c \
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#
|
||||
com pnglibconf.h - library build configuration
|
||||
com
|
||||
com libpng version 1.5.3 - (PENDING RELEASE)
|
||||
com libpng version 1.5.3 - July 7, 2011
|
||||
com
|
||||
com Copyright (c) 1998-2011 Glenn Randers-Pehrson
|
||||
com
|
||||
@@ -267,10 +267,10 @@ option SET_USER_LIMITS enables SET_CHUNK_CACHE_LIMIT
|
||||
option SET_USER_LIMITS enables SET_CHUNK_MALLOC_LIMIT
|
||||
|
||||
# Added at libpng-1.0.16 and 1.2.6. To accept all valid PNGs no matter
|
||||
# how large, set these two limits to 0x7fffffffL
|
||||
# how large, set these two limits to 0x7fffffff
|
||||
|
||||
setting USER_WIDTH_MAX default 1000000L
|
||||
setting USER_HEIGHT_MAX default 1000000L
|
||||
setting USER_WIDTH_MAX default 1000000
|
||||
setting USER_HEIGHT_MAX default 1000000
|
||||
|
||||
# Added at libpng-1.2.43. To accept all valid PNGs no matter
|
||||
# how large, set these two limits to 0.
|
||||
@@ -294,7 +294,9 @@ option READ enables READ_INTERLACING
|
||||
# Disabling READ_16BIT does not disable reading 16-bit PNG files, but it
|
||||
# forces them to be chopped down to 8-bit, and disables any 16-bit
|
||||
# processing after that has happened. You need to be sure to enable
|
||||
# READ_16_TO_8 when you disable READ_16BIT for this to work properly.
|
||||
# READ_SCALE_16_TO_8 or READ_STRIP_16_TO_8 when you disable READ_16BIT for
|
||||
# this to work properly. You should disable the other option if you need to
|
||||
# ensure a particular convertion (otherwise the app can chose.)
|
||||
|
||||
option READ_16BIT requires READ enables 16BIT
|
||||
|
||||
@@ -312,7 +314,8 @@ option READ_SWAP requires READ_TRANSFORMS READ_16BIT
|
||||
option READ_PACKSWAP requires READ_TRANSFORMS
|
||||
option READ_INVERT requires READ_TRANSFORMS
|
||||
option READ_BACKGROUND requires READ_TRANSFORMS enables READ_STRIP_ALPHA
|
||||
option READ_16_TO_8 requires READ_TRANSFORMS
|
||||
option READ_STRIP_16_TO_8 requires READ_TRANSFORMS
|
||||
option READ_SCALE_16_TO_8 requires READ_TRANSFORMS
|
||||
option READ_FILLER requires READ_TRANSFORMS
|
||||
option READ_GAMMA requires READ_TRANSFORMS enables READ_gAMA
|
||||
option READ_GRAY_TO_RGB requires READ_TRANSFORMS
|
||||
@@ -552,8 +555,6 @@ option SAVE_INT_32 requires WRITE
|
||||
|
||||
# added at libpng-1.5.4
|
||||
|
||||
option READ_CHOP_16_TO_8 requires READ_16_TO_8
|
||||
|
||||
option WRITE_OPTIMIZE_CMF requires WRITE
|
||||
|
||||
option READ_COMPRESSED_TEXT disabled
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
/* pnglibconf.h - library build configuration */
|
||||
|
||||
/* libpng version 1.5.0 - last changed on February 11, 2011 */
|
||||
/* libpng version 1.5.4 - last changed on June 22, 2011 */
|
||||
|
||||
/* Copyright (c) 1998-2011 Glenn Randers-Pehrson */
|
||||
|
||||
@@ -33,8 +33,8 @@
|
||||
#define PNG_sCAL_PRECISION 5
|
||||
#define PNG_USER_CHUNK_CACHE_MAX 0
|
||||
#define PNG_USER_CHUNK_MALLOC_MAX 0
|
||||
#define PNG_USER_HEIGHT_MAX 1000000L
|
||||
#define PNG_USER_WIDTH_MAX 1000000L
|
||||
#define PNG_USER_HEIGHT_MAX 1000000
|
||||
#define PNG_USER_WIDTH_MAX 1000000
|
||||
#define PNG_WEIGHT_SHIFT 8
|
||||
#define PNG_ZBUF_SIZE 8192
|
||||
/* end of settings */
|
||||
@@ -49,6 +49,7 @@
|
||||
#define PNG_CONSOLE_IO_SUPPORTED
|
||||
#define PNG_CONVERT_tIME_SUPPORTED
|
||||
#define PNG_EASY_ACCESS_SUPPORTED
|
||||
/*#undef PNG_ERROR_NUMBERS_SUPPORTED*/
|
||||
#define PNG_ERROR_TEXT_SUPPORTED
|
||||
#define PNG_FIXED_POINT_SUPPORTED
|
||||
#define PNG_FLOATING_ARITHMETIC_SUPPORTED
|
||||
@@ -68,16 +69,14 @@
|
||||
#define PNG_POINTER_INDEXING_SUPPORTED
|
||||
#define PNG_PROGRESSIVE_READ_SUPPORTED
|
||||
#define PNG_READ_16BIT_SUPPORTED
|
||||
#define PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED
|
||||
#define PNG_READ_16_TO_8_SUPPORTED
|
||||
#define PNG_READ_ALPHA_MODE_SUPPORTED
|
||||
#define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED
|
||||
#define PNG_READ_BACKGROUND_SUPPORTED
|
||||
#define PNG_READ_BGR_SUPPORTED
|
||||
#define PNG_READ_bKGD_SUPPORTED
|
||||
#define PNG_READ_cHRM_SUPPORTED
|
||||
#define PNG_READ_CHOP_16_TO_8_SUPPORTED
|
||||
#define PNG_READ_COMPOSITE_NODIV_SUPPORTED
|
||||
#define PNG_READ_COMPRESSED_TEXT_SUPPORTED
|
||||
#define PNG_READ_EXPAND_16_SUPPORTED
|
||||
#define PNG_READ_EXPAND_SUPPORTED
|
||||
#define PNG_READ_FILLER_SUPPORTED
|
||||
@@ -100,10 +99,12 @@
|
||||
#define PNG_READ_QUANTIZE_SUPPORTED
|
||||
#define PNG_READ_RGB_TO_GRAY_SUPPORTED
|
||||
#define PNG_READ_sBIT_SUPPORTED
|
||||
#define PNG_READ_SCALE_16_TO_8_SUPPORTED
|
||||
#define PNG_READ_sCAL_SUPPORTED
|
||||
#define PNG_READ_SHIFT_SUPPORTED
|
||||
#define PNG_READ_sPLT_SUPPORTED
|
||||
#define PNG_READ_sRGB_SUPPORTED
|
||||
#define PNG_READ_STRIP_16_TO_8_SUPPORTED
|
||||
#define PNG_READ_STRIP_ALPHA_SUPPORTED
|
||||
#define PNG_READ_SUPPORTED
|
||||
#define PNG_READ_SWAP_ALPHA_SUPPORTED
|
||||
@@ -117,7 +118,6 @@
|
||||
#define PNG_READ_USER_CHUNKS_SUPPORTED
|
||||
#define PNG_READ_USER_TRANSFORM_SUPPORTED
|
||||
#define PNG_READ_zTXt_SUPPORTED
|
||||
#define PNG_READ_COMPRESSED_TEXT_SUPPORTED
|
||||
#define PNG_SAVE_INT_32_SUPPORTED
|
||||
#define PNG_sBIT_SUPPORTED
|
||||
#define PNG_sCAL_SUPPORTED
|
||||
@@ -146,6 +146,8 @@
|
||||
#define PNG_WRITE_BGR_SUPPORTED
|
||||
#define PNG_WRITE_bKGD_SUPPORTED
|
||||
#define PNG_WRITE_cHRM_SUPPORTED
|
||||
#define PNG_WRITE_COMPRESSED_TEXT_SUPPORTED
|
||||
#define PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
|
||||
#define PNG_WRITE_FILLER_SUPPORTED
|
||||
#define PNG_WRITE_FILTER_SUPPORTED
|
||||
#define PNG_WRITE_FLUSH_SUPPORTED
|
||||
@@ -156,7 +158,6 @@
|
||||
#define PNG_WRITE_INT_FUNCTIONS_SUPPORTED
|
||||
#define PNG_WRITE_INVERT_ALPHA_SUPPORTED
|
||||
#define PNG_WRITE_INVERT_SUPPORTED
|
||||
#define PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
|
||||
#define PNG_WRITE_iTXt_SUPPORTED
|
||||
#define PNG_WRITE_oFFs_SUPPORTED
|
||||
#define PNG_WRITE_OPTIMIZE_CMF_SUPPORTED
|
||||
@@ -182,7 +183,5 @@
|
||||
#define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
|
||||
#define PNG_WRITE_zTXt_SUPPORTED
|
||||
#define PNG_zTXt_SUPPORTED
|
||||
#define PNG_WRITE_COMPRESSED_TEXT_SUPPORTED
|
||||
/*#undef PNG_ERROR_NUMBERS_SUPPORTED*/
|
||||
/* end of options */
|
||||
#endif /* PNGLCONF_H */
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
LIBRARY
|
||||
|
||||
EXPORTS
|
||||
;Version 1.5.4beta03
|
||||
;Version 1.5.6rc02
|
||||
png_access_version_number @1
|
||||
png_set_sig_bytes @2
|
||||
png_sig_cmp @3
|
||||
@@ -234,4 +234,8 @@ EXPORTS
|
||||
png_set_text_compression_method @226
|
||||
png_set_alpha_mode @227
|
||||
png_set_alpha_mode_fixed @228
|
||||
png_set_chop_16 @229
|
||||
png_set_scale_16 @229
|
||||
png_get_cHRM_XYZ @230
|
||||
png_get_cHRM_XYZ_fixed @231
|
||||
png_set_cHRM_XYZ @232
|
||||
png_set_cHRM_XYZ_fixed @233
|
||||
|
||||
@@ -5,4 +5,12 @@ echo "Running tests. For details see pngtest-log.txt"
|
||||
echo "============ pngtest pngtest.png ==============" > pngtest-log.txt
|
||||
|
||||
echo "Running test-pngtest.sh"
|
||||
./pngtest ${srcdir}/pngtest.png >> pngtest-log.txt 2>&1
|
||||
if ./pngtest --strict ${srcdir}/pngtest.png >> pngtest-log.txt 2>&1
|
||||
then
|
||||
echo " PASS: pngtest --strict pngtest.png"
|
||||
err=0
|
||||
else
|
||||
echo " FAIL: pngtest --strict pngtest.png"
|
||||
err=1
|
||||
fi
|
||||
exit $err
|
||||
|
||||
@@ -9,11 +9,11 @@ echo "============ pngvalid-full.sh ==============" >> pngtest-log.txt
|
||||
echo "Running test-pngvalid-full.sh"
|
||||
for gamma in threshold transform sbit 16-to-8 background alpha-mode "transform --expand16" "background --expand16" "alpha-mode --expand16"
|
||||
do
|
||||
if ./pngvalid --gamma-$gamma >> pngtest-log.txt 2>&1
|
||||
if ./pngvalid "$@" --gamma-$gamma >> pngtest-log.txt 2>&1
|
||||
then
|
||||
echo " PASS:" pngvalid "--gamma-$gamma"
|
||||
echo " PASS: pngvalid" "$@" "--gamma-$gamma"
|
||||
else
|
||||
echo " FAIL:" pngvalid "--gamma-$gamma"
|
||||
echo " FAIL: pngvalid" "$@" "--gamma-$gamma"
|
||||
err=1
|
||||
fi
|
||||
done
|
||||
|
||||
@@ -18,11 +18,11 @@ for opts in "--standard" "--standard --progressive-read" \
|
||||
"--size" "--size --progressive-read" \
|
||||
"--transform"
|
||||
do
|
||||
if ./pngvalid $opts >> pngtest-log.txt 2>&1
|
||||
if ./pngvalid "$@" $opts >> pngtest-log.txt 2>&1
|
||||
then
|
||||
echo " PASS:" pngvalid $opts
|
||||
echo " PASS: pngvalid" "$@" $opts
|
||||
else
|
||||
echo " FAIL:" pngvalid $opts
|
||||
echo " FAIL: pngvalid" "$@" $opts
|
||||
err=1
|
||||
fi
|
||||
done
|
||||
|
||||
Reference in New Issue
Block a user