mirror of
https://github.com/GRRLIB/GRRLIB.git
synced 2024-11-25 16:22:20 +00:00
libpng updated to version 1.6.18.
This commit is contained in:
parent
f1a3e81770
commit
83b47b1893
21 changed files with 1150 additions and 1787 deletions
|
@ -10,21 +10,17 @@ this sentence.
|
||||||
|
|
||||||
This code is released under the libpng license.
|
This code is released under the libpng license.
|
||||||
|
|
||||||
libpng versions 1.2.6, August 15, 2004, through 1.6.16, December 22, 2014, are
|
libpng versions 1.0.7, July 1, 2000, through 1.6.18, July 23, 2015, are
|
||||||
Copyright (c) 2004, 2006-2014 Glenn Randers-Pehrson, and are
|
Copyright (c) 2000-2002, 2004, 2006-2015 Glenn Randers-Pehrson, and are
|
||||||
distributed according to the same disclaimer and license as libpng-1.2.5
|
|
||||||
with the following individual added to the list of Contributing Authors
|
|
||||||
|
|
||||||
Cosmin Truta
|
|
||||||
|
|
||||||
libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
|
|
||||||
Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
|
|
||||||
distributed according to the same disclaimer and license as libpng-1.0.6
|
distributed according to the same disclaimer and license as libpng-1.0.6
|
||||||
with the following individuals added to the list of Contributing Authors
|
with the following individuals added to the list of Contributing Authors:
|
||||||
|
|
||||||
Simon-Pierre Cadieux
|
Simon-Pierre Cadieux
|
||||||
Eric S. Raymond
|
Eric S. Raymond
|
||||||
|
Mans Rullgard
|
||||||
|
Cosmin Truta
|
||||||
Gilles Vollant
|
Gilles Vollant
|
||||||
|
James Yu
|
||||||
|
|
||||||
and with the following additions to the disclaimer:
|
and with the following additions to the disclaimer:
|
||||||
|
|
||||||
|
@ -36,17 +32,17 @@ and with the following additions to the disclaimer:
|
||||||
the user.
|
the user.
|
||||||
|
|
||||||
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
|
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
|
||||||
Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
|
Copyright (c) 1998-2000 Glenn Randers-Pehrson, and are distributed according
|
||||||
distributed according to the same disclaimer and license as libpng-0.96,
|
to the same disclaimer and license as libpng-0.96, with the following
|
||||||
with the following individuals added to the list of Contributing Authors:
|
individuals added to the list of Contributing Authors:
|
||||||
|
|
||||||
Tom Lane
|
Tom Lane
|
||||||
Glenn Randers-Pehrson
|
Glenn Randers-Pehrson
|
||||||
Willem van Schaik
|
Willem van Schaik
|
||||||
|
|
||||||
libpng versions 0.89, June 1996, through 0.96, May 1997, are
|
libpng versions 0.89, June 1996, through 0.96, May 1997, are
|
||||||
Copyright (c) 1996, 1997 Andreas Dilger
|
Copyright (c) 1996-1997 Andreas Dilger, and are
|
||||||
Distributed according to the same disclaimer and license as libpng-0.88,
|
distributed according to the same disclaimer and license as libpng-0.88,
|
||||||
with the following individuals added to the list of Contributing Authors:
|
with the following individuals added to the list of Contributing Authors:
|
||||||
|
|
||||||
John Bowler
|
John Bowler
|
||||||
|
@ -57,7 +53,7 @@ with the following individuals added to the list of Contributing Authors:
|
||||||
Tom Tanner
|
Tom Tanner
|
||||||
|
|
||||||
libpng versions 0.5, May 1995, through 0.88, January 1996, are
|
libpng versions 0.5, May 1995, through 0.88, January 1996, are
|
||||||
Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
|
||||||
|
|
||||||
For the purposes of this copyright and license, "Contributing Authors"
|
For the purposes of this copyright and license, "Contributing Authors"
|
||||||
is defined as the following set of individuals:
|
is defined as the following set of individuals:
|
||||||
|
@ -80,13 +76,13 @@ Permission is hereby granted to use, copy, modify, and distribute this
|
||||||
source code, or portions hereof, for any purpose, without fee, subject
|
source code, or portions hereof, for any purpose, without fee, subject
|
||||||
to the following restrictions:
|
to the following restrictions:
|
||||||
|
|
||||||
1. The origin of this source code must not be misrepresented.
|
1. The origin of this source code must not be misrepresented.
|
||||||
|
|
||||||
2. Altered versions must be plainly marked as such and must not
|
2. Altered versions must be plainly marked as such and must not
|
||||||
be misrepresented as being the original source.
|
be misrepresented as being the original source.
|
||||||
|
|
||||||
3. This Copyright notice may not be removed or altered from any
|
3. This Copyright notice may not be removed or altered from any
|
||||||
source or altered source distribution.
|
source or altered source distribution.
|
||||||
|
|
||||||
The Contributing Authors and Group 42, Inc. specifically permit, without
|
The Contributing Authors and Group 42, Inc. specifically permit, without
|
||||||
fee, and encourage the use of this source code as a component to
|
fee, and encourage the use of this source code as a component to
|
||||||
|
@ -94,18 +90,18 @@ supporting the PNG file format in commercial products. If you use this
|
||||||
source code in a product, acknowledgment is not required but would be
|
source code in a product, acknowledgment is not required but would be
|
||||||
appreciated.
|
appreciated.
|
||||||
|
|
||||||
|
|
||||||
A "png_get_copyright" function is available, for convenient use in "about"
|
A "png_get_copyright" function is available, for convenient use in "about"
|
||||||
boxes and the like:
|
boxes and the like:
|
||||||
|
|
||||||
printf("%s",png_get_copyright(NULL));
|
printf("%s", png_get_copyright(NULL));
|
||||||
|
|
||||||
Also, the PNG logo (in PNG format, of course) is supplied in the
|
Also, the PNG logo (in PNG format, of course) is supplied in the
|
||||||
files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
|
files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
|
||||||
|
|
||||||
Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a
|
Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
|
||||||
certification mark of the Open Source Initiative.
|
a certification mark of the Open Source Initiative. OSI has not addressed
|
||||||
|
the additional disclaimers inserted at version 1.0.7.
|
||||||
|
|
||||||
Glenn Randers-Pehrson
|
Glenn Randers-Pehrson
|
||||||
glennrp at users.sourceforge.net
|
glennrp at users.sourceforge.net
|
||||||
December 22, 2014
|
July 23, 2015
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
|
|
||||||
/* png.c - location for general purpose libpng functions
|
/* png.c - location for general purpose libpng functions
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.16 [December 22, 2014]
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
* Copyright (c) 1998-2014 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
|
@ -14,7 +14,7 @@
|
||||||
#include "pngpriv.h"
|
#include "pngpriv.h"
|
||||||
|
|
||||||
/* Generate a compiler error if there is an old png.h in the search path. */
|
/* Generate a compiler error if there is an old png.h in the search path. */
|
||||||
typedef png_libpng_version_1_6_16 Your_png_h_is_not_version_1_6_16;
|
typedef png_libpng_version_1_6_18 Your_png_h_is_not_version_1_6_18;
|
||||||
|
|
||||||
/* Tells libpng that we have already handled the first "num_bytes" bytes
|
/* Tells libpng that we have already handled the first "num_bytes" bytes
|
||||||
* of the PNG file signature. If the PNG data is embedded into another
|
* of the PNG file signature. If the PNG data is embedded into another
|
||||||
|
@ -34,7 +34,7 @@ png_set_sig_bytes(png_structrp png_ptr, int num_bytes)
|
||||||
if (num_bytes > 8)
|
if (num_bytes > 8)
|
||||||
png_error(png_ptr, "Too many bytes for PNG signature");
|
png_error(png_ptr, "Too many bytes for PNG signature");
|
||||||
|
|
||||||
png_ptr->sig_bytes = (png_byte)(num_bytes < 0 ? 0 : num_bytes);
|
png_ptr->sig_bytes = (png_byte)((num_bytes < 0 ? 0 : num_bytes) & 0xff);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Checks whether the supplied bytes match the PNG signature. We allow
|
/* Checks whether the supplied bytes match the PNG signature. We allow
|
||||||
|
@ -101,7 +101,7 @@ png_zfree(voidpf png_ptr, voidpf ptr)
|
||||||
void /* PRIVATE */
|
void /* PRIVATE */
|
||||||
png_reset_crc(png_structrp png_ptr)
|
png_reset_crc(png_structrp png_ptr)
|
||||||
{
|
{
|
||||||
/* The cast is safe because the crc is a 32 bit value. */
|
/* The cast is safe because the crc is a 32-bit value. */
|
||||||
png_ptr->crc = (png_uint_32)crc32(0, Z_NULL, 0);
|
png_ptr->crc = (png_uint_32)crc32(0, Z_NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,7 +129,7 @@ png_calculate_crc(png_structrp png_ptr, png_const_bytep ptr, png_size_t length)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 'uLong' is defined in zlib.h as unsigned long; this means that on some
|
/* 'uLong' is defined in zlib.h as unsigned long; this means that on some
|
||||||
* systems it is a 64 bit value. crc32, however, returns 32 bits so the
|
* systems it is a 64-bit value. crc32, however, returns 32 bits so the
|
||||||
* following cast is safe. 'uInt' may be no more than 16 bits, so it is
|
* following cast is safe. 'uInt' may be no more than 16 bits, so it is
|
||||||
* necessary to perform a loop here.
|
* necessary to perform a loop here.
|
||||||
*/
|
*/
|
||||||
|
@ -140,8 +140,10 @@ png_calculate_crc(png_structrp png_ptr, png_const_bytep ptr, png_size_t length)
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
uInt safe_length = (uInt)length;
|
uInt safe_length = (uInt)length;
|
||||||
|
#ifndef __COVERITY__
|
||||||
if (safe_length == 0)
|
if (safe_length == 0)
|
||||||
safe_length = (uInt)-1; /* evil, but safe */
|
safe_length = (uInt)-1; /* evil, but safe */
|
||||||
|
#endif
|
||||||
|
|
||||||
crc = crc32(crc, ptr, safe_length);
|
crc = crc32(crc, ptr, safe_length);
|
||||||
|
|
||||||
|
@ -241,15 +243,15 @@ png_create_png_struct,(png_const_charp user_png_ver, png_voidp error_ptr,
|
||||||
create_struct.user_height_max = PNG_USER_HEIGHT_MAX;
|
create_struct.user_height_max = PNG_USER_HEIGHT_MAX;
|
||||||
|
|
||||||
# ifdef PNG_USER_CHUNK_CACHE_MAX
|
# ifdef PNG_USER_CHUNK_CACHE_MAX
|
||||||
/* Added at libpng-1.2.43 and 1.4.0 */
|
/* Added at libpng-1.2.43 and 1.4.0 */
|
||||||
create_struct.user_chunk_cache_max = PNG_USER_CHUNK_CACHE_MAX;
|
create_struct.user_chunk_cache_max = PNG_USER_CHUNK_CACHE_MAX;
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# ifdef PNG_USER_CHUNK_MALLOC_MAX
|
# ifdef PNG_USER_CHUNK_MALLOC_MAX
|
||||||
/* Added at libpng-1.2.43 and 1.4.1, required only for read but exists
|
/* Added at libpng-1.2.43 and 1.4.1, required only for read but exists
|
||||||
* in png_struct regardless.
|
* in png_struct regardless.
|
||||||
*/
|
*/
|
||||||
create_struct.user_chunk_malloc_max = PNG_USER_CHUNK_MALLOC_MAX;
|
create_struct.user_chunk_malloc_max = PNG_USER_CHUNK_MALLOC_MAX;
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
@ -273,7 +275,9 @@ png_create_png_struct,(png_const_charp user_png_ver, png_voidp error_ptr,
|
||||||
|
|
||||||
# ifdef PNG_SETJMP_SUPPORTED
|
# ifdef PNG_SETJMP_SUPPORTED
|
||||||
if (!setjmp(create_jmp_buf))
|
if (!setjmp(create_jmp_buf))
|
||||||
|
# endif
|
||||||
{
|
{
|
||||||
|
# ifdef PNG_SETJMP_SUPPORTED
|
||||||
/* Temporarily fake out the longjmp information until we have
|
/* Temporarily fake out the longjmp information until we have
|
||||||
* successfully completed this function. This only works if we have
|
* successfully completed this function. This only works if we have
|
||||||
* setjmp() support compiled in, but it is safe - this stuff should
|
* setjmp() support compiled in, but it is safe - this stuff should
|
||||||
|
@ -282,8 +286,6 @@ png_create_png_struct,(png_const_charp user_png_ver, png_voidp error_ptr,
|
||||||
create_struct.jmp_buf_ptr = &create_jmp_buf;
|
create_struct.jmp_buf_ptr = &create_jmp_buf;
|
||||||
create_struct.jmp_buf_size = 0; /*stack allocation*/
|
create_struct.jmp_buf_size = 0; /*stack allocation*/
|
||||||
create_struct.longjmp_fn = longjmp;
|
create_struct.longjmp_fn = longjmp;
|
||||||
# else
|
|
||||||
{
|
|
||||||
# endif
|
# endif
|
||||||
/* Call the general version checker (shared with read and write code):
|
/* Call the general version checker (shared with read and write code):
|
||||||
*/
|
*/
|
||||||
|
@ -302,10 +304,10 @@ png_create_png_struct,(png_const_charp user_png_ver, png_voidp error_ptr,
|
||||||
create_struct.zstream.opaque = png_ptr;
|
create_struct.zstream.opaque = png_ptr;
|
||||||
|
|
||||||
# ifdef PNG_SETJMP_SUPPORTED
|
# ifdef PNG_SETJMP_SUPPORTED
|
||||||
/* Eliminate the local error handling: */
|
/* Eliminate the local error handling: */
|
||||||
create_struct.jmp_buf_ptr = NULL;
|
create_struct.jmp_buf_ptr = NULL;
|
||||||
create_struct.jmp_buf_size = 0;
|
create_struct.jmp_buf_size = 0;
|
||||||
create_struct.longjmp_fn = 0;
|
create_struct.longjmp_fn = 0;
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
*png_ptr = create_struct;
|
*png_ptr = create_struct;
|
||||||
|
@ -476,9 +478,10 @@ png_free_data(png_const_structrp png_ptr, png_inforp info_ptr, png_uint_32 mask,
|
||||||
/* Free any tRNS entry */
|
/* Free any tRNS entry */
|
||||||
if (((mask & PNG_FREE_TRNS) & info_ptr->free_me) != 0)
|
if (((mask & PNG_FREE_TRNS) & info_ptr->free_me) != 0)
|
||||||
{
|
{
|
||||||
|
info_ptr->valid &= ~PNG_INFO_tRNS;
|
||||||
png_free(png_ptr, info_ptr->trans_alpha);
|
png_free(png_ptr, info_ptr->trans_alpha);
|
||||||
info_ptr->trans_alpha = NULL;
|
info_ptr->trans_alpha = NULL;
|
||||||
info_ptr->valid &= ~PNG_INFO_tRNS;
|
info_ptr->num_trans = 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -544,20 +547,17 @@ png_free_data(png_const_structrp png_ptr, png_inforp info_ptr, png_uint_32 mask,
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (info_ptr->splt_palettes_num != 0)
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < info_ptr->splt_palettes_num; i++)
|
||||||
{
|
{
|
||||||
int i;
|
png_free(png_ptr, info_ptr->splt_palettes[i].name);
|
||||||
|
png_free(png_ptr, info_ptr->splt_palettes[i].entries);
|
||||||
for (i = 0; i < info_ptr->splt_palettes_num; i++)
|
|
||||||
{
|
|
||||||
png_free(png_ptr, info_ptr->splt_palettes[i].name);
|
|
||||||
png_free(png_ptr, info_ptr->splt_palettes[i].entries);
|
|
||||||
}
|
|
||||||
|
|
||||||
png_free(png_ptr, info_ptr->splt_palettes);
|
|
||||||
info_ptr->splt_palettes = NULL;
|
|
||||||
info_ptr->splt_palettes_num = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
png_free(png_ptr, info_ptr->splt_palettes);
|
||||||
|
info_ptr->splt_palettes = NULL;
|
||||||
|
info_ptr->splt_palettes_num = 0;
|
||||||
info_ptr->valid &= ~PNG_INFO_sPLT;
|
info_ptr->valid &= ~PNG_INFO_sPLT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -577,15 +577,12 @@ png_free_data(png_const_structrp png_ptr, png_inforp info_ptr, png_uint_32 mask,
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (info_ptr->unknown_chunks_num != 0)
|
for (i = 0; i < info_ptr->unknown_chunks_num; i++)
|
||||||
{
|
png_free(png_ptr, info_ptr->unknown_chunks[i].data);
|
||||||
for (i = 0; i < info_ptr->unknown_chunks_num; i++)
|
|
||||||
png_free(png_ptr, info_ptr->unknown_chunks[i].data);
|
|
||||||
|
|
||||||
png_free(png_ptr, info_ptr->unknown_chunks);
|
png_free(png_ptr, info_ptr->unknown_chunks);
|
||||||
info_ptr->unknown_chunks = NULL;
|
info_ptr->unknown_chunks = NULL;
|
||||||
info_ptr->unknown_chunks_num = 0;
|
info_ptr->unknown_chunks_num = 0;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -666,7 +663,7 @@ png_init_io(png_structrp png_ptr, png_FILE_p fp)
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
#ifdef PNG_SAVE_INT_32_SUPPORTED
|
# ifdef PNG_SAVE_INT_32_SUPPORTED
|
||||||
/* The png_save_int_32 function assumes integers are stored in two's
|
/* The png_save_int_32 function assumes integers are stored in two's
|
||||||
* complement format. If this isn't the case, then this routine needs to
|
* complement format. If this isn't the case, then this routine needs to
|
||||||
* be modified to write data in two's complement format. Note that,
|
* be modified to write data in two's complement format. Note that,
|
||||||
|
@ -681,7 +678,7 @@ png_save_int_32(png_bytep buf, png_int_32 i)
|
||||||
buf[2] = (png_byte)((i >> 8) & 0xff);
|
buf[2] = (png_byte)((i >> 8) & 0xff);
|
||||||
buf[3] = (png_byte)(i & 0xff);
|
buf[3] = (png_byte)(i & 0xff);
|
||||||
}
|
}
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
# ifdef PNG_TIME_RFC1123_SUPPORTED
|
# ifdef PNG_TIME_RFC1123_SUPPORTED
|
||||||
/* Convert the supplied time into an RFC 1123 string suitable for use in
|
/* Convert the supplied time into an RFC 1123 string suitable for use in
|
||||||
|
@ -734,7 +731,7 @@ png_convert_to_rfc1123_buffer(char out[29], png_const_timep ptime)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
# if PNG_LIBPNG_VER < 10700
|
# if PNG_LIBPNG_VER < 10700
|
||||||
/* To do: remove the following from libpng-1.7 */
|
/* To do: remove the following from libpng-1.7 */
|
||||||
/* Original API that uses a private buffer in png_struct.
|
/* Original API that uses a private buffer in png_struct.
|
||||||
* Deprecated because it causes png_struct to carry a spurious temporary
|
* Deprecated because it causes png_struct to carry a spurious temporary
|
||||||
|
@ -755,7 +752,7 @@ png_convert_to_rfc1123(png_structrp png_ptr, png_const_timep ptime)
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
# endif
|
# endif /* LIBPNG_VER < 10700 */
|
||||||
# endif /* TIME_RFC1123 */
|
# endif /* TIME_RFC1123 */
|
||||||
|
|
||||||
#endif /* READ || WRITE */
|
#endif /* READ || WRITE */
|
||||||
|
@ -769,14 +766,14 @@ png_get_copyright(png_const_structrp png_ptr)
|
||||||
#else
|
#else
|
||||||
# ifdef __STDC__
|
# ifdef __STDC__
|
||||||
return PNG_STRING_NEWLINE \
|
return PNG_STRING_NEWLINE \
|
||||||
"libpng version 1.6.16 - December 22, 2014" PNG_STRING_NEWLINE \
|
"libpng version 1.6.18 - July 23, 2015" PNG_STRING_NEWLINE \
|
||||||
"Copyright (c) 1998-2014 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \
|
"Copyright (c) 1998-2015 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \
|
||||||
"Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \
|
"Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \
|
||||||
"Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \
|
"Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \
|
||||||
PNG_STRING_NEWLINE;
|
PNG_STRING_NEWLINE;
|
||||||
# else
|
# else
|
||||||
return "libpng version 1.6.16 - December 22, 2014\
|
return "libpng version 1.6.18 - July 23, 2015\
|
||||||
Copyright (c) 1998-2014 Glenn Randers-Pehrson\
|
Copyright (c) 1998-2015 Glenn Randers-Pehrson\
|
||||||
Copyright (c) 1996-1997 Andreas Dilger\
|
Copyright (c) 1996-1997 Andreas Dilger\
|
||||||
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.";
|
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.";
|
||||||
# endif
|
# endif
|
||||||
|
@ -814,9 +811,9 @@ png_get_header_version(png_const_structrp png_ptr)
|
||||||
#ifdef __STDC__
|
#ifdef __STDC__
|
||||||
return PNG_HEADER_VERSION_STRING
|
return PNG_HEADER_VERSION_STRING
|
||||||
# ifndef PNG_READ_SUPPORTED
|
# ifndef PNG_READ_SUPPORTED
|
||||||
" (NO READ SUPPORT)"
|
" (NO READ SUPPORT)"
|
||||||
# endif
|
# endif
|
||||||
PNG_STRING_NEWLINE;
|
PNG_STRING_NEWLINE;
|
||||||
#else
|
#else
|
||||||
return PNG_HEADER_VERSION_STRING;
|
return PNG_HEADER_VERSION_STRING;
|
||||||
#endif
|
#endif
|
||||||
|
@ -872,9 +869,9 @@ png_build_grayscale_palette(int bit_depth, png_colorp palette)
|
||||||
|
|
||||||
for (i = 0, v = 0; i < num_palette; i++, v += color_inc)
|
for (i = 0, v = 0; i < num_palette; i++, v += color_inc)
|
||||||
{
|
{
|
||||||
palette[i].red = (png_byte)v;
|
palette[i].red = (png_byte)(v & 0xff);
|
||||||
palette[i].green = (png_byte)v;
|
palette[i].green = (png_byte)(v & 0xff);
|
||||||
palette[i].blue = (png_byte)v;
|
palette[i].blue = (png_byte)(v & 0xff);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -947,8 +944,6 @@ png_access_version_number(void)
|
||||||
return((png_uint_32)PNG_LIBPNG_VER);
|
return((png_uint_32)PNG_LIBPNG_VER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
|
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
|
||||||
/* Ensure that png_ptr->zstream.msg holds some appropriate error message string.
|
/* Ensure that png_ptr->zstream.msg holds some appropriate error message string.
|
||||||
* If it doesn't 'ret' is used to set it to something appropriate, even in cases
|
* If it doesn't 'ret' is used to set it to something appropriate, even in cases
|
||||||
|
@ -1091,10 +1086,10 @@ png_colorspace_set_gamma(png_const_structrp png_ptr,
|
||||||
errmsg = "gamma value out of range";
|
errmsg = "gamma value out of range";
|
||||||
|
|
||||||
# ifdef PNG_READ_gAMA_SUPPORTED
|
# ifdef PNG_READ_gAMA_SUPPORTED
|
||||||
/* Allow the application to set the gamma value more than once */
|
/* Allow the application to set the gamma value more than once */
|
||||||
else if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 &&
|
else if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 &&
|
||||||
(colorspace->flags & PNG_COLORSPACE_FROM_gAMA) != 0)
|
(colorspace->flags & PNG_COLORSPACE_FROM_gAMA) != 0)
|
||||||
errmsg = "duplicate";
|
errmsg = "duplicate";
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
/* Do nothing if the colorspace is already invalid */
|
/* Do nothing if the colorspace is already invalid */
|
||||||
|
@ -1135,31 +1130,31 @@ png_colorspace_sync_info(png_const_structrp png_ptr, png_inforp info_ptr)
|
||||||
PNG_INFO_iCCP);
|
PNG_INFO_iCCP);
|
||||||
|
|
||||||
# ifdef PNG_COLORSPACE_SUPPORTED
|
# ifdef PNG_COLORSPACE_SUPPORTED
|
||||||
/* Clean up the iCCP profile now if it won't be used. */
|
/* Clean up the iCCP profile now if it won't be used. */
|
||||||
png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, -1/*not used*/);
|
png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, -1/*not used*/);
|
||||||
# else
|
# else
|
||||||
PNG_UNUSED(png_ptr)
|
PNG_UNUSED(png_ptr)
|
||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
# ifdef PNG_COLORSPACE_SUPPORTED
|
# ifdef PNG_COLORSPACE_SUPPORTED
|
||||||
/* Leave the INFO_iCCP flag set if the pngset.c code has already set
|
/* Leave the INFO_iCCP flag set if the pngset.c code has already set
|
||||||
* it; this allows a PNG to contain a profile which matches sRGB and
|
* it; this allows a PNG to contain a profile which matches sRGB and
|
||||||
* yet still have that profile retrievable by the application.
|
* yet still have that profile retrievable by the application.
|
||||||
*/
|
*/
|
||||||
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_MATCHES_sRGB) != 0)
|
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_MATCHES_sRGB) != 0)
|
||||||
info_ptr->valid |= PNG_INFO_sRGB;
|
info_ptr->valid |= PNG_INFO_sRGB;
|
||||||
|
|
||||||
else
|
else
|
||||||
info_ptr->valid &= ~PNG_INFO_sRGB;
|
info_ptr->valid &= ~PNG_INFO_sRGB;
|
||||||
|
|
||||||
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
|
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
|
||||||
info_ptr->valid |= PNG_INFO_cHRM;
|
info_ptr->valid |= PNG_INFO_cHRM;
|
||||||
|
|
||||||
else
|
else
|
||||||
info_ptr->valid &= ~PNG_INFO_cHRM;
|
info_ptr->valid &= ~PNG_INFO_cHRM;
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) != 0)
|
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) != 0)
|
||||||
|
@ -1181,7 +1176,7 @@ png_colorspace_sync(png_const_structrp png_ptr, png_inforp info_ptr)
|
||||||
png_colorspace_sync_info(png_ptr, info_ptr);
|
png_colorspace_sync_info(png_ptr, info_ptr);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif /* GAMMA */
|
||||||
|
|
||||||
#ifdef PNG_COLORSPACE_SUPPORTED
|
#ifdef PNG_COLORSPACE_SUPPORTED
|
||||||
/* Added at libpng-1.5.5 to support read and write of true CIEXYZ values for
|
/* Added at libpng-1.5.5 to support read and write of true CIEXYZ values for
|
||||||
|
@ -1240,16 +1235,17 @@ png_XYZ_from_xy(png_XYZ *XYZ, const png_xy *xy)
|
||||||
|
|
||||||
/* Check xy and, implicitly, z. Note that wide gamut color spaces typically
|
/* Check xy and, implicitly, z. Note that wide gamut color spaces typically
|
||||||
* have end points with 0 tristimulus values (these are impossible end
|
* have end points with 0 tristimulus values (these are impossible end
|
||||||
* points, but they are used to cover the possible colors.)
|
* points, but they are used to cover the possible colors). We check
|
||||||
|
* xy->whitey against 5, not 0, to avoid a possible integer overflow.
|
||||||
*/
|
*/
|
||||||
if (xy->redx < 0 || xy->redx > PNG_FP_1) return 1;
|
if (xy->redx < 0 || xy->redx > PNG_FP_1) return 1;
|
||||||
if (xy->redy < 0 || xy->redy > PNG_FP_1-xy->redx) return 1;
|
if (xy->redy < 0 || xy->redy > PNG_FP_1-xy->redx) return 1;
|
||||||
if (xy->greenx < 0 || xy->greenx > PNG_FP_1) return 1;
|
if (xy->greenx < 0 || xy->greenx > PNG_FP_1) return 1;
|
||||||
if (xy->greeny < 0 || xy->greeny > PNG_FP_1-xy->greenx) return 1;
|
if (xy->greeny < 0 || xy->greeny > PNG_FP_1-xy->greenx) return 1;
|
||||||
if (xy->bluex < 0 || xy->bluex > PNG_FP_1) return 1;
|
if (xy->bluex < 0 || xy->bluex > PNG_FP_1) return 1;
|
||||||
if (xy->bluey < 0 || xy->bluey > PNG_FP_1-xy->bluex) return 1;
|
if (xy->bluey < 0 || xy->bluey > PNG_FP_1-xy->bluex) return 1;
|
||||||
if (xy->whitex < 0 || xy->whitex > PNG_FP_1) return 1;
|
if (xy->whitex < 0 || xy->whitex > PNG_FP_1) return 1;
|
||||||
if (xy->whitey < 0 || xy->whitey > PNG_FP_1-xy->whitex) return 1;
|
if (xy->whitey < 5 || xy->whitey > PNG_FP_1-xy->whitex) return 1;
|
||||||
|
|
||||||
/* The reverse calculation is more difficult because the original tristimulus
|
/* The reverse calculation is more difficult because the original tristimulus
|
||||||
* value had 9 independent values (red,green,blue)x(X,Y,Z) however only 8
|
* value had 9 independent values (red,green,blue)x(X,Y,Z) however only 8
|
||||||
|
@ -2166,7 +2162,8 @@ png_icc_check_tag_table(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
||||||
return 1; /* success, maybe with warnings */
|
return 1; /* success, maybe with warnings */
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(PNG_sRGB_SUPPORTED) && PNG_sRGB_PROFILE_CHECKS >= 0
|
#ifdef PNG_sRGB_SUPPORTED
|
||||||
|
#if PNG_sRGB_PROFILE_CHECKS >= 0
|
||||||
/* Information about the known ICC sRGB profiles */
|
/* Information about the known ICC sRGB profiles */
|
||||||
static const struct
|
static const struct
|
||||||
{
|
{
|
||||||
|
@ -2280,7 +2277,7 @@ png_compare_ICC_profile_with_sRGB(png_const_structrp png_ptr,
|
||||||
|
|
||||||
/* Length *and* intent must match */
|
/* Length *and* intent must match */
|
||||||
if (length == png_sRGB_checks[i].length &&
|
if (length == png_sRGB_checks[i].length &&
|
||||||
intent == png_sRGB_checks[i].intent)
|
intent == (png_uint_32) png_sRGB_checks[i].intent)
|
||||||
{
|
{
|
||||||
/* Now calculate the adler32 if not done already. */
|
/* Now calculate the adler32 if not done already. */
|
||||||
if (adler == 0)
|
if (adler == 0)
|
||||||
|
@ -2324,8 +2321,8 @@ png_compare_ICC_profile_with_sRGB(png_const_structrp png_ptr,
|
||||||
*/
|
*/
|
||||||
else if (png_sRGB_checks[i].have_md5 == 0)
|
else if (png_sRGB_checks[i].have_md5 == 0)
|
||||||
{
|
{
|
||||||
png_chunk_report(png_ptr, "out-of-date sRGB profile with"
|
png_chunk_report(png_ptr,
|
||||||
" no signature",
|
"out-of-date sRGB profile with no signature",
|
||||||
PNG_CHUNK_WARNING);
|
PNG_CHUNK_WARNING);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2338,8 +2335,8 @@ png_compare_ICC_profile_with_sRGB(png_const_structrp png_ptr,
|
||||||
* way. This probably indicates a data error or uninformed hacking.
|
* way. This probably indicates a data error or uninformed hacking.
|
||||||
* Fall through to "no match".
|
* Fall through to "no match".
|
||||||
*/
|
*/
|
||||||
png_chunk_report(png_ptr, "Not recognizing known sRGB profile that"
|
png_chunk_report(png_ptr,
|
||||||
" has been edited",
|
"Not recognizing known sRGB profile that has been edited",
|
||||||
PNG_CHUNK_WARNING);
|
PNG_CHUNK_WARNING);
|
||||||
break;
|
break;
|
||||||
# endif
|
# endif
|
||||||
|
@ -2349,9 +2346,8 @@ png_compare_ICC_profile_with_sRGB(png_const_structrp png_ptr,
|
||||||
|
|
||||||
return 0; /* no match */
|
return 0; /* no match */
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* PNG_sRGB_PROFILE_CHECKS >= 0 */
|
||||||
|
|
||||||
#ifdef PNG_sRGB_SUPPORTED
|
|
||||||
void /* PRIVATE */
|
void /* PRIVATE */
|
||||||
png_icc_set_sRGB(png_const_structrp png_ptr,
|
png_icc_set_sRGB(png_const_structrp png_ptr,
|
||||||
png_colorspacerp colorspace, png_const_bytep profile, uLong adler)
|
png_colorspacerp colorspace, png_const_bytep profile, uLong adler)
|
||||||
|
@ -2365,7 +2361,7 @@ png_icc_set_sRGB(png_const_structrp png_ptr,
|
||||||
(void)png_colorspace_set_sRGB(png_ptr, colorspace,
|
(void)png_colorspace_set_sRGB(png_ptr, colorspace,
|
||||||
(int)/*already checked*/png_get_uint_32(profile+64));
|
(int)/*already checked*/png_get_uint_32(profile+64));
|
||||||
}
|
}
|
||||||
#endif /* READ_sRGB */
|
#endif /* sRGB */
|
||||||
|
|
||||||
int /* PRIVATE */
|
int /* PRIVATE */
|
||||||
png_colorspace_set_ICC(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
png_colorspace_set_ICC(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
||||||
|
@ -2457,7 +2453,7 @@ png_colorspace_set_rgb_coefficients(png_structrp png_ptr)
|
||||||
png_error(png_ptr, "internal error handling cHRM->XYZ");
|
png_error(png_ptr, "internal error handling cHRM->XYZ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* READ_RGB_TO_GRAY */
|
||||||
|
|
||||||
#endif /* COLORSPACE */
|
#endif /* COLORSPACE */
|
||||||
|
|
||||||
|
@ -2486,18 +2482,19 @@ png_check_IHDR(png_const_structrp png_ptr,
|
||||||
png_warning(png_ptr, "Image width is zero in IHDR");
|
png_warning(png_ptr, "Image width is zero in IHDR");
|
||||||
error = 1;
|
error = 1;
|
||||||
}
|
}
|
||||||
else if (width > PNG_UINT_31_MAX)
|
|
||||||
|
if (width > PNG_UINT_31_MAX)
|
||||||
{
|
{
|
||||||
png_warning(png_ptr, "Invalid image width in IHDR");
|
png_warning(png_ptr, "Invalid image width in IHDR");
|
||||||
error = 1;
|
error = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (png_gt(width,
|
if (png_gt(((width + 7) & (~7)),
|
||||||
(PNG_SIZE_MAX >> 3) /* 8-byte RGBA pixels */
|
((PNG_SIZE_MAX
|
||||||
- 48 /* big_row_buf hack */
|
- 48 /* big_row_buf hack */
|
||||||
- 1 /* filter byte */
|
- 1) /* filter byte */
|
||||||
- 7*8 /* rounding width to multiple of 8 pix */
|
/ 8) /* 8-byte RGBA pixels */
|
||||||
- 8)) /* extra max_pixel_depth pad */
|
- 1)) /* extra max_pixel_depth pad */
|
||||||
{
|
{
|
||||||
/* The size of the row must be within the limits of this architecture.
|
/* The size of the row must be within the limits of this architecture.
|
||||||
* Because the read code can perform arbitrary transformations the
|
* Because the read code can perform arbitrary transformations the
|
||||||
|
@ -2513,17 +2510,15 @@ png_check_IHDR(png_const_structrp png_ptr,
|
||||||
png_warning(png_ptr, "Image width is too large for this architecture");
|
png_warning(png_ptr, "Image width is too large for this architecture");
|
||||||
error = 1;
|
error = 1;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
|
||||||
|
if (width > png_ptr->user_width_max)
|
||||||
|
#else
|
||||||
|
if (width > PNG_USER_WIDTH_MAX)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
# ifdef PNG_SET_USER_LIMITS_SUPPORTED
|
png_warning(png_ptr, "Image width exceeds user limit in IHDR");
|
||||||
if (width > png_ptr->user_width_max)
|
error = 1;
|
||||||
# else
|
|
||||||
if (width > PNG_USER_WIDTH_MAX)
|
|
||||||
# endif
|
|
||||||
{
|
|
||||||
png_warning(png_ptr, "Image width exceeds user limit in IHDR");
|
|
||||||
error = 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (height == 0)
|
if (height == 0)
|
||||||
|
@ -2531,22 +2526,21 @@ png_check_IHDR(png_const_structrp png_ptr,
|
||||||
png_warning(png_ptr, "Image height is zero in IHDR");
|
png_warning(png_ptr, "Image height is zero in IHDR");
|
||||||
error = 1;
|
error = 1;
|
||||||
}
|
}
|
||||||
else if (height > PNG_UINT_31_MAX)
|
|
||||||
|
if (height > PNG_UINT_31_MAX)
|
||||||
{
|
{
|
||||||
png_warning(png_ptr, "Invalid image height in IHDR");
|
png_warning(png_ptr, "Invalid image height in IHDR");
|
||||||
error = 1;
|
error = 1;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
|
||||||
|
if (height > png_ptr->user_height_max)
|
||||||
|
#else
|
||||||
|
if (height > PNG_USER_HEIGHT_MAX)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
# ifdef PNG_SET_USER_LIMITS_SUPPORTED
|
png_warning(png_ptr, "Image height exceeds user limit in IHDR");
|
||||||
if (height > png_ptr->user_height_max)
|
error = 1;
|
||||||
# else
|
|
||||||
if (height > PNG_USER_HEIGHT_MAX)
|
|
||||||
# endif
|
|
||||||
{
|
|
||||||
png_warning(png_ptr, "Image height exceeds user limit in IHDR");
|
|
||||||
error = 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check other values */
|
/* Check other values */
|
||||||
|
@ -2585,7 +2579,7 @@ png_check_IHDR(png_const_structrp png_ptr,
|
||||||
error = 1;
|
error = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifdef PNG_MNG_FEATURES_SUPPORTED
|
#ifdef PNG_MNG_FEATURES_SUPPORTED
|
||||||
/* Accept filter_method 64 (intrapixel differencing) only if
|
/* Accept filter_method 64 (intrapixel differencing) only if
|
||||||
* 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and
|
* 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and
|
||||||
* 2. Libpng did not read a PNG signature (this filter_method is only
|
* 2. Libpng did not read a PNG signature (this filter_method is only
|
||||||
|
@ -2618,13 +2612,13 @@ png_check_IHDR(png_const_structrp png_ptr,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# else
|
#else
|
||||||
if (filter_type != PNG_FILTER_TYPE_BASE)
|
if (filter_type != PNG_FILTER_TYPE_BASE)
|
||||||
{
|
{
|
||||||
png_warning(png_ptr, "Unknown filter method in IHDR");
|
png_warning(png_ptr, "Unknown filter method in IHDR");
|
||||||
error = 1;
|
error = 1;
|
||||||
}
|
}
|
||||||
# endif
|
#endif
|
||||||
|
|
||||||
if (error == 1)
|
if (error == 1)
|
||||||
png_error(png_ptr, "Invalid IHDR data");
|
png_error(png_ptr, "Invalid IHDR data");
|
||||||
|
@ -2850,7 +2844,7 @@ png_ascii_from_fp(png_const_structrp png_ptr, png_charp ascii, png_size_t size,
|
||||||
|
|
||||||
if (fp >= DBL_MIN && fp <= DBL_MAX)
|
if (fp >= DBL_MIN && fp <= DBL_MAX)
|
||||||
{
|
{
|
||||||
int exp_b10; /* A base 10 exponent */
|
int exp_b10; /* A base 10 exponent */
|
||||||
double base; /* 10^exp_b10 */
|
double base; /* 10^exp_b10 */
|
||||||
|
|
||||||
/* First extract a base 10 exponent of the number,
|
/* First extract a base 10 exponent of the number,
|
||||||
|
@ -2898,7 +2892,7 @@ png_ascii_from_fp(png_const_structrp png_ptr, png_charp ascii, png_size_t size,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
{
|
{
|
||||||
int czero, clead, cdigits;
|
unsigned int czero, clead, cdigits;
|
||||||
char exponent[10];
|
char exponent[10];
|
||||||
|
|
||||||
/* Allow up to two leading zeros - this will not lengthen
|
/* Allow up to two leading zeros - this will not lengthen
|
||||||
|
@ -2928,7 +2922,7 @@ png_ascii_from_fp(png_const_structrp png_ptr, png_charp ascii, png_size_t size,
|
||||||
* of the loop don't break the number into parts so
|
* of the loop don't break the number into parts so
|
||||||
* that the final digit is rounded.
|
* that the final digit is rounded.
|
||||||
*/
|
*/
|
||||||
if (cdigits+czero-clead+1 < (int)precision)
|
if (cdigits+czero+1 < precision+clead)
|
||||||
fp = modf(fp, &d);
|
fp = modf(fp, &d);
|
||||||
|
|
||||||
else
|
else
|
||||||
|
@ -3034,14 +3028,14 @@ png_ascii_from_fp(png_const_structrp png_ptr, png_charp ascii, png_size_t size,
|
||||||
*ascii++ = (char)(48 + (int)d), ++cdigits;
|
*ascii++ = (char)(48 + (int)d), ++cdigits;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (cdigits+czero-clead < (int)precision && fp > DBL_MIN);
|
while (cdigits+czero < precision+clead && fp > DBL_MIN);
|
||||||
|
|
||||||
/* The total output count (max) is now 4+precision */
|
/* The total output count (max) is now 4+precision */
|
||||||
|
|
||||||
/* Check for an exponent, if we don't need one we are
|
/* Check for an exponent, if we don't need one we are
|
||||||
* done and just need to terminate the string. At
|
* done and just need to terminate the string. At
|
||||||
* this point exp_b10==(-1) is effectively if flag - it got
|
* this point exp_b10==(-1) is effectively if flag - it got
|
||||||
* to '-1' because of the decrement after outputing
|
* to '-1' because of the decrement after outputting
|
||||||
* the decimal point above (the exponent required is
|
* the decimal point above (the exponent required is
|
||||||
* *not* -1!)
|
* *not* -1!)
|
||||||
*/
|
*/
|
||||||
|
@ -3049,7 +3043,7 @@ png_ascii_from_fp(png_const_structrp png_ptr, png_charp ascii, png_size_t size,
|
||||||
{
|
{
|
||||||
/* The following only happens if we didn't output the
|
/* The following only happens if we didn't output the
|
||||||
* leading zeros above for negative exponent, so this
|
* leading zeros above for negative exponent, so this
|
||||||
* doest add to the digit requirement. Note that the
|
* doesn't add to the digit requirement. Note that the
|
||||||
* two zeros here can only be output if the two leading
|
* two zeros here can only be output if the two leading
|
||||||
* zeros were *not* output, so this doesn't increase
|
* zeros were *not* output, so this doesn't increase
|
||||||
* the output count.
|
* the output count.
|
||||||
|
@ -3102,7 +3096,7 @@ png_ascii_from_fp(png_const_structrp png_ptr, png_charp ascii, png_size_t size,
|
||||||
/* Need another size check here for the exponent digits, so
|
/* Need another size check here for the exponent digits, so
|
||||||
* this need not be considered above.
|
* this need not be considered above.
|
||||||
*/
|
*/
|
||||||
if ((int)size > cdigits)
|
if (size > cdigits)
|
||||||
{
|
{
|
||||||
while (cdigits > 0) *ascii++ = exponent[--cdigits];
|
while (cdigits > 0) *ascii++ = exponent[--cdigits];
|
||||||
|
|
||||||
|
@ -3206,7 +3200,7 @@ png_ascii_from_fixed(png_const_structrp png_ptr, png_charp ascii,
|
||||||
png_error(png_ptr, "ASCII conversion buffer too small");
|
png_error(png_ptr, "ASCII conversion buffer too small");
|
||||||
}
|
}
|
||||||
# endif /* FIXED_POINT */
|
# endif /* FIXED_POINT */
|
||||||
#endif /* READ_SCAL */
|
#endif /* SCAL */
|
||||||
|
|
||||||
#if defined(PNG_FLOATING_POINT_SUPPORTED) && \
|
#if defined(PNG_FLOATING_POINT_SUPPORTED) && \
|
||||||
!defined(PNG_FIXED_POINT_MACRO_SUPPORTED) && \
|
!defined(PNG_FIXED_POINT_MACRO_SUPPORTED) && \
|
||||||
|
@ -3224,7 +3218,7 @@ png_fixed(png_const_structrp png_ptr, double fp, png_const_charp text)
|
||||||
png_fixed_error(png_ptr, text);
|
png_fixed_error(png_ptr, text);
|
||||||
|
|
||||||
# ifndef PNG_ERROR_TEXT_SUPPORTED
|
# ifndef PNG_ERROR_TEXT_SUPPORTED
|
||||||
PNG_UNUSED(text)
|
PNG_UNUSED(text)
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
return (png_fixed_point)r;
|
return (png_fixed_point)r;
|
||||||
|
@ -3405,29 +3399,29 @@ png_gamma_significant(png_fixed_point gamma_val)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PNG_READ_GAMMA_SUPPORTED
|
#ifdef PNG_READ_GAMMA_SUPPORTED
|
||||||
#if defined(PNG_16BIT_SUPPORTED) || !defined(PNG_FLOATING_ARITHMETIC_SUPPORTED)
|
#ifdef PNG_16BIT_SUPPORTED
|
||||||
/* A local convenience routine. */
|
/* A local convenience routine. */
|
||||||
static png_fixed_point
|
static png_fixed_point
|
||||||
png_product2(png_fixed_point a, png_fixed_point b)
|
png_product2(png_fixed_point a, png_fixed_point b)
|
||||||
{
|
{
|
||||||
/* The required result is 1/a * 1/b; the following preserves accuracy. */
|
/* The required result is 1/a * 1/b; the following preserves accuracy. */
|
||||||
# ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
|
#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
|
||||||
double r = a * 1E-5;
|
double r = a * 1E-5;
|
||||||
r *= b;
|
r *= b;
|
||||||
r = floor(r+.5);
|
r = floor(r+.5);
|
||||||
|
|
||||||
if (r <= 2147483647. && r >= -2147483648.)
|
if (r <= 2147483647. && r >= -2147483648.)
|
||||||
return (png_fixed_point)r;
|
return (png_fixed_point)r;
|
||||||
# else
|
#else
|
||||||
png_fixed_point res;
|
png_fixed_point res;
|
||||||
|
|
||||||
if (png_muldiv(&res, a, b, 100000) != 0)
|
if (png_muldiv(&res, a, b, 100000) != 0)
|
||||||
return res;
|
return res;
|
||||||
# endif
|
#endif
|
||||||
|
|
||||||
return 0; /* overflow */
|
return 0; /* overflow */
|
||||||
}
|
}
|
||||||
#endif /* 16BIT || !FLOATING_ARITHMETIC */
|
#endif /* 16BIT */
|
||||||
|
|
||||||
/* The inverse of the above. */
|
/* The inverse of the above. */
|
||||||
png_fixed_point
|
png_fixed_point
|
||||||
|
@ -3435,12 +3429,15 @@ png_reciprocal2(png_fixed_point a, png_fixed_point b)
|
||||||
{
|
{
|
||||||
/* The required result is 1/a * 1/b; the following preserves accuracy. */
|
/* The required result is 1/a * 1/b; the following preserves accuracy. */
|
||||||
#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
|
#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
|
||||||
double r = 1E15/a;
|
if (a != 0 && b != 0)
|
||||||
r /= b;
|
{
|
||||||
r = floor(r+.5);
|
double r = 1E15/a;
|
||||||
|
r /= b;
|
||||||
|
r = floor(r+.5);
|
||||||
|
|
||||||
if (r <= 2147483647. && r >= -2147483648.)
|
if (r <= 2147483647. && r >= -2147483648.)
|
||||||
return (png_fixed_point)r;
|
return (png_fixed_point)r;
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
/* This may overflow because the range of png_fixed_point isn't symmetric,
|
/* This may overflow because the range of png_fixed_point isn't symmetric,
|
||||||
* but this API is only used for the product of file and screen gamma so it
|
* but this API is only used for the product of file and screen gamma so it
|
||||||
|
@ -3731,7 +3728,7 @@ png_exp8bit(png_fixed_point lg2)
|
||||||
* step.
|
* step.
|
||||||
*/
|
*/
|
||||||
x -= x >> 8;
|
x -= x >> 8;
|
||||||
return (png_byte)((x + 0x7fffffU) >> 24);
|
return (png_byte)(((x + 0x7fffffU) >> 24) & 0xff);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef PNG_16BIT_SUPPORTED
|
#ifdef PNG_16BIT_SUPPORTED
|
||||||
|
@ -3792,7 +3789,7 @@ png_gamma_8bit_correct(unsigned int value, png_fixed_point gamma_val)
|
||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
return (png_byte)value;
|
return (png_byte)(value & 0xff);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef PNG_16BIT_SUPPORTED
|
#ifdef PNG_16BIT_SUPPORTED
|
||||||
|
@ -4014,7 +4011,7 @@ png_build_8bit_table(png_structrp png_ptr, png_bytepp ptable,
|
||||||
|
|
||||||
else
|
else
|
||||||
for (i=0; i<256; ++i)
|
for (i=0; i<256; ++i)
|
||||||
table[i] = (png_byte)i;
|
table[i] = (png_byte)(i & 0xff);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Used from png_read_destroy and below to release the memory used by the gamma
|
/* Used from png_read_destroy and below to release the memory used by the gamma
|
||||||
|
@ -4154,7 +4151,8 @@ png_build_gamma_table(png_structrp png_ptr, int bit_depth)
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
if (sig_bit > 0 && sig_bit < 16U)
|
if (sig_bit > 0 && sig_bit < 16U)
|
||||||
shift = (png_byte)(16U - sig_bit); /* shift == insignificant bits */
|
/* shift == insignificant bits */
|
||||||
|
shift = (png_byte)((16U - sig_bit) & 0xff);
|
||||||
|
|
||||||
else
|
else
|
||||||
shift = 0; /* keep all 16 bits */
|
shift = 0; /* keep all 16 bits */
|
||||||
|
@ -4223,7 +4221,7 @@ png_set_option(png_structrp png_ptr, int option, int onoff)
|
||||||
int setting = (2 + (onoff != 0)) << option;
|
int setting = (2 + (onoff != 0)) << option;
|
||||||
int current = png_ptr->options;
|
int current = png_ptr->options;
|
||||||
|
|
||||||
png_ptr->options = (png_byte)((current & ~mask) | setting);
|
png_ptr->options = (png_byte)(((current & ~mask) | setting) & 0xff);
|
||||||
|
|
||||||
return (current & mask) >> option;
|
return (current & mask) >> option;
|
||||||
}
|
}
|
||||||
|
@ -4239,7 +4237,7 @@ png_set_option(png_structrp png_ptr, int option, int onoff)
|
||||||
* contrib/tools/makesRGB.c. The actual sRGB transfer curve defined in the
|
* contrib/tools/makesRGB.c. The actual sRGB transfer curve defined in the
|
||||||
* specification (see the article at http://en.wikipedia.org/wiki/SRGB)
|
* specification (see the article at http://en.wikipedia.org/wiki/SRGB)
|
||||||
* is used, not the gamma=1/2.2 approximation use elsewhere in libpng.
|
* is used, not the gamma=1/2.2 approximation use elsewhere in libpng.
|
||||||
* The sRGB to linear table is exact (to the nearest 16 bit linear fraction).
|
* The sRGB to linear table is exact (to the nearest 16-bit linear fraction).
|
||||||
* The inverse (linear to sRGB) table has accuracies as follows:
|
* The inverse (linear to sRGB) table has accuracies as follows:
|
||||||
*
|
*
|
||||||
* For all possible (255*65535+1) input values:
|
* For all possible (255*65535+1) input values:
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
|
|
||||||
/* png.h - header file for PNG reference library
|
/* png.h - header file for PNG reference library
|
||||||
*
|
*
|
||||||
* libpng version 1.6.16, December 22, 2014
|
* libpng version 1.6.18, July 23, 2015
|
||||||
* Copyright (c) 1998-2014 Glenn Randers-Pehrson
|
*
|
||||||
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
|
@ -10,8 +11,8 @@
|
||||||
*
|
*
|
||||||
* Authors and maintainers:
|
* Authors and maintainers:
|
||||||
* libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat
|
* libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat
|
||||||
* libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger
|
* libpng versions 0.89, June 1996, through 0.96, May 1997: Andreas Dilger
|
||||||
* libpng versions 0.97, January 1998, through 1.6.16, December 22, 2014: Glenn
|
* libpng versions 0.97, January 1998, through 1.6.18, July 23, 2015: Glenn
|
||||||
* See also "Contributing Authors", below.
|
* See also "Contributing Authors", below.
|
||||||
*
|
*
|
||||||
* Note about libpng version numbers:
|
* Note about libpng version numbers:
|
||||||
|
@ -212,6 +213,12 @@
|
||||||
* 1.6.16beta01-03 16 10616 16.so.16.16[.0]
|
* 1.6.16beta01-03 16 10616 16.so.16.16[.0]
|
||||||
* 1.6.16rc01-02 16 10616 16.so.16.16[.0]
|
* 1.6.16rc01-02 16 10616 16.so.16.16[.0]
|
||||||
* 1.6.16 16 10616 16.so.16.16[.0]
|
* 1.6.16 16 10616 16.so.16.16[.0]
|
||||||
|
* 1.6.17beta01-06 16 10617 16.so.16.17[.0]
|
||||||
|
* 1.6.17rc01-06 16 10617 16.so.16.17[.0]
|
||||||
|
* 1.6.17 16 10617 16.so.16.17[.0]
|
||||||
|
* 1.6.18beta01-09 16 10618 16.so.16.18[.0]
|
||||||
|
* 1.6.18rc01-03 16 10618 16.so.16.18[.0]
|
||||||
|
* 1.6.18 16 10618 16.so.16.18[.0]
|
||||||
*
|
*
|
||||||
* Henceforth the source version will match the shared-library major
|
* Henceforth the source version will match the shared-library major
|
||||||
* and minor numbers; the shared-library major version number will be
|
* and minor numbers; the shared-library major version number will be
|
||||||
|
@ -243,21 +250,16 @@
|
||||||
*
|
*
|
||||||
* This code is released under the libpng license.
|
* This code is released under the libpng license.
|
||||||
*
|
*
|
||||||
* libpng versions 1.2.6, August 15, 2004, through 1.6.16, December 22, 2014, are
|
* libpng versions 1.0.7, July 1, 2000, through 1.6.18, July 23, 2015, are
|
||||||
* Copyright (c) 2004, 2006-2014 Glenn Randers-Pehrson, and are
|
* Copyright (c) 2000-2002, 2004, 2006-2015 Glenn Randers-Pehrson, and are
|
||||||
* distributed according to the same disclaimer and license as libpng-1.2.5
|
|
||||||
* with the following individual added to the list of Contributing Authors:
|
|
||||||
*
|
|
||||||
* Cosmin Truta
|
|
||||||
*
|
|
||||||
* libpng versions 1.0.7, July 1, 2000, through 1.2.5, October 3, 2002, are
|
|
||||||
* Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
|
|
||||||
* distributed according to the same disclaimer and license as libpng-1.0.6
|
* distributed according to the same disclaimer and license as libpng-1.0.6
|
||||||
* with the following individuals added to the list of Contributing Authors:
|
* with the following individuals added to the list of Contributing Authors:
|
||||||
*
|
*
|
||||||
* Simon-Pierre Cadieux
|
* Simon-Pierre Cadieux
|
||||||
* Eric S. Raymond
|
* Mans Rullgard
|
||||||
|
* Cosmin Truta
|
||||||
* Gilles Vollant
|
* Gilles Vollant
|
||||||
|
* James Yu
|
||||||
*
|
*
|
||||||
* and with the following additions to the disclaimer:
|
* and with the following additions to the disclaimer:
|
||||||
*
|
*
|
||||||
|
@ -269,17 +271,18 @@
|
||||||
* the user.
|
* the user.
|
||||||
*
|
*
|
||||||
* libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
|
* libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
|
||||||
* Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson, and are
|
* Copyright (c) 1998-2000 Glenn Randers-Pehrson, and are distributed according
|
||||||
* distributed according to the same disclaimer and license as libpng-0.96,
|
* to the same disclaimer and license as libpng-0.96, with the following
|
||||||
* with the following individuals added to the list of Contributing Authors:
|
* individuals added to the list of Contributing Authors:
|
||||||
*
|
*
|
||||||
* Tom Lane
|
* Tom Lane
|
||||||
* Glenn Randers-Pehrson
|
* Glenn Randers-Pehrson
|
||||||
|
* Eric S. Raymond
|
||||||
* Willem van Schaik
|
* Willem van Schaik
|
||||||
*
|
*
|
||||||
* libpng versions 0.89, June 1996, through 0.96, May 1997, are
|
* libpng versions 0.89, June 1996, through 0.96, May 1997, are
|
||||||
* Copyright (c) 1996, 1997 Andreas Dilger
|
* Copyright (c) 1996-1997 Andreas Dilger, and are
|
||||||
* Distributed according to the same disclaimer and license as libpng-0.88,
|
* distributed according to the same disclaimer and license as libpng-0.88,
|
||||||
* with the following individuals added to the list of Contributing Authors:
|
* with the following individuals added to the list of Contributing Authors:
|
||||||
*
|
*
|
||||||
* John Bowler
|
* John Bowler
|
||||||
|
@ -290,7 +293,7 @@
|
||||||
* Tom Tanner
|
* Tom Tanner
|
||||||
*
|
*
|
||||||
* libpng versions 0.5, May 1995, through 0.88, January 1996, are
|
* libpng versions 0.5, May 1995, through 0.88, January 1996, are
|
||||||
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
* Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
|
||||||
*
|
*
|
||||||
* For the purposes of this copyright and license, "Contributing Authors"
|
* For the purposes of this copyright and license, "Contributing Authors"
|
||||||
* is defined as the following set of individuals:
|
* is defined as the following set of individuals:
|
||||||
|
@ -318,8 +321,8 @@
|
||||||
* 2. Altered versions must be plainly marked as such and must not
|
* 2. Altered versions must be plainly marked as such and must not
|
||||||
* be misrepresented as being the original source.
|
* be misrepresented as being the original source.
|
||||||
*
|
*
|
||||||
* 3. This Copyright notice may not be removed or altered from
|
* 3. This Copyright notice may not be removed or altered from any
|
||||||
* any source or altered source distribution.
|
* source or altered source distribution.
|
||||||
*
|
*
|
||||||
* The Contributing Authors and Group 42, Inc. specifically permit, without
|
* The Contributing Authors and Group 42, Inc. specifically permit, without
|
||||||
* fee, and encourage the use of this source code as a component to
|
* fee, and encourage the use of this source code as a component to
|
||||||
|
@ -332,15 +335,16 @@
|
||||||
* A "png_get_copyright" function is available, for convenient use in "about"
|
* A "png_get_copyright" function is available, for convenient use in "about"
|
||||||
* boxes and the like:
|
* boxes and the like:
|
||||||
*
|
*
|
||||||
* printf("%s", png_get_copyright(NULL));
|
* printf("%s", png_get_copyright(NULL));
|
||||||
*
|
*
|
||||||
* Also, the PNG logo (in PNG format, of course) is supplied in the
|
* Also, the PNG logo (in PNG format, of course) is supplied in the
|
||||||
* files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
|
* files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Libpng is OSI Certified Open Source Software. OSI Certified is a
|
* Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
|
||||||
* certification mark of the Open Source Initiative.
|
* a certification mark of the Open Source Initiative. OSI has not addressed
|
||||||
|
* the additional disclaimers inserted at version 1.0.7.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -355,13 +359,13 @@
|
||||||
* Y2K compliance in libpng:
|
* Y2K compliance in libpng:
|
||||||
* =========================
|
* =========================
|
||||||
*
|
*
|
||||||
* December 22, 2014
|
* July 23, 2015
|
||||||
*
|
*
|
||||||
* Since the PNG Development group is an ad-hoc body, we can't make
|
* Since the PNG Development group is an ad-hoc body, we can't make
|
||||||
* an official declaration.
|
* an official declaration.
|
||||||
*
|
*
|
||||||
* This is your unofficial assurance that libpng from version 0.71 and
|
* This is your unofficial assurance that libpng from version 0.71 and
|
||||||
* upward through 1.6.16 are Y2K compliant. It is my belief that
|
* upward through 1.6.18 are Y2K compliant. It is my belief that
|
||||||
* earlier versions were also Y2K compliant.
|
* earlier versions were also Y2K compliant.
|
||||||
*
|
*
|
||||||
* Libpng only has two year fields. One is a 2-byte unsigned integer
|
* Libpng only has two year fields. One is a 2-byte unsigned integer
|
||||||
|
@ -423,9 +427,9 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Version information for png.h - this should match the version in png.c */
|
/* Version information for png.h - this should match the version in png.c */
|
||||||
#define PNG_LIBPNG_VER_STRING "1.6.16"
|
#define PNG_LIBPNG_VER_STRING "1.6.18"
|
||||||
#define PNG_HEADER_VERSION_STRING \
|
#define PNG_HEADER_VERSION_STRING \
|
||||||
" libpng version 1.6.16 - December 22, 2014\n"
|
" libpng version 1.6.18 - July 23, 2015\n"
|
||||||
|
|
||||||
#define PNG_LIBPNG_VER_SONUM 16
|
#define PNG_LIBPNG_VER_SONUM 16
|
||||||
#define PNG_LIBPNG_VER_DLLNUM 16
|
#define PNG_LIBPNG_VER_DLLNUM 16
|
||||||
|
@ -433,7 +437,7 @@
|
||||||
/* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
|
/* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
|
||||||
#define PNG_LIBPNG_VER_MAJOR 1
|
#define PNG_LIBPNG_VER_MAJOR 1
|
||||||
#define PNG_LIBPNG_VER_MINOR 6
|
#define PNG_LIBPNG_VER_MINOR 6
|
||||||
#define PNG_LIBPNG_VER_RELEASE 16
|
#define PNG_LIBPNG_VER_RELEASE 18
|
||||||
|
|
||||||
/* This should match the numeric part of the final component of
|
/* This should match the numeric part of the final component of
|
||||||
* PNG_LIBPNG_VER_STRING, omitting any leading zero:
|
* PNG_LIBPNG_VER_STRING, omitting any leading zero:
|
||||||
|
@ -464,7 +468,7 @@
|
||||||
* version 1.0.0 was mis-numbered 100 instead of 10000). From
|
* version 1.0.0 was mis-numbered 100 instead of 10000). From
|
||||||
* version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release
|
* version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release
|
||||||
*/
|
*/
|
||||||
#define PNG_LIBPNG_VER 10616 /* 1.6.16 */
|
#define PNG_LIBPNG_VER 10618 /* 1.6.18 */
|
||||||
|
|
||||||
/* Library configuration: these options cannot be changed after
|
/* Library configuration: these options cannot be changed after
|
||||||
* the library has been built.
|
* the library has been built.
|
||||||
|
@ -569,7 +573,7 @@ extern "C" {
|
||||||
/* This triggers a compiler error in png.c, if png.c and png.h
|
/* This triggers a compiler error in png.c, if png.c and png.h
|
||||||
* do not agree upon the version number.
|
* do not agree upon the version number.
|
||||||
*/
|
*/
|
||||||
typedef char* png_libpng_version_1_6_16;
|
typedef char* png_libpng_version_1_6_18;
|
||||||
|
|
||||||
/* Basic control structions. Read libpng-manual.txt or libpng.3 for more info.
|
/* Basic control structions. Read libpng-manual.txt or libpng.3 for more info.
|
||||||
*
|
*
|
||||||
|
@ -1578,6 +1582,7 @@ PNG_EXPORT(66, void, png_set_crc_action, (png_structrp png_ptr, int crit_action,
|
||||||
#define PNG_CRC_QUIET_USE 4 /* quiet/use data quiet/use data */
|
#define PNG_CRC_QUIET_USE 4 /* quiet/use data quiet/use data */
|
||||||
#define PNG_CRC_NO_CHANGE 5 /* use current value use current value */
|
#define PNG_CRC_NO_CHANGE 5 /* use current value use current value */
|
||||||
|
|
||||||
|
#ifdef PNG_WRITE_SUPPORTED
|
||||||
/* These functions give the user control over the scan-line filtering in
|
/* These functions give the user control over the scan-line filtering in
|
||||||
* libpng and the compression methods used by zlib. These functions are
|
* libpng and the compression methods used by zlib. These functions are
|
||||||
* mainly useful for testing, as the defaults should work with most users.
|
* mainly useful for testing, as the defaults should work with most users.
|
||||||
|
@ -1591,6 +1596,7 @@ PNG_EXPORT(66, void, png_set_crc_action, (png_structrp png_ptr, int crit_action,
|
||||||
*/
|
*/
|
||||||
PNG_EXPORT(67, void, png_set_filter, (png_structrp png_ptr, int method,
|
PNG_EXPORT(67, void, png_set_filter, (png_structrp png_ptr, int method,
|
||||||
int filters));
|
int filters));
|
||||||
|
#endif /* WRITE */
|
||||||
|
|
||||||
/* Flags for png_set_filter() to say which filters to use. The flags
|
/* Flags for png_set_filter() to say which filters to use. The flags
|
||||||
* are chosen so that they don't conflict with real filter types
|
* are chosen so that they don't conflict with real filter types
|
||||||
|
@ -1616,35 +1622,8 @@ PNG_EXPORT(67, void, png_set_filter, (png_structrp png_ptr, int method,
|
||||||
#define PNG_FILTER_VALUE_PAETH 4
|
#define PNG_FILTER_VALUE_PAETH 4
|
||||||
#define PNG_FILTER_VALUE_LAST 5
|
#define PNG_FILTER_VALUE_LAST 5
|
||||||
|
|
||||||
#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* EXPERIMENTAL */
|
#ifdef PNG_WRITE_SUPPORTED
|
||||||
/* The "heuristic_method" is given by one of the PNG_FILTER_HEURISTIC_
|
#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* DEPRECATED */
|
||||||
* defines, either the default (minimum-sum-of-absolute-differences), or
|
|
||||||
* the experimental method (weighted-minimum-sum-of-absolute-differences).
|
|
||||||
*
|
|
||||||
* Weights are factors >= 1.0, indicating how important it is to keep the
|
|
||||||
* filter type consistent between rows. Larger numbers mean the current
|
|
||||||
* filter is that many times as likely to be the same as the "num_weights"
|
|
||||||
* previous filters. This is cumulative for each previous row with a weight.
|
|
||||||
* There needs to be "num_weights" values in "filter_weights", or it can be
|
|
||||||
* NULL if the weights aren't being specified. Weights have no influence on
|
|
||||||
* the selection of the first row filter. Well chosen weights can (in theory)
|
|
||||||
* improve the compression for a given image.
|
|
||||||
*
|
|
||||||
* Costs are factors >= 1.0 indicating the relative decoding costs of a
|
|
||||||
* filter type. Higher costs indicate more decoding expense, and are
|
|
||||||
* therefore less likely to be selected over a filter with lower computational
|
|
||||||
* costs. There needs to be a value in "filter_costs" for each valid filter
|
|
||||||
* type (given by PNG_FILTER_VALUE_LAST), or it can be NULL if you aren't
|
|
||||||
* setting the costs. Costs try to improve the speed of decompression without
|
|
||||||
* unduly increasing the compressed image size.
|
|
||||||
*
|
|
||||||
* A negative weight or cost indicates the default value is to be used, and
|
|
||||||
* values in the range [0.0, 1.0) indicate the value is to remain unchanged.
|
|
||||||
* The default values for both weights and costs are currently 1.0, but may
|
|
||||||
* change if good general weighting/cost heuristics can be found. If both
|
|
||||||
* the weights and costs are set to 1.0, this degenerates the WEIGHTED method
|
|
||||||
* to the UNWEIGHTED method, but with added encoding time/computation.
|
|
||||||
*/
|
|
||||||
PNG_FP_EXPORT(68, void, png_set_filter_heuristics, (png_structrp png_ptr,
|
PNG_FP_EXPORT(68, void, png_set_filter_heuristics, (png_structrp png_ptr,
|
||||||
int heuristic_method, int num_weights, png_const_doublep filter_weights,
|
int heuristic_method, int num_weights, png_const_doublep filter_weights,
|
||||||
png_const_doublep filter_costs))
|
png_const_doublep filter_costs))
|
||||||
|
@ -1654,15 +1633,12 @@ PNG_FIXED_EXPORT(209, void, png_set_filter_heuristics_fixed,
|
||||||
png_const_fixed_point_p filter_costs))
|
png_const_fixed_point_p filter_costs))
|
||||||
#endif /* WRITE_WEIGHTED_FILTER */
|
#endif /* WRITE_WEIGHTED_FILTER */
|
||||||
|
|
||||||
/* Heuristic used for row filter selection. These defines should NOT be
|
/* The following are no longer used and will be removed from libpng-1.7: */
|
||||||
* changed.
|
|
||||||
*/
|
|
||||||
#define PNG_FILTER_HEURISTIC_DEFAULT 0 /* Currently "UNWEIGHTED" */
|
#define PNG_FILTER_HEURISTIC_DEFAULT 0 /* Currently "UNWEIGHTED" */
|
||||||
#define PNG_FILTER_HEURISTIC_UNWEIGHTED 1 /* Used by libpng < 0.95 */
|
#define PNG_FILTER_HEURISTIC_UNWEIGHTED 1 /* Used by libpng < 0.95 */
|
||||||
#define PNG_FILTER_HEURISTIC_WEIGHTED 2 /* Experimental feature */
|
#define PNG_FILTER_HEURISTIC_WEIGHTED 2 /* Experimental feature */
|
||||||
#define PNG_FILTER_HEURISTIC_LAST 3 /* Not a valid value */
|
#define PNG_FILTER_HEURISTIC_LAST 3 /* Not a valid value */
|
||||||
|
|
||||||
#ifdef PNG_WRITE_SUPPORTED
|
|
||||||
/* Set the library compression level. Currently, valid values range from
|
/* Set the library compression level. Currently, valid values range from
|
||||||
* 0 - 9, corresponding directly to the zlib compression levels 0 - 9
|
* 0 - 9, corresponding directly to the zlib compression levels 0 - 9
|
||||||
* (0 - no compression, 9 - "maximal" compression). Note that tests have
|
* (0 - no compression, 9 - "maximal" compression). Note that tests have
|
||||||
|
@ -1670,6 +1646,7 @@ PNG_FIXED_EXPORT(209, void, png_set_filter_heuristics_fixed,
|
||||||
* for PNG images, and do considerably fewer caclulations. In the future,
|
* for PNG images, and do considerably fewer caclulations. In the future,
|
||||||
* these values may not correspond directly to the zlib compression levels.
|
* these values may not correspond directly to the zlib compression levels.
|
||||||
*/
|
*/
|
||||||
|
#ifdef PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED
|
||||||
PNG_EXPORT(69, void, png_set_compression_level, (png_structrp png_ptr,
|
PNG_EXPORT(69, void, png_set_compression_level, (png_structrp png_ptr,
|
||||||
int level));
|
int level));
|
||||||
|
|
||||||
|
@ -1687,7 +1664,7 @@ PNG_EXPORT(72, void, png_set_compression_window_bits, (png_structrp png_ptr,
|
||||||
|
|
||||||
PNG_EXPORT(73, void, png_set_compression_method, (png_structrp png_ptr,
|
PNG_EXPORT(73, void, png_set_compression_method, (png_structrp png_ptr,
|
||||||
int method));
|
int method));
|
||||||
#endif
|
#endif /* WRITE_CUSTOMIZE_COMPRESSION */
|
||||||
|
|
||||||
#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
|
#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
|
||||||
/* Also set zlib parameters for compressing non-IDAT chunks */
|
/* Also set zlib parameters for compressing non-IDAT chunks */
|
||||||
|
@ -1709,6 +1686,7 @@ PNG_EXPORT(225, void, png_set_text_compression_window_bits,
|
||||||
PNG_EXPORT(226, void, png_set_text_compression_method, (png_structrp png_ptr,
|
PNG_EXPORT(226, void, png_set_text_compression_method, (png_structrp png_ptr,
|
||||||
int method));
|
int method));
|
||||||
#endif /* WRITE_CUSTOMIZE_ZTXT_COMPRESSION */
|
#endif /* WRITE_CUSTOMIZE_ZTXT_COMPRESSION */
|
||||||
|
#endif /* WRITE */
|
||||||
|
|
||||||
/* These next functions are called for input/output, memory, and error
|
/* These next functions are called for input/output, memory, and error
|
||||||
* handling. They are in the file pngrio.c, pngwio.c, and pngerror.c,
|
* handling. They are in the file pngrio.c, pngwio.c, and pngerror.c,
|
||||||
|
@ -1819,7 +1797,7 @@ PNG_EXPORT(218, png_byte, png_get_current_pass_number, (png_const_structrp));
|
||||||
*
|
*
|
||||||
* The integer return from the callback function is interpreted thus:
|
* The integer return from the callback function is interpreted thus:
|
||||||
*
|
*
|
||||||
* negative: An error occured, png_chunk_error will be called.
|
* negative: An error occurred; png_chunk_error will be called.
|
||||||
* zero: The chunk was not handled, the chunk will be saved. A critical
|
* zero: The chunk was not handled, the chunk will be saved. A critical
|
||||||
* chunk will cause an error at this point unless it is to be saved.
|
* chunk will cause an error at this point unless it is to be saved.
|
||||||
* positive: The chunk was handled, libpng will ignore/discard it.
|
* positive: The chunk was handled, libpng will ignore/discard it.
|
||||||
|
@ -2664,26 +2642,28 @@ PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type,
|
||||||
* (png_uint_16)(alpha) \
|
* (png_uint_16)(alpha) \
|
||||||
+ (png_uint_16)(bg)*(png_uint_16)(255 \
|
+ (png_uint_16)(bg)*(png_uint_16)(255 \
|
||||||
- (png_uint_16)(alpha)) + 128); \
|
- (png_uint_16)(alpha)) + 128); \
|
||||||
(composite) = (png_byte)((temp + (temp >> 8)) >> 8); }
|
(composite) = (png_byte)(((temp + (temp >> 8)) >> 8) & 0xff); }
|
||||||
|
|
||||||
# define png_composite_16(composite, fg, alpha, bg) \
|
# define png_composite_16(composite, fg, alpha, bg) \
|
||||||
{ png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) \
|
{ png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) \
|
||||||
* (png_uint_32)(alpha) \
|
* (png_uint_32)(alpha) \
|
||||||
+ (png_uint_32)(bg)*(65535 \
|
+ (png_uint_32)(bg)*(65535 \
|
||||||
- (png_uint_32)(alpha)) + 32768); \
|
- (png_uint_32)(alpha)) + 32768); \
|
||||||
(composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); }
|
(composite) = (png_uint_16)(0xffff & ((temp + (temp >> 16)) >> 16)); }
|
||||||
|
|
||||||
#else /* Standard method using integer division */
|
#else /* Standard method using integer division */
|
||||||
|
|
||||||
# define png_composite(composite, fg, alpha, bg) \
|
# define png_composite(composite, fg, alpha, bg) \
|
||||||
(composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) + \
|
(composite) = \
|
||||||
(png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \
|
(png_byte)(0xff & (((png_uint_16)(fg) * (png_uint_16)(alpha) + \
|
||||||
127) / 255)
|
(png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \
|
||||||
|
127) / 255))
|
||||||
|
|
||||||
# define png_composite_16(composite, fg, alpha, bg) \
|
# define png_composite_16(composite, fg, alpha, bg) \
|
||||||
(composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \
|
(composite) = \
|
||||||
(png_uint_32)(bg)*(png_uint_32)(65535 - (png_uint_32)(alpha)) + \
|
(png_uint_16)(0xffff & (((png_uint_32)(fg) * (png_uint_32)(alpha) + \
|
||||||
32767) / 65535)
|
(png_uint_32)(bg)*(png_uint_32)(65535 - (png_uint_32)(alpha)) + \
|
||||||
|
32767) / 65535))
|
||||||
#endif /* READ_COMPOSITE_NODIV */
|
#endif /* READ_COMPOSITE_NODIV */
|
||||||
|
|
||||||
#ifdef PNG_READ_INT_FUNCTIONS_SUPPORTED
|
#ifdef PNG_READ_INT_FUNCTIONS_SUPPORTED
|
||||||
|
@ -2773,8 +2753,9 @@ PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i));
|
||||||
*
|
*
|
||||||
* To read a PNG file using the simplified API:
|
* To read a PNG file using the simplified API:
|
||||||
*
|
*
|
||||||
* 1) Declare a 'png_image' structure (see below) on the stack and set the
|
* 1) Declare a 'png_image' structure (see below) on the stack, set the
|
||||||
* version field to PNG_IMAGE_VERSION.
|
* version field to PNG_IMAGE_VERSION and the 'opaque' pointer to NULL
|
||||||
|
* (this is REQUIRED, your program may crash if you don't do it.)
|
||||||
* 2) Call the appropriate png_image_begin_read... function.
|
* 2) Call the appropriate png_image_begin_read... function.
|
||||||
* 3) Set the png_image 'format' member to the required sample format.
|
* 3) Set the png_image 'format' member to the required sample format.
|
||||||
* 4) Allocate a buffer for the image and, if required, the color-map.
|
* 4) Allocate a buffer for the image and, if required, the color-map.
|
||||||
|
@ -3199,9 +3180,11 @@ PNG_EXPORT(240, int, png_image_write_to_stdio, (png_imagep image, FILE *file,
|
||||||
*
|
*
|
||||||
* With all APIs row_stride is handled as in the read APIs - it is the spacing
|
* With all APIs row_stride is handled as in the read APIs - it is the spacing
|
||||||
* from one row to the next in component sized units (1 or 2 bytes) and if
|
* from one row to the next in component sized units (1 or 2 bytes) and if
|
||||||
* negative indicates a bottom-up row layout in the buffer.
|
* negative indicates a bottom-up row layout in the buffer. If row_stride is zero,
|
||||||
|
* libpng will calculate it for you from the image width and number of channels.
|
||||||
*
|
*
|
||||||
* Note that the write API does not support interlacing or sub-8-bit pixels.
|
* Note that the write API does not support interlacing, sub-8-bit pixels, indexed
|
||||||
|
* PNG (color_type 3) or most ancillary chunks.
|
||||||
*/
|
*/
|
||||||
#endif /* STDIO */
|
#endif /* STDIO */
|
||||||
#endif /* SIMPLIFIED_WRITE */
|
#endif /* SIMPLIFIED_WRITE */
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
|
|
||||||
/* pngconf.h - machine configurable file for libpng
|
/* pngconf.h - machine configurable file for libpng
|
||||||
*
|
*
|
||||||
* libpng version 1.6.16,December 22, 2014
|
* libpng version 1.6.18, July 23, 2015
|
||||||
*
|
*
|
||||||
* Copyright (c) 1998-2014 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
|
@ -11,9 +11,7 @@
|
||||||
* For conditions of distribution and use, see the disclaimer
|
* For conditions of distribution and use, see the disclaimer
|
||||||
* and license in png.h
|
* and license in png.h
|
||||||
*
|
*
|
||||||
*/
|
* Any machine specific code is near the front of this file, so if you
|
||||||
|
|
||||||
/* Any machine specific code is near the front of this file, so if you
|
|
||||||
* are configuring libpng for a machine, you may want to read the section
|
* are configuring libpng for a machine, you may want to read the section
|
||||||
* starting here down to where it starts to typedef png_color, png_text,
|
* starting here down to where it starts to typedef png_color, png_text,
|
||||||
* and png_info.
|
* and png_info.
|
||||||
|
@ -22,26 +20,6 @@
|
||||||
#ifndef PNGCONF_H
|
#ifndef PNGCONF_H
|
||||||
#define PNGCONF_H
|
#define PNGCONF_H
|
||||||
|
|
||||||
/* To do: Do all of this in scripts/pnglibconf.dfa */
|
|
||||||
#ifdef PNG_SAFE_LIMITS_SUPPORTED
|
|
||||||
# ifdef PNG_USER_WIDTH_MAX
|
|
||||||
# undef PNG_USER_WIDTH_MAX
|
|
||||||
# define PNG_USER_WIDTH_MAX 1000000L
|
|
||||||
# endif
|
|
||||||
# ifdef PNG_USER_HEIGHT_MAX
|
|
||||||
# undef PNG_USER_HEIGHT_MAX
|
|
||||||
# define PNG_USER_HEIGHT_MAX 1000000L
|
|
||||||
# endif
|
|
||||||
# ifdef PNG_USER_CHUNK_MALLOC_MAX
|
|
||||||
# undef PNG_USER_CHUNK_MALLOC_MAX
|
|
||||||
# define PNG_USER_CHUNK_MALLOC_MAX 4000000L
|
|
||||||
# endif
|
|
||||||
# ifdef PNG_USER_CHUNK_CACHE_MAX
|
|
||||||
# undef PNG_USER_CHUNK_CACHE_MAX
|
|
||||||
# define PNG_USER_CHUNK_CACHE_MAX 128
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef PNG_BUILDING_SYMBOL_TABLE /* else includes may cause problems */
|
#ifndef PNG_BUILDING_SYMBOL_TABLE /* else includes may cause problems */
|
||||||
|
|
||||||
/* From libpng 1.6.0 libpng requires an ANSI X3.159-1989 ("ISOC90") compliant C
|
/* From libpng 1.6.0 libpng requires an ANSI X3.159-1989 ("ISOC90") compliant C
|
||||||
|
@ -317,11 +295,11 @@
|
||||||
* table entries, so we discard it here. See the .dfn files in the
|
* table entries, so we discard it here. See the .dfn files in the
|
||||||
* scripts directory.
|
* scripts directory.
|
||||||
*/
|
*/
|
||||||
#ifndef PNG_EXPORTA
|
|
||||||
|
|
||||||
# define PNG_EXPORTA(ordinal, type, name, args, attributes)\
|
#ifndef PNG_EXPORTA
|
||||||
PNG_FUNCTION(PNG_EXPORT_TYPE(type),(PNGAPI name),PNGARG(args), \
|
# define PNG_EXPORTA(ordinal, type, name, args, attributes) \
|
||||||
extern attributes)
|
PNG_FUNCTION(PNG_EXPORT_TYPE(type), (PNGAPI name), PNGARG(args), \
|
||||||
|
PNG_LINKAGE_API attributes)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* ANSI-C (C90) does not permit a macro to be invoked with an empty argument,
|
/* ANSI-C (C90) does not permit a macro to be invoked with an empty argument,
|
||||||
|
@ -329,7 +307,7 @@
|
||||||
*/
|
*/
|
||||||
#define PNG_EMPTY /*empty list*/
|
#define PNG_EMPTY /*empty list*/
|
||||||
|
|
||||||
#define PNG_EXPORT(ordinal, type, name, args)\
|
#define PNG_EXPORT(ordinal, type, name, args) \
|
||||||
PNG_EXPORTA(ordinal, type, name, args, PNG_EMPTY)
|
PNG_EXPORTA(ordinal, type, name, args, PNG_EMPTY)
|
||||||
|
|
||||||
/* Use PNG_REMOVED to comment out a removed interface. */
|
/* Use PNG_REMOVED to comment out a removed interface. */
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
|
|
||||||
/* pngdebug.h - Debugging macros for libpng, also used in pngtest.c
|
/* pngdebug.h - Debugging macros for libpng, also used in pngtest.c
|
||||||
*
|
*
|
||||||
|
* Last changed in libpng 1.6.8 [December 19, 2013]
|
||||||
* Copyright (c) 1998-2013 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2013 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.8 [December 19, 2013]
|
|
||||||
*
|
|
||||||
* This code is released under the libpng license.
|
* This code is released under the libpng license.
|
||||||
* For conditions of distribution and use, see the disclaimer
|
* For conditions of distribution and use, see the disclaimer
|
||||||
* and license in png.h
|
* and license in png.h
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
|
|
||||||
/* pngget.c - retrieval of values from info struct
|
/* pngget.c - retrieval of values from info struct
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.15 [November 20, 2014]
|
* Last changed in libpng 1.6.17 [March 26, 2015]
|
||||||
* Copyright (c) 1998-2014 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
|
@ -799,14 +799,20 @@ png_get_IHDR(png_const_structrp png_ptr, png_const_inforp info_ptr,
|
||||||
{
|
{
|
||||||
png_debug1(1, "in %s retrieval function", "IHDR");
|
png_debug1(1, "in %s retrieval function", "IHDR");
|
||||||
|
|
||||||
if (png_ptr == NULL || info_ptr == NULL || width == NULL ||
|
if (png_ptr == NULL || info_ptr == NULL)
|
||||||
height == NULL || bit_depth == NULL || color_type == NULL)
|
|
||||||
return (0);
|
return (0);
|
||||||
|
|
||||||
*width = info_ptr->width;
|
if (width != NULL)
|
||||||
*height = info_ptr->height;
|
*width = info_ptr->width;
|
||||||
*bit_depth = info_ptr->bit_depth;
|
|
||||||
*color_type = info_ptr->color_type;
|
if (height != NULL)
|
||||||
|
*height = info_ptr->height;
|
||||||
|
|
||||||
|
if (bit_depth != NULL)
|
||||||
|
*bit_depth = info_ptr->bit_depth;
|
||||||
|
|
||||||
|
if (color_type != NULL)
|
||||||
|
*color_type = info_ptr->color_type;
|
||||||
|
|
||||||
if (compression_type != NULL)
|
if (compression_type != NULL)
|
||||||
*compression_type = info_ptr->compression_type;
|
*compression_type = info_ptr->compression_type;
|
||||||
|
@ -1135,21 +1141,21 @@ png_get_compression_buffer_size(png_const_structrp png_ptr)
|
||||||
if (png_ptr == NULL)
|
if (png_ptr == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
# ifdef PNG_WRITE_SUPPORTED
|
#ifdef PNG_WRITE_SUPPORTED
|
||||||
if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
|
if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
|
||||||
# endif
|
#endif
|
||||||
{
|
{
|
||||||
# ifdef PNG_SEQUENTIAL_READ_SUPPORTED
|
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
|
||||||
return png_ptr->IDAT_read_size;
|
return png_ptr->IDAT_read_size;
|
||||||
# else
|
#else
|
||||||
return PNG_IDAT_READ_SIZE;
|
return PNG_IDAT_READ_SIZE;
|
||||||
# endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifdef PNG_WRITE_SUPPORTED
|
#ifdef PNG_WRITE_SUPPORTED
|
||||||
else
|
else
|
||||||
return png_ptr->zbuffer_size;
|
return png_ptr->zbuffer_size;
|
||||||
# endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
|
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
|
|
||||||
/* pnginfo.h - header file for PNG reference library
|
/* pnginfo.h - header file for PNG reference library
|
||||||
*
|
*
|
||||||
|
* Last changed in libpng 1.6.1 [March 28, 2013]
|
||||||
* Copyright (c) 1998-2013 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2013 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.1 [March 28, 2013]
|
|
||||||
*
|
|
||||||
* This code is released under the libpng license.
|
* This code is released under the libpng license.
|
||||||
* For conditions of distribution and use, see the disclaimer
|
* For conditions of distribution and use, see the disclaimer
|
||||||
* and license in png.h
|
* and license in png.h
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
/* pnglibconf.h - library build configuration */
|
/* pnglibconf.h - library build configuration */
|
||||||
|
|
||||||
/* libpng version 1.6.8 - December 19, 2013 */
|
/* libpng version 1.6.18, July 23, 2015 */
|
||||||
|
|
||||||
/* Copyright (c) 1998-2012 Glenn Randers-Pehrson */
|
/* Copyright (c) 1998-2014 Glenn Randers-Pehrson */
|
||||||
|
|
||||||
/* This code is released under the libpng license. */
|
/* This code is released under the libpng license. */
|
||||||
/* For conditions of distribution and use, see the disclaimer */
|
/* For conditions of distribution and use, see the disclaimer */
|
||||||
|
@ -95,13 +95,10 @@
|
||||||
#define PNG_READ_tIME_SUPPORTED
|
#define PNG_READ_tIME_SUPPORTED
|
||||||
#define PNG_READ_tRNS_SUPPORTED
|
#define PNG_READ_tRNS_SUPPORTED
|
||||||
#define PNG_READ_zTXt_SUPPORTED
|
#define PNG_READ_zTXt_SUPPORTED
|
||||||
/*#undef PNG_SAFE_LIMITS_SUPPORTED*/
|
|
||||||
#define PNG_SAVE_INT_32_SUPPORTED
|
#define PNG_SAVE_INT_32_SUPPORTED
|
||||||
#define PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED
|
#define PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED
|
||||||
#define PNG_SEQUENTIAL_READ_SUPPORTED
|
#define PNG_SEQUENTIAL_READ_SUPPORTED
|
||||||
#define PNG_SETJMP_SUPPORTED
|
#define PNG_SETJMP_SUPPORTED
|
||||||
#define PNG_SET_CHUNK_CACHE_LIMIT_SUPPORTED
|
|
||||||
#define PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED
|
|
||||||
#define PNG_SET_OPTION_SUPPORTED
|
#define PNG_SET_OPTION_SUPPORTED
|
||||||
#define PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
|
#define PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
|
||||||
#define PNG_SET_USER_LIMITS_SUPPORTED
|
#define PNG_SET_USER_LIMITS_SUPPORTED
|
||||||
|
@ -127,6 +124,7 @@
|
||||||
#define PNG_WRITE_BGR_SUPPORTED
|
#define PNG_WRITE_BGR_SUPPORTED
|
||||||
#define PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED
|
#define PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED
|
||||||
#define PNG_WRITE_COMPRESSED_TEXT_SUPPORTED
|
#define PNG_WRITE_COMPRESSED_TEXT_SUPPORTED
|
||||||
|
#define PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED
|
||||||
#define PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
|
#define PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
|
||||||
#define PNG_WRITE_FILLER_SUPPORTED
|
#define PNG_WRITE_FILLER_SUPPORTED
|
||||||
#define PNG_WRITE_FILTER_SUPPORTED
|
#define PNG_WRITE_FILTER_SUPPORTED
|
||||||
|
@ -185,18 +183,25 @@
|
||||||
/* end of options */
|
/* end of options */
|
||||||
/* settings */
|
/* settings */
|
||||||
#define PNG_API_RULE 0
|
#define PNG_API_RULE 0
|
||||||
#define PNG_CALLOC_SUPPORTED
|
|
||||||
#define PNG_COST_SHIFT 3
|
#define PNG_COST_SHIFT 3
|
||||||
#define PNG_DEFAULT_READ_MACROS 1
|
#define PNG_DEFAULT_READ_MACROS 1
|
||||||
#define PNG_GAMMA_THRESHOLD_FIXED 5000
|
#define PNG_GAMMA_THRESHOLD_FIXED 5000
|
||||||
#define PNG_IDAT_READ_SIZE PNG_ZBUF_SIZE
|
#define PNG_IDAT_READ_SIZE PNG_ZBUF_SIZE
|
||||||
#define PNG_INFLATE_BUF_SIZE 1024
|
#define PNG_INFLATE_BUF_SIZE 1024
|
||||||
|
#define PNG_LINKAGE_API extern
|
||||||
|
#define PNG_LINKAGE_CALLBACK extern
|
||||||
|
#define PNG_LINKAGE_DATA extern
|
||||||
|
#define PNG_LINKAGE_FUNCTION extern
|
||||||
#define PNG_MAX_GAMMA_8 11
|
#define PNG_MAX_GAMMA_8 11
|
||||||
#define PNG_QUANTIZE_BLUE_BITS 5
|
#define PNG_QUANTIZE_BLUE_BITS 5
|
||||||
#define PNG_QUANTIZE_GREEN_BITS 5
|
#define PNG_QUANTIZE_GREEN_BITS 5
|
||||||
#define PNG_QUANTIZE_RED_BITS 5
|
#define PNG_QUANTIZE_RED_BITS 5
|
||||||
#define PNG_TEXT_Z_DEFAULT_COMPRESSION (-1)
|
#define PNG_TEXT_Z_DEFAULT_COMPRESSION (-1)
|
||||||
#define PNG_TEXT_Z_DEFAULT_STRATEGY 0
|
#define PNG_TEXT_Z_DEFAULT_STRATEGY 0
|
||||||
|
#define PNG_USER_CHUNK_CACHE_MAX 1000
|
||||||
|
#define PNG_USER_CHUNK_MALLOC_MAX 8000000
|
||||||
|
#define PNG_USER_HEIGHT_MAX 1000000
|
||||||
|
#define PNG_USER_WIDTH_MAX 1000000
|
||||||
#define PNG_WEIGHT_SHIFT 8
|
#define PNG_WEIGHT_SHIFT 8
|
||||||
#define PNG_ZBUF_SIZE 8192
|
#define PNG_ZBUF_SIZE 8192
|
||||||
#define PNG_ZLIB_VERNUM 0x1280
|
#define PNG_ZLIB_VERNUM 0x1280
|
||||||
|
|
|
@ -41,7 +41,7 @@ png_destroy_png_struct(png_structrp png_ptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate memory. For reasonable files, size should never exceed
|
/* Allocate memory. For reasonable files, size should never exceed
|
||||||
* 64K. However, zlib may allocate more then 64K if you don't tell
|
* 64K. However, zlib may allocate more than 64K if you don't tell
|
||||||
* it not to. See zconf.h and png.h for more information. zlib does
|
* it not to. See zconf.h and png.h for more information. zlib does
|
||||||
* need to allocate exactly 64K, so whatever you call here must
|
* need to allocate exactly 64K, so whatever you call here must
|
||||||
* have the ability to do that.
|
* have the ability to do that.
|
||||||
|
@ -77,6 +77,9 @@ png_malloc_base,(png_const_structrp png_ptr, png_alloc_size_t size),
|
||||||
PNG_UNUSED(png_ptr)
|
PNG_UNUSED(png_ptr)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Some compilers complain that this is always true. However, it
|
||||||
|
* can be false when integer overflow happens.
|
||||||
|
*/
|
||||||
if (size > 0 && size <= PNG_SIZE_MAX
|
if (size > 0 && size <= PNG_SIZE_MAX
|
||||||
# ifdef PNG_MAX_MALLOC_64K
|
# ifdef PNG_MAX_MALLOC_64K
|
||||||
&& size <= 65536U
|
&& size <= 65536U
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
|
|
||||||
/* pngpread.c - read a png file in push mode
|
/* pngpread.c - read a png file in push mode
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.15 [November 20, 2014]
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
* Copyright (c) 1998-2014 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
|
@ -19,7 +19,6 @@
|
||||||
#define PNG_READ_SIG_MODE 0
|
#define PNG_READ_SIG_MODE 0
|
||||||
#define PNG_READ_CHUNK_MODE 1
|
#define PNG_READ_CHUNK_MODE 1
|
||||||
#define PNG_READ_IDAT_MODE 2
|
#define PNG_READ_IDAT_MODE 2
|
||||||
#define PNG_SKIP_MODE 3
|
|
||||||
#define PNG_READ_tEXt_MODE 4
|
#define PNG_READ_tEXt_MODE 4
|
||||||
#define PNG_READ_zTXt_MODE 5
|
#define PNG_READ_zTXt_MODE 5
|
||||||
#define PNG_READ_DONE_MODE 6
|
#define PNG_READ_DONE_MODE 6
|
||||||
|
@ -78,32 +77,14 @@ png_process_data_pause(png_structrp png_ptr, int save)
|
||||||
png_uint_32 PNGAPI
|
png_uint_32 PNGAPI
|
||||||
png_process_data_skip(png_structrp png_ptr)
|
png_process_data_skip(png_structrp png_ptr)
|
||||||
{
|
{
|
||||||
png_uint_32 remaining = 0;
|
/* TODO: Deprecate and remove this API.
|
||||||
|
* Somewhere the implementation of this seems to have been lost,
|
||||||
if (png_ptr != NULL && png_ptr->process_mode == PNG_SKIP_MODE &&
|
* or abandoned. It was only to support some internal back-door access
|
||||||
png_ptr->skip_length > 0)
|
* to png_struct) in libpng-1.4.x.
|
||||||
{
|
*/
|
||||||
/* At the end of png_process_data the buffer size must be 0 (see the loop
|
png_app_warning(png_ptr,
|
||||||
* above) so we can detect a broken call here:
|
"png_process_data_skip is not implemented in any current version of libpng");
|
||||||
*/
|
return 0;
|
||||||
if (png_ptr->buffer_size != 0)
|
|
||||||
png_error(png_ptr,
|
|
||||||
"png_process_data_skip called inside png_process_data");
|
|
||||||
|
|
||||||
/* If is impossible for there to be a saved buffer at this point -
|
|
||||||
* otherwise we could not be in SKIP mode. This will also happen if
|
|
||||||
* png_process_skip is called inside png_process_data (but only very
|
|
||||||
* rarely.)
|
|
||||||
*/
|
|
||||||
if (png_ptr->save_buffer_size != 0)
|
|
||||||
png_error(png_ptr, "png_process_data_skip called with saved data");
|
|
||||||
|
|
||||||
remaining = png_ptr->skip_length;
|
|
||||||
png_ptr->skip_length = 0;
|
|
||||||
png_ptr->process_mode = PNG_READ_CHUNK_MODE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return remaining;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* What we do with the incoming data depends on what we were previously
|
/* What we do with the incoming data depends on what we were previously
|
||||||
|
@ -135,12 +116,6 @@ png_process_some_data(png_structrp png_ptr, png_inforp info_ptr)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case PNG_SKIP_MODE:
|
|
||||||
{
|
|
||||||
png_push_crc_finish(png_ptr);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
png_ptr->buffer_size = 0;
|
png_ptr->buffer_size = 0;
|
||||||
|
@ -159,7 +134,7 @@ void /* PRIVATE */
|
||||||
png_push_read_sig(png_structrp png_ptr, png_inforp info_ptr)
|
png_push_read_sig(png_structrp png_ptr, png_inforp info_ptr)
|
||||||
{
|
{
|
||||||
png_size_t num_checked = png_ptr->sig_bytes, /* SAFE, does not exceed 8 */
|
png_size_t num_checked = png_ptr->sig_bytes, /* SAFE, does not exceed 8 */
|
||||||
num_to_check = 8 - num_checked;
|
num_to_check = 8 - num_checked;
|
||||||
|
|
||||||
if (png_ptr->buffer_size < num_to_check)
|
if (png_ptr->buffer_size < num_to_check)
|
||||||
{
|
{
|
||||||
|
@ -439,69 +414,6 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr)
|
||||||
png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
|
png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
|
||||||
}
|
}
|
||||||
|
|
||||||
void /* PRIVATE */
|
|
||||||
png_push_crc_skip(png_structrp png_ptr, png_uint_32 skip)
|
|
||||||
{
|
|
||||||
png_ptr->process_mode = PNG_SKIP_MODE;
|
|
||||||
png_ptr->skip_length = skip;
|
|
||||||
}
|
|
||||||
|
|
||||||
void /* PRIVATE */
|
|
||||||
png_push_crc_finish(png_structrp png_ptr)
|
|
||||||
{
|
|
||||||
if (png_ptr->skip_length != 0 && png_ptr->save_buffer_size != 0)
|
|
||||||
{
|
|
||||||
png_size_t save_size = png_ptr->save_buffer_size;
|
|
||||||
png_uint_32 skip_length = png_ptr->skip_length;
|
|
||||||
|
|
||||||
/* We want the smaller of 'skip_length' and 'save_buffer_size', but
|
|
||||||
* they are of different types and we don't know which variable has the
|
|
||||||
* fewest bits. Carefully select the smaller and cast it to the type of
|
|
||||||
* the larger - this cannot overflow. Do not cast in the following test
|
|
||||||
* - it will break on either 16 or 64 bit platforms.
|
|
||||||
*/
|
|
||||||
if (skip_length < save_size)
|
|
||||||
save_size = (png_size_t)skip_length;
|
|
||||||
|
|
||||||
else
|
|
||||||
skip_length = (png_uint_32)save_size;
|
|
||||||
|
|
||||||
png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size);
|
|
||||||
|
|
||||||
png_ptr->skip_length -= skip_length;
|
|
||||||
png_ptr->buffer_size -= save_size;
|
|
||||||
png_ptr->save_buffer_size -= save_size;
|
|
||||||
png_ptr->save_buffer_ptr += save_size;
|
|
||||||
}
|
|
||||||
if (png_ptr->skip_length != 0 && png_ptr->current_buffer_size != 0)
|
|
||||||
{
|
|
||||||
png_size_t save_size = png_ptr->current_buffer_size;
|
|
||||||
png_uint_32 skip_length = png_ptr->skip_length;
|
|
||||||
|
|
||||||
/* We want the smaller of 'skip_length' and 'current_buffer_size', here,
|
|
||||||
* the same problem exists as above and the same solution.
|
|
||||||
*/
|
|
||||||
if (skip_length < save_size)
|
|
||||||
save_size = (png_size_t)skip_length;
|
|
||||||
|
|
||||||
else
|
|
||||||
skip_length = (png_uint_32)save_size;
|
|
||||||
|
|
||||||
png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size);
|
|
||||||
|
|
||||||
png_ptr->skip_length -= skip_length;
|
|
||||||
png_ptr->buffer_size -= save_size;
|
|
||||||
png_ptr->current_buffer_size -= save_size;
|
|
||||||
png_ptr->current_buffer_ptr += save_size;
|
|
||||||
}
|
|
||||||
if (png_ptr->skip_length == 0)
|
|
||||||
{
|
|
||||||
PNG_PUSH_SAVE_BUFFER_IF_LT(4)
|
|
||||||
png_crc_finish(png_ptr, 0);
|
|
||||||
png_ptr->process_mode = PNG_READ_CHUNK_MODE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void PNGCBAPI
|
void PNGCBAPI
|
||||||
png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length)
|
png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length)
|
||||||
{
|
{
|
||||||
|
@ -584,13 +496,11 @@ png_push_save_buffer(png_structrp png_ptr)
|
||||||
if (png_ptr->save_buffer == NULL)
|
if (png_ptr->save_buffer == NULL)
|
||||||
{
|
{
|
||||||
png_free(png_ptr, old_buffer);
|
png_free(png_ptr, old_buffer);
|
||||||
old_buffer = NULL;
|
|
||||||
png_error(png_ptr, "Insufficient memory for save_buffer");
|
png_error(png_ptr, "Insufficient memory for save_buffer");
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size);
|
memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size);
|
||||||
png_free(png_ptr, old_buffer);
|
png_free(png_ptr, old_buffer);
|
||||||
old_buffer = NULL;
|
|
||||||
png_ptr->save_buffer_max = new_max;
|
png_ptr->save_buffer_max = new_max;
|
||||||
}
|
}
|
||||||
if (png_ptr->current_buffer_size)
|
if (png_ptr->current_buffer_size)
|
||||||
|
@ -696,6 +606,7 @@ png_push_read_IDAT(png_structrp png_ptr)
|
||||||
png_ptr->current_buffer_size -= save_size;
|
png_ptr->current_buffer_size -= save_size;
|
||||||
png_ptr->current_buffer_ptr += save_size;
|
png_ptr->current_buffer_ptr += save_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (png_ptr->idat_size == 0)
|
if (png_ptr->idat_size == 0)
|
||||||
{
|
{
|
||||||
PNG_PUSH_SAVE_BUFFER_IF_LT(4)
|
PNG_PUSH_SAVE_BUFFER_IF_LT(4)
|
||||||
|
@ -726,7 +637,7 @@ png_process_IDAT_data(png_structrp png_ptr, png_bytep buffer,
|
||||||
* or the stream marked as finished.
|
* or the stream marked as finished.
|
||||||
*/
|
*/
|
||||||
while (png_ptr->zstream.avail_in > 0 &&
|
while (png_ptr->zstream.avail_in > 0 &&
|
||||||
!(png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED))
|
(png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED) == 0)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -1036,6 +947,7 @@ png_push_process_row(png_structrp png_ptr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
png_push_have_row(png_ptr, png_ptr->row_buf + 1);
|
png_push_have_row(png_ptr, png_ptr->row_buf + 1);
|
||||||
png_read_push_finish_row(png_ptr);
|
png_read_push_finish_row(png_ptr);
|
||||||
|
@ -1045,6 +957,7 @@ png_push_process_row(png_structrp png_ptr)
|
||||||
void /* PRIVATE */
|
void /* PRIVATE */
|
||||||
png_read_push_finish_row(png_structrp png_ptr)
|
png_read_push_finish_row(png_structrp png_ptr)
|
||||||
{
|
{
|
||||||
|
#ifdef PNG_READ_INTERLACING_SUPPORTED
|
||||||
/* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
|
/* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
|
||||||
|
|
||||||
/* Start of interlace block */
|
/* Start of interlace block */
|
||||||
|
@ -1069,6 +982,7 @@ png_read_push_finish_row(png_structrp png_ptr)
|
||||||
if (png_ptr->row_number < png_ptr->num_rows)
|
if (png_ptr->row_number < png_ptr->num_rows)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
#ifdef PNG_READ_INTERLACING_SUPPORTED
|
||||||
if (png_ptr->interlaced != 0)
|
if (png_ptr->interlaced != 0)
|
||||||
{
|
{
|
||||||
png_ptr->row_number = 0;
|
png_ptr->row_number = 0;
|
||||||
|
@ -1103,6 +1017,7 @@ png_read_push_finish_row(png_structrp png_ptr)
|
||||||
|
|
||||||
} while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0);
|
} while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0);
|
||||||
}
|
}
|
||||||
|
#endif /* READ_INTERLACING */
|
||||||
}
|
}
|
||||||
|
|
||||||
void /* PRIVATE */
|
void /* PRIVATE */
|
||||||
|
@ -1127,6 +1042,7 @@ png_push_have_row(png_structrp png_ptr, png_bytep row)
|
||||||
(int)png_ptr->pass);
|
(int)png_ptr->pass);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef PNG_READ_INTERLACING_SUPPORTED
|
||||||
void PNGAPI
|
void PNGAPI
|
||||||
png_progressive_combine_row(png_const_structrp png_ptr, png_bytep old_row,
|
png_progressive_combine_row(png_const_structrp png_ptr, png_bytep old_row,
|
||||||
png_const_bytep new_row)
|
png_const_bytep new_row)
|
||||||
|
@ -1141,6 +1057,7 @@ png_progressive_combine_row(png_const_structrp png_ptr, png_bytep old_row,
|
||||||
if (new_row != NULL)
|
if (new_row != NULL)
|
||||||
png_combine_row(png_ptr, old_row, 1/*blocky display*/);
|
png_combine_row(png_ptr, old_row, 1/*blocky display*/);
|
||||||
}
|
}
|
||||||
|
#endif /* READ_INTERLACING */
|
||||||
|
|
||||||
void PNGAPI
|
void PNGAPI
|
||||||
png_set_progressive_read_fn(png_structrp png_ptr, png_voidp progressive_ptr,
|
png_set_progressive_read_fn(png_structrp png_ptr, png_voidp progressive_ptr,
|
||||||
|
|
|
@ -1,13 +1,11 @@
|
||||||
|
|
||||||
/* pngpriv.h - private declarations for use inside libpng
|
/* pngpriv.h - private declarations for use inside libpng
|
||||||
*
|
*
|
||||||
* For conditions of distribution and use, see copyright notice in png.h
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
* Copyright (c) 1998-2014 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.10 [March 6, 1014]]
|
|
||||||
*
|
|
||||||
* This code is released under the libpng license.
|
* This code is released under the libpng license.
|
||||||
* For conditions of distribution and use, see the disclaimer
|
* For conditions of distribution and use, see the disclaimer
|
||||||
* and license in png.h
|
* and license in png.h
|
||||||
|
@ -120,8 +118,12 @@
|
||||||
* to compile with an appropriate #error if ALIGNED_MEMORY has been turned
|
* to compile with an appropriate #error if ALIGNED_MEMORY has been turned
|
||||||
* off.
|
* off.
|
||||||
*
|
*
|
||||||
* Note that gcc-4.9 defines __ARM_NEON instead of __ARM_NEON__, so we
|
* Note that gcc-4.9 defines __ARM_NEON instead of the deprecated
|
||||||
* check both variants.
|
* __ARM_NEON__, so we check both variants.
|
||||||
|
*
|
||||||
|
* To disable ARM_NEON optimizations entirely, and skip compiling the
|
||||||
|
* associated assembler code, pass --enable-arm-neon=no to configure
|
||||||
|
* or put -DPNG_ARM_NEON_OPT=0 in CPPFLAGS.
|
||||||
*/
|
*/
|
||||||
# if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \
|
# if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \
|
||||||
defined(PNG_ALIGNED_MEMORY_SUPPORTED)
|
defined(PNG_ALIGNED_MEMORY_SUPPORTED)
|
||||||
|
@ -250,17 +252,18 @@
|
||||||
* always be used to declare an extern data or function object in this file.
|
* always be used to declare an extern data or function object in this file.
|
||||||
*/
|
*/
|
||||||
#ifndef PNG_INTERNAL_DATA
|
#ifndef PNG_INTERNAL_DATA
|
||||||
# define PNG_INTERNAL_DATA(type, name, array) extern type name array
|
# define PNG_INTERNAL_DATA(type, name, array) PNG_LINKAGE_DATA type name array
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef PNG_INTERNAL_FUNCTION
|
#ifndef PNG_INTERNAL_FUNCTION
|
||||||
# define PNG_INTERNAL_FUNCTION(type, name, args, attributes)\
|
# define PNG_INTERNAL_FUNCTION(type, name, args, attributes)\
|
||||||
extern PNG_FUNCTION(type, name, args, PNG_EMPTY attributes)
|
PNG_LINKAGE_FUNCTION PNG_FUNCTION(type, name, args, PNG_EMPTY attributes)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef PNG_INTERNAL_CALLBACK
|
#ifndef PNG_INTERNAL_CALLBACK
|
||||||
# define PNG_INTERNAL_CALLBACK(type, name, args, attributes)\
|
# define PNG_INTERNAL_CALLBACK(type, name, args, attributes)\
|
||||||
extern PNG_FUNCTION(type, (PNGCBAPI name), args, PNG_EMPTY attributes)
|
PNG_LINKAGE_CALLBACK PNG_FUNCTION(type, (PNGCBAPI name), args,\
|
||||||
|
PNG_EMPTY attributes)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* If floating or fixed point APIs are disabled they may still be compiled
|
/* If floating or fixed point APIs are disabled they may still be compiled
|
||||||
|
@ -298,48 +301,27 @@
|
||||||
# define PNG_DLL_EXPORT
|
# define PNG_DLL_EXPORT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* SECURITY and SAFETY:
|
/* This is a global switch to set the compilation for an installed system
|
||||||
|
* (a release build). It can be set for testing debug builds to ensure that
|
||||||
|
* they will compile when the build type is switched to RC or STABLE, the
|
||||||
|
* default is just to use PNG_LIBPNG_BUILD_BASE_TYPE. Set this in CPPFLAGS
|
||||||
|
* with either:
|
||||||
*
|
*
|
||||||
* By default libpng is built without any internal limits on image size,
|
* -DPNG_RELEASE_BUILD Turns on the release compile path
|
||||||
* individual heap (png_malloc) allocations or the total amount of memory used.
|
* -DPNG_RELEASE_BUILD=0 Turns it off
|
||||||
* If PNG_SAFE_LIMITS_SUPPORTED is defined, however, the limits below are used
|
* or in your pngusr.h with
|
||||||
* (unless individually overridden). These limits are believed to be fairly
|
* #define PNG_RELEASE_BUILD=1 Turns on the release compile path
|
||||||
* safe, but builders of secure systems should verify the values against the
|
* #define PNG_RELEASE_BUILD=0 Turns it off
|
||||||
* real system capabilities.
|
|
||||||
*/
|
*/
|
||||||
#ifdef PNG_SAFE_LIMITS_SUPPORTED
|
#ifndef PNG_RELEASE_BUILD
|
||||||
/* 'safe' limits */
|
# define PNG_RELEASE_BUILD (PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC)
|
||||||
# ifndef PNG_USER_WIDTH_MAX
|
|
||||||
# define PNG_USER_WIDTH_MAX 1000000
|
|
||||||
# endif
|
|
||||||
# ifndef PNG_USER_HEIGHT_MAX
|
|
||||||
# define PNG_USER_HEIGHT_MAX 1000000
|
|
||||||
# endif
|
|
||||||
# ifndef PNG_USER_CHUNK_CACHE_MAX
|
|
||||||
# define PNG_USER_CHUNK_CACHE_MAX 128
|
|
||||||
# endif
|
|
||||||
# ifndef PNG_USER_CHUNK_MALLOC_MAX
|
|
||||||
# define PNG_USER_CHUNK_MALLOC_MAX 8000000
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
/* values for no limits */
|
|
||||||
# ifndef PNG_USER_WIDTH_MAX
|
|
||||||
# define PNG_USER_WIDTH_MAX 0x7fffffff
|
|
||||||
# endif
|
|
||||||
# ifndef PNG_USER_HEIGHT_MAX
|
|
||||||
# define PNG_USER_HEIGHT_MAX 0x7fffffff
|
|
||||||
# endif
|
|
||||||
# ifndef PNG_USER_CHUNK_CACHE_MAX
|
|
||||||
# define PNG_USER_CHUNK_CACHE_MAX 0
|
|
||||||
# endif
|
|
||||||
# ifndef PNG_USER_CHUNK_MALLOC_MAX
|
|
||||||
# define PNG_USER_CHUNK_MALLOC_MAX 0
|
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Moved to pngpriv.h at libpng-1.5.0 */
|
/* SECURITY and SAFETY:
|
||||||
/* NOTE: some of these may have been used in external applications as
|
*
|
||||||
* these definitions were exposed in pngconf.h prior to 1.5.
|
* libpng is built with support for internal limits on image dimensions and
|
||||||
|
* memory usage. These are documented in scripts/pnglibconf.dfa of the
|
||||||
|
* source and recorded in the machine generated header file pnglibconf.h.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* If you are running on a machine where you cannot allocate more
|
/* If you are running on a machine where you cannot allocate more
|
||||||
|
@ -582,13 +564,13 @@
|
||||||
#define PNG_RGB_TO_GRAY_WARN 0x400000
|
#define PNG_RGB_TO_GRAY_WARN 0x400000
|
||||||
#define PNG_RGB_TO_GRAY 0x600000 /* two bits, RGB_TO_GRAY_ERR|WARN */
|
#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_ENCODE_ALPHA 0x800000 /* Added to libpng-1.5.4 */
|
||||||
#define PNG_ADD_ALPHA 0x1000000 /* Added to libpng-1.2.7 */
|
#define PNG_ADD_ALPHA 0x1000000 /* Added to libpng-1.2.7 */
|
||||||
#define PNG_EXPAND_tRNS 0x2000000 /* Added to libpng-1.2.9 */
|
#define PNG_EXPAND_tRNS 0x2000000 /* Added to libpng-1.2.9 */
|
||||||
#define PNG_SCALE_16_TO_8 0x4000000 /* Added to libpng-1.5.4 */
|
#define PNG_SCALE_16_TO_8 0x4000000 /* Added to libpng-1.5.4 */
|
||||||
/* 0x8000000 unused */
|
/* 0x8000000 unused */
|
||||||
/* 0x10000000 unused */
|
/* 0x10000000 unused */
|
||||||
/* 0x20000000 unused */
|
/* 0x20000000 unused */
|
||||||
/* 0x40000000 unused */
|
/* 0x40000000 unused */
|
||||||
/* Flags for png_create_struct */
|
/* Flags for png_create_struct */
|
||||||
#define PNG_STRUCT_PNG 0x0001
|
#define PNG_STRUCT_PNG 0x0001
|
||||||
#define PNG_STRUCT_INFO 0x0002
|
#define PNG_STRUCT_INFO 0x0002
|
||||||
|
@ -780,15 +762,17 @@
|
||||||
* macro will fail on top-bit-set values because of the sign extension.
|
* macro will fail on top-bit-set values because of the sign extension.
|
||||||
*/
|
*/
|
||||||
#define PNG_CHUNK_FROM_STRING(s)\
|
#define PNG_CHUNK_FROM_STRING(s)\
|
||||||
PNG_U32(0xff&(s)[0], 0xff&(s)[1], 0xff&(s)[2], 0xff&(s)[3])
|
PNG_U32(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
|
/* 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
|
* signed and the argument is a (char[]) This macro will fail miserably on
|
||||||
* systems where (char) is more than 8 bits.
|
* systems where (char) is more than 8 bits.
|
||||||
*/
|
*/
|
||||||
#define PNG_STRING_FROM_CHUNK(s,c)\
|
#define PNG_STRING_FROM_CHUNK(s,c)\
|
||||||
(void)(((char*)(s))[0]=(char)((c)>>24), ((char*)(s))[1]=(char)((c)>>16),\
|
(void)(((char*)(s))[0]=(char)(((c)>>24) & 0xff), \
|
||||||
((char*)(s))[2]=(char)((c)>>8), ((char*)(s))[3]=(char)((c)))
|
((char*)(s))[1]=(char)(((c)>>16) & 0xff),\
|
||||||
|
((char*)(s))[2]=(char)(((c)>>8) & 0xff), \
|
||||||
|
((char*)(s))[3]=(char)((c & 0xff)))
|
||||||
|
|
||||||
/* Do the same but terminate with a null character. */
|
/* Do the same but terminate with a null character. */
|
||||||
#define PNG_CSTRING_FROM_CHUNK(s,c)\
|
#define PNG_CSTRING_FROM_CHUNK(s,c)\
|
||||||
|
@ -850,8 +834,9 @@ PNG_INTERNAL_DATA(const png_uint_16, png_sRGB_table, [256]);
|
||||||
PNG_INTERNAL_DATA(const png_uint_16, png_sRGB_base, [512]);
|
PNG_INTERNAL_DATA(const png_uint_16, png_sRGB_base, [512]);
|
||||||
PNG_INTERNAL_DATA(const png_byte, png_sRGB_delta, [512]);
|
PNG_INTERNAL_DATA(const png_byte, png_sRGB_delta, [512]);
|
||||||
|
|
||||||
#define PNG_sRGB_FROM_LINEAR(linear) ((png_byte)((png_sRGB_base[(linear)>>15] +\
|
#define PNG_sRGB_FROM_LINEAR(linear) \
|
||||||
((((linear)&0x7fff)*png_sRGB_delta[(linear)>>15])>>12)) >> 8))
|
((png_byte)(0xff & ((png_sRGB_base[(linear)>>15] \
|
||||||
|
+ ((((linear) & 0x7fff)*png_sRGB_delta[(linear)>>15])>>12)) >> 8)))
|
||||||
/* Given a value 'linear' in the range 0..255*65535 calculate the 8-bit sRGB
|
/* Given a value 'linear' in the range 0..255*65535 calculate the 8-bit sRGB
|
||||||
* encoded value with maximum error 0.646365. Note that the input is not a
|
* encoded value with maximum error 0.646365. Note that the input is not a
|
||||||
* 16-bit value; it has been multiplied by 255! */
|
* 16-bit value; it has been multiplied by 255! */
|
||||||
|
@ -910,7 +895,7 @@ PNG_INTERNAL_FUNCTION(png_voidp,png_malloc_base,(png_const_structrp png_ptr,
|
||||||
#if defined(PNG_TEXT_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) ||\
|
#if defined(PNG_TEXT_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) ||\
|
||||||
defined(PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED)
|
defined(PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED)
|
||||||
/* Internal array allocator, outputs no error or warning messages on failure,
|
/* Internal array allocator, outputs no error or warning messages on failure,
|
||||||
* just returns NULL.
|
* just returns NULL.
|
||||||
*/
|
*/
|
||||||
PNG_INTERNAL_FUNCTION(png_voidp,png_malloc_array,(png_const_structrp png_ptr,
|
PNG_INTERNAL_FUNCTION(png_voidp,png_malloc_array,(png_const_structrp png_ptr,
|
||||||
int nelements, size_t element_size),PNG_ALLOCATED);
|
int nelements, size_t element_size),PNG_ALLOCATED);
|
||||||
|
@ -1408,10 +1393,6 @@ PNG_INTERNAL_FUNCTION(void,png_push_read_chunk,(png_structrp png_ptr,
|
||||||
PNG_INTERNAL_FUNCTION(void,png_push_read_sig,(png_structrp png_ptr,
|
PNG_INTERNAL_FUNCTION(void,png_push_read_sig,(png_structrp png_ptr,
|
||||||
png_inforp info_ptr),PNG_EMPTY);
|
png_inforp info_ptr),PNG_EMPTY);
|
||||||
PNG_INTERNAL_FUNCTION(void,png_push_check_crc,(png_structrp png_ptr),PNG_EMPTY);
|
PNG_INTERNAL_FUNCTION(void,png_push_check_crc,(png_structrp png_ptr),PNG_EMPTY);
|
||||||
PNG_INTERNAL_FUNCTION(void,png_push_crc_skip,(png_structrp png_ptr,
|
|
||||||
png_uint_32 length),PNG_EMPTY);
|
|
||||||
PNG_INTERNAL_FUNCTION(void,png_push_crc_finish,(png_structrp png_ptr),
|
|
||||||
PNG_EMPTY);
|
|
||||||
PNG_INTERNAL_FUNCTION(void,png_push_save_buffer,(png_structrp png_ptr),
|
PNG_INTERNAL_FUNCTION(void,png_push_save_buffer,(png_structrp png_ptr),
|
||||||
PNG_EMPTY);
|
PNG_EMPTY);
|
||||||
PNG_INTERNAL_FUNCTION(void,png_push_restore_buffer,(png_structrp png_ptr,
|
PNG_INTERNAL_FUNCTION(void,png_push_restore_buffer,(png_structrp png_ptr,
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
|
|
||||||
/* pngread.c - read a PNG file
|
/* pngread.c - read a PNG file
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.15 [November 20, 2014]
|
* Last changed in libpng 1.6.17 [March 26, 2015]
|
||||||
* Copyright (c) 1998-2014 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
|
@ -63,7 +63,7 @@ png_create_read_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr,
|
||||||
/* In stable builds only warn if an application error can be completely
|
/* In stable builds only warn if an application error can be completely
|
||||||
* handled.
|
* handled.
|
||||||
*/
|
*/
|
||||||
# if PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC
|
# if PNG_RELEASE_BUILD
|
||||||
png_ptr->flags |= PNG_FLAG_APP_WARNINGS_WARN;
|
png_ptr->flags |= PNG_FLAG_APP_WARNINGS_WARN;
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
|
@ -814,8 +814,7 @@ png_read_end(png_structrp png_ptr, png_inforp info_ptr)
|
||||||
/* Zero length IDATs are legal after the last IDAT has been
|
/* Zero length IDATs are legal after the last IDAT has been
|
||||||
* read, but not after other chunks have been read.
|
* read, but not after other chunks have been read.
|
||||||
*/
|
*/
|
||||||
if ((length > 0) ||
|
if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)
|
||||||
(png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)
|
|
||||||
png_benign_error(png_ptr, "Too many IDATs found");
|
png_benign_error(png_ptr, "Too many IDATs found");
|
||||||
|
|
||||||
png_crc_finish(png_ptr, length);
|
png_crc_finish(png_ptr, length);
|
||||||
|
@ -1044,9 +1043,9 @@ png_read_png(png_structrp png_ptr, png_inforp info_ptr,
|
||||||
/* Tell libpng to strip 16-bit/color files down to 8 bits per color.
|
/* Tell libpng to strip 16-bit/color files down to 8 bits per color.
|
||||||
*/
|
*/
|
||||||
if ((transforms & PNG_TRANSFORM_SCALE_16) != 0)
|
if ((transforms & PNG_TRANSFORM_SCALE_16) != 0)
|
||||||
/* Added at libpng-1.5.4. "strip_16" produces the same result that it
|
/* Added at libpng-1.5.4. "strip_16" produces the same result that it
|
||||||
* did in earlier versions, while "scale_16" is now more accurate.
|
* did in earlier versions, while "scale_16" is now more accurate.
|
||||||
*/
|
*/
|
||||||
#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
|
#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
|
||||||
png_set_scale_16(png_ptr);
|
png_set_scale_16(png_ptr);
|
||||||
#else
|
#else
|
||||||
|
@ -1210,7 +1209,7 @@ png_read_png(png_structrp png_ptr, png_inforp info_ptr,
|
||||||
|
|
||||||
for (iptr = 0; iptr < info_ptr->height; iptr++)
|
for (iptr = 0; iptr < info_ptr->height; iptr++)
|
||||||
info_ptr->row_pointers[iptr] = png_voidcast(png_bytep,
|
info_ptr->row_pointers[iptr] = png_voidcast(png_bytep,
|
||||||
png_malloc(png_ptr, info_ptr->rowbytes));
|
png_malloc(png_ptr, info_ptr->rowbytes));
|
||||||
}
|
}
|
||||||
|
|
||||||
png_read_image(png_ptr, info_ptr->row_pointers);
|
png_read_image(png_ptr, info_ptr->row_pointers);
|
||||||
|
@ -1824,6 +1823,7 @@ png_create_colormap_entry(png_image_read_control *display,
|
||||||
y = (y + 128) >> 8;
|
y = (y + 128) >> 8;
|
||||||
y *= 255;
|
y *= 255;
|
||||||
y = PNG_sRGB_FROM_LINEAR((y + 64) >> 7);
|
y = PNG_sRGB_FROM_LINEAR((y + 64) >> 7);
|
||||||
|
alpha = PNG_DIV257(alpha);
|
||||||
encoding = P_sRGB;
|
encoding = P_sRGB;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2286,8 +2286,14 @@ png_image_read_colormap(png_voidp argument)
|
||||||
output_processing = PNG_CMAP_NONE;
|
output_processing = PNG_CMAP_NONE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#ifdef __COVERITY__
|
||||||
|
/* Coverity claims that output_encoding cannot be 2 (P_LINEAR)
|
||||||
|
* here.
|
||||||
|
*/
|
||||||
|
back_alpha = 255;
|
||||||
|
#else
|
||||||
back_alpha = output_encoding == P_LINEAR ? 65535 : 255;
|
back_alpha = output_encoding == P_LINEAR ? 65535 : 255;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* output_processing means that the libpng-processed row will be
|
/* output_processing means that the libpng-processed row will be
|
||||||
|
@ -2412,7 +2418,14 @@ png_image_read_colormap(png_voidp argument)
|
||||||
*/
|
*/
|
||||||
background_index = i;
|
background_index = i;
|
||||||
png_create_colormap_entry(display, i++, back_r, back_g, back_b,
|
png_create_colormap_entry(display, i++, back_r, back_g, back_b,
|
||||||
output_encoding == P_LINEAR ? 65535U : 255U, output_encoding);
|
#ifdef __COVERITY__
|
||||||
|
/* Coverity claims that output_encoding cannot be 2 (P_LINEAR)
|
||||||
|
* here.
|
||||||
|
*/ 255U,
|
||||||
|
#else
|
||||||
|
output_encoding == P_LINEAR ? 65535U : 255U,
|
||||||
|
#endif
|
||||||
|
output_encoding);
|
||||||
|
|
||||||
/* For non-opaque input composite on the sRGB background - this
|
/* For non-opaque input composite on the sRGB background - this
|
||||||
* requires inverting the encoding for each component. The input
|
* requires inverting the encoding for each component. The input
|
||||||
|
@ -3246,7 +3259,7 @@ png_image_read_composite(png_voidp argument)
|
||||||
png_uint_32 width = image->width;
|
png_uint_32 width = image->width;
|
||||||
ptrdiff_t step_row = display->row_bytes;
|
ptrdiff_t step_row = display->row_bytes;
|
||||||
unsigned int channels =
|
unsigned int channels =
|
||||||
(image->format & PNG_FORMAT_FLAG_COLOR) != 0 ? 3 : 1;
|
(image->format & PNG_FORMAT_FLAG_COLOR) != 0 ? 3 : 1;
|
||||||
int pass;
|
int pass;
|
||||||
|
|
||||||
for (pass = 0; pass < passes; ++pass)
|
for (pass = 0; pass < passes; ++pass)
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
|
|
||||||
/* pngrio.c - functions for data input
|
/* pngrio.c - functions for data input
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.15 [November 20, 2014]
|
* Last changed in libpng 1.6.17 [March 26, 2015]
|
||||||
* Copyright (c) 1998-2014 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
|
@ -26,7 +26,7 @@
|
||||||
* reads from a file pointer. Note that this routine sometimes gets called
|
* reads from a file pointer. Note that this routine sometimes gets called
|
||||||
* with very small lengths, so you should implement some kind of simple
|
* with very small lengths, so you should implement some kind of simple
|
||||||
* buffering if you are using unbuffered reads. This should never be asked
|
* buffering if you are using unbuffered reads. This should never be asked
|
||||||
* to read more then 64K on a 16 bit machine.
|
* to read more than 64K on a 16 bit machine.
|
||||||
*/
|
*/
|
||||||
void /* PRIVATE */
|
void /* PRIVATE */
|
||||||
png_read_data(png_structrp png_ptr, png_bytep data, png_size_t length)
|
png_read_data(png_structrp png_ptr, png_bytep data, png_size_t length)
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
|
|
||||||
/* pngrtran.c - transforms the data in a row for PNG readers
|
/* pngrtran.c - transforms the data in a row for PNG readers
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.15 [November 20, 2014]
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
* Copyright (c) 1998-2014 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
|
@ -394,7 +394,7 @@ png_set_alpha_mode(png_structrp png_ptr, int mode, double output_gamma)
|
||||||
/* Dither file to 8-bit. Supply a palette, the current number
|
/* Dither file to 8-bit. Supply a palette, the current number
|
||||||
* of elements in the palette, the maximum number of elements
|
* of elements in the palette, the maximum number of elements
|
||||||
* allowed, and a histogram if possible. If the current number
|
* allowed, and a histogram if possible. If the current number
|
||||||
* of colors is greater then the maximum number, the palette will be
|
* of colors is greater than the maximum number, the palette will be
|
||||||
* modified to fit in the maximum number. "full_quantize" indicates
|
* modified to fit in the maximum number. "full_quantize" indicates
|
||||||
* whether we need a quantizing cube set up for RGB images, or if we
|
* whether we need a quantizing cube set up for RGB images, or if we
|
||||||
* simply are reducing the number of colors in a paletted image.
|
* simply are reducing the number of colors in a paletted image.
|
||||||
|
@ -2357,7 +2357,7 @@ png_do_unshift(png_row_infop row_info, png_bytep row,
|
||||||
if (++channel >= channels)
|
if (++channel >= channels)
|
||||||
channel = 0;
|
channel = 0;
|
||||||
*bp++ = (png_byte)(value >> 8);
|
*bp++ = (png_byte)(value >> 8);
|
||||||
*bp++ = (png_byte)(value & 0xff);
|
*bp++ = (png_byte)value;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2662,9 +2662,9 @@ png_do_read_filler(png_row_infop row_info, png_bytep row,
|
||||||
png_uint_32 row_width = row_info->width;
|
png_uint_32 row_width = row_info->width;
|
||||||
|
|
||||||
#ifdef PNG_READ_16BIT_SUPPORTED
|
#ifdef PNG_READ_16BIT_SUPPORTED
|
||||||
png_byte hi_filler = (png_byte)((filler>>8) & 0xff);
|
png_byte hi_filler = (png_byte)(filler>>8);
|
||||||
#endif
|
#endif
|
||||||
png_byte lo_filler = (png_byte)(filler & 0xff);
|
png_byte lo_filler = (png_byte)filler;
|
||||||
|
|
||||||
png_debug(1, "in png_do_read_filler");
|
png_debug(1, "in png_do_read_filler");
|
||||||
|
|
||||||
|
@ -2715,13 +2715,13 @@ png_do_read_filler(png_row_infop row_info, png_bytep row,
|
||||||
png_bytep dp = sp + (png_size_t)row_width * 2;
|
png_bytep dp = sp + (png_size_t)row_width * 2;
|
||||||
for (i = 1; i < row_width; i++)
|
for (i = 1; i < row_width; i++)
|
||||||
{
|
{
|
||||||
*(--dp) = hi_filler;
|
|
||||||
*(--dp) = lo_filler;
|
*(--dp) = lo_filler;
|
||||||
|
*(--dp) = hi_filler;
|
||||||
*(--dp) = *(--sp);
|
*(--dp) = *(--sp);
|
||||||
*(--dp) = *(--sp);
|
*(--dp) = *(--sp);
|
||||||
}
|
}
|
||||||
*(--dp) = hi_filler;
|
|
||||||
*(--dp) = lo_filler;
|
*(--dp) = lo_filler;
|
||||||
|
*(--dp) = hi_filler;
|
||||||
row_info->channels = 2;
|
row_info->channels = 2;
|
||||||
row_info->pixel_depth = 32;
|
row_info->pixel_depth = 32;
|
||||||
row_info->rowbytes = row_width * 4;
|
row_info->rowbytes = row_width * 4;
|
||||||
|
@ -2736,8 +2736,8 @@ png_do_read_filler(png_row_infop row_info, png_bytep row,
|
||||||
{
|
{
|
||||||
*(--dp) = *(--sp);
|
*(--dp) = *(--sp);
|
||||||
*(--dp) = *(--sp);
|
*(--dp) = *(--sp);
|
||||||
*(--dp) = hi_filler;
|
|
||||||
*(--dp) = lo_filler;
|
*(--dp) = lo_filler;
|
||||||
|
*(--dp) = hi_filler;
|
||||||
}
|
}
|
||||||
row_info->channels = 2;
|
row_info->channels = 2;
|
||||||
row_info->pixel_depth = 32;
|
row_info->pixel_depth = 32;
|
||||||
|
@ -2796,8 +2796,8 @@ png_do_read_filler(png_row_infop row_info, png_bytep row,
|
||||||
png_bytep dp = sp + (png_size_t)row_width * 2;
|
png_bytep dp = sp + (png_size_t)row_width * 2;
|
||||||
for (i = 1; i < row_width; i++)
|
for (i = 1; i < row_width; i++)
|
||||||
{
|
{
|
||||||
*(--dp) = hi_filler;
|
|
||||||
*(--dp) = lo_filler;
|
*(--dp) = lo_filler;
|
||||||
|
*(--dp) = hi_filler;
|
||||||
*(--dp) = *(--sp);
|
*(--dp) = *(--sp);
|
||||||
*(--dp) = *(--sp);
|
*(--dp) = *(--sp);
|
||||||
*(--dp) = *(--sp);
|
*(--dp) = *(--sp);
|
||||||
|
@ -2805,8 +2805,8 @@ png_do_read_filler(png_row_infop row_info, png_bytep row,
|
||||||
*(--dp) = *(--sp);
|
*(--dp) = *(--sp);
|
||||||
*(--dp) = *(--sp);
|
*(--dp) = *(--sp);
|
||||||
}
|
}
|
||||||
*(--dp) = hi_filler;
|
|
||||||
*(--dp) = lo_filler;
|
*(--dp) = lo_filler;
|
||||||
|
*(--dp) = hi_filler;
|
||||||
row_info->channels = 4;
|
row_info->channels = 4;
|
||||||
row_info->pixel_depth = 64;
|
row_info->pixel_depth = 64;
|
||||||
row_info->rowbytes = row_width * 8;
|
row_info->rowbytes = row_width * 8;
|
||||||
|
@ -2825,8 +2825,8 @@ png_do_read_filler(png_row_infop row_info, png_bytep row,
|
||||||
*(--dp) = *(--sp);
|
*(--dp) = *(--sp);
|
||||||
*(--dp) = *(--sp);
|
*(--dp) = *(--sp);
|
||||||
*(--dp) = *(--sp);
|
*(--dp) = *(--sp);
|
||||||
*(--dp) = hi_filler;
|
|
||||||
*(--dp) = lo_filler;
|
*(--dp) = lo_filler;
|
||||||
|
*(--dp) = hi_filler;
|
||||||
}
|
}
|
||||||
|
|
||||||
row_info->channels = 4;
|
row_info->channels = 4;
|
||||||
|
@ -3087,10 +3087,11 @@ png_do_rgb_to_gray(png_structrp png_ptr, png_row_infop row_info, png_bytep row)
|
||||||
for (i = 0; i < row_width; i++)
|
for (i = 0; i < row_width; i++)
|
||||||
{
|
{
|
||||||
png_uint_16 red, green, blue, w;
|
png_uint_16 red, green, blue, w;
|
||||||
|
png_byte hi,lo;
|
||||||
|
|
||||||
red = (png_uint_16)(((*(sp)) << 8) | *(sp + 1)); sp += 2;
|
hi=*(sp)++; lo=*(sp)++; red = (png_uint_16)((hi << 8) | (lo));
|
||||||
green = (png_uint_16)(((*(sp)) << 8) | *(sp + 1)); sp += 2;
|
hi=*(sp)++; lo=*(sp)++; green = (png_uint_16)((hi << 8) | (lo));
|
||||||
blue = (png_uint_16)(((*(sp)) << 8) | *(sp + 1)); sp += 2;
|
hi=*(sp)++; lo=*(sp)++; blue = (png_uint_16)((hi << 8) | (lo));
|
||||||
|
|
||||||
if (red == green && red == blue)
|
if (red == green && red == blue)
|
||||||
{
|
{
|
||||||
|
@ -3104,16 +3105,16 @@ png_do_rgb_to_gray(png_structrp png_ptr, png_row_infop row_info, png_bytep row)
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
png_uint_16 red_1 = png_ptr->gamma_16_to_1[(red&0xff)
|
png_uint_16 red_1 = png_ptr->gamma_16_to_1[(red & 0xff)
|
||||||
>> png_ptr->gamma_shift][red>>8];
|
>> png_ptr->gamma_shift][red>>8];
|
||||||
png_uint_16 green_1 =
|
png_uint_16 green_1 =
|
||||||
png_ptr->gamma_16_to_1[(green&0xff) >>
|
png_ptr->gamma_16_to_1[(green & 0xff) >>
|
||||||
png_ptr->gamma_shift][green>>8];
|
png_ptr->gamma_shift][green>>8];
|
||||||
png_uint_16 blue_1 = png_ptr->gamma_16_to_1[(blue&0xff)
|
png_uint_16 blue_1 = png_ptr->gamma_16_to_1[(blue & 0xff)
|
||||||
>> png_ptr->gamma_shift][blue>>8];
|
>> png_ptr->gamma_shift][blue>>8];
|
||||||
png_uint_16 gray16 = (png_uint_16)((rc*red_1 + gc*green_1
|
png_uint_16 gray16 = (png_uint_16)((rc*red_1 + gc*green_1
|
||||||
+ bc*blue_1 + 16384)>>15);
|
+ bc*blue_1 + 16384)>>15);
|
||||||
w = png_ptr->gamma_16_from_1[(gray16&0xff) >>
|
w = png_ptr->gamma_16_from_1[(gray16 & 0xff) >>
|
||||||
png_ptr->gamma_shift][gray16 >> 8];
|
png_ptr->gamma_shift][gray16 >> 8];
|
||||||
rgb_error |= 1;
|
rgb_error |= 1;
|
||||||
}
|
}
|
||||||
|
@ -3138,10 +3139,11 @@ png_do_rgb_to_gray(png_structrp png_ptr, png_row_infop row_info, png_bytep row)
|
||||||
for (i = 0; i < row_width; i++)
|
for (i = 0; i < row_width; i++)
|
||||||
{
|
{
|
||||||
png_uint_16 red, green, blue, gray16;
|
png_uint_16 red, green, blue, gray16;
|
||||||
|
png_byte hi,lo;
|
||||||
|
|
||||||
red = (png_uint_16)(((*(sp)) << 8) | *(sp + 1)); sp += 2;
|
hi=*(sp)++; lo=*(sp)++; red = (png_uint_16)((hi << 8) | (lo));
|
||||||
green = (png_uint_16)(((*(sp)) << 8) | *(sp + 1)); sp += 2;
|
hi=*(sp)++; lo=*(sp)++; green = (png_uint_16)((hi << 8) | (lo));
|
||||||
blue = (png_uint_16)(((*(sp)) << 8) | *(sp + 1)); sp += 2;
|
hi=*(sp)++; lo=*(sp)++; blue = (png_uint_16)((hi << 8) | (lo));
|
||||||
|
|
||||||
if (red != green || red != blue)
|
if (red != green || red != blue)
|
||||||
rgb_error |= 1;
|
rgb_error |= 1;
|
||||||
|
@ -3667,7 +3669,8 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr)
|
||||||
if (optimize != 0)
|
if (optimize != 0)
|
||||||
w = v;
|
w = v;
|
||||||
else
|
else
|
||||||
w = gamma_16_from_1[(v&0xff) >> gamma_shift][v >> 8];
|
w = gamma_16_from_1[(v & 0xff) >>
|
||||||
|
gamma_shift][v >> 8];
|
||||||
*sp = (png_byte)((w >> 8) & 0xff);
|
*sp = (png_byte)((w >> 8) & 0xff);
|
||||||
*(sp + 1) = (png_byte)(w & 0xff);
|
*(sp + 1) = (png_byte)(w & 0xff);
|
||||||
}
|
}
|
||||||
|
@ -3831,7 +3834,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr)
|
||||||
v = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp];
|
v = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp];
|
||||||
png_composite_16(w, v, a, png_ptr->background_1.red);
|
png_composite_16(w, v, a, png_ptr->background_1.red);
|
||||||
if (optimize == 0)
|
if (optimize == 0)
|
||||||
w = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >>
|
w = gamma_16_from_1[((w & 0xff) >> gamma_shift)][w >>
|
||||||
8];
|
8];
|
||||||
*sp = (png_byte)((w >> 8) & 0xff);
|
*sp = (png_byte)((w >> 8) & 0xff);
|
||||||
*(sp + 1) = (png_byte)(w & 0xff);
|
*(sp + 1) = (png_byte)(w & 0xff);
|
||||||
|
@ -3839,7 +3842,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr)
|
||||||
v = gamma_16_to_1[*(sp + 3) >> gamma_shift][*(sp + 2)];
|
v = gamma_16_to_1[*(sp + 3) >> gamma_shift][*(sp + 2)];
|
||||||
png_composite_16(w, v, a, png_ptr->background_1.green);
|
png_composite_16(w, v, a, png_ptr->background_1.green);
|
||||||
if (optimize == 0)
|
if (optimize == 0)
|
||||||
w = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >>
|
w = gamma_16_from_1[((w & 0xff) >> gamma_shift)][w >>
|
||||||
8];
|
8];
|
||||||
|
|
||||||
*(sp + 2) = (png_byte)((w >> 8) & 0xff);
|
*(sp + 2) = (png_byte)((w >> 8) & 0xff);
|
||||||
|
@ -3848,7 +3851,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr)
|
||||||
v = gamma_16_to_1[*(sp + 5) >> gamma_shift][*(sp + 4)];
|
v = gamma_16_to_1[*(sp + 5) >> gamma_shift][*(sp + 4)];
|
||||||
png_composite_16(w, v, a, png_ptr->background_1.blue);
|
png_composite_16(w, v, a, png_ptr->background_1.blue);
|
||||||
if (optimize == 0)
|
if (optimize == 0)
|
||||||
w = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >>
|
w = gamma_16_from_1[((w & 0xff) >> gamma_shift)][w >>
|
||||||
8];
|
8];
|
||||||
|
|
||||||
*(sp + 4) = (png_byte)((w >> 8) & 0xff);
|
*(sp + 4) = (png_byte)((w >> 8) & 0xff);
|
||||||
|
@ -4457,7 +4460,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,
|
||||||
|
|
||||||
for (i = 0; i < row_width; i++)
|
for (i = 0; i < row_width; i++)
|
||||||
{
|
{
|
||||||
if (*sp == gray)
|
if ((*sp & 0xffU) == gray)
|
||||||
*dp-- = 0;
|
*dp-- = 0;
|
||||||
|
|
||||||
else
|
else
|
||||||
|
@ -4475,7 +4478,8 @@ png_do_expand(png_row_infop row_info, png_bytep row,
|
||||||
dp = row + (row_info->rowbytes << 1) - 1;
|
dp = row + (row_info->rowbytes << 1) - 1;
|
||||||
for (i = 0; i < row_width; i++)
|
for (i = 0; i < row_width; i++)
|
||||||
{
|
{
|
||||||
if (*(sp - 1) == gray_high && *(sp) == gray_low)
|
if ((*(sp - 1) & 0xffU) == gray_high &&
|
||||||
|
(*(sp) & 0xffU) == gray_low)
|
||||||
{
|
{
|
||||||
*dp-- = 0;
|
*dp-- = 0;
|
||||||
*dp-- = 0;
|
*dp-- = 0;
|
||||||
|
@ -4837,7 +4841,7 @@ png_do_read_transformations(png_structrp png_ptr, png_row_infop row_info)
|
||||||
/* Because PNG_COMPOSE does the gamma transform if there is something to
|
/* Because PNG_COMPOSE does the gamma transform if there is something to
|
||||||
* do (if there is an alpha channel or transparency.)
|
* do (if there is an alpha channel or transparency.)
|
||||||
*/
|
*/
|
||||||
!((png_ptr->transformations & PNG_COMPOSE) &&
|
!((png_ptr->transformations & PNG_COMPOSE) != 0 &&
|
||||||
((png_ptr->num_trans != 0) ||
|
((png_ptr->num_trans != 0) ||
|
||||||
(png_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0)) &&
|
(png_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0)) &&
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
|
|
||||||
/* pngrutil.c - utilities to read a PNG file
|
/* pngrutil.c - utilities to read a PNG file
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.15 [November 20, 2014]
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
* Copyright (c) 1998-2014 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
|
@ -341,7 +341,7 @@ png_inflate_claim(png_structrp png_ptr, png_uint_32 owner)
|
||||||
* are minimal.
|
* are minimal.
|
||||||
*/
|
*/
|
||||||
(void)png_safecat(msg, (sizeof msg), 4, " using zstream");
|
(void)png_safecat(msg, (sizeof msg), 4, " using zstream");
|
||||||
#if PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC
|
#if PNG_RELEASE_BUILD
|
||||||
png_chunk_warning(png_ptr, msg);
|
png_chunk_warning(png_ptr, msg);
|
||||||
png_ptr->zowner = 0;
|
png_ptr->zowner = 0;
|
||||||
#else
|
#else
|
||||||
|
@ -575,7 +575,7 @@ png_decompress_chunk(png_structrp png_ptr,
|
||||||
*/
|
*/
|
||||||
png_alloc_size_t limit = PNG_SIZE_MAX;
|
png_alloc_size_t limit = PNG_SIZE_MAX;
|
||||||
|
|
||||||
# ifdef PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED
|
# ifdef PNG_SET_USER_LIMITS_SUPPORTED
|
||||||
if (png_ptr->user_chunk_malloc_max > 0 &&
|
if (png_ptr->user_chunk_malloc_max > 0 &&
|
||||||
png_ptr->user_chunk_malloc_max < limit)
|
png_ptr->user_chunk_malloc_max < limit)
|
||||||
limit = png_ptr->user_chunk_malloc_max;
|
limit = png_ptr->user_chunk_malloc_max;
|
||||||
|
@ -670,7 +670,6 @@ png_decompress_chunk(png_structrp png_ptr,
|
||||||
* success)
|
* success)
|
||||||
*/
|
*/
|
||||||
png_free(png_ptr, text);
|
png_free(png_ptr, text);
|
||||||
text = NULL;
|
|
||||||
|
|
||||||
/* This really is very benign, but it's still an error because
|
/* This really is very benign, but it's still an error because
|
||||||
* the extra space may otherwise be used as a Trojan Horse.
|
* the extra space may otherwise be used as a Trojan Horse.
|
||||||
|
@ -1147,11 +1146,13 @@ png_handle_sBIT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (i=0; i<truelen; ++i)
|
for (i=0; i<truelen; ++i)
|
||||||
|
{
|
||||||
if (buf[i] == 0 || buf[i] > sample_depth)
|
if (buf[i] == 0 || buf[i] > sample_depth)
|
||||||
{
|
{
|
||||||
png_chunk_benign_error(png_ptr, "invalid");
|
png_chunk_benign_error(png_ptr, "invalid");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)
|
if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)
|
||||||
{
|
{
|
||||||
|
@ -1462,10 +1463,10 @@ png_handle_iCCP(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
||||||
finished = 1;
|
finished = 1;
|
||||||
|
|
||||||
# ifdef PNG_sRGB_SUPPORTED
|
# ifdef PNG_sRGB_SUPPORTED
|
||||||
/* Check for a match against sRGB */
|
/* Check for a match against sRGB */
|
||||||
png_icc_set_sRGB(png_ptr,
|
png_icc_set_sRGB(png_ptr,
|
||||||
&png_ptr->colorspace, profile,
|
&png_ptr->colorspace, profile,
|
||||||
png_ptr->zstream.adler);
|
png_ptr->zstream.adler);
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
/* Steal the profile for info_ptr. */
|
/* Steal the profile for info_ptr. */
|
||||||
|
@ -1515,8 +1516,10 @@ png_handle_iCCP(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
||||||
else if (size > 0)
|
else if (size > 0)
|
||||||
errmsg = "truncated";
|
errmsg = "truncated";
|
||||||
|
|
||||||
|
#ifndef __COVERITY__
|
||||||
else
|
else
|
||||||
errmsg = png_ptr->zstream.msg;
|
errmsg = png_ptr->zstream.msg;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* else png_icc_check_tag_table output an error */
|
/* else png_icc_check_tag_table output an error */
|
||||||
|
@ -1673,8 +1676,8 @@ png_handle_sPLT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
||||||
|
|
||||||
if (dl > max_dl)
|
if (dl > max_dl)
|
||||||
{
|
{
|
||||||
png_warning(png_ptr, "sPLT chunk too long");
|
png_warning(png_ptr, "sPLT chunk too long");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
new_palette.nentries = (png_int_32)(data_length / entry_size);
|
new_palette.nentries = (png_int_32)(data_length / entry_size);
|
||||||
|
@ -1684,8 +1687,8 @@ png_handle_sPLT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
||||||
|
|
||||||
if (new_palette.entries == NULL)
|
if (new_palette.entries == NULL)
|
||||||
{
|
{
|
||||||
png_warning(png_ptr, "sPLT chunk requires too much memory");
|
png_warning(png_ptr, "sPLT chunk requires too much memory");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef PNG_POINTER_INDEXING_SUPPORTED
|
#ifdef PNG_POINTER_INDEXING_SUPPORTED
|
||||||
|
@ -1815,7 +1818,8 @@ png_handle_tRNS(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (length > png_ptr->num_palette || length > PNG_MAX_PALETTE_LENGTH ||
|
if (length > png_ptr->num_palette ||
|
||||||
|
length > (unsigned int) PNG_MAX_PALETTE_LENGTH ||
|
||||||
length == 0)
|
length == 0)
|
||||||
{
|
{
|
||||||
png_crc_finish(png_ptr, length);
|
png_crc_finish(png_ptr, length);
|
||||||
|
@ -1978,7 +1982,7 @@ png_handle_hIST(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
||||||
|
|
||||||
num = length / 2 ;
|
num = length / 2 ;
|
||||||
|
|
||||||
if (num != png_ptr->num_palette || num > PNG_MAX_PALETTE_LENGTH)
|
if (num != png_ptr->num_palette || num > (unsigned int) PNG_MAX_PALETTE_LENGTH)
|
||||||
{
|
{
|
||||||
png_crc_finish(png_ptr, length);
|
png_crc_finish(png_ptr, length);
|
||||||
png_chunk_benign_error(png_ptr, "invalid");
|
png_chunk_benign_error(png_ptr, "invalid");
|
||||||
|
@ -2713,14 +2717,14 @@ png_cache_unknown_chunk(png_structrp png_ptr, png_uint_32 length)
|
||||||
png_ptr->unknown_chunk.data = NULL;
|
png_ptr->unknown_chunk.data = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifdef PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED
|
# ifdef PNG_SET_USER_LIMITS_SUPPORTED
|
||||||
if (png_ptr->user_chunk_malloc_max > 0 &&
|
if (png_ptr->user_chunk_malloc_max > 0 &&
|
||||||
png_ptr->user_chunk_malloc_max < limit)
|
png_ptr->user_chunk_malloc_max < limit)
|
||||||
limit = png_ptr->user_chunk_malloc_max;
|
limit = png_ptr->user_chunk_malloc_max;
|
||||||
|
|
||||||
# elif PNG_USER_CHUNK_MALLOC_MAX > 0
|
# elif PNG_USER_CHUNK_MALLOC_MAX > 0
|
||||||
if (PNG_USER_CHUNK_MALLOC_MAX < limit)
|
if (PNG_USER_CHUNK_MALLOC_MAX < limit)
|
||||||
limit = PNG_USER_CHUNK_MALLOC_MAX;
|
limit = PNG_USER_CHUNK_MALLOC_MAX;
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
if (length <= limit)
|
if (length <= limit)
|
||||||
|
@ -2783,7 +2787,7 @@ png_handle_unknown(png_structrp png_ptr, png_inforp info_ptr,
|
||||||
*/
|
*/
|
||||||
# ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
|
# ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
|
||||||
# ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
|
# ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
|
||||||
keep = png_chunk_unknown_handling(png_ptr, png_ptr->chunk_name);
|
keep = png_chunk_unknown_handling(png_ptr, png_ptr->chunk_name);
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
@ -2792,153 +2796,153 @@ png_handle_unknown(png_structrp png_ptr, png_inforp info_ptr,
|
||||||
* PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
|
* PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
|
||||||
*/
|
*/
|
||||||
# ifdef PNG_READ_USER_CHUNKS_SUPPORTED
|
# ifdef PNG_READ_USER_CHUNKS_SUPPORTED
|
||||||
/* The user callback takes precedence over the chunk keep value, but the
|
/* The user callback takes precedence over the chunk keep value, but the
|
||||||
* keep value is still required to validate a save of a critical chunk.
|
* keep value is still required to validate a save of a critical chunk.
|
||||||
*/
|
*/
|
||||||
if (png_ptr->read_user_chunk_fn != NULL)
|
if (png_ptr->read_user_chunk_fn != NULL)
|
||||||
|
{
|
||||||
|
if (png_cache_unknown_chunk(png_ptr, length) != 0)
|
||||||
{
|
{
|
||||||
if (png_cache_unknown_chunk(png_ptr, length) != 0)
|
/* Callback to user unknown chunk handler */
|
||||||
|
int ret = (*(png_ptr->read_user_chunk_fn))(png_ptr,
|
||||||
|
&png_ptr->unknown_chunk);
|
||||||
|
|
||||||
|
/* ret is:
|
||||||
|
* negative: An error occurred; png_chunk_error will be called.
|
||||||
|
* zero: The chunk was not handled, the chunk will be discarded
|
||||||
|
* unless png_set_keep_unknown_chunks has been used to set
|
||||||
|
* a 'keep' behavior for this particular chunk, in which
|
||||||
|
* case that will be used. A critical chunk will cause an
|
||||||
|
* error at this point unless it is to be saved.
|
||||||
|
* positive: The chunk was handled, libpng will ignore/discard it.
|
||||||
|
*/
|
||||||
|
if (ret < 0)
|
||||||
|
png_chunk_error(png_ptr, "error in user chunk");
|
||||||
|
|
||||||
|
else if (ret == 0)
|
||||||
{
|
{
|
||||||
/* Callback to user unknown chunk handler */
|
/* If the keep value is 'default' or 'never' override it, but
|
||||||
int ret = (*(png_ptr->read_user_chunk_fn))(png_ptr,
|
* still error out on critical chunks unless the keep value is
|
||||||
&png_ptr->unknown_chunk);
|
* 'always' While this is weird it is the behavior in 1.4.12.
|
||||||
|
* A possible improvement would be to obey the value set for the
|
||||||
/* ret is:
|
* chunk, but this would be an API change that would probably
|
||||||
* negative: An error occured, png_chunk_error will be called.
|
* damage some applications.
|
||||||
* zero: The chunk was not handled, the chunk will be discarded
|
*
|
||||||
* unless png_set_keep_unknown_chunks has been used to set
|
* The png_app_warning below catches the case that matters, where
|
||||||
* a 'keep' behavior for this particular chunk, in which
|
* the application has not set specific save or ignore for this
|
||||||
* case that will be used. A critical chunk will cause an
|
* chunk or global save or ignore.
|
||||||
* error at this point unless it is to be saved.
|
|
||||||
* positive: The chunk was handled, libpng will ignore/discard it.
|
|
||||||
*/
|
*/
|
||||||
if (ret < 0)
|
if (keep < PNG_HANDLE_CHUNK_IF_SAFE)
|
||||||
png_chunk_error(png_ptr, "error in user chunk");
|
|
||||||
|
|
||||||
else if (ret == 0)
|
|
||||||
{
|
{
|
||||||
/* If the keep value is 'default' or 'never' override it, but
|
# ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
|
||||||
* still error out on critical chunks unless the keep value is
|
if (png_ptr->unknown_default < PNG_HANDLE_CHUNK_IF_SAFE)
|
||||||
* 'always' While this is weird it is the behavior in 1.4.12.
|
|
||||||
* A possible improvement would be to obey the value set for the
|
|
||||||
* chunk, but this would be an API change that would probably
|
|
||||||
* damage some applications.
|
|
||||||
*
|
|
||||||
* The png_app_warning below catches the case that matters, where
|
|
||||||
* the application has not set specific save or ignore for this
|
|
||||||
* chunk or global save or ignore.
|
|
||||||
*/
|
|
||||||
if (keep < PNG_HANDLE_CHUNK_IF_SAFE)
|
|
||||||
{
|
{
|
||||||
# ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
|
png_chunk_warning(png_ptr, "Saving unknown chunk:");
|
||||||
if (png_ptr->unknown_default < PNG_HANDLE_CHUNK_IF_SAFE)
|
png_app_warning(png_ptr,
|
||||||
{
|
"forcing save of an unhandled chunk;"
|
||||||
png_chunk_warning(png_ptr, "Saving unknown chunk:");
|
" please call png_set_keep_unknown_chunks");
|
||||||
png_app_warning(png_ptr,
|
/* with keep = PNG_HANDLE_CHUNK_IF_SAFE */
|
||||||
"forcing save of an unhandled chunk;"
|
|
||||||
" please call png_set_keep_unknown_chunks");
|
|
||||||
/* with keep = PNG_HANDLE_CHUNK_IF_SAFE */
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
keep = PNG_HANDLE_CHUNK_IF_SAFE;
|
|
||||||
}
|
}
|
||||||
}
|
# endif
|
||||||
|
keep = PNG_HANDLE_CHUNK_IF_SAFE;
|
||||||
else /* chunk was handled */
|
|
||||||
{
|
|
||||||
handled = 1;
|
|
||||||
/* Critical chunks can be safely discarded at this point. */
|
|
||||||
keep = PNG_HANDLE_CHUNK_NEVER;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else /* chunk was handled */
|
||||||
keep = PNG_HANDLE_CHUNK_NEVER; /* insufficient memory */
|
{
|
||||||
|
handled = 1;
|
||||||
|
/* Critical chunks can be safely discarded at this point. */
|
||||||
|
keep = PNG_HANDLE_CHUNK_NEVER;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
/* Use the SAVE_UNKNOWN_CHUNKS code or skip the chunk */
|
keep = PNG_HANDLE_CHUNK_NEVER; /* insufficient memory */
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
/* Use the SAVE_UNKNOWN_CHUNKS code or skip the chunk */
|
||||||
# endif /* READ_USER_CHUNKS */
|
# endif /* READ_USER_CHUNKS */
|
||||||
|
|
||||||
# ifdef PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED
|
# ifdef PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED
|
||||||
|
{
|
||||||
|
/* keep is currently just the per-chunk setting, if there was no
|
||||||
|
* setting change it to the global default now (not that this may
|
||||||
|
* still be AS_DEFAULT) then obtain the cache of the chunk if required,
|
||||||
|
* if not simply skip the chunk.
|
||||||
|
*/
|
||||||
|
if (keep == PNG_HANDLE_CHUNK_AS_DEFAULT)
|
||||||
|
keep = png_ptr->unknown_default;
|
||||||
|
|
||||||
|
if (keep == PNG_HANDLE_CHUNK_ALWAYS ||
|
||||||
|
(keep == PNG_HANDLE_CHUNK_IF_SAFE &&
|
||||||
|
PNG_CHUNK_ANCILLARY(png_ptr->chunk_name)))
|
||||||
{
|
{
|
||||||
/* keep is currently just the per-chunk setting, if there was no
|
if (png_cache_unknown_chunk(png_ptr, length) == 0)
|
||||||
* setting change it to the global default now (not that this may
|
keep = PNG_HANDLE_CHUNK_NEVER;
|
||||||
* still be AS_DEFAULT) then obtain the cache of the chunk if required,
|
|
||||||
* if not simply skip the chunk.
|
|
||||||
*/
|
|
||||||
if (keep == PNG_HANDLE_CHUNK_AS_DEFAULT)
|
|
||||||
keep = png_ptr->unknown_default;
|
|
||||||
|
|
||||||
if (keep == PNG_HANDLE_CHUNK_ALWAYS ||
|
|
||||||
(keep == PNG_HANDLE_CHUNK_IF_SAFE &&
|
|
||||||
PNG_CHUNK_ANCILLARY(png_ptr->chunk_name)))
|
|
||||||
{
|
|
||||||
if (png_cache_unknown_chunk(png_ptr, length) == 0)
|
|
||||||
keep = PNG_HANDLE_CHUNK_NEVER;
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
png_crc_finish(png_ptr, length);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
png_crc_finish(png_ptr, length);
|
||||||
|
}
|
||||||
# else
|
# else
|
||||||
# ifndef PNG_READ_USER_CHUNKS_SUPPORTED
|
# ifndef PNG_READ_USER_CHUNKS_SUPPORTED
|
||||||
# error no method to support READ_UNKNOWN_CHUNKS
|
# error no method to support READ_UNKNOWN_CHUNKS
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
{
|
{
|
||||||
/* If here there is no read callback pointer set and no support is
|
/* If here there is no read callback pointer set and no support is
|
||||||
* compiled in to just save the unknown chunks, so simply skip this
|
* compiled in to just save the unknown chunks, so simply skip this
|
||||||
* chunk. If 'keep' is something other than AS_DEFAULT or NEVER then
|
* chunk. If 'keep' is something other than AS_DEFAULT or NEVER then
|
||||||
* the app has erroneously asked for unknown chunk saving when there
|
* the app has erroneously asked for unknown chunk saving when there
|
||||||
* is no support.
|
* is no support.
|
||||||
*/
|
*/
|
||||||
if (keep > PNG_HANDLE_CHUNK_NEVER)
|
if (keep > PNG_HANDLE_CHUNK_NEVER)
|
||||||
png_app_error(png_ptr, "no unknown chunk support available");
|
png_app_error(png_ptr, "no unknown chunk support available");
|
||||||
|
|
||||||
png_crc_finish(png_ptr, length);
|
png_crc_finish(png_ptr, length);
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
|
# ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
|
||||||
/* Now store the chunk in the chunk list if appropriate, and if the limits
|
/* Now store the chunk in the chunk list if appropriate, and if the limits
|
||||||
* permit it.
|
* permit it.
|
||||||
*/
|
*/
|
||||||
if (keep == PNG_HANDLE_CHUNK_ALWAYS ||
|
if (keep == PNG_HANDLE_CHUNK_ALWAYS ||
|
||||||
(keep == PNG_HANDLE_CHUNK_IF_SAFE &&
|
(keep == PNG_HANDLE_CHUNK_IF_SAFE &&
|
||||||
PNG_CHUNK_ANCILLARY(png_ptr->chunk_name)))
|
PNG_CHUNK_ANCILLARY(png_ptr->chunk_name)))
|
||||||
|
{
|
||||||
|
# ifdef PNG_USER_LIMITS_SUPPORTED
|
||||||
|
switch (png_ptr->user_chunk_cache_max)
|
||||||
{
|
{
|
||||||
# ifdef PNG_USER_LIMITS_SUPPORTED
|
case 2:
|
||||||
switch (png_ptr->user_chunk_cache_max)
|
png_ptr->user_chunk_cache_max = 1;
|
||||||
{
|
png_chunk_benign_error(png_ptr, "no space in chunk cache");
|
||||||
case 2:
|
/* FALL THROUGH */
|
||||||
png_ptr->user_chunk_cache_max = 1;
|
case 1:
|
||||||
png_chunk_benign_error(png_ptr, "no space in chunk cache");
|
/* NOTE: prior to 1.6.0 this case resulted in an unknown critical
|
||||||
/* FALL THROUGH */
|
* chunk being skipped, now there will be a hard error below.
|
||||||
case 1:
|
*/
|
||||||
/* NOTE: prior to 1.6.0 this case resulted in an unknown critical
|
break;
|
||||||
* chunk being skipped, now there will be a hard error below.
|
|
||||||
*/
|
|
||||||
break;
|
|
||||||
|
|
||||||
default: /* not at limit */
|
default: /* not at limit */
|
||||||
--(png_ptr->user_chunk_cache_max);
|
--(png_ptr->user_chunk_cache_max);
|
||||||
/* FALL THROUGH */
|
/* FALL THROUGH */
|
||||||
case 0: /* no limit */
|
case 0: /* no limit */
|
||||||
# endif /* USER_LIMITS */
|
# endif /* USER_LIMITS */
|
||||||
/* Here when the limit isn't reached or when limits are compiled
|
/* Here when the limit isn't reached or when limits are compiled
|
||||||
* out; store the chunk.
|
* out; store the chunk.
|
||||||
*/
|
*/
|
||||||
png_set_unknown_chunks(png_ptr, info_ptr,
|
png_set_unknown_chunks(png_ptr, info_ptr,
|
||||||
&png_ptr->unknown_chunk, 1);
|
&png_ptr->unknown_chunk, 1);
|
||||||
handled = 1;
|
handled = 1;
|
||||||
# ifdef PNG_USER_LIMITS_SUPPORTED
|
# ifdef PNG_USER_LIMITS_SUPPORTED
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
# endif
|
|
||||||
}
|
}
|
||||||
|
# endif
|
||||||
|
}
|
||||||
# else /* no store support: the chunk must be handled by the user callback */
|
# else /* no store support: the chunk must be handled by the user callback */
|
||||||
PNG_UNUSED(info_ptr)
|
PNG_UNUSED(info_ptr)
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
/* Regardless of the error handling below the cached data (if any) can be
|
/* Regardless of the error handling below the cached data (if any) can be
|
||||||
|
@ -3040,13 +3044,13 @@ png_combine_row(png_const_structrp png_ptr, png_bytep dp, int display)
|
||||||
end_ptr = dp + PNG_ROWBYTES(pixel_depth, row_width) - 1;
|
end_ptr = dp + PNG_ROWBYTES(pixel_depth, row_width) - 1;
|
||||||
end_byte = *end_ptr;
|
end_byte = *end_ptr;
|
||||||
# ifdef PNG_READ_PACKSWAP_SUPPORTED
|
# ifdef PNG_READ_PACKSWAP_SUPPORTED
|
||||||
if ((png_ptr->transformations & PNG_PACKSWAP) != 0)
|
if ((png_ptr->transformations & PNG_PACKSWAP) != 0)
|
||||||
/* little-endian byte */
|
/* little-endian byte */
|
||||||
end_mask = 0xff << end_mask;
|
end_mask = 0xff << end_mask;
|
||||||
|
|
||||||
else /* big-endian byte */
|
else /* big-endian byte */
|
||||||
# endif
|
# endif
|
||||||
end_mask = 0xff >> end_mask;
|
end_mask = 0xff >> end_mask;
|
||||||
/* end_mask is now the bits to *keep* from the destination row */
|
/* end_mask is now the bits to *keep* from the destination row */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3204,12 +3208,12 @@ png_combine_row(png_const_structrp png_ptr, png_bytep dp, int display)
|
||||||
png_uint_32 mask;
|
png_uint_32 mask;
|
||||||
|
|
||||||
# ifdef PNG_READ_PACKSWAP_SUPPORTED
|
# ifdef PNG_READ_PACKSWAP_SUPPORTED
|
||||||
if ((png_ptr->transformations & PNG_PACKSWAP) != 0)
|
if ((png_ptr->transformations & PNG_PACKSWAP) != 0)
|
||||||
mask = MASK(pass, pixel_depth, display, 0);
|
mask = MASK(pass, pixel_depth, display, 0);
|
||||||
|
|
||||||
else
|
else
|
||||||
# endif
|
# endif
|
||||||
mask = MASK(pass, pixel_depth, display, 1);
|
mask = MASK(pass, pixel_depth, display, 1);
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
|
@ -3810,15 +3814,15 @@ png_read_filter_row_paeth_1byte_pixel(png_row_infop row_info, png_bytep row,
|
||||||
p = b - c;
|
p = b - c;
|
||||||
pc = a - c;
|
pc = a - c;
|
||||||
|
|
||||||
# ifdef PNG_USE_ABS
|
#ifdef PNG_USE_ABS
|
||||||
pa = abs(p);
|
pa = abs(p);
|
||||||
pb = abs(pc);
|
pb = abs(pc);
|
||||||
pc = abs(p + pc);
|
pc = abs(p + pc);
|
||||||
# else
|
#else
|
||||||
pa = p < 0 ? -p : p;
|
pa = p < 0 ? -p : p;
|
||||||
pb = pc < 0 ? -pc : pc;
|
pb = pc < 0 ? -pc : pc;
|
||||||
pc = (p + pc) < 0 ? -(p + pc) : p + pc;
|
pc = (p + pc) < 0 ? -(p + pc) : p + pc;
|
||||||
# endif
|
#endif
|
||||||
|
|
||||||
/* Find the best predictor, the least of pa, pb, pc favoring the earlier
|
/* Find the best predictor, the least of pa, pb, pc favoring the earlier
|
||||||
* ones in the case of a tie.
|
* ones in the case of a tie.
|
||||||
|
@ -3865,15 +3869,15 @@ png_read_filter_row_paeth_multibyte_pixel(png_row_infop row_info, png_bytep row,
|
||||||
p = b - c;
|
p = b - c;
|
||||||
pc = a - c;
|
pc = a - c;
|
||||||
|
|
||||||
# ifdef PNG_USE_ABS
|
#ifdef PNG_USE_ABS
|
||||||
pa = abs(p);
|
pa = abs(p);
|
||||||
pb = abs(pc);
|
pb = abs(pc);
|
||||||
pc = abs(p + pc);
|
pc = abs(p + pc);
|
||||||
# else
|
#else
|
||||||
pa = p < 0 ? -p : p;
|
pa = p < 0 ? -p : p;
|
||||||
pb = pc < 0 ? -pc : pc;
|
pb = pc < 0 ? -pc : pc;
|
||||||
pc = (p + pc) < 0 ? -(p + pc) : p + pc;
|
pc = (p + pc) < 0 ? -(p + pc) : p + pc;
|
||||||
# endif
|
#endif
|
||||||
|
|
||||||
if (pb < pa) pa = pb, a = b;
|
if (pb < pa) pa = pb, a = b;
|
||||||
if (pc < pa) a = c;
|
if (pc < pa) a = c;
|
||||||
|
@ -4278,18 +4282,18 @@ png_read_start_row(png_structrp png_ptr)
|
||||||
#ifdef PNG_READ_EXPAND_16_SUPPORTED
|
#ifdef PNG_READ_EXPAND_16_SUPPORTED
|
||||||
if ((png_ptr->transformations & PNG_EXPAND_16) != 0)
|
if ((png_ptr->transformations & PNG_EXPAND_16) != 0)
|
||||||
{
|
{
|
||||||
# ifdef PNG_READ_EXPAND_SUPPORTED
|
# ifdef PNG_READ_EXPAND_SUPPORTED
|
||||||
/* In fact it is an error if it isn't supported, but checking is
|
/* In fact it is an error if it isn't supported, but checking is
|
||||||
* the safe way.
|
* the safe way.
|
||||||
*/
|
*/
|
||||||
if ((png_ptr->transformations & PNG_EXPAND) != 0)
|
if ((png_ptr->transformations & PNG_EXPAND) != 0)
|
||||||
{
|
{
|
||||||
if (png_ptr->bit_depth < 16)
|
if (png_ptr->bit_depth < 16)
|
||||||
max_pixel_depth *= 2;
|
max_pixel_depth *= 2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
# endif
|
# endif
|
||||||
png_ptr->transformations &= ~PNG_EXPAND_16;
|
png_ptr->transformations &= ~PNG_EXPAND_16;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
|
|
||||||
/* pngset.c - storage of image information into info struct
|
/* pngset.c - storage of image information into info struct
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.15 [November 20, 2014]
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
* Copyright (c) 1998-2014 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
|
@ -190,6 +190,7 @@ png_set_hIST(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||||
if (info_ptr->hist == NULL)
|
if (info_ptr->hist == NULL)
|
||||||
{
|
{
|
||||||
png_warning(png_ptr, "Insufficient memory for hIST chunk data");
|
png_warning(png_ptr, "Insufficient memory for hIST chunk data");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -271,7 +272,7 @@ png_set_pCAL(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||||
png_debug1(1, "in %s storage function", "pCAL");
|
png_debug1(1, "in %s storage function", "pCAL");
|
||||||
|
|
||||||
if (png_ptr == NULL || info_ptr == NULL || purpose == NULL || units == NULL
|
if (png_ptr == NULL || info_ptr == NULL || purpose == NULL || units == NULL
|
||||||
|| (nparams > 0 && params == NULL))
|
|| (nparams > 0 && params == NULL))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
length = strlen(purpose) + 1;
|
length = strlen(purpose) + 1;
|
||||||
|
@ -301,6 +302,7 @@ png_set_pCAL(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||||
if (info_ptr->pcal_purpose == NULL)
|
if (info_ptr->pcal_purpose == NULL)
|
||||||
{
|
{
|
||||||
png_warning(png_ptr, "Insufficient memory for pCAL purpose");
|
png_warning(png_ptr, "Insufficient memory for pCAL purpose");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -322,6 +324,7 @@ png_set_pCAL(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||||
if (info_ptr->pcal_units == NULL)
|
if (info_ptr->pcal_units == NULL)
|
||||||
{
|
{
|
||||||
png_warning(png_ptr, "Insufficient memory for pCAL units");
|
png_warning(png_ptr, "Insufficient memory for pCAL units");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -333,6 +336,7 @@ png_set_pCAL(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||||
if (info_ptr->pcal_params == NULL)
|
if (info_ptr->pcal_params == NULL)
|
||||||
{
|
{
|
||||||
png_warning(png_ptr, "Insufficient memory for pCAL params");
|
png_warning(png_ptr, "Insufficient memory for pCAL params");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -349,6 +353,7 @@ png_set_pCAL(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||||
if (info_ptr->pcal_params[i] == NULL)
|
if (info_ptr->pcal_params[i] == NULL)
|
||||||
{
|
{
|
||||||
png_warning(png_ptr, "Insufficient memory for pCAL parameter");
|
png_warning(png_ptr, "Insufficient memory for pCAL parameter");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -398,6 +403,7 @@ png_set_sCAL_s(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||||
if (info_ptr->scal_s_width == NULL)
|
if (info_ptr->scal_s_width == NULL)
|
||||||
{
|
{
|
||||||
png_warning(png_ptr, "Memory allocation failed while processing sCAL");
|
png_warning(png_ptr, "Memory allocation failed while processing sCAL");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -416,6 +422,7 @@ png_set_sCAL_s(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||||
info_ptr->scal_s_width = NULL;
|
info_ptr->scal_s_width = NULL;
|
||||||
|
|
||||||
png_warning(png_ptr, "Memory allocation failed while processing sCAL");
|
png_warning(png_ptr, "Memory allocation failed while processing sCAL");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -519,6 +526,7 @@ png_set_PLTE(png_structrp png_ptr, png_inforp info_ptr,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
png_warning(png_ptr, "Invalid palette length");
|
png_warning(png_ptr, "Invalid palette length");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -531,7 +539,6 @@ png_set_PLTE(png_structrp png_ptr, png_inforp info_ptr,
|
||||||
))
|
))
|
||||||
{
|
{
|
||||||
png_error(png_ptr, "Invalid palette");
|
png_error(png_ptr, "Invalid palette");
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* It may not actually be necessary to set png_ptr->palette here;
|
/* It may not actually be necessary to set png_ptr->palette here;
|
||||||
|
@ -655,6 +662,7 @@ png_set_iCCP(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||||
if (new_iccp_name == NULL)
|
if (new_iccp_name == NULL)
|
||||||
{
|
{
|
||||||
png_benign_error(png_ptr, "Insufficient memory to process iCCP chunk");
|
png_benign_error(png_ptr, "Insufficient memory to process iCCP chunk");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -665,9 +673,9 @@ png_set_iCCP(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||||
if (new_iccp_profile == NULL)
|
if (new_iccp_profile == NULL)
|
||||||
{
|
{
|
||||||
png_free(png_ptr, new_iccp_name);
|
png_free(png_ptr, new_iccp_name);
|
||||||
new_iccp_name = NULL;
|
|
||||||
png_benign_error(png_ptr,
|
png_benign_error(png_ptr,
|
||||||
"Insufficient memory to process iCCP profile");
|
"Insufficient memory to process iCCP profile");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -701,7 +709,7 @@ png_set_text_2(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
png_debug1(1, "in %lx storage function", png_ptr == NULL ? "unexpected" :
|
png_debug1(1, "in %lx storage function", png_ptr == NULL ? 0xabadca11 :
|
||||||
(unsigned long)png_ptr->chunk_name);
|
(unsigned long)png_ptr->chunk_name);
|
||||||
|
|
||||||
if (png_ptr == NULL || info_ptr == NULL || num_text <= 0 || text_ptr == NULL)
|
if (png_ptr == NULL || info_ptr == NULL || num_text <= 0 || text_ptr == NULL)
|
||||||
|
@ -743,6 +751,7 @@ png_set_text_2(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||||
{
|
{
|
||||||
png_chunk_report(png_ptr, "too many text chunks",
|
png_chunk_report(png_ptr, "too many text chunks",
|
||||||
PNG_CHUNK_WRITE_ERROR);
|
PNG_CHUNK_WRITE_ERROR);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -798,7 +807,7 @@ png_set_text_2(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||||
else
|
else
|
||||||
lang_key_len = 0;
|
lang_key_len = 0;
|
||||||
}
|
}
|
||||||
# else /* PNG_iTXt_SUPPORTED */
|
# else /* iTXt */
|
||||||
{
|
{
|
||||||
png_chunk_report(png_ptr, "iTXt chunk not supported",
|
png_chunk_report(png_ptr, "iTXt chunk not supported",
|
||||||
PNG_CHUNK_WRITE_ERROR);
|
PNG_CHUNK_WRITE_ERROR);
|
||||||
|
@ -831,6 +840,7 @@ png_set_text_2(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||||
{
|
{
|
||||||
png_chunk_report(png_ptr, "text chunk: out of memory",
|
png_chunk_report(png_ptr, "text chunk: out of memory",
|
||||||
PNG_CHUNK_WRITE_ERROR);
|
PNG_CHUNK_WRITE_ERROR);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -904,6 +914,7 @@ png_set_tIME(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||||
mod_time->second > 60)
|
mod_time->second > 60)
|
||||||
{
|
{
|
||||||
png_warning(png_ptr, "Ignoring invalid time value");
|
png_warning(png_ptr, "Ignoring invalid time value");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -920,6 +931,7 @@ png_set_tRNS(png_structrp png_ptr, png_inforp info_ptr,
|
||||||
png_debug1(1, "in %s storage function", "tRNS");
|
png_debug1(1, "in %s storage function", "tRNS");
|
||||||
|
|
||||||
if (png_ptr == NULL || info_ptr == NULL)
|
if (png_ptr == NULL || info_ptr == NULL)
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (trans_alpha != NULL)
|
if (trans_alpha != NULL)
|
||||||
|
@ -945,16 +957,21 @@ png_set_tRNS(png_structrp png_ptr, png_inforp info_ptr,
|
||||||
|
|
||||||
if (trans_color != NULL)
|
if (trans_color != NULL)
|
||||||
{
|
{
|
||||||
int sample_max = (1 << info_ptr->bit_depth);
|
#ifdef PNG_WARNINGS_SUPPORTED
|
||||||
|
if (info_ptr->bit_depth < 16)
|
||||||
|
{
|
||||||
|
int sample_max = (1 << info_ptr->bit_depth) - 1;
|
||||||
|
|
||||||
if ((info_ptr->color_type == PNG_COLOR_TYPE_GRAY &&
|
if ((info_ptr->color_type == PNG_COLOR_TYPE_GRAY &&
|
||||||
trans_color->gray > sample_max) ||
|
trans_color->gray > sample_max) ||
|
||||||
(info_ptr->color_type == PNG_COLOR_TYPE_RGB &&
|
(info_ptr->color_type == PNG_COLOR_TYPE_RGB &&
|
||||||
(trans_color->red > sample_max ||
|
(trans_color->red > sample_max ||
|
||||||
trans_color->green > sample_max ||
|
trans_color->green > sample_max ||
|
||||||
trans_color->blue > sample_max)))
|
trans_color->blue > sample_max)))
|
||||||
png_warning(png_ptr,
|
png_warning(png_ptr,
|
||||||
"tRNS chunk has out-of-range samples for bit_depth");
|
"tRNS chunk has out-of-range samples for bit_depth");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
info_ptr->trans_color = *trans_color;
|
info_ptr->trans_color = *trans_color;
|
||||||
|
|
||||||
|
@ -1001,6 +1018,7 @@ png_set_sPLT(png_const_structrp png_ptr,
|
||||||
{
|
{
|
||||||
/* Out of memory or too many chunks */
|
/* Out of memory or too many chunks */
|
||||||
png_chunk_report(png_ptr, "too many sPLT chunks", PNG_CHUNK_WRITE_ERROR);
|
png_chunk_report(png_ptr, "too many sPLT chunks", PNG_CHUNK_WRITE_ERROR);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1116,7 +1134,7 @@ png_set_unknown_chunks(png_const_structrp png_ptr,
|
||||||
png_unknown_chunkp np;
|
png_unknown_chunkp np;
|
||||||
|
|
||||||
if (png_ptr == NULL || info_ptr == NULL || num_unknowns <= 0 ||
|
if (png_ptr == NULL || info_ptr == NULL || num_unknowns <= 0 ||
|
||||||
unknowns == NULL)
|
unknowns == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Check for the failure cases where support has been disabled at compile
|
/* Check for the failure cases where support has been disabled at compile
|
||||||
|
@ -1130,6 +1148,7 @@ png_set_unknown_chunks(png_const_structrp png_ptr,
|
||||||
if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
|
if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
|
||||||
{
|
{
|
||||||
png_app_error(png_ptr, "no unknown chunk support on read");
|
png_app_error(png_ptr, "no unknown chunk support on read");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
@ -1138,6 +1157,7 @@ png_set_unknown_chunks(png_const_structrp png_ptr,
|
||||||
if ((png_ptr->mode & PNG_IS_READ_STRUCT) == 0)
|
if ((png_ptr->mode & PNG_IS_READ_STRUCT) == 0)
|
||||||
{
|
{
|
||||||
png_app_error(png_ptr, "no unknown chunk support on write");
|
png_app_error(png_ptr, "no unknown chunk support on write");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
@ -1155,6 +1175,7 @@ png_set_unknown_chunks(png_const_structrp png_ptr,
|
||||||
{
|
{
|
||||||
png_chunk_report(png_ptr, "too many unknown chunks",
|
png_chunk_report(png_ptr, "too many unknown chunks",
|
||||||
PNG_CHUNK_WRITE_ERROR);
|
PNG_CHUNK_WRITE_ERROR);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1232,8 +1253,7 @@ png_set_unknown_chunk_location(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||||
check_location(png_ptr, location);
|
check_location(png_ptr, location);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* STORE_UNKNOWN_CHUNKS */
|
||||||
|
|
||||||
|
|
||||||
#ifdef PNG_MNG_FEATURES_SUPPORTED
|
#ifdef PNG_MNG_FEATURES_SUPPORTED
|
||||||
png_uint_32 PNGAPI
|
png_uint_32 PNGAPI
|
||||||
|
@ -1264,6 +1284,7 @@ add_one_chunk(png_bytep list, unsigned int count, png_const_bytep add, int keep)
|
||||||
if (memcmp(list, add, 4) == 0)
|
if (memcmp(list, add, 4) == 0)
|
||||||
{
|
{
|
||||||
list[4] = (png_byte)keep;
|
list[4] = (png_byte)keep;
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1291,6 +1312,7 @@ png_set_keep_unknown_chunks(png_structrp png_ptr, int keep,
|
||||||
if (keep < 0 || keep >= PNG_HANDLE_CHUNK_LAST)
|
if (keep < 0 || keep >= PNG_HANDLE_CHUNK_LAST)
|
||||||
{
|
{
|
||||||
png_app_error(png_ptr, "png_set_keep_unknown_chunks: invalid keep");
|
png_app_error(png_ptr, "png_set_keep_unknown_chunks: invalid keep");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1340,6 +1362,7 @@ png_set_keep_unknown_chunks(png_structrp png_ptr, int keep,
|
||||||
* which can be switched off.
|
* which can be switched off.
|
||||||
*/
|
*/
|
||||||
png_app_error(png_ptr, "png_set_keep_unknown_chunks: no chunk list");
|
png_app_error(png_ptr, "png_set_keep_unknown_chunks: no chunk list");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1355,6 +1378,7 @@ png_set_keep_unknown_chunks(png_structrp png_ptr, int keep,
|
||||||
if (num_chunks + old_num_chunks > UINT_MAX/5)
|
if (num_chunks + old_num_chunks > UINT_MAX/5)
|
||||||
{
|
{
|
||||||
png_app_error(png_ptr, "png_set_keep_unknown_chunks: too many chunks");
|
png_app_error(png_ptr, "png_set_keep_unknown_chunks: too many chunks");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1492,23 +1516,30 @@ png_set_compression_buffer_size(png_structrp png_ptr, png_size_t size)
|
||||||
{
|
{
|
||||||
png_warning(png_ptr,
|
png_warning(png_ptr,
|
||||||
"Compression buffer size cannot be changed because it is in use");
|
"Compression buffer size cannot be changed because it is in use");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef __COVERITY__
|
||||||
|
/* Some compilers complain that this is always false. However, it
|
||||||
|
* can be true when integer overflow happens.
|
||||||
|
*/
|
||||||
if (size > ZLIB_IO_MAX)
|
if (size > ZLIB_IO_MAX)
|
||||||
{
|
{
|
||||||
png_warning(png_ptr,
|
png_warning(png_ptr,
|
||||||
"Compression buffer size limited to system maximum");
|
"Compression buffer size limited to system maximum");
|
||||||
size = ZLIB_IO_MAX; /* must fit */
|
size = ZLIB_IO_MAX; /* must fit */
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
else if (size < 6)
|
if (size < 6)
|
||||||
{
|
{
|
||||||
/* Deflate will potentially go into an infinite loop on a SYNC_FLUSH
|
/* Deflate will potentially go into an infinite loop on a SYNC_FLUSH
|
||||||
* if this is permitted.
|
* if this is permitted.
|
||||||
*/
|
*/
|
||||||
png_warning(png_ptr,
|
png_warning(png_ptr,
|
||||||
"Compression buffer size cannot be reduced below 6");
|
"Compression buffer size cannot be reduced below 6");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1550,8 +1581,8 @@ png_set_user_limits (png_structrp png_ptr, png_uint_32 user_width_max,
|
||||||
void PNGAPI
|
void PNGAPI
|
||||||
png_set_chunk_cache_max (png_structrp png_ptr, png_uint_32 user_chunk_cache_max)
|
png_set_chunk_cache_max (png_structrp png_ptr, png_uint_32 user_chunk_cache_max)
|
||||||
{
|
{
|
||||||
if (png_ptr != NULL)
|
if (png_ptr != NULL)
|
||||||
png_ptr->user_chunk_cache_max = user_chunk_cache_max;
|
png_ptr->user_chunk_cache_max = user_chunk_cache_max;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This function was added to libpng 1.4.1 */
|
/* This function was added to libpng 1.4.1 */
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
|
|
||||||
/* pngstruct.h - header file for PNG reference library
|
/* pngstruct.h - header file for PNG reference library
|
||||||
*
|
*
|
||||||
* Copyright (c) 1998-2013 Glenn Randers-Pehrson
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.1 [March 28, 2013]
|
|
||||||
*
|
|
||||||
* This code is released under the libpng license.
|
* This code is released under the libpng license.
|
||||||
* For conditions of distribution and use, see the disclaimer
|
* For conditions of distribution and use, see the disclaimer
|
||||||
* and license in png.h
|
* and license in png.h
|
||||||
|
@ -101,7 +100,7 @@ typedef struct png_XYZ
|
||||||
#endif /* COLORSPACE */
|
#endif /* COLORSPACE */
|
||||||
|
|
||||||
#if defined(PNG_COLORSPACE_SUPPORTED) || defined(PNG_GAMMA_SUPPORTED)
|
#if defined(PNG_COLORSPACE_SUPPORTED) || defined(PNG_GAMMA_SUPPORTED)
|
||||||
/* A colorspace is all the above plus, potentially, profile information,
|
/* A colorspace is all the above plus, potentially, profile information;
|
||||||
* however at present libpng does not use the profile internally so it is only
|
* however at present libpng does not use the profile internally so it is only
|
||||||
* stored in the png_info struct (if iCCP is supported.) The rendering intent
|
* stored in the png_info struct (if iCCP is supported.) The rendering intent
|
||||||
* is retained here and is checked.
|
* is retained here and is checked.
|
||||||
|
@ -220,16 +219,18 @@ struct png_struct_def
|
||||||
png_uint_32 row_number; /* current row in interlace pass */
|
png_uint_32 row_number; /* current row in interlace pass */
|
||||||
png_uint_32 chunk_name; /* PNG_CHUNK() id of current chunk */
|
png_uint_32 chunk_name; /* PNG_CHUNK() id of current chunk */
|
||||||
png_bytep prev_row; /* buffer to save previous (unfiltered) row.
|
png_bytep prev_row; /* buffer to save previous (unfiltered) row.
|
||||||
* This is a pointer into big_prev_row
|
* While reading this is a pointer into
|
||||||
|
* big_prev_row; while writing it is separately
|
||||||
|
* allocated if needed.
|
||||||
*/
|
*/
|
||||||
png_bytep row_buf; /* buffer to save current (unfiltered) row.
|
png_bytep row_buf; /* buffer to save current (unfiltered) row.
|
||||||
* This is a pointer into big_row_buf
|
* While reading, this is a pointer into
|
||||||
|
* big_row_buf; while writing it is separately
|
||||||
|
* allocated.
|
||||||
*/
|
*/
|
||||||
#ifdef PNG_WRITE_SUPPORTED
|
#ifdef PNG_WRITE_FILTER_SUPPORTED
|
||||||
png_bytep sub_row; /* buffer to save "sub" row when filtering */
|
png_bytep try_row; /* buffer to save trial row when filtering */
|
||||||
png_bytep up_row; /* buffer to save "up" row when filtering */
|
png_bytep tst_row; /* buffer to save best trial row when filtering */
|
||||||
png_bytep avg_row; /* buffer to save "avg" row when filtering */
|
|
||||||
png_bytep paeth_row; /* buffer to save "Paeth" row when filtering */
|
|
||||||
#endif
|
#endif
|
||||||
png_size_t info_rowbytes; /* Added in 1.5.4: cache of updated row bytes */
|
png_size_t info_rowbytes; /* Added in 1.5.4: cache of updated row bytes */
|
||||||
|
|
||||||
|
@ -347,17 +348,7 @@ struct png_struct_def
|
||||||
png_bytep quantize_index; /* index translation for palette files */
|
png_bytep quantize_index; /* index translation for palette files */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
|
/* Options */
|
||||||
png_byte heuristic_method; /* heuristic for row filter selection */
|
|
||||||
png_byte num_prev_filters; /* number of weights for previous rows */
|
|
||||||
png_bytep prev_filters; /* filter type(s) of previous row(s) */
|
|
||||||
png_uint_16p filter_weights; /* weight(s) for previous line(s) */
|
|
||||||
png_uint_16p inv_filter_weights; /* 1/weight(s) for previous line(s) */
|
|
||||||
png_uint_16p filter_costs; /* relative filter calculation cost */
|
|
||||||
png_uint_16p inv_filter_costs; /* 1/relative filter calculation cost */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Options */
|
|
||||||
#ifdef PNG_SET_OPTION_SUPPORTED
|
#ifdef PNG_SET_OPTION_SUPPORTED
|
||||||
png_byte options; /* On/off state (up to 4 options) */
|
png_byte options; /* On/off state (up to 4 options) */
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
|
|
||||||
/* pngtrans.c - transforms the data in a row (used by both readers and writers)
|
/* pngtrans.c - transforms the data in a row (used by both readers and writers)
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.15 [November 20, 2014]
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
* Copyright (c) 1998-2014 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
|
@ -704,7 +704,7 @@ png_do_check_palette_indexes(png_structrp png_ptr, png_row_infop row_info)
|
||||||
*/
|
*/
|
||||||
for (; rp > png_ptr->row_buf; rp--)
|
for (; rp > png_ptr->row_buf; rp--)
|
||||||
{
|
{
|
||||||
if (*rp >> padding != 0)
|
if ((*rp >> padding) != 0)
|
||||||
png_ptr->num_palette_max = 1;
|
png_ptr->num_palette_max = 1;
|
||||||
padding = 0;
|
padding = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
|
|
||||||
/* pngwrite.c - general routines to write a PNG file
|
/* pngwrite.c - general routines to write a PNG file
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.15 [November 20, 2014]
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
* Copyright (c) 1998-2014 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
|
@ -90,43 +90,44 @@ png_write_info_before_PLTE(png_structrp png_ptr, png_const_inforp info_ptr)
|
||||||
|
|
||||||
if ((png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE) == 0)
|
if ((png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE) == 0)
|
||||||
{
|
{
|
||||||
/* Write PNG signature */
|
/* Write PNG signature */
|
||||||
png_write_sig(png_ptr);
|
png_write_sig(png_ptr);
|
||||||
|
|
||||||
#ifdef PNG_MNG_FEATURES_SUPPORTED
|
#ifdef PNG_MNG_FEATURES_SUPPORTED
|
||||||
if ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) != 0 && \
|
if ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) != 0 && \
|
||||||
png_ptr->mng_features_permitted != 0)
|
png_ptr->mng_features_permitted != 0)
|
||||||
{
|
{
|
||||||
png_warning(png_ptr, "MNG features are not allowed in a PNG datastream");
|
png_warning(png_ptr,
|
||||||
png_ptr->mng_features_permitted = 0;
|
"MNG features are not allowed in a PNG datastream");
|
||||||
}
|
png_ptr->mng_features_permitted = 0;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Write IHDR information. */
|
/* Write IHDR information. */
|
||||||
png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height,
|
png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height,
|
||||||
info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type,
|
info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type,
|
||||||
info_ptr->filter_type,
|
info_ptr->filter_type,
|
||||||
#ifdef PNG_WRITE_INTERLACING_SUPPORTED
|
#ifdef PNG_WRITE_INTERLACING_SUPPORTED
|
||||||
info_ptr->interlace_type
|
info_ptr->interlace_type
|
||||||
#else
|
#else
|
||||||
0
|
0
|
||||||
#endif
|
#endif
|
||||||
);
|
);
|
||||||
|
|
||||||
/* The rest of these check to see if the valid field has the appropriate
|
/* The rest of these check to see if the valid field has the appropriate
|
||||||
* flag set, and if it does, writes the chunk.
|
* flag set, and if it does, writes the chunk.
|
||||||
*
|
*
|
||||||
* 1.6.0: COLORSPACE support controls the writing of these chunks too, and
|
* 1.6.0: COLORSPACE support controls the writing of these chunks too, and
|
||||||
* the chunks will be written if the WRITE routine is there and information
|
* the chunks will be written if the WRITE routine is there and
|
||||||
* is available in the COLORSPACE. (See png_colorspace_sync_info in png.c
|
* information * is available in the COLORSPACE. (See
|
||||||
* for where the valid flags get set.)
|
* png_colorspace_sync_info in png.c for where the valid flags get set.)
|
||||||
*
|
*
|
||||||
* Under certain circumstances the colorspace can be invalidated without
|
* Under certain circumstances the colorspace can be invalidated without
|
||||||
* syncing the info_struct 'valid' flags; this happens if libpng detects and
|
* syncing the info_struct 'valid' flags; this happens if libpng detects
|
||||||
* error and calls png_error while the color space is being set, yet the
|
* an error and calls png_error while the color space is being set, yet
|
||||||
* application continues writing the PNG. So check the 'invalid' flag here
|
* the application continues writing the PNG. So check the 'invalid'
|
||||||
* too.
|
* flag here too.
|
||||||
*/
|
*/
|
||||||
#ifdef PNG_GAMMA_SUPPORTED
|
#ifdef PNG_GAMMA_SUPPORTED
|
||||||
# ifdef PNG_WRITE_gAMA_SUPPORTED
|
# ifdef PNG_WRITE_gAMA_SUPPORTED
|
||||||
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
|
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
|
||||||
|
@ -137,50 +138,50 @@ png_write_info_before_PLTE(png_structrp png_ptr, png_const_inforp info_ptr)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PNG_COLORSPACE_SUPPORTED
|
#ifdef PNG_COLORSPACE_SUPPORTED
|
||||||
/* Write only one of sRGB or an ICC profile. If a profile was supplied
|
/* Write only one of sRGB or an ICC profile. If a profile was supplied
|
||||||
* and it matches one of the known sRGB ones issue a warning.
|
* and it matches one of the known sRGB ones issue a warning.
|
||||||
*/
|
*/
|
||||||
# ifdef PNG_WRITE_iCCP_SUPPORTED
|
# ifdef PNG_WRITE_iCCP_SUPPORTED
|
||||||
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
|
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
|
||||||
(info_ptr->valid & PNG_INFO_iCCP) != 0)
|
(info_ptr->valid & PNG_INFO_iCCP) != 0)
|
||||||
{
|
{
|
||||||
# ifdef PNG_WRITE_sRGB_SUPPORTED
|
# ifdef PNG_WRITE_sRGB_SUPPORTED
|
||||||
if ((info_ptr->valid & PNG_INFO_sRGB) != 0)
|
if ((info_ptr->valid & PNG_INFO_sRGB) != 0)
|
||||||
png_app_warning(png_ptr,
|
png_app_warning(png_ptr,
|
||||||
"profile matches sRGB but writing iCCP instead");
|
"profile matches sRGB but writing iCCP instead");
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
png_write_iCCP(png_ptr, info_ptr->iccp_name,
|
png_write_iCCP(png_ptr, info_ptr->iccp_name,
|
||||||
info_ptr->iccp_profile);
|
info_ptr->iccp_profile);
|
||||||
}
|
}
|
||||||
# ifdef PNG_WRITE_sRGB_SUPPORTED
|
# ifdef PNG_WRITE_sRGB_SUPPORTED
|
||||||
else
|
else
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# ifdef PNG_WRITE_sRGB_SUPPORTED
|
# ifdef PNG_WRITE_sRGB_SUPPORTED
|
||||||
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
|
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
|
||||||
(info_ptr->valid & PNG_INFO_sRGB) != 0)
|
(info_ptr->valid & PNG_INFO_sRGB) != 0)
|
||||||
png_write_sRGB(png_ptr, info_ptr->colorspace.rendering_intent);
|
png_write_sRGB(png_ptr, info_ptr->colorspace.rendering_intent);
|
||||||
# endif /* WRITE_sRGB */
|
# endif /* WRITE_sRGB */
|
||||||
#endif /* COLORSPACE */
|
#endif /* COLORSPACE */
|
||||||
|
|
||||||
#ifdef PNG_WRITE_sBIT_SUPPORTED
|
#ifdef PNG_WRITE_sBIT_SUPPORTED
|
||||||
if ((info_ptr->valid & PNG_INFO_sBIT) != 0)
|
if ((info_ptr->valid & PNG_INFO_sBIT) != 0)
|
||||||
png_write_sBIT(png_ptr, &(info_ptr->sig_bit), info_ptr->color_type);
|
png_write_sBIT(png_ptr, &(info_ptr->sig_bit), info_ptr->color_type);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PNG_COLORSPACE_SUPPORTED
|
#ifdef PNG_COLORSPACE_SUPPORTED
|
||||||
# ifdef PNG_WRITE_cHRM_SUPPORTED
|
# ifdef PNG_WRITE_cHRM_SUPPORTED
|
||||||
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
|
if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
|
||||||
(info_ptr->colorspace.flags & PNG_COLORSPACE_FROM_cHRM) != 0 &&
|
(info_ptr->colorspace.flags & PNG_COLORSPACE_FROM_cHRM) != 0 &&
|
||||||
(info_ptr->valid & PNG_INFO_cHRM) != 0)
|
(info_ptr->valid & PNG_INFO_cHRM) != 0)
|
||||||
png_write_cHRM_fixed(png_ptr, &info_ptr->colorspace.end_points_xy);
|
png_write_cHRM_fixed(png_ptr, &info_ptr->colorspace.end_points_xy);
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
|
#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
|
||||||
write_unknown_chunks(png_ptr, info_ptr, PNG_HAVE_IHDR);
|
write_unknown_chunks(png_ptr, info_ptr, PNG_HAVE_IHDR);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE;
|
png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE;
|
||||||
|
@ -216,8 +217,13 @@ png_write_info(png_structrp png_ptr, png_const_inforp info_ptr)
|
||||||
if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0 &&
|
if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0 &&
|
||||||
info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
|
info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
|
||||||
{
|
{
|
||||||
int j;
|
int j, jend;
|
||||||
for (j = 0; j<(int)info_ptr->num_trans; j++)
|
|
||||||
|
jend = info_ptr->num_trans;
|
||||||
|
if (jend > PNG_MAX_PALETTE_LENGTH)
|
||||||
|
jend = PNG_MAX_PALETTE_LENGTH;
|
||||||
|
|
||||||
|
for (j = 0; j<jend; ++j)
|
||||||
info_ptr->trans_alpha[j] =
|
info_ptr->trans_alpha[j] =
|
||||||
(png_byte)(255 - info_ptr->trans_alpha[j]);
|
(png_byte)(255 - info_ptr->trans_alpha[j]);
|
||||||
}
|
}
|
||||||
|
@ -538,7 +544,7 @@ png_create_write_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr,
|
||||||
/* App warnings are warnings in release (or release candidate) builds but
|
/* App warnings are warnings in release (or release candidate) builds but
|
||||||
* are errors during development.
|
* are errors during development.
|
||||||
*/
|
*/
|
||||||
#if PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC
|
#if PNG_RELEASE_BUILD
|
||||||
png_ptr->flags |= PNG_FLAG_APP_WARNINGS_WARN;
|
png_ptr->flags |= PNG_FLAG_APP_WARNINGS_WARN;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -638,8 +644,8 @@ png_do_write_intrapixel(png_row_infop row_info, png_bytep row)
|
||||||
|
|
||||||
for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
|
for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
|
||||||
{
|
{
|
||||||
*(rp) = (png_byte)((*rp - *(rp + 1)) & 0xff);
|
*(rp) = (png_byte)(*rp - *(rp + 1));
|
||||||
*(rp + 2) = (png_byte)((*(rp + 2) - *(rp + 1)) & 0xff);
|
*(rp + 2) = (png_byte)(*(rp + 2) - *(rp + 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -665,10 +671,10 @@ png_do_write_intrapixel(png_row_infop row_info, png_bytep row)
|
||||||
png_uint_32 s2 = (*(rp + 4) << 8) | *(rp + 5);
|
png_uint_32 s2 = (*(rp + 4) << 8) | *(rp + 5);
|
||||||
png_uint_32 red = (png_uint_32)((s0 - s1) & 0xffffL);
|
png_uint_32 red = (png_uint_32)((s0 - s1) & 0xffffL);
|
||||||
png_uint_32 blue = (png_uint_32)((s2 - s1) & 0xffffL);
|
png_uint_32 blue = (png_uint_32)((s2 - s1) & 0xffffL);
|
||||||
*(rp ) = (png_byte)((red >> 8) & 0xff);
|
*(rp ) = (png_byte)(red >> 8);
|
||||||
*(rp + 1) = (png_byte)(red & 0xff);
|
*(rp + 1) = (png_byte)red;
|
||||||
*(rp + 4) = (png_byte)((blue >> 8) & 0xff);
|
*(rp + 4) = (png_byte)(blue >> 8);
|
||||||
*(rp + 5) = (png_byte)(blue & 0xff);
|
*(rp + 5) = (png_byte)blue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* WRITE_16BIT */
|
#endif /* WRITE_16BIT */
|
||||||
|
@ -849,7 +855,7 @@ png_write_row(png_structrp png_ptr, png_const_bytep row)
|
||||||
* which is also the output depth.
|
* which is also the output depth.
|
||||||
*/
|
*/
|
||||||
if (row_info.pixel_depth != png_ptr->pixel_depth ||
|
if (row_info.pixel_depth != png_ptr->pixel_depth ||
|
||||||
row_info.pixel_depth != png_ptr->transformed_pixel_depth)
|
row_info.pixel_depth != png_ptr->transformed_pixel_depth)
|
||||||
png_error(png_ptr, "internal write transform logic error");
|
png_error(png_ptr, "internal write transform logic error");
|
||||||
|
|
||||||
#ifdef PNG_MNG_FEATURES_SUPPORTED
|
#ifdef PNG_MNG_FEATURES_SUPPORTED
|
||||||
|
@ -917,10 +923,6 @@ png_write_flush(png_structrp png_ptr)
|
||||||
}
|
}
|
||||||
#endif /* WRITE_FLUSH */
|
#endif /* WRITE_FLUSH */
|
||||||
|
|
||||||
#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
|
|
||||||
static void png_reset_filter_heuristics(png_structrp png_ptr);/* forward decl */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Free any memory used in png_ptr struct without freeing the struct itself. */
|
/* Free any memory used in png_ptr struct without freeing the struct itself. */
|
||||||
static void
|
static void
|
||||||
png_write_destroy(png_structrp png_ptr)
|
png_write_destroy(png_structrp png_ptr)
|
||||||
|
@ -937,24 +939,11 @@ png_write_destroy(png_structrp png_ptr)
|
||||||
png_ptr->row_buf = NULL;
|
png_ptr->row_buf = NULL;
|
||||||
#ifdef PNG_WRITE_FILTER_SUPPORTED
|
#ifdef PNG_WRITE_FILTER_SUPPORTED
|
||||||
png_free(png_ptr, png_ptr->prev_row);
|
png_free(png_ptr, png_ptr->prev_row);
|
||||||
png_free(png_ptr, png_ptr->sub_row);
|
png_free(png_ptr, png_ptr->try_row);
|
||||||
png_free(png_ptr, png_ptr->up_row);
|
png_free(png_ptr, png_ptr->tst_row);
|
||||||
png_free(png_ptr, png_ptr->avg_row);
|
|
||||||
png_free(png_ptr, png_ptr->paeth_row);
|
|
||||||
png_ptr->prev_row = NULL;
|
png_ptr->prev_row = NULL;
|
||||||
png_ptr->sub_row = NULL;
|
png_ptr->try_row = NULL;
|
||||||
png_ptr->up_row = NULL;
|
png_ptr->tst_row = NULL;
|
||||||
png_ptr->avg_row = NULL;
|
|
||||||
png_ptr->paeth_row = NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
|
|
||||||
/* Use this to save a little code space, it doesn't free the filter_costs */
|
|
||||||
png_reset_filter_heuristics(png_ptr);
|
|
||||||
png_free(png_ptr, png_ptr->filter_costs);
|
|
||||||
png_free(png_ptr, png_ptr->inv_filter_costs);
|
|
||||||
png_ptr->filter_costs = NULL;
|
|
||||||
png_ptr->inv_filter_costs = NULL;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
|
#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
|
||||||
|
@ -1044,211 +1033,85 @@ png_set_filter(png_structrp png_ptr, int method, int filters)
|
||||||
#endif /* WRITE_FILTER */
|
#endif /* WRITE_FILTER */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef PNG_WRITE_FILTER_SUPPORTED
|
||||||
/* If we have allocated the row_buf, this means we have already started
|
/* If we have allocated the row_buf, this means we have already started
|
||||||
* with the image and we should have allocated all of the filter buffers
|
* with the image and we should have allocated all of the filter buffers
|
||||||
* that have been selected. If prev_row isn't already allocated, then
|
* that have been selected. If prev_row isn't already allocated, then
|
||||||
* it is too late to start using the filters that need it, since we
|
* it is too late to start using the filters that need it, since we
|
||||||
* will be missing the data in the previous row. If an application
|
* will be missing the data in the previous row. If an application
|
||||||
* wants to start and stop using particular filters during compression,
|
* wants to start and stop using particular filters during compression,
|
||||||
* it should start out with all of the filters, and then add and
|
* it should start out with all of the filters, and then remove them
|
||||||
* remove them after the start of compression.
|
* or add them back after the start of compression.
|
||||||
|
*
|
||||||
|
* NOTE: this is a nasty constraint on the code, because it means that the
|
||||||
|
* prev_row buffer must be maintained even if there are currently no
|
||||||
|
* 'prev_row' requiring filters active.
|
||||||
*/
|
*/
|
||||||
if (png_ptr->row_buf != NULL)
|
if (png_ptr->row_buf != NULL)
|
||||||
{
|
{
|
||||||
#ifdef PNG_WRITE_FILTER_SUPPORTED
|
int num_filters;
|
||||||
if ((png_ptr->do_filter & PNG_FILTER_SUB) != 0 &&
|
png_alloc_size_t buf_size;
|
||||||
png_ptr->sub_row == NULL)
|
|
||||||
|
/* Repeat the checks in png_write_start_row; 1 pixel high or wide
|
||||||
|
* images cannot benefit from certain filters. If this isn't done here
|
||||||
|
* the check below will fire on 1 pixel high images.
|
||||||
|
*/
|
||||||
|
if (png_ptr->height == 1)
|
||||||
|
filters &= ~(PNG_FILTER_UP|PNG_FILTER_AVG|PNG_FILTER_PAETH);
|
||||||
|
|
||||||
|
if (png_ptr->width == 1)
|
||||||
|
filters &= ~(PNG_FILTER_SUB|PNG_FILTER_AVG|PNG_FILTER_PAETH);
|
||||||
|
|
||||||
|
if ((filters & (PNG_FILTER_UP|PNG_FILTER_AVG|PNG_FILTER_PAETH)) != 0
|
||||||
|
&& png_ptr->prev_row == NULL)
|
||||||
{
|
{
|
||||||
png_ptr->sub_row = (png_bytep)png_malloc(png_ptr,
|
/* This is the error case, however it is benign - the previous row
|
||||||
(png_ptr->rowbytes + 1));
|
* is not available so the filter can't be used. Just warn here.
|
||||||
png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB;
|
*/
|
||||||
|
png_app_warning(png_ptr,
|
||||||
|
"png_set_filter: UP/AVG/PAETH cannot be added after start");
|
||||||
|
filters &= ~(PNG_FILTER_UP|PNG_FILTER_AVG|PNG_FILTER_PAETH);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((png_ptr->do_filter & PNG_FILTER_UP) != 0 &&
|
num_filters = 0;
|
||||||
png_ptr->up_row == NULL)
|
|
||||||
|
if (filters & PNG_FILTER_SUB)
|
||||||
|
num_filters++;
|
||||||
|
|
||||||
|
if (filters & PNG_FILTER_UP)
|
||||||
|
num_filters++;
|
||||||
|
|
||||||
|
if (filters & PNG_FILTER_AVG)
|
||||||
|
num_filters++;
|
||||||
|
|
||||||
|
if (filters & PNG_FILTER_PAETH)
|
||||||
|
num_filters++;
|
||||||
|
|
||||||
|
/* Allocate needed row buffers if they have not already been
|
||||||
|
* allocated.
|
||||||
|
*/
|
||||||
|
buf_size = PNG_ROWBYTES(png_ptr->usr_channels * png_ptr->usr_bit_depth,
|
||||||
|
png_ptr->width) + 1;
|
||||||
|
|
||||||
|
if (png_ptr->try_row == NULL)
|
||||||
|
png_ptr->try_row = png_voidcast(png_bytep,
|
||||||
|
png_malloc(png_ptr, buf_size));
|
||||||
|
|
||||||
|
if (num_filters > 1)
|
||||||
{
|
{
|
||||||
if (png_ptr->prev_row == NULL)
|
if (png_ptr->tst_row == NULL)
|
||||||
{
|
png_ptr->tst_row = png_voidcast(png_bytep,
|
||||||
png_warning(png_ptr, "Can't add Up filter after starting");
|
png_malloc(png_ptr, buf_size));
|
||||||
png_ptr->do_filter = (png_byte)(png_ptr->do_filter &
|
|
||||||
~PNG_FILTER_UP);
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
png_ptr->up_row = (png_bytep)png_malloc(png_ptr,
|
|
||||||
(png_ptr->rowbytes + 1));
|
|
||||||
png_ptr->up_row[0] = PNG_FILTER_VALUE_UP;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((png_ptr->do_filter & PNG_FILTER_AVG) != 0 &&
|
|
||||||
png_ptr->avg_row == NULL)
|
|
||||||
{
|
|
||||||
if (png_ptr->prev_row == NULL)
|
|
||||||
{
|
|
||||||
png_warning(png_ptr, "Can't add Average filter after starting");
|
|
||||||
png_ptr->do_filter = (png_byte)(png_ptr->do_filter &
|
|
||||||
~PNG_FILTER_AVG);
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
png_ptr->avg_row = (png_bytep)png_malloc(png_ptr,
|
|
||||||
(png_ptr->rowbytes + 1));
|
|
||||||
png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((png_ptr->do_filter & PNG_FILTER_PAETH) != 0 &&
|
|
||||||
png_ptr->paeth_row == NULL)
|
|
||||||
{
|
|
||||||
if (png_ptr->prev_row == NULL)
|
|
||||||
{
|
|
||||||
png_warning(png_ptr, "Can't add Paeth filter after starting");
|
|
||||||
png_ptr->do_filter &= (png_byte)(~PNG_FILTER_PAETH);
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
png_ptr->paeth_row = (png_bytep)png_malloc(png_ptr,
|
|
||||||
(png_ptr->rowbytes + 1));
|
|
||||||
png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (png_ptr->do_filter == PNG_NO_FILTERS)
|
|
||||||
#endif /* WRITE_FILTER */
|
|
||||||
png_ptr->do_filter = PNG_FILTER_NONE;
|
|
||||||
}
|
}
|
||||||
|
png_ptr->do_filter = (png_byte)filters;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
png_error(png_ptr, "Unknown custom filter method");
|
png_error(png_ptr, "Unknown custom filter method");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This allows us to influence the way in which libpng chooses the "best"
|
#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* DEPRECATED */
|
||||||
* filter for the current scanline. While the "minimum-sum-of-absolute-
|
|
||||||
* differences metric is relatively fast and effective, there is some
|
|
||||||
* question as to whether it can be improved upon by trying to keep the
|
|
||||||
* filtered data going to zlib more consistent, hopefully resulting in
|
|
||||||
* better compression.
|
|
||||||
*/
|
|
||||||
#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* GRR 970116 */
|
|
||||||
/* Convenience reset API. */
|
|
||||||
static void
|
|
||||||
png_reset_filter_heuristics(png_structrp png_ptr)
|
|
||||||
{
|
|
||||||
/* Clear out any old values in the 'weights' - this must be done because if
|
|
||||||
* the app calls set_filter_heuristics multiple times with different
|
|
||||||
* 'num_weights' values we would otherwise potentially have wrong sized
|
|
||||||
* arrays.
|
|
||||||
*/
|
|
||||||
png_ptr->num_prev_filters = 0;
|
|
||||||
png_ptr->heuristic_method = PNG_FILTER_HEURISTIC_UNWEIGHTED;
|
|
||||||
if (png_ptr->prev_filters != NULL)
|
|
||||||
{
|
|
||||||
png_bytep old = png_ptr->prev_filters;
|
|
||||||
png_ptr->prev_filters = NULL;
|
|
||||||
png_free(png_ptr, old);
|
|
||||||
}
|
|
||||||
if (png_ptr->filter_weights != NULL)
|
|
||||||
{
|
|
||||||
png_uint_16p old = png_ptr->filter_weights;
|
|
||||||
png_ptr->filter_weights = NULL;
|
|
||||||
png_free(png_ptr, old);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (png_ptr->inv_filter_weights != NULL)
|
|
||||||
{
|
|
||||||
png_uint_16p old = png_ptr->inv_filter_weights;
|
|
||||||
png_ptr->inv_filter_weights = NULL;
|
|
||||||
png_free(png_ptr, old);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Leave the filter_costs - this array is fixed size. */
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
png_init_filter_heuristics(png_structrp png_ptr, int heuristic_method,
|
|
||||||
int num_weights)
|
|
||||||
{
|
|
||||||
if (png_ptr == NULL)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* Clear out the arrays */
|
|
||||||
png_reset_filter_heuristics(png_ptr);
|
|
||||||
|
|
||||||
/* Check arguments; the 'reset' function makes the correct settings for the
|
|
||||||
* unweighted case, but we must handle the weight case by initializing the
|
|
||||||
* arrays for the caller.
|
|
||||||
*/
|
|
||||||
if (heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (num_weights > 0)
|
|
||||||
{
|
|
||||||
png_ptr->prev_filters = (png_bytep)png_malloc(png_ptr,
|
|
||||||
(png_uint_32)((sizeof (png_byte)) * num_weights));
|
|
||||||
|
|
||||||
/* To make sure that the weighting starts out fairly */
|
|
||||||
for (i = 0; i < num_weights; i++)
|
|
||||||
{
|
|
||||||
png_ptr->prev_filters[i] = 255;
|
|
||||||
}
|
|
||||||
|
|
||||||
png_ptr->filter_weights = (png_uint_16p)png_malloc(png_ptr,
|
|
||||||
(png_uint_32)((sizeof (png_uint_16)) * num_weights));
|
|
||||||
|
|
||||||
png_ptr->inv_filter_weights = (png_uint_16p)png_malloc(png_ptr,
|
|
||||||
(png_uint_32)((sizeof (png_uint_16)) * num_weights));
|
|
||||||
|
|
||||||
for (i = 0; i < num_weights; i++)
|
|
||||||
{
|
|
||||||
png_ptr->inv_filter_weights[i] =
|
|
||||||
png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Safe to set this now */
|
|
||||||
png_ptr->num_prev_filters = (png_byte)num_weights;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If, in the future, there are other filter methods, this would
|
|
||||||
* need to be based on png_ptr->filter.
|
|
||||||
*/
|
|
||||||
if (png_ptr->filter_costs == NULL)
|
|
||||||
{
|
|
||||||
png_ptr->filter_costs = (png_uint_16p)png_malloc(png_ptr,
|
|
||||||
(png_uint_32)((sizeof (png_uint_16)) * PNG_FILTER_VALUE_LAST));
|
|
||||||
|
|
||||||
png_ptr->inv_filter_costs = (png_uint_16p)png_malloc(png_ptr,
|
|
||||||
(png_uint_32)((sizeof (png_uint_16)) * PNG_FILTER_VALUE_LAST));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < PNG_FILTER_VALUE_LAST; i++)
|
|
||||||
{
|
|
||||||
png_ptr->inv_filter_costs[i] =
|
|
||||||
png_ptr->filter_costs[i] = PNG_COST_FACTOR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* All the arrays are inited, safe to set this: */
|
|
||||||
png_ptr->heuristic_method = PNG_FILTER_HEURISTIC_WEIGHTED;
|
|
||||||
|
|
||||||
/* Return the 'ok' code. */
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
else if (heuristic_method == PNG_FILTER_HEURISTIC_DEFAULT ||
|
|
||||||
heuristic_method == PNG_FILTER_HEURISTIC_UNWEIGHTED)
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
png_warning(png_ptr, "Unknown filter heuristic method");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Provide floating and fixed point APIs */
|
/* Provide floating and fixed point APIs */
|
||||||
#ifdef PNG_FLOATING_POINT_SUPPORTED
|
#ifdef PNG_FLOATING_POINT_SUPPORTED
|
||||||
void PNGAPI
|
void PNGAPI
|
||||||
|
@ -1256,52 +1119,11 @@ png_set_filter_heuristics(png_structrp png_ptr, int heuristic_method,
|
||||||
int num_weights, png_const_doublep filter_weights,
|
int num_weights, png_const_doublep filter_weights,
|
||||||
png_const_doublep filter_costs)
|
png_const_doublep filter_costs)
|
||||||
{
|
{
|
||||||
png_debug(1, "in png_set_filter_heuristics");
|
PNG_UNUSED(png_ptr)
|
||||||
|
PNG_UNUSED(heuristic_method)
|
||||||
/* The internal API allocates all the arrays and ensures that the elements of
|
PNG_UNUSED(num_weights)
|
||||||
* those arrays are set to the default value.
|
PNG_UNUSED(filter_weights)
|
||||||
*/
|
PNG_UNUSED(filter_costs)
|
||||||
if (png_init_filter_heuristics(png_ptr, heuristic_method, num_weights) == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* If using the weighted method copy in the weights. */
|
|
||||||
if (heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < num_weights; i++)
|
|
||||||
{
|
|
||||||
if (filter_weights[i] <= 0.0)
|
|
||||||
{
|
|
||||||
png_ptr->inv_filter_weights[i] =
|
|
||||||
png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR;
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
png_ptr->inv_filter_weights[i] =
|
|
||||||
(png_uint_16)(PNG_WEIGHT_FACTOR*filter_weights[i]+.5);
|
|
||||||
|
|
||||||
png_ptr->filter_weights[i] =
|
|
||||||
(png_uint_16)(PNG_WEIGHT_FACTOR/filter_weights[i]+.5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Here is where we set the relative costs of the different filters. We
|
|
||||||
* should take the desired compression level into account when setting
|
|
||||||
* the costs, so that Paeth, for instance, has a high relative cost at low
|
|
||||||
* compression levels, while it has a lower relative cost at higher
|
|
||||||
* compression settings. The filter types are in order of increasing
|
|
||||||
* relative cost, so it would be possible to do this with an algorithm.
|
|
||||||
*/
|
|
||||||
for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) if (filter_costs[i] >= 1.0)
|
|
||||||
{
|
|
||||||
png_ptr->inv_filter_costs[i] =
|
|
||||||
(png_uint_16)(PNG_COST_FACTOR / filter_costs[i] + .5);
|
|
||||||
|
|
||||||
png_ptr->filter_costs[i] =
|
|
||||||
(png_uint_16)(PNG_COST_FACTOR * filter_costs[i] + .5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif /* FLOATING_POINT */
|
#endif /* FLOATING_POINT */
|
||||||
|
|
||||||
|
@ -1311,67 +1133,16 @@ png_set_filter_heuristics_fixed(png_structrp png_ptr, int heuristic_method,
|
||||||
int num_weights, png_const_fixed_point_p filter_weights,
|
int num_weights, png_const_fixed_point_p filter_weights,
|
||||||
png_const_fixed_point_p filter_costs)
|
png_const_fixed_point_p filter_costs)
|
||||||
{
|
{
|
||||||
png_debug(1, "in png_set_filter_heuristics_fixed");
|
PNG_UNUSED(png_ptr)
|
||||||
|
PNG_UNUSED(heuristic_method)
|
||||||
/* The internal API allocates all the arrays and ensures that the elements of
|
PNG_UNUSED(num_weights)
|
||||||
* those arrays are set to the default value.
|
PNG_UNUSED(filter_weights)
|
||||||
*/
|
PNG_UNUSED(filter_costs)
|
||||||
if (png_init_filter_heuristics(png_ptr, heuristic_method, num_weights) == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* If using the weighted method copy in the weights. */
|
|
||||||
if (heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < num_weights; i++)
|
|
||||||
{
|
|
||||||
if (filter_weights[i] <= 0)
|
|
||||||
{
|
|
||||||
png_ptr->inv_filter_weights[i] =
|
|
||||||
png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR;
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
png_ptr->inv_filter_weights[i] = (png_uint_16)
|
|
||||||
((PNG_WEIGHT_FACTOR*filter_weights[i]+PNG_FP_HALF)/PNG_FP_1);
|
|
||||||
|
|
||||||
png_ptr->filter_weights[i] = (png_uint_16)((PNG_WEIGHT_FACTOR*
|
|
||||||
PNG_FP_1+(filter_weights[i]/2))/filter_weights[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Here is where we set the relative costs of the different filters. We
|
|
||||||
* should take the desired compression level into account when setting
|
|
||||||
* the costs, so that Paeth, for instance, has a high relative cost at low
|
|
||||||
* compression levels, while it has a lower relative cost at higher
|
|
||||||
* compression settings. The filter types are in order of increasing
|
|
||||||
* relative cost, so it would be possible to do this with an algorithm.
|
|
||||||
*/
|
|
||||||
for (i = 0; i < PNG_FILTER_VALUE_LAST; i++)
|
|
||||||
if (filter_costs[i] >= PNG_FP_1)
|
|
||||||
{
|
|
||||||
png_uint_32 tmp;
|
|
||||||
|
|
||||||
/* Use a 32 bit unsigned temporary here because otherwise the
|
|
||||||
* intermediate value will be a 32 bit *signed* integer (ANSI rules)
|
|
||||||
* and this will get the wrong answer on division.
|
|
||||||
*/
|
|
||||||
tmp = PNG_COST_FACTOR*PNG_FP_1 + (filter_costs[i]/2);
|
|
||||||
tmp /= filter_costs[i];
|
|
||||||
|
|
||||||
png_ptr->inv_filter_costs[i] = (png_uint_16)tmp;
|
|
||||||
|
|
||||||
tmp = PNG_COST_FACTOR * filter_costs[i] + PNG_FP_HALF;
|
|
||||||
tmp /= PNG_FP_1;
|
|
||||||
|
|
||||||
png_ptr->filter_costs[i] = (png_uint_16)tmp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif /* FIXED_POINT */
|
#endif /* FIXED_POINT */
|
||||||
#endif /* WRITE_WEIGHTED_FILTER */
|
#endif /* WRITE_WEIGHTED_FILTER */
|
||||||
|
|
||||||
|
#ifdef PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED
|
||||||
void PNGAPI
|
void PNGAPI
|
||||||
png_set_compression_level(png_structrp png_ptr, int level)
|
png_set_compression_level(png_structrp png_ptr, int level)
|
||||||
{
|
{
|
||||||
|
@ -1417,8 +1188,8 @@ png_set_compression_window_bits(png_structrp png_ptr, int window_bits)
|
||||||
if (png_ptr == NULL)
|
if (png_ptr == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Prior to 1.6.0 this would warn but then set the window_bits value, this
|
/* Prior to 1.6.0 this would warn but then set the window_bits value. This
|
||||||
* meant that negative window bits values could be selected which would cause
|
* meant that negative window bits values could be selected that would cause
|
||||||
* libpng to write a non-standard PNG file with raw deflate or gzip
|
* libpng to write a non-standard PNG file with raw deflate or gzip
|
||||||
* compressed IDAT or ancillary chunks. Such files can be read and there is
|
* compressed IDAT or ancillary chunks. Such files can be read and there is
|
||||||
* no warning on read, so this seems like a very bad idea.
|
* no warning on read, so this seems like a very bad idea.
|
||||||
|
@ -1454,6 +1225,7 @@ png_set_compression_method(png_structrp png_ptr, int method)
|
||||||
|
|
||||||
png_ptr->zlib_method = method;
|
png_ptr->zlib_method = method;
|
||||||
}
|
}
|
||||||
|
#endif /* WRITE_CUSTOMIZE_COMPRESSION */
|
||||||
|
|
||||||
/* The following were added to libpng-1.5.4 */
|
/* The following were added to libpng-1.5.4 */
|
||||||
#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
|
#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
|
||||||
|
@ -1614,14 +1386,14 @@ png_write_png(png_structrp png_ptr, png_inforp info_ptr,
|
||||||
* alpha channel.
|
* alpha channel.
|
||||||
*/
|
*/
|
||||||
if ((transforms & (PNG_TRANSFORM_STRIP_FILLER_AFTER|
|
if ((transforms & (PNG_TRANSFORM_STRIP_FILLER_AFTER|
|
||||||
PNG_TRANSFORM_STRIP_FILLER_BEFORE)) != 0)
|
PNG_TRANSFORM_STRIP_FILLER_BEFORE)) != 0)
|
||||||
{
|
{
|
||||||
#ifdef PNG_WRITE_FILLER_SUPPORTED
|
#ifdef PNG_WRITE_FILLER_SUPPORTED
|
||||||
if ((transforms & PNG_TRANSFORM_STRIP_FILLER_AFTER) != 0)
|
if ((transforms & PNG_TRANSFORM_STRIP_FILLER_AFTER) != 0)
|
||||||
{
|
{
|
||||||
if ((transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE) != 0)
|
if ((transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE) != 0)
|
||||||
png_app_error(png_ptr,
|
png_app_error(png_ptr,
|
||||||
"PNG_TRANSFORM_STRIP_FILLER: BEFORE+AFTER not supported");
|
"PNG_TRANSFORM_STRIP_FILLER: BEFORE+AFTER not supported");
|
||||||
|
|
||||||
/* Continue if ignored - this is the pre-1.6.10 behavior */
|
/* Continue if ignored - this is the pre-1.6.10 behavior */
|
||||||
png_set_filler(png_ptr, 0, PNG_FILLER_AFTER);
|
png_set_filler(png_ptr, 0, PNG_FILLER_AFTER);
|
||||||
|
@ -1680,13 +1452,13 @@ png_write_png(png_structrp png_ptr, png_inforp info_ptr,
|
||||||
|
|
||||||
|
|
||||||
#ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED
|
#ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED
|
||||||
#ifdef PNG_STDIO_SUPPORTED /* currently required for png_image_write_* */
|
# ifdef PNG_STDIO_SUPPORTED /* currently required for png_image_write_* */
|
||||||
/* Initialize the write structure - general purpose utility. */
|
/* Initialize the write structure - general purpose utility. */
|
||||||
static int
|
static int
|
||||||
png_image_write_init(png_imagep image)
|
png_image_write_init(png_imagep image)
|
||||||
{
|
{
|
||||||
png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, image,
|
png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, image,
|
||||||
png_safe_error, png_safe_warning);
|
png_safe_error, png_safe_warning);
|
||||||
|
|
||||||
if (png_ptr != NULL)
|
if (png_ptr != NULL)
|
||||||
{
|
{
|
||||||
|
@ -1695,7 +1467,7 @@ png_image_write_init(png_imagep image)
|
||||||
if (info_ptr != NULL)
|
if (info_ptr != NULL)
|
||||||
{
|
{
|
||||||
png_controlp control = png_voidcast(png_controlp,
|
png_controlp control = png_voidcast(png_controlp,
|
||||||
png_malloc_warn(png_ptr, (sizeof *control)));
|
png_malloc_warn(png_ptr, (sizeof *control)));
|
||||||
|
|
||||||
if (control != NULL)
|
if (control != NULL)
|
||||||
{
|
{
|
||||||
|
@ -1742,12 +1514,12 @@ static int
|
||||||
png_write_image_16bit(png_voidp argument)
|
png_write_image_16bit(png_voidp argument)
|
||||||
{
|
{
|
||||||
png_image_write_control *display = png_voidcast(png_image_write_control*,
|
png_image_write_control *display = png_voidcast(png_image_write_control*,
|
||||||
argument);
|
argument);
|
||||||
png_imagep image = display->image;
|
png_imagep image = display->image;
|
||||||
png_structrp png_ptr = image->opaque->png_ptr;
|
png_structrp png_ptr = image->opaque->png_ptr;
|
||||||
|
|
||||||
png_const_uint_16p input_row = png_voidcast(png_const_uint_16p,
|
png_const_uint_16p input_row = png_voidcast(png_const_uint_16p,
|
||||||
display->first_row);
|
display->first_row);
|
||||||
png_uint_16p output_row = png_voidcast(png_uint_16p, display->local_row);
|
png_uint_16p output_row = png_voidcast(png_uint_16p, display->local_row);
|
||||||
png_uint_16p row_end;
|
png_uint_16p row_end;
|
||||||
const int channels = (image->format & PNG_FORMAT_FLAG_COLOR) != 0 ? 3 : 1;
|
const int channels = (image->format & PNG_FORMAT_FLAG_COLOR) != 0 ? 3 : 1;
|
||||||
|
@ -1756,17 +1528,18 @@ png_write_image_16bit(png_voidp argument)
|
||||||
|
|
||||||
if ((image->format & PNG_FORMAT_FLAG_ALPHA) != 0)
|
if ((image->format & PNG_FORMAT_FLAG_ALPHA) != 0)
|
||||||
{
|
{
|
||||||
# ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED
|
# ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED
|
||||||
if ((image->format & PNG_FORMAT_FLAG_AFIRST) != 0)
|
if ((image->format & PNG_FORMAT_FLAG_AFIRST) != 0)
|
||||||
{
|
{
|
||||||
aindex = -1;
|
aindex = -1;
|
||||||
++input_row; /* To point to the first component */
|
++input_row; /* To point to the first component */
|
||||||
++output_row;
|
++output_row;
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
# endif
|
aindex = channels;
|
||||||
|
# else
|
||||||
aindex = channels;
|
aindex = channels;
|
||||||
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
|
@ -1848,7 +1621,7 @@ png_write_image_16bit(png_voidp argument)
|
||||||
* calculation can be done to 15 bits of accuracy; however, the output needs to
|
* calculation can be done to 15 bits of accuracy; however, the output needs to
|
||||||
* be scaled in the range 0..255*65535, so include that scaling here.
|
* be scaled in the range 0..255*65535, so include that scaling here.
|
||||||
*/
|
*/
|
||||||
#define UNP_RECIPROCAL(alpha) ((((0xffff*0xff)<<7)+(alpha>>1))/alpha)
|
# define UNP_RECIPROCAL(alpha) ((((0xffff*0xff)<<7)+(alpha>>1))/alpha)
|
||||||
|
|
||||||
static png_byte
|
static png_byte
|
||||||
png_unpremultiply(png_uint_32 component, png_uint_32 alpha,
|
png_unpremultiply(png_uint_32 component, png_uint_32 alpha,
|
||||||
|
@ -1899,12 +1672,12 @@ static int
|
||||||
png_write_image_8bit(png_voidp argument)
|
png_write_image_8bit(png_voidp argument)
|
||||||
{
|
{
|
||||||
png_image_write_control *display = png_voidcast(png_image_write_control*,
|
png_image_write_control *display = png_voidcast(png_image_write_control*,
|
||||||
argument);
|
argument);
|
||||||
png_imagep image = display->image;
|
png_imagep image = display->image;
|
||||||
png_structrp png_ptr = image->opaque->png_ptr;
|
png_structrp png_ptr = image->opaque->png_ptr;
|
||||||
|
|
||||||
png_const_uint_16p input_row = png_voidcast(png_const_uint_16p,
|
png_const_uint_16p input_row = png_voidcast(png_const_uint_16p,
|
||||||
display->first_row);
|
display->first_row);
|
||||||
png_bytep output_row = png_voidcast(png_bytep, display->local_row);
|
png_bytep output_row = png_voidcast(png_bytep, display->local_row);
|
||||||
png_uint_32 y = image->height;
|
png_uint_32 y = image->height;
|
||||||
const int channels = (image->format & PNG_FORMAT_FLAG_COLOR) != 0 ? 3 : 1;
|
const int channels = (image->format & PNG_FORMAT_FLAG_COLOR) != 0 ? 3 : 1;
|
||||||
|
@ -1914,17 +1687,17 @@ png_write_image_8bit(png_voidp argument)
|
||||||
png_bytep row_end;
|
png_bytep row_end;
|
||||||
int aindex;
|
int aindex;
|
||||||
|
|
||||||
# ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED
|
# ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED
|
||||||
if ((image->format & PNG_FORMAT_FLAG_AFIRST) != 0)
|
if ((image->format & PNG_FORMAT_FLAG_AFIRST) != 0)
|
||||||
{
|
{
|
||||||
aindex = -1;
|
aindex = -1;
|
||||||
++input_row; /* To point to the first component */
|
++input_row; /* To point to the first component */
|
||||||
++output_row;
|
++output_row;
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
# endif
|
# endif
|
||||||
aindex = channels;
|
aindex = channels;
|
||||||
|
|
||||||
/* Use row_end in place of a loop counter: */
|
/* Use row_end in place of a loop counter: */
|
||||||
row_end = output_row + image->width * (channels+1);
|
row_end = output_row + image->width * (channels+1);
|
||||||
|
@ -1958,7 +1731,7 @@ png_write_image_8bit(png_voidp argument)
|
||||||
} /* while out_ptr < row_end */
|
} /* while out_ptr < row_end */
|
||||||
|
|
||||||
png_write_row(png_ptr, png_voidcast(png_const_bytep,
|
png_write_row(png_ptr, png_voidcast(png_const_bytep,
|
||||||
display->local_row));
|
display->local_row));
|
||||||
input_row += display->row_bytes/(sizeof (png_uint_16));
|
input_row += display->row_bytes/(sizeof (png_uint_16));
|
||||||
} /* while y */
|
} /* while y */
|
||||||
}
|
}
|
||||||
|
@ -1997,25 +1770,25 @@ png_image_set_PLTE(png_image_write_control *display)
|
||||||
const png_imagep image = display->image;
|
const png_imagep image = display->image;
|
||||||
const void *cmap = display->colormap;
|
const void *cmap = display->colormap;
|
||||||
const int entries = image->colormap_entries > 256 ? 256 :
|
const int entries = image->colormap_entries > 256 ? 256 :
|
||||||
(int)image->colormap_entries;
|
(int)image->colormap_entries;
|
||||||
|
|
||||||
/* NOTE: the caller must check for cmap != NULL and entries != 0 */
|
/* NOTE: the caller must check for cmap != NULL and entries != 0 */
|
||||||
const png_uint_32 format = image->format;
|
const png_uint_32 format = image->format;
|
||||||
const int channels = PNG_IMAGE_SAMPLE_CHANNELS(format);
|
const int channels = PNG_IMAGE_SAMPLE_CHANNELS(format);
|
||||||
|
|
||||||
# if defined(PNG_FORMAT_BGR_SUPPORTED) &&\
|
# if defined(PNG_FORMAT_BGR_SUPPORTED) &&\
|
||||||
defined(PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED)
|
defined(PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED)
|
||||||
const int afirst = (format & PNG_FORMAT_FLAG_AFIRST) != 0 &&
|
const int afirst = (format & PNG_FORMAT_FLAG_AFIRST) != 0 &&
|
||||||
(format & PNG_FORMAT_FLAG_ALPHA) != 0;
|
(format & PNG_FORMAT_FLAG_ALPHA) != 0;
|
||||||
# else
|
# else
|
||||||
# define afirst 0
|
# define afirst 0
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# ifdef PNG_FORMAT_BGR_SUPPORTED
|
# ifdef PNG_FORMAT_BGR_SUPPORTED
|
||||||
const int bgr = (format & PNG_FORMAT_FLAG_BGR) != 0 ? 2 : 0;
|
const int bgr = (format & PNG_FORMAT_FLAG_BGR) != 0 ? 2 : 0;
|
||||||
# else
|
# else
|
||||||
# define bgr 0
|
# define bgr 0
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
int i, num_trans;
|
int i, num_trans;
|
||||||
png_color palette[256];
|
png_color palette[256];
|
||||||
|
@ -2040,11 +1813,11 @@ png_image_set_PLTE(png_image_write_control *display)
|
||||||
if (channels >= 3) /* RGB */
|
if (channels >= 3) /* RGB */
|
||||||
{
|
{
|
||||||
palette[i].blue = (png_byte)PNG_sRGB_FROM_LINEAR(255 *
|
palette[i].blue = (png_byte)PNG_sRGB_FROM_LINEAR(255 *
|
||||||
entry[(2 ^ bgr)]);
|
entry[(2 ^ bgr)]);
|
||||||
palette[i].green = (png_byte)PNG_sRGB_FROM_LINEAR(255 *
|
palette[i].green = (png_byte)PNG_sRGB_FROM_LINEAR(255 *
|
||||||
entry[1]);
|
entry[1]);
|
||||||
palette[i].red = (png_byte)PNG_sRGB_FROM_LINEAR(255 *
|
palette[i].red = (png_byte)PNG_sRGB_FROM_LINEAR(255 *
|
||||||
entry[bgr]);
|
entry[bgr]);
|
||||||
}
|
}
|
||||||
|
|
||||||
else /* Gray */
|
else /* Gray */
|
||||||
|
@ -2120,12 +1893,12 @@ png_image_set_PLTE(png_image_write_control *display)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifdef afirst
|
# ifdef afirst
|
||||||
# undef afirst
|
# undef afirst
|
||||||
# endif
|
# endif
|
||||||
# ifdef bgr
|
# ifdef bgr
|
||||||
# undef bgr
|
# undef bgr
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
png_set_PLTE(image->opaque->png_ptr, image->opaque->info_ptr, palette,
|
png_set_PLTE(image->opaque->png_ptr, image->opaque->info_ptr, palette,
|
||||||
entries);
|
entries);
|
||||||
|
@ -2153,10 +1926,10 @@ png_image_write_main(png_voidp argument)
|
||||||
int alpha = !colormap && (format & PNG_FORMAT_FLAG_ALPHA);
|
int alpha = !colormap && (format & PNG_FORMAT_FLAG_ALPHA);
|
||||||
int write_16bit = linear && !colormap && (display->convert_to_8bit == 0);
|
int write_16bit = linear && !colormap && (display->convert_to_8bit == 0);
|
||||||
|
|
||||||
# ifdef PNG_BENIGN_ERRORS_SUPPORTED
|
# ifdef PNG_BENIGN_ERRORS_SUPPORTED
|
||||||
/* Make sure we error out on any bad situation */
|
/* Make sure we error out on any bad situation */
|
||||||
png_set_benign_errors(png_ptr, 0/*error*/);
|
png_set_benign_errors(png_ptr, 0/*error*/);
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
/* Default the 'row_stride' parameter if required. */
|
/* Default the 'row_stride' parameter if required. */
|
||||||
if (display->row_stride == 0)
|
if (display->row_stride == 0)
|
||||||
|
@ -2235,23 +2008,23 @@ png_image_write_main(png_voidp argument)
|
||||||
png_set_swap(png_ptr);
|
png_set_swap(png_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifdef PNG_SIMPLIFIED_WRITE_BGR_SUPPORTED
|
# ifdef PNG_SIMPLIFIED_WRITE_BGR_SUPPORTED
|
||||||
if ((format & PNG_FORMAT_FLAG_BGR) != 0)
|
if ((format & PNG_FORMAT_FLAG_BGR) != 0)
|
||||||
{
|
{
|
||||||
if (colormap == 0 && (format & PNG_FORMAT_FLAG_COLOR) != 0)
|
if (colormap == 0 && (format & PNG_FORMAT_FLAG_COLOR) != 0)
|
||||||
png_set_bgr(png_ptr);
|
png_set_bgr(png_ptr);
|
||||||
format &= ~PNG_FORMAT_FLAG_BGR;
|
format &= ~PNG_FORMAT_FLAG_BGR;
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED
|
# ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED
|
||||||
if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
|
if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
|
||||||
{
|
{
|
||||||
if (colormap == 0 && (format & PNG_FORMAT_FLAG_ALPHA) != 0)
|
if (colormap == 0 && (format & PNG_FORMAT_FLAG_ALPHA) != 0)
|
||||||
png_set_swap_alpha(png_ptr);
|
png_set_swap_alpha(png_ptr);
|
||||||
format &= ~PNG_FORMAT_FLAG_AFIRST;
|
format &= ~PNG_FORMAT_FLAG_AFIRST;
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
/* If there are 16 or fewer color-map entries we wrote a lower bit depth
|
/* If there are 16 or fewer color-map entries we wrote a lower bit depth
|
||||||
* above, but the application data is still byte packed.
|
* above, but the application data is still byte packed.
|
||||||
|
@ -2287,7 +2060,9 @@ png_image_write_main(png_voidp argument)
|
||||||
* it about 50 times. The speed-up in pngstest was about 10-20% of the
|
* it about 50 times. The speed-up in pngstest was about 10-20% of the
|
||||||
* total (user) time on a heavily loaded system.
|
* total (user) time on a heavily loaded system.
|
||||||
*/
|
*/
|
||||||
|
# ifdef PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED
|
||||||
png_set_compression_level(png_ptr, 3);
|
png_set_compression_level(png_ptr, 3);
|
||||||
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check for the cases that currently require a pre-transform on the row
|
/* Check for the cases that currently require a pre-transform on the row
|
||||||
|
@ -2450,6 +2225,6 @@ png_image_write_to_file(png_imagep image, const char *file_name,
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif /* STDIO */
|
# endif /* STDIO */
|
||||||
#endif /* SIMPLIFIED_WRITE */
|
#endif /* SIMPLIFIED_WRITE */
|
||||||
#endif /* WRITE */
|
#endif /* WRITE */
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
|
|
||||||
/* pngwtran.c - transforms the data in a row for PNG writers
|
/* pngwtran.c - transforms the data in a row for PNG writers
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.15 [November 20, 2014]
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
* Copyright (c) 1998-2014 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
|
@ -71,7 +71,8 @@ png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)
|
||||||
case 2:
|
case 2:
|
||||||
{
|
{
|
||||||
png_bytep sp, dp;
|
png_bytep sp, dp;
|
||||||
int shift, v;
|
unsigned int shift;
|
||||||
|
int v;
|
||||||
png_uint_32 i;
|
png_uint_32 i;
|
||||||
png_uint_32 row_width = row_info->width;
|
png_uint_32 row_width = row_info->width;
|
||||||
|
|
||||||
|
@ -110,7 +111,8 @@ png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)
|
||||||
case 4:
|
case 4:
|
||||||
{
|
{
|
||||||
png_bytep sp, dp;
|
png_bytep sp, dp;
|
||||||
int shift, v;
|
unsigned int shift;
|
||||||
|
int v;
|
||||||
png_uint_32 i;
|
png_uint_32 i;
|
||||||
png_uint_32 row_width = row_info->width;
|
png_uint_32 row_width = row_info->width;
|
||||||
|
|
||||||
|
@ -422,7 +424,7 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
|
||||||
*(dp++) = *(sp++);
|
*(dp++) = *(sp++);
|
||||||
*/
|
*/
|
||||||
sp+=3; dp = sp;
|
sp+=3; dp = sp;
|
||||||
*(dp++) = (png_byte)(255 - *(sp++));
|
*dp = (png_byte)(255 - *(sp++));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -446,7 +448,7 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
|
||||||
*/
|
*/
|
||||||
sp+=6; dp = sp;
|
sp+=6; dp = sp;
|
||||||
*(dp++) = (png_byte)(255 - *(sp++));
|
*(dp++) = (png_byte)(255 - *(sp++));
|
||||||
*(dp++) = (png_byte)(255 - *(sp++));
|
*dp = (png_byte)(255 - *(sp++));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* WRITE_16BIT */
|
#endif /* WRITE_16BIT */
|
||||||
|
@ -484,7 +486,7 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
|
||||||
*/
|
*/
|
||||||
sp+=2; dp = sp;
|
sp+=2; dp = sp;
|
||||||
*(dp++) = (png_byte)(255 - *(sp++));
|
*(dp++) = (png_byte)(255 - *(sp++));
|
||||||
*(dp++) = (png_byte)(255 - *(sp++));
|
*dp = (png_byte)(255 - *(sp++));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* WRITE_16BIT */
|
#endif /* WRITE_16BIT */
|
||||||
|
|
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue