mirror of
https://git.code.sf.net/p/libpng/code.git
synced 2025-07-10 18:04:09 +02:00
Imported from pngcrush-1.2.1.tar
This commit is contained in:
23
INSTALL
Normal file
23
INSTALL
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
|
||||||
|
There's no makefile or "configure" for pngcrush.
|
||||||
|
|
||||||
|
All you should need to do is enter the pngcrush-1.2.l
|
||||||
|
directory and type
|
||||||
|
|
||||||
|
cc -O -o pngcrush *.c -lm
|
||||||
|
cp pngcrush /usr/local/bin # or wherever you want
|
||||||
|
|
||||||
|
You might want to create a makefile if you are planning to do
|
||||||
|
something more complicated, like loading with your own shared
|
||||||
|
libraries for libpng and zlib.
|
||||||
|
|
||||||
|
Here's the command for compiling on SGI IRIX:
|
||||||
|
|
||||||
|
cc -n32 -fullwarn -O2 -IPA:plimit=256 -OPT:Olimit=0 -o pngcrush *.c -lm
|
||||||
|
cp pngcrush /usr/local/bin
|
||||||
|
|
||||||
|
On a PC with DJGCC, you can type
|
||||||
|
|
||||||
|
gcc -O3 -Wall -funroll-loops -o pngcrush *.c
|
||||||
|
copy /B pmodstub.exe + pngcrush pngcrush.exe
|
||||||
|
then put pngcrush.exe wherever you want.
|
||||||
36
README.txt
36
README.txt
@@ -1,8 +1,8 @@
|
|||||||
|
|
||||||
| pngcrush 1.2.0, Copyright (C) 1998, 1999, Glenn Randers-Pehrson
|
| pngcrush 1.2.1, Copyright (C) 1998, 1999, Glenn Randers-Pehrson
|
||||||
| This is a free, open-source program. Permission is
|
| This is a free, open-source program. Permission is
|
||||||
| granted to everyone to use pngcrush without fee.
|
| granted to everyone to use pngcrush without fee.
|
||||||
| This program was built with libpng version 1.0.5a,
|
| This program was built with libpng version 1.0.5f,
|
||||||
| Copyright (C) 1995, Guy Eric Schalnat, Group 42 Inc.,
|
| Copyright (C) 1995, Guy Eric Schalnat, Group 42 Inc.,
|
||||||
| Copyright (C) 1996, 1997 Andreas Dilger,
|
| Copyright (C) 1996, 1997 Andreas Dilger,
|
||||||
| Copyright (C) 1998, 1999, Glenn Randers-Pehrson,
|
| Copyright (C) 1998, 1999, Glenn Randers-Pehrson,
|
||||||
@@ -13,6 +13,31 @@
|
|||||||
usage: pngcrush [options] infile.png outfile.png
|
usage: pngcrush [options] infile.png outfile.png
|
||||||
pngcrush -e ext [other options] files.png ...
|
pngcrush -e ext [other options] files.png ...
|
||||||
pngcrush -d dir [other options] files.png ...
|
pngcrush -d dir [other options] files.png ...
|
||||||
|
options:
|
||||||
|
-brute (Use brute-force, try 114 different methods)
|
||||||
|
-c color_type of output file [0, 2, 4, or 6]
|
||||||
|
-d directory_name (where output files will go)
|
||||||
|
-double_gamma (used for fixing gamma in PhotoShop 5.0/5.02 files)
|
||||||
|
-e extension (used for creating output filename)
|
||||||
|
-f user_filter [0-5]
|
||||||
|
-force (Write a new output file even if larger than input)
|
||||||
|
-g gamma_value (float, e.g., 0.45455)
|
||||||
|
-l zlib_compression_level [0-9]
|
||||||
|
-m method [0 through 200]
|
||||||
|
-max maximum_IDAT_size [1 through 524288]
|
||||||
|
-n (no save; does not do compression or write output PNG)
|
||||||
|
-plte_len n (truncate PLTE)
|
||||||
|
-q (quiet)
|
||||||
|
-rem chunkname (or "alla" or "allb")
|
||||||
|
-replace_gamma gamma_value (float) even when file has a gAMA chunk.
|
||||||
|
-res dpi
|
||||||
|
-srgb [0, 1, 2, or 3]
|
||||||
|
-text b[efore_IDAT]|a[fter_IDAT] "keyword" "text"
|
||||||
|
-trns index red green blue gray
|
||||||
|
-verbose (write more detailed information)
|
||||||
|
-w compression_window_size [32, 16, 8, 4, 2, 1, 512, 256]
|
||||||
|
-h (help)
|
||||||
|
-p (pause)
|
||||||
|
|
||||||
options:
|
options:
|
||||||
-brute (Use brute-force, try 114 different methods)
|
-brute (Use brute-force, try 114 different methods)
|
||||||
@@ -89,6 +114,11 @@ options:
|
|||||||
|
|
||||||
Useful in conjunction with -v option to get info.
|
Useful in conjunction with -v option to get info.
|
||||||
|
|
||||||
|
-plte_len n (truncate PLTE)
|
||||||
|
|
||||||
|
Truncates the PLTE. Be sure not to truncate it to
|
||||||
|
|
||||||
|
less than the greatest index present in IDAT.
|
||||||
-q (quiet)
|
-q (quiet)
|
||||||
|
|
||||||
|
|
||||||
@@ -146,7 +176,7 @@ options:
|
|||||||
-z zlib_strategy [0, 1, or 2]
|
-z zlib_strategy [0, 1, or 2]
|
||||||
|
|
||||||
zlib compression strategy to use with the preceding
|
zlib compression strategy to use with the preceding
|
||||||
preceding '-m method' argument.
|
'-m method' argument.
|
||||||
|
|
||||||
-h (help)
|
-h (help)
|
||||||
|
|
||||||
|
|||||||
249
png.c
249
png.c
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* png.c - location for general purpose libpng functions
|
/* png.c - location for general purpose libpng functions
|
||||||
*
|
*
|
||||||
* libpng version 1.0.5a - October 23, 1999
|
* libpng version 1.0.5f - December 6, 1999
|
||||||
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
||||||
* Copyright (c) 1996, 1997 Andreas Dilger
|
* Copyright (c) 1996, 1997 Andreas Dilger
|
||||||
* Copyright (c) 1998, 1999 Glenn Randers-Pehrson
|
* Copyright (c) 1998, 1999 Glenn Randers-Pehrson
|
||||||
@@ -12,38 +12,40 @@
|
|||||||
#define PNG_NO_EXTERN
|
#define PNG_NO_EXTERN
|
||||||
#include "png.h"
|
#include "png.h"
|
||||||
|
|
||||||
PNG_GET_HEADER
|
|
||||||
|
|
||||||
/* Version information for C files. This had better match the version
|
/* Version information for C files. This had better match the version
|
||||||
* string defined in png.h.
|
* string defined in png.h.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
char png_libpng_ver[12] = "1.0.5a";
|
#ifdef PNG_USE_GLOBAL_ARRAYS
|
||||||
|
/* png_libpng_ver was changed to a function in version 1.0.5c */
|
||||||
|
char png_libpng_ver[12] = "1.0.5f";
|
||||||
|
|
||||||
|
/* png_sig was changed to a function in version 1.0.5c */
|
||||||
/* Place to hold the signature string for a PNG file. */
|
/* Place to hold the signature string for a PNG file. */
|
||||||
png_byte FARDATA png_sig[8] = {137, 80, 78, 71, 13, 10, 26, 10};
|
png_byte FARDATA png_sig[8] = {137, 80, 78, 71, 13, 10, 26, 10};
|
||||||
|
|
||||||
/* Constant strings for known chunk types. If you need to add a chunk,
|
/* Invoke global declarations for constant strings for known chunk types */
|
||||||
* add a string holding the name here. If you want to make the code
|
PNG_IHDR;
|
||||||
* portable to EBCDIC machines, use ASCII numbers, not characters.
|
PNG_IDAT;
|
||||||
*/
|
PNG_IEND;
|
||||||
png_byte FARDATA png_IHDR[5] = { 73, 72, 68, 82, '\0'};
|
PNG_PLTE;
|
||||||
png_byte FARDATA png_IDAT[5] = { 73, 68, 65, 84, '\0'};
|
PNG_bKGD;
|
||||||
png_byte FARDATA png_IEND[5] = { 73, 69, 78, 68, '\0'};
|
PNG_cHRM;
|
||||||
png_byte FARDATA png_PLTE[5] = { 80, 76, 84, 69, '\0'};
|
PNG_gAMA;
|
||||||
png_byte FARDATA png_bKGD[5] = { 98, 75, 71, 68, '\0'};
|
PNG_hIST;
|
||||||
png_byte FARDATA png_cHRM[5] = { 99, 72, 82, 77, '\0'};
|
PNG_iCCP;
|
||||||
png_byte FARDATA png_gAMA[5] = {103, 65, 77, 65, '\0'};
|
PNG_iTXt;
|
||||||
png_byte FARDATA png_hIST[5] = {104, 73, 83, 84, '\0'};
|
PNG_oFFs;
|
||||||
png_byte FARDATA png_oFFs[5] = {111, 70, 70, 115, '\0'};
|
PNG_pCAL;
|
||||||
png_byte FARDATA png_pCAL[5] = {112, 67, 65, 76, '\0'};
|
PNG_sCAL;
|
||||||
png_byte FARDATA png_pHYs[5] = {112, 72, 89, 115, '\0'};
|
PNG_pHYs;
|
||||||
png_byte FARDATA png_sBIT[5] = {115, 66, 73, 84, '\0'};
|
PNG_sBIT;
|
||||||
png_byte FARDATA png_sRGB[5] = {115, 82, 71, 66, '\0'};
|
PNG_sPLT;
|
||||||
png_byte FARDATA png_tEXt[5] = {116, 69, 88, 116, '\0'};
|
PNG_sRGB;
|
||||||
png_byte FARDATA png_tIME[5] = {116, 73, 77, 69, '\0'};
|
PNG_tEXt;
|
||||||
png_byte FARDATA png_tRNS[5] = {116, 82, 78, 83, '\0'};
|
PNG_tIME;
|
||||||
png_byte FARDATA png_zTXt[5] = {122, 84, 88, 116, '\0'};
|
PNG_tRNS;
|
||||||
|
PNG_zTXt;
|
||||||
|
|
||||||
/* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
|
/* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
|
||||||
|
|
||||||
@@ -75,6 +77,8 @@ int FARDATA png_pass_mask[] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff};
|
|||||||
/* Mask to determine which pixels to overwrite while displaying */
|
/* Mask to determine which pixels to overwrite while displaying */
|
||||||
int FARDATA png_pass_dsp_mask[] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff};
|
int FARDATA png_pass_dsp_mask[] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/* 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
|
||||||
* stream we can set num_bytes = 8 so that libpng will not attempt to read
|
* stream we can set num_bytes = 8 so that libpng will not attempt to read
|
||||||
@@ -102,6 +106,7 @@ png_set_sig_bytes(png_structp png_ptr, int num_bytes)
|
|||||||
int
|
int
|
||||||
png_sig_cmp(png_bytep sig, png_size_t start, png_size_t num_to_check)
|
png_sig_cmp(png_bytep sig, png_size_t start, png_size_t num_to_check)
|
||||||
{
|
{
|
||||||
|
png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10};
|
||||||
if (num_to_check > 8)
|
if (num_to_check > 8)
|
||||||
num_to_check = 8;
|
num_to_check = 8;
|
||||||
else if (num_to_check < 1)
|
else if (num_to_check < 1)
|
||||||
@@ -113,7 +118,7 @@ png_sig_cmp(png_bytep sig, png_size_t start, png_size_t num_to_check)
|
|||||||
if (start + num_to_check > 8)
|
if (start + num_to_check > 8)
|
||||||
num_to_check = 8 - start;
|
num_to_check = 8 - start;
|
||||||
|
|
||||||
return ((int)(png_memcmp(&sig[start], &png_sig[start], num_to_check)));
|
return ((int)(png_memcmp(&sig[start], &png_signature[start], num_to_check)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (Obsolete) function to check signature bytes. It does not allow one
|
/* (Obsolete) function to check signature bytes. It does not allow one
|
||||||
@@ -253,6 +258,108 @@ png_info_init(png_infop info_ptr)
|
|||||||
png_memset(info_ptr, 0, sizeof (png_info));
|
png_memset(info_ptr, 0, sizeof (png_info));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(PNG_TEXT_SUPPORTED)
|
||||||
|
/* free text item num or (if num == -1) all text items */
|
||||||
|
void
|
||||||
|
png_free_text(png_structp png_ptr, png_infop info_ptr, int num)
|
||||||
|
{
|
||||||
|
if (num != -1)
|
||||||
|
{
|
||||||
|
if (info_ptr->text[num].key)
|
||||||
|
{
|
||||||
|
png_free(png_ptr, info_ptr->text[num].key);
|
||||||
|
info_ptr->text[num].key = NULL;
|
||||||
|
}
|
||||||
|
if (info_ptr->text[num].lang)
|
||||||
|
{
|
||||||
|
png_free(png_ptr, info_ptr->text[num].lang);
|
||||||
|
info_ptr->text[num].lang = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (info_ptr->text != NULL)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < info_ptr->num_text; i++)
|
||||||
|
png_free_text(png_ptr, info_ptr, i);
|
||||||
|
png_free(png_ptr, info_ptr->text);
|
||||||
|
info_ptr->text = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_sCAL_SUPPORTED)
|
||||||
|
/* free any sCAL entry */
|
||||||
|
void
|
||||||
|
png_free_sCAL(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
if (info_ptr->valid & PNG_INFO_sCAL)
|
||||||
|
{
|
||||||
|
png_free(png_ptr, info_ptr->scal_unit);
|
||||||
|
info_ptr->valid &= ~PNG_INFO_sCAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_pCAL_SUPPORTED)
|
||||||
|
/* free any pCAL entry */
|
||||||
|
void
|
||||||
|
png_free_pCAL(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
if (info_ptr->valid & PNG_INFO_pCAL)
|
||||||
|
{
|
||||||
|
png_free(png_ptr, info_ptr->pcal_purpose);
|
||||||
|
png_free(png_ptr, info_ptr->pcal_units);
|
||||||
|
if (info_ptr->pcal_params != NULL)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < (int)info_ptr->pcal_nparams; i++)
|
||||||
|
{
|
||||||
|
png_free(png_ptr, info_ptr->pcal_params[i]);
|
||||||
|
}
|
||||||
|
png_free(png_ptr, info_ptr->pcal_params);
|
||||||
|
}
|
||||||
|
info_ptr->valid &= ~PNG_INFO_pCAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_iCCP_SUPPORTED)
|
||||||
|
/* free any pCAL entry */
|
||||||
|
void
|
||||||
|
png_free_iCCP(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
if (info_ptr->valid & PNG_INFO_iCCP)
|
||||||
|
{
|
||||||
|
png_free(png_ptr, info_ptr->iccp_name);
|
||||||
|
png_free(png_ptr, info_ptr->iccp_profile);
|
||||||
|
info_ptr->valid &= ~PNG_INFO_iCCP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_sPLT_SUPPORTED)
|
||||||
|
/* free a given sPLT entry, or (if num == -1) all sPLT entries */
|
||||||
|
void
|
||||||
|
png_free_spalettes(png_structp png_ptr, png_infop info_ptr, int num)
|
||||||
|
{
|
||||||
|
if (num != -1)
|
||||||
|
{
|
||||||
|
png_free(png_ptr, info_ptr->splt_palettes[num].name);
|
||||||
|
png_free(png_ptr, info_ptr->splt_palettes[num].entries);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
png_uint_32 i;
|
||||||
|
|
||||||
|
for (i = 0; i < info_ptr->splt_palettes_num; i++)
|
||||||
|
png_free_spalettes(png_ptr, info_ptr, num);
|
||||||
|
|
||||||
|
png_free(png_ptr, info_ptr->splt_palettes);
|
||||||
|
info_ptr->splt_palettes_num = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* This is an internal routine to free any memory that the info struct is
|
/* This is an internal routine to free any memory that the info struct is
|
||||||
* pointing to before re-using it or freeing the struct itself. Recall
|
* pointing to before re-using it or freeing the struct itself. Recall
|
||||||
* that png_free() checks for NULL pointers for us.
|
* that png_free() checks for NULL pointers for us.
|
||||||
@@ -260,39 +367,22 @@ png_info_init(png_infop info_ptr)
|
|||||||
void
|
void
|
||||||
png_info_destroy(png_structp png_ptr, png_infop info_ptr)
|
png_info_destroy(png_structp png_ptr, png_infop info_ptr)
|
||||||
{
|
{
|
||||||
#if defined(PNG_READ_tEXt_SUPPORTED) || defined(PNG_READ_zTXt_SUPPORTED)
|
|
||||||
png_debug(1, "in png_info_destroy\n");
|
png_debug(1, "in png_info_destroy\n");
|
||||||
if (info_ptr->text != NULL)
|
#if defined(PNG_READ_TEXT_SUPPORTED)
|
||||||
{
|
png_free_text(png_ptr, info_ptr, -1);
|
||||||
int i;
|
#endif
|
||||||
for (i = 0; i < info_ptr->num_text; i++)
|
#if defined(PNG_READ_sCAL_SUPPORTED)
|
||||||
{
|
png_free_sCAL(png_ptr, info_ptr);
|
||||||
if(info_ptr->text[i].key != NULL)
|
|
||||||
{
|
|
||||||
png_free(png_ptr, info_ptr->text[i].key);
|
|
||||||
info_ptr->text[i].key = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
png_free(png_ptr, info_ptr->text);
|
|
||||||
info_ptr->text = NULL;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
#if defined(PNG_READ_pCAL_SUPPORTED)
|
#if defined(PNG_READ_pCAL_SUPPORTED)
|
||||||
png_free(png_ptr, info_ptr->pcal_purpose);
|
png_free_pCAL(png_ptr, info_ptr);
|
||||||
png_free(png_ptr, info_ptr->pcal_units);
|
#endif
|
||||||
if (info_ptr->pcal_params != NULL)
|
#if defined(PNG_READ_iCCP_SUPPORTED)
|
||||||
{
|
png_free_iCCP(png_ptr, info_ptr);
|
||||||
int i;
|
#endif
|
||||||
for (i = 0; i < (int)info_ptr->pcal_nparams; i++)
|
#if defined(PNG_READ_sPLT_SUPPORTED)
|
||||||
{
|
png_free_spalettes(png_ptr, info_ptr, -1);
|
||||||
png_free(png_ptr, info_ptr->pcal_params[i]);
|
|
||||||
info_ptr->pcal_params[i]=NULL;
|
|
||||||
}
|
|
||||||
png_free(png_ptr, info_ptr->pcal_params);
|
|
||||||
info_ptr->pcal_params = NULL;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
png_info_init(info_ptr);
|
png_info_init(info_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -356,22 +446,65 @@ png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime)
|
|||||||
}
|
}
|
||||||
#endif /* PNG_TIME_RFC1123_SUPPORTED */
|
#endif /* PNG_TIME_RFC1123_SUPPORTED */
|
||||||
|
|
||||||
|
/* Signature string for a PNG file. */
|
||||||
|
png_bytep
|
||||||
|
png_sig_bytes(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
const png_byte png_sig_numbers[9] = {137, 80, 78, 71, 13, 10, 26, 10, 0};
|
||||||
|
if (png_ptr == NULL) /* silence compiler warning */
|
||||||
|
return ((png_bytep) strdup((png_const_charp)png_sig_numbers));
|
||||||
|
return ((png_bytep) strdup((png_const_charp)png_sig_numbers));
|
||||||
|
}
|
||||||
|
|
||||||
png_charp
|
png_charp
|
||||||
png_get_copyright(png_structp png_ptr)
|
png_get_copyright(png_structp png_ptr)
|
||||||
{
|
{
|
||||||
if (png_ptr != NULL || png_ptr == NULL) /* silence compiler warning */
|
if (png_ptr != NULL || png_ptr == NULL) /* silence compiler warning */
|
||||||
return ("\n libpng version 1.0.5a - October 23, 1999\n\
|
return ("\n libpng version 1.0.5f - December 6, 1999\n\
|
||||||
Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.\n\
|
Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.\n\
|
||||||
Copyright (c) 1996, 1997 Andreas Dilger\n\
|
Copyright (c) 1996, 1997 Andreas Dilger\n\
|
||||||
Copyright (c) 1998, 1999 Glenn Randers-Pehrson\n");
|
Copyright (c) 1998, 1999 Glenn Randers-Pehrson\n");
|
||||||
return ("");
|
return ("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The following return the library version as a short string in the
|
||||||
|
* format 1.0.0 through 99.99.99zz. To get the version of *.h files used
|
||||||
|
* with your application, print out PNG_LIBPNG_VER_STRING, which is defined
|
||||||
|
* in png.h.
|
||||||
|
*/
|
||||||
|
|
||||||
|
png_charp
|
||||||
|
png_get_libpng_ver(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
/* Version of *.c files used when building libpng */
|
||||||
|
if(png_ptr != NULL) /* silence compiler warning about unused png_ptr */
|
||||||
|
return("1.0.5f");
|
||||||
|
return("1.0.5f");
|
||||||
|
}
|
||||||
|
|
||||||
|
png_charp
|
||||||
|
png_get_header_ver(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
/* Version of *.h files used when building libpng */
|
||||||
|
if(png_ptr != NULL) /* silence compiler warning about unused png_ptr */
|
||||||
|
return(PNG_LIBPNG_VER_STRING);
|
||||||
|
return(PNG_LIBPNG_VER_STRING);
|
||||||
|
}
|
||||||
|
|
||||||
|
png_charp
|
||||||
|
png_get_header_version(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
/* Returns longer string containing both version and date */
|
||||||
|
if(png_ptr != NULL) /* silence compiler warning about unused png_ptr */
|
||||||
|
return(PNG_HEADER_VERSION_STRING);
|
||||||
|
return(PNG_HEADER_VERSION_STRING);
|
||||||
|
}
|
||||||
|
|
||||||
/* 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. */
|
||||||
void
|
void
|
||||||
png_check_version
|
png_check_version
|
||||||
(version_1_0_5a png_h_is_not_version_1_0_5a)
|
(version_1_0_5f png_h_is_not_version_1_0_5f)
|
||||||
{
|
{
|
||||||
if(png_h_is_not_version_1_0_5a == NULL)
|
if(png_h_is_not_version_1_0_5f == NULL)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
148
pngconf.h
148
pngconf.h
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngconf.h - machine configurable file for libpng
|
/* pngconf.h - machine configurable file for libpng
|
||||||
*
|
*
|
||||||
* libpng 1.0.5a - October 23, 1999
|
* libpng 1.0.5f - December 6, 1999
|
||||||
* For conditions of distribution and use, see copyright notice in png.h
|
* For conditions of distribution and use, see copyright notice in png.h
|
||||||
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
||||||
* Copyright (c) 1996, 1997 Andreas Dilger
|
* Copyright (c) 1996, 1997 Andreas Dilger
|
||||||
@@ -17,7 +17,9 @@
|
|||||||
#ifndef PNGCONF_H
|
#ifndef PNGCONF_H
|
||||||
#define PNGCONF_H
|
#define PNGCONF_H
|
||||||
|
|
||||||
#define PNG_ZBUF_SIZE 524288
|
#define PNG_NO_EASY_ACCESS
|
||||||
|
#define PNG_NO_READ_EMPTY_PLTE
|
||||||
|
#define PNG_NO_WRITE_TRANSFORMS
|
||||||
#define PNG_READ_USER_TRANSFORM_SUPPORTED
|
#define PNG_READ_USER_TRANSFORM_SUPPORTED
|
||||||
#define PNG_READ_STRIP_ALPHA_SUPPORTED
|
#define PNG_READ_STRIP_ALPHA_SUPPORTED
|
||||||
#define PNG_READ_EXPAND_SUPPORTED
|
#define PNG_READ_EXPAND_SUPPORTED
|
||||||
@@ -26,8 +28,10 @@
|
|||||||
#define PNG_READ_RGB_TO_GRAY_SUPPORTED
|
#define PNG_READ_RGB_TO_GRAY_SUPPORTED
|
||||||
#define PNG_READ_BACKGROUND_SUPPORTED
|
#define PNG_READ_BACKGROUND_SUPPORTED
|
||||||
#define PNG_READ_GAMMA_SUPPORTED
|
#define PNG_READ_GAMMA_SUPPORTED
|
||||||
#define PNG_NO_WRITE_TRANSFORMS
|
#define PNG_ZBUF_SIZE 524288
|
||||||
#define PNG_NO_READ_EMPTY_PLTE
|
/*
|
||||||
|
#define PNG_NO_GLOBAL_ARRAYS
|
||||||
|
*/
|
||||||
|
|
||||||
/* This is the size of the compression buffer, and thus the size of
|
/* This is the size of the compression buffer, and thus the size of
|
||||||
* an IDAT chunk. Make this whatever size you feel is best for your
|
* an IDAT chunk. Make this whatever size you feel is best for your
|
||||||
@@ -430,6 +434,16 @@ __dont__ include it again
|
|||||||
#define PNG_ASSEMBLER_CODE_SUPPORTED
|
#define PNG_ASSEMBLER_CODE_SUPPORTED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Do not use global arrays (helps with building DLL's)
|
||||||
|
* They are no longer used in libpng itself, since version 1.0.5c,
|
||||||
|
* but might be required for some pre-1.0.5c applications.
|
||||||
|
*/
|
||||||
|
#ifdef PNG_NO_GLOBAL_ARRAYS
|
||||||
|
#define PNG_USE_LOCAL_ARRAYS
|
||||||
|
#else
|
||||||
|
#define PNG_USE_GLOBAL_ARRAYS
|
||||||
|
#endif
|
||||||
|
|
||||||
/* These are currently experimental features, define them if you want */
|
/* These are currently experimental features, define them if you want */
|
||||||
|
|
||||||
/* very little testing */
|
/* very little testing */
|
||||||
@@ -468,87 +482,191 @@ __dont__ include it again
|
|||||||
#ifdef PNG_READ_ANCILLARY_CHUNKS_SUPPORTED
|
#ifdef PNG_READ_ANCILLARY_CHUNKS_SUPPORTED
|
||||||
#ifndef PNG_NO_READ_bKGD
|
#ifndef PNG_NO_READ_bKGD
|
||||||
#define PNG_READ_bKGD_SUPPORTED
|
#define PNG_READ_bKGD_SUPPORTED
|
||||||
|
#define PNG_bKGD_SUPPORTED
|
||||||
#endif
|
#endif
|
||||||
#ifndef PNG_NO_READ_cHRM
|
#ifndef PNG_NO_READ_cHRM
|
||||||
#define PNG_READ_cHRM_SUPPORTED
|
#define PNG_READ_cHRM_SUPPORTED
|
||||||
|
#define PNG_cHRM_SUPPORTED
|
||||||
#endif
|
#endif
|
||||||
#ifndef PNG_NO_READ_gAMA
|
#ifndef PNG_NO_READ_gAMA
|
||||||
#define PNG_READ_gAMA_SUPPORTED
|
#define PNG_READ_gAMA_SUPPORTED
|
||||||
|
#define PNG_gAMA_SUPPORTED
|
||||||
#endif
|
#endif
|
||||||
#ifndef PNG_NO_READ_hIST
|
#ifndef PNG_NO_READ_hIST
|
||||||
#define PNG_READ_hIST_SUPPORTED
|
#define PNG_READ_hIST_SUPPORTED
|
||||||
|
#define PNG_hIST_SUPPORTED
|
||||||
|
#endif
|
||||||
|
#ifndef PNG_NO_READ_iCCP
|
||||||
|
#define PNG_READ_iCCP_SUPPORTED
|
||||||
|
#define PNG_iCCP_SUPPORTED
|
||||||
|
#endif
|
||||||
|
#ifndef PNG_NO_READ_iTXt
|
||||||
|
#define PNG_READ_iTXt_SUPPORTED
|
||||||
|
#define PNG_iTXt_SUPPORTED
|
||||||
#endif
|
#endif
|
||||||
#ifndef PNG_NO_READ_oFFs
|
#ifndef PNG_NO_READ_oFFs
|
||||||
#define PNG_READ_oFFs_SUPPORTED
|
#define PNG_READ_oFFs_SUPPORTED
|
||||||
|
#define PNG_oFFs_SUPPORTED
|
||||||
#endif
|
#endif
|
||||||
#ifndef PNG_NO_READ_pCAL
|
#ifndef PNG_NO_READ_pCAL
|
||||||
#define PNG_READ_pCAL_SUPPORTED
|
#define PNG_READ_pCAL_SUPPORTED
|
||||||
|
#define PNG_pCAL_SUPPORTED
|
||||||
|
#endif
|
||||||
|
#ifndef PNG_NO_READ_sCAL
|
||||||
|
#define PNG_READ_sCAL_SUPPORTED
|
||||||
|
#define PNG_sCAL_SUPPORTED
|
||||||
#endif
|
#endif
|
||||||
#ifndef PNG_NO_READ_pHYs
|
#ifndef PNG_NO_READ_pHYs
|
||||||
#define PNG_READ_pHYs_SUPPORTED
|
#define PNG_READ_pHYs_SUPPORTED
|
||||||
|
#define PNG_pHYs_SUPPORTED
|
||||||
#endif
|
#endif
|
||||||
#ifndef PNG_NO_READ_sBIT
|
#ifndef PNG_NO_READ_sBIT
|
||||||
#define PNG_READ_sBIT_SUPPORTED
|
#define PNG_READ_sBIT_SUPPORTED
|
||||||
|
#define PNG_sBIT_SUPPORTED
|
||||||
|
#endif
|
||||||
|
#ifndef PNG_NO_READ_sPLT
|
||||||
|
#define PNG_READ_sPLT_SUPPORTED
|
||||||
|
#define PNG_sPLT_SUPPORTED
|
||||||
#endif
|
#endif
|
||||||
#ifndef PNG_NO_READ_sRGB
|
#ifndef PNG_NO_READ_sRGB
|
||||||
#define PNG_READ_sRGB_SUPPORTED
|
#define PNG_READ_sRGB_SUPPORTED
|
||||||
|
#define PNG_sRGB_SUPPORTED
|
||||||
#endif
|
#endif
|
||||||
#ifndef PNG_NO_READ_tEXt
|
#ifndef PNG_NO_READ_tEXt
|
||||||
#define PNG_READ_tEXt_SUPPORTED
|
#define PNG_READ_tEXt_SUPPORTED
|
||||||
|
#define PNG_tEXt_SUPPORTED
|
||||||
#endif
|
#endif
|
||||||
#ifndef PNG_NO_READ_tIME
|
#ifndef PNG_NO_READ_tIME
|
||||||
#define PNG_READ_tIME_SUPPORTED
|
#define PNG_READ_tIME_SUPPORTED
|
||||||
|
#define PNG_tIME_SUPPORTED
|
||||||
#endif
|
#endif
|
||||||
#ifndef PNG_NO_READ_tRNS
|
#ifndef PNG_NO_READ_tRNS
|
||||||
#define PNG_READ_tRNS_SUPPORTED
|
#define PNG_READ_tRNS_SUPPORTED
|
||||||
|
#define PNG_tRNS_SUPPORTED
|
||||||
#endif
|
#endif
|
||||||
#ifndef PNG_NO_READ_zTXt
|
#ifndef PNG_NO_READ_zTXt
|
||||||
#define PNG_READ_zTXt_SUPPORTED
|
#define PNG_READ_zTXt_SUPPORTED
|
||||||
|
#define PNG_zTXt_SUPPORTED
|
||||||
#endif
|
#endif
|
||||||
#ifndef PNG_NO_READ_OPT_PLTE
|
#ifndef PNG_NO_READ_OPT_PLTE
|
||||||
#define PNG_READ_OPT_PLTE_SUPPORTED /* only affects support of the optional */
|
#define PNG_READ_OPT_PLTE_SUPPORTED /* only affects support of the optional */
|
||||||
#endif /* PLTE chunk in RGB and RGBA images */
|
#endif /* PLTE chunk in RGB and RGBA images */
|
||||||
|
#if defined(PNG_READ_iTXt_SUPPORTED) || defined(PNG_READ_tEXt_SUPPORTED) || \
|
||||||
|
defined(PNG_READ_zTXt_SUPPORTED)
|
||||||
|
#define PNG_READ_TEXT_SUPPORTED
|
||||||
|
#define PNG_TEXT_SUPPORTED
|
||||||
|
#endif
|
||||||
#endif /* PNG_READ_ANCILLARY_CHUNKS_SUPPORTED */
|
#endif /* PNG_READ_ANCILLARY_CHUNKS_SUPPORTED */
|
||||||
|
|
||||||
#ifdef PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED
|
#ifdef PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED
|
||||||
#ifndef PNG_NO_WRITE_bKGD
|
#ifndef PNG_NO_WRITE_bKGD
|
||||||
#define PNG_WRITE_bKGD_SUPPORTED
|
#define PNG_WRITE_bKGD_SUPPORTED
|
||||||
|
#ifndef PNG_bKGD_SUPPORTED
|
||||||
|
# define PNG_bKGD_SUPPORTED
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#ifndef PNG_NO_WRITE_cHRM
|
#ifndef PNG_NO_WRITE_cHRM
|
||||||
#define PNG_WRITE_cHRM_SUPPORTED
|
#define PNG_WRITE_cHRM_SUPPORTED
|
||||||
|
#ifndef PNG_cHRM_SUPPORTED
|
||||||
|
# define PNG_cHRM_SUPPORTED
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#ifndef PNG_NO_WRITE_gAMA
|
#ifndef PNG_NO_WRITE_gAMA
|
||||||
#define PNG_WRITE_gAMA_SUPPORTED
|
#define PNG_WRITE_gAMA_SUPPORTED
|
||||||
|
#ifndef PNG_gAMA_SUPPORTED
|
||||||
|
# define PNG_gAMA_SUPPORTED
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#ifndef PNG_NO_WRITE_hIST
|
#ifndef PNG_NO_WRITE_hIST
|
||||||
#define PNG_WRITE_hIST_SUPPORTED
|
#define PNG_WRITE_hIST_SUPPORTED
|
||||||
|
#ifndef PNG_hIST_SUPPORTED
|
||||||
|
# define PNG_hIST_SUPPORTED
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifndef PNG_NO_WRITE_iCCP
|
||||||
|
#define PNG_WRITE_iCCP_SUPPORTED
|
||||||
|
#ifndef PNG_iCCP_SUPPORTED
|
||||||
|
# define PNG_iCCP_SUPPORTED
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifndef PNG_NO_WRITE_iTXt
|
||||||
|
#define PNG_WRITE_iTXt_SUPPORTED
|
||||||
|
#ifndef PNG_iTXt_SUPPORTED
|
||||||
|
# define PNG_iTXt_SUPPORTED
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#ifndef PNG_NO_WRITE_oFFs
|
#ifndef PNG_NO_WRITE_oFFs
|
||||||
#define PNG_WRITE_oFFs_SUPPORTED
|
#define PNG_WRITE_oFFs_SUPPORTED
|
||||||
|
#ifndef PNG_oFFs_SUPPORTED
|
||||||
|
# define PNG_oFFs_SUPPORTED
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#ifndef PNG_NO_WRITE_pCAL
|
#ifndef PNG_NO_WRITE_pCAL
|
||||||
#define PNG_WRITE_pCAL_SUPPORTED
|
#define PNG_WRITE_pCAL_SUPPORTED
|
||||||
|
#ifndef PNG_pCAL_SUPPORTED
|
||||||
|
# define PNG_pCAL_SUPPORTED
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifndef PNG_NO_WRITE_sCAL
|
||||||
|
#define PNG_WRITE_sCAL_SUPPORTED
|
||||||
|
#ifndef PNG_sCAL_SUPPORTED
|
||||||
|
# define PNG_sCAL_SUPPORTED
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#ifndef PNG_NO_WRITE_pHYs
|
#ifndef PNG_NO_WRITE_pHYs
|
||||||
#define PNG_WRITE_pHYs_SUPPORTED
|
#define PNG_WRITE_pHYs_SUPPORTED
|
||||||
|
#ifndef PNG_pHYs_SUPPORTED
|
||||||
|
# define PNG_pHYs_SUPPORTED
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#ifndef PNG_NO_WRITE_sBIT
|
#ifndef PNG_NO_WRITE_sBIT
|
||||||
#define PNG_WRITE_sBIT_SUPPORTED
|
#define PNG_WRITE_sBIT_SUPPORTED
|
||||||
|
#ifndef PNG_sBIT_SUPPORTED
|
||||||
|
# define PNG_sBIT_SUPPORTED
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifndef PNG_NO_WRITE_sPLT
|
||||||
|
#define PNG_WRITE_sPLT_SUPPORTED
|
||||||
|
#ifndef PNG_sPLT_SUPPORTED
|
||||||
|
# define PNG_sPLT_SUPPORTED
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#ifndef PNG_NO_WRITE_sRGB
|
#ifndef PNG_NO_WRITE_sRGB
|
||||||
#define PNG_WRITE_sRGB_SUPPORTED
|
#define PNG_WRITE_sRGB_SUPPORTED
|
||||||
|
#ifndef PNG_sRGB_SUPPORTED
|
||||||
|
# define PNG_sRGB_SUPPORTED
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#ifndef PNG_NO_WRITE_tEXt
|
#ifndef PNG_NO_WRITE_tEXt
|
||||||
#define PNG_WRITE_tEXt_SUPPORTED
|
#define PNG_WRITE_tEXt_SUPPORTED
|
||||||
|
#ifndef PNG_tEXt_SUPPORTED
|
||||||
|
# define PNG_tEXt_SUPPORTED
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#ifndef PNG_NO_WRITE_tIME
|
#ifndef PNG_NO_WRITE_tIME
|
||||||
#define PNG_WRITE_tIME_SUPPORTED
|
#define PNG_WRITE_tIME_SUPPORTED
|
||||||
|
#ifndef PNG_tIME_SUPPORTED
|
||||||
|
# define PNG_tIME_SUPPORTED
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#ifndef PNG_NO_WRITE_tRNS
|
#ifndef PNG_NO_WRITE_tRNS
|
||||||
#define PNG_WRITE_tRNS_SUPPORTED
|
#define PNG_WRITE_tRNS_SUPPORTED
|
||||||
|
#ifndef PNG_tRNS_SUPPORTED
|
||||||
|
# define PNG_tRNS_SUPPORTED
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#ifndef PNG_NO_WRITE_zTXt
|
#ifndef PNG_NO_WRITE_zTXt
|
||||||
#define PNG_WRITE_zTXt_SUPPORTED
|
#define PNG_WRITE_zTXt_SUPPORTED
|
||||||
|
#ifndef PNG_zTXt_SUPPORTED
|
||||||
|
# define PNG_zTXt_SUPPORTED
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_WRITE_iTXt_SUPPORTED) || defined(PNG_WRITE_tEXt_SUPPORTED) || \
|
||||||
|
defined(PNG_WRITE_zTXt_SUPPORTED)
|
||||||
|
#define PNG_WRITE_TEXT_SUPPORTED
|
||||||
|
#ifndef PNG_TEXT_SUPPORTED
|
||||||
|
# define PNG_TEXT_SUPPORTED
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#endif /* PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED */
|
#endif /* PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED */
|
||||||
|
|
||||||
@@ -696,6 +814,28 @@ typedef z_stream FAR * png_zstreamp;
|
|||||||
# define PNG_EXPORT(type,symbol) type symbol
|
# define PNG_EXPORT(type,symbol) type symbol
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(__MINGW32__) || defined(__CYGWIN32__)
|
||||||
|
# define PNG_ATTR_DLLIMP
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef PNG_EXPORT_VAR
|
||||||
|
# ifdef PNG_DECL_DLLEXP
|
||||||
|
# define PNG_EXPORT_VAR(type) extern __declspec(dllexport) type
|
||||||
|
# endif
|
||||||
|
# ifdef PNG_ATTR_DLLEXP
|
||||||
|
# define PNG_EXPORT_VAR(type) extern type __attribute__((dllexport))
|
||||||
|
# endif
|
||||||
|
# ifdef PNG_DECL_DLLIMP
|
||||||
|
# define PNG_EXPORT_VAR(type) extern __declspec(dllimport) type
|
||||||
|
# endif
|
||||||
|
# ifdef PNG_ATTR_DLLIMP
|
||||||
|
# define PNG_EXPORT_VAR(type) extern type __attribute__((dllimport))
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef PNG_EXPORT_VAR
|
||||||
|
# define PNG_EXPORT_VAR(type) extern type
|
||||||
|
#endif
|
||||||
|
|
||||||
/* User may want to use these so not in PNG_INTERNAL. Any library functions
|
/* User may want to use these so not in PNG_INTERNAL. Any library functions
|
||||||
* that are passed far data must be model independent.
|
* that are passed far data must be model independent.
|
||||||
|
|||||||
64
pngcrush.c
64
pngcrush.c
@@ -14,7 +14,7 @@
|
|||||||
* occasionally creating Linux executables.
|
* occasionally creating Linux executables.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define PNGCRUSH_VERSION "1.2.0"
|
#define PNGCRUSH_VERSION "1.2.1"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* COPYRIGHT NOTICE, DISCLAIMER, AND LICENSE:
|
* COPYRIGHT NOTICE, DISCLAIMER, AND LICENSE:
|
||||||
@@ -41,12 +41,26 @@
|
|||||||
* or altered from any source or altered source distribution.
|
* or altered from any source or altered source distribution.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Version 1.2.*: check for unused alpha channel and ok-to-reduce-depth
|
/* To do:
|
||||||
* rearrange palette to put most-used color first and
|
*
|
||||||
* transparent color second.
|
* Version 1.2.*: check for unused alpha channel and ok-to-reduce-depth.
|
||||||
|
* Rearrange palette to put most-used color first and
|
||||||
|
* transparent color second.
|
||||||
|
*
|
||||||
|
* Version 1.2.2: Add iCCP, iTXt, sCAL, and sPLT support, which are
|
||||||
|
* now supported by libpng.
|
||||||
|
*
|
||||||
|
* Change log:
|
||||||
|
*
|
||||||
|
* Version 1.2.1: Fixed -srgb parameter so it really does take an argument,
|
||||||
|
* and so it continues to use "0" if an integer does not follow the -srgb.
|
||||||
|
* Added "-plte_len n" argument for truncating the PLTE. Be sure not to
|
||||||
|
* truncate it to less than the greatest index actually appearing in IDAT.
|
||||||
*
|
*
|
||||||
* Version 1.2.0: Removed registration requirement. Added open source
|
* Version 1.2.0: Removed registration requirement. Added open source
|
||||||
* license. Redefined TOO_FAR=32k in deflate.c
|
* license. Redefined TOO_FAR=32k in deflate.c.
|
||||||
|
*
|
||||||
|
* Changes prior to going "open source":
|
||||||
*
|
*
|
||||||
* Version 1.1.8: built with libpng-1.0.5a. Runs OK with pngvcrd.c.
|
* Version 1.1.8: built with libpng-1.0.5a. Runs OK with pngvcrd.c.
|
||||||
*
|
*
|
||||||
@@ -165,6 +179,7 @@ static int z_strategy;
|
|||||||
static int best_of_three;
|
static int best_of_three;
|
||||||
static int methods_specified=0;
|
static int methods_specified=0;
|
||||||
static int intent=-1;
|
static int intent=-1;
|
||||||
|
static int plte_len=-1;
|
||||||
static double specified_gamma=0.;
|
static double specified_gamma=0.;
|
||||||
static double force_specified_gamma=0.;
|
static double force_specified_gamma=0.;
|
||||||
static int double_gamma=0;
|
static int double_gamma=0;
|
||||||
@@ -697,6 +712,11 @@ main(int argc, char *argv[])
|
|||||||
nosave++;
|
nosave++;
|
||||||
pngcrush_mode=EXTENSION_MODE;
|
pngcrush_mode=EXTENSION_MODE;
|
||||||
}
|
}
|
||||||
|
else if(!strncmp(argv[i],"-plte_len",9))
|
||||||
|
{
|
||||||
|
names++;
|
||||||
|
plte_len=atoi(argv[++i]);
|
||||||
|
}
|
||||||
else if(!strncmp(argv[i],"-p",2))
|
else if(!strncmp(argv[i],"-p",2))
|
||||||
{
|
{
|
||||||
pauses++;
|
pauses++;
|
||||||
@@ -721,10 +741,19 @@ main(int argc, char *argv[])
|
|||||||
else if( !strncmp(argv[i],"-srgb",5) ||
|
else if( !strncmp(argv[i],"-srgb",5) ||
|
||||||
!strncmp(argv[i],"-sRGB",5))
|
!strncmp(argv[i],"-sRGB",5))
|
||||||
{
|
{
|
||||||
names++;
|
|
||||||
specified_gamma=.45455;
|
specified_gamma=.45455;
|
||||||
intent=0;
|
intent=0;
|
||||||
i++;
|
i++;
|
||||||
|
if(!strncmp(argv[i],"0",1) ||
|
||||||
|
!strncmp(argv[i],"1",1) ||
|
||||||
|
!strncmp(argv[i],"2",1) ||
|
||||||
|
!strncmp(argv[i],"3",1))
|
||||||
|
{
|
||||||
|
names++;
|
||||||
|
intent=(int)atoi(argv[i]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
i--;
|
||||||
}
|
}
|
||||||
else if(!strncmp(argv[i],"-s",2))
|
else if(!strncmp(argv[i],"-s",2))
|
||||||
{
|
{
|
||||||
@@ -1053,6 +1082,16 @@ main(int argc, char *argv[])
|
|||||||
fprintf(STDERR,
|
fprintf(STDERR,
|
||||||
"\n Useful in conjunction with -v option to get info.\n\n");
|
"\n Useful in conjunction with -v option to get info.\n\n");
|
||||||
|
|
||||||
|
fprintf(STDERR,
|
||||||
|
" -plte_len n (truncate PLTE)\n");
|
||||||
|
if(verbose > 1)
|
||||||
|
{
|
||||||
|
fprintf(STDERR,
|
||||||
|
"\n Truncates the PLTE. Be sure not to truncate it to\n");
|
||||||
|
fprintf(STDERR,
|
||||||
|
"\n less than the greatest index present in IDAT.\n");
|
||||||
|
|
||||||
|
}
|
||||||
fprintf(STDERR,
|
fprintf(STDERR,
|
||||||
" -q (quiet)\n");
|
" -q (quiet)\n");
|
||||||
if(verbose > 1)
|
if(verbose > 1)
|
||||||
@@ -1173,7 +1212,7 @@ main(int argc, char *argv[])
|
|||||||
fprintf(STDERR,
|
fprintf(STDERR,
|
||||||
"\n zlib compression strategy to use with the preceding\n");
|
"\n zlib compression strategy to use with the preceding\n");
|
||||||
fprintf(STDERR,
|
fprintf(STDERR,
|
||||||
" preceding '-m method' argument.\n\n");
|
" '-m method' argument.\n\n");
|
||||||
}
|
}
|
||||||
#if 0
|
#if 0
|
||||||
fprintf(STDERR,
|
fprintf(STDERR,
|
||||||
@@ -1558,7 +1597,7 @@ main(int argc, char *argv[])
|
|||||||
(png_bytep)png_malloc(read_ptr, (png_uint_32)read_ptr->zbuf_size);
|
(png_bytep)png_malloc(read_ptr, (png_uint_32)read_ptr->zbuf_size);
|
||||||
}
|
}
|
||||||
if(nosave == 0)
|
if(nosave == 0)
|
||||||
if(write_ptr->zbuf_size < (png_size_t)max_idat_size)
|
if(write_ptr->zbuf_size > (png_size_t)max_idat_size)
|
||||||
{
|
{
|
||||||
if(verbose > 2)
|
if(verbose > 2)
|
||||||
printf("reinitializing write zbuf.\n");
|
printf("reinitializing write zbuf.\n");
|
||||||
@@ -1697,6 +1736,7 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
png_set_compression_window_bits(write_ptr, compression_window);
|
png_set_compression_window_bits(write_ptr, compression_window);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(verbose > 1)
|
if(verbose > 1)
|
||||||
fprintf(STDERR, " Setting IHDR\n");
|
fprintf(STDERR, " Setting IHDR\n");
|
||||||
|
|
||||||
@@ -1833,7 +1873,7 @@ main(int argc, char *argv[])
|
|||||||
#endif
|
#endif
|
||||||
#if defined(PNG_READ_oFFs_SUPPORTED) && defined(PNG_WRITE_oFFs_SUPPORTED)
|
#if defined(PNG_READ_oFFs_SUPPORTED) && defined(PNG_WRITE_oFFs_SUPPORTED)
|
||||||
{
|
{
|
||||||
png_uint_32 offset_x, offset_y;
|
png_int_32 offset_x, offset_y;
|
||||||
int unit_type;
|
int unit_type;
|
||||||
|
|
||||||
if (png_get_oFFs(read_ptr, read_info_ptr,&offset_x,&offset_y,&unit_type))
|
if (png_get_oFFs(read_ptr, read_info_ptr,&offset_x,&offset_y,&unit_type))
|
||||||
@@ -1993,6 +2033,8 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
if (png_get_PLTE(read_ptr, read_info_ptr, &palette, &num_palette))
|
if (png_get_PLTE(read_ptr, read_info_ptr, &palette, &num_palette))
|
||||||
{
|
{
|
||||||
|
if (plte_len > 0)
|
||||||
|
num_palette=plte_len;
|
||||||
if(output_color_type == 3)
|
if(output_color_type == 3)
|
||||||
png_set_PLTE(write_ptr, write_info_ptr, palette, num_palette);
|
png_set_PLTE(write_ptr, write_info_ptr, palette, num_palette);
|
||||||
else if(keep_chunk("PLTE",argv))
|
else if(keep_chunk("PLTE",argv))
|
||||||
@@ -2477,6 +2519,10 @@ png_measure_idat(png_structp png_ptr, png_infop info_ptr)
|
|||||||
|
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
|
#ifdef PNG_USE_LOCAL_ARRAYS
|
||||||
|
PNG_IDAT;
|
||||||
|
PNG_IEND;
|
||||||
|
#endif
|
||||||
png_byte chunk_length[4];
|
png_byte chunk_length[4];
|
||||||
png_byte chunk_name[5];
|
png_byte chunk_name[5];
|
||||||
png_uint_32 length;
|
png_uint_32 length;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngerror.c - stub functions for i/o and memory allocation
|
/* pngerror.c - stub functions for i/o and memory allocation
|
||||||
*
|
*
|
||||||
* libpng 1.0.5a - October 23, 1999
|
* libpng 1.0.5f - December 6, 1999
|
||||||
* For conditions of distribution and use, see copyright notice in png.h
|
* For conditions of distribution and use, see copyright notice in png.h
|
||||||
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
||||||
* Copyright (c) 1996, 1997 Andreas Dilger
|
* Copyright (c) 1996, 1997 Andreas Dilger
|
||||||
|
|||||||
71
pngget.c
71
pngget.c
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngget.c - retrieval of values from info struct
|
/* pngget.c - retrieval of values from info struct
|
||||||
*
|
*
|
||||||
* libpng 1.0.5a - October 23, 1999
|
* libpng 1.0.5f - December 6, 1999
|
||||||
* For conditions of distribution and use, see copyright notice in png.h
|
* For conditions of distribution and use, see copyright notice in png.h
|
||||||
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
||||||
* Copyright (c) 1996, 1997 Andreas Dilger
|
* Copyright (c) 1996, 1997 Andreas Dilger
|
||||||
@@ -104,7 +104,7 @@ png_get_compression_type(png_structp png_ptr, png_infop info_ptr)
|
|||||||
png_uint_32
|
png_uint_32
|
||||||
png_get_x_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
|
png_get_x_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
|
||||||
{
|
{
|
||||||
#if defined(PNG_READ_pHYs_SUPPORTED) || defined(PNG_WRITE_pHYs_SUPPORTED)
|
#if defined(PNG_pHYs_SUPPORTED)
|
||||||
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs))
|
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs))
|
||||||
{
|
{
|
||||||
png_debug1(1, "in %s retrieval function\n", "png_get_x_pixels_per_meter");
|
png_debug1(1, "in %s retrieval function\n", "png_get_x_pixels_per_meter");
|
||||||
@@ -120,7 +120,7 @@ png_get_x_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
|
|||||||
png_uint_32
|
png_uint_32
|
||||||
png_get_y_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
|
png_get_y_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
|
||||||
{
|
{
|
||||||
#if defined(PNG_READ_pHYs_SUPPORTED) || defined(PNG_WRITE_pHYs_SUPPORTED)
|
#if defined(PNG_pHYs_SUPPORTED)
|
||||||
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs))
|
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs))
|
||||||
{
|
{
|
||||||
png_debug1(1, "in %s retrieval function\n", "png_get_y_pixels_per_meter");
|
png_debug1(1, "in %s retrieval function\n", "png_get_y_pixels_per_meter");
|
||||||
@@ -136,7 +136,7 @@ png_get_y_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
|
|||||||
png_uint_32
|
png_uint_32
|
||||||
png_get_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
|
png_get_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
|
||||||
{
|
{
|
||||||
#if defined(PNG_READ_pHYs_SUPPORTED) || defined(PNG_WRITE_pHYs_SUPPORTED)
|
#if defined(PNG_pHYs_SUPPORTED)
|
||||||
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs))
|
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs))
|
||||||
{
|
{
|
||||||
png_debug1(1, "in %s retrieval function\n", "png_get_pixels_per_meter");
|
png_debug1(1, "in %s retrieval function\n", "png_get_pixels_per_meter");
|
||||||
@@ -153,7 +153,7 @@ png_get_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
|
|||||||
float
|
float
|
||||||
png_get_pixel_aspect_ratio(png_structp png_ptr, png_infop info_ptr)
|
png_get_pixel_aspect_ratio(png_structp png_ptr, png_infop info_ptr)
|
||||||
{
|
{
|
||||||
#if defined(PNG_READ_pHYs_SUPPORTED) || defined(PNG_WRITE_pHYs_SUPPORTED)
|
#if defined(PNG_pHYs_SUPPORTED)
|
||||||
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs))
|
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs))
|
||||||
{
|
{
|
||||||
png_debug1(1, "in %s retrieval function\n", "png_get_aspect_ratio");
|
png_debug1(1, "in %s retrieval function\n", "png_get_aspect_ratio");
|
||||||
@@ -171,7 +171,7 @@ png_get_pixel_aspect_ratio(png_structp png_ptr, png_infop info_ptr)
|
|||||||
png_uint_32
|
png_uint_32
|
||||||
png_get_x_offset_microns(png_structp png_ptr, png_infop info_ptr)
|
png_get_x_offset_microns(png_structp png_ptr, png_infop info_ptr)
|
||||||
{
|
{
|
||||||
#if defined(PNG_READ_oFFs_SUPPORTED) || defined(PNG_WRITE_oFFs_SUPPORTED)
|
#if defined(PNG_oFFs_SUPPORTED)
|
||||||
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs))
|
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs))
|
||||||
{
|
{
|
||||||
png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns");
|
png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns");
|
||||||
@@ -187,7 +187,7 @@ png_get_x_offset_microns(png_structp png_ptr, png_infop info_ptr)
|
|||||||
png_uint_32
|
png_uint_32
|
||||||
png_get_y_offset_microns(png_structp png_ptr, png_infop info_ptr)
|
png_get_y_offset_microns(png_structp png_ptr, png_infop info_ptr)
|
||||||
{
|
{
|
||||||
#if defined(PNG_READ_oFFs_SUPPORTED) || defined(PNG_WRITE_oFFs_SUPPORTED)
|
#if defined(PNG_oFFs_SUPPORTED)
|
||||||
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs))
|
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs))
|
||||||
{
|
{
|
||||||
png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns");
|
png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns");
|
||||||
@@ -203,7 +203,7 @@ png_get_y_offset_microns(png_structp png_ptr, png_infop info_ptr)
|
|||||||
png_uint_32
|
png_uint_32
|
||||||
png_get_x_offset_pixels(png_structp png_ptr, png_infop info_ptr)
|
png_get_x_offset_pixels(png_structp png_ptr, png_infop info_ptr)
|
||||||
{
|
{
|
||||||
#if defined(PNG_READ_oFFs_SUPPORTED) || defined(PNG_WRITE_oFFs_SUPPORTED)
|
#if defined(PNG_oFFs_SUPPORTED)
|
||||||
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs))
|
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs))
|
||||||
{
|
{
|
||||||
png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns");
|
png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns");
|
||||||
@@ -219,7 +219,7 @@ png_get_x_offset_pixels(png_structp png_ptr, png_infop info_ptr)
|
|||||||
png_uint_32
|
png_uint_32
|
||||||
png_get_y_offset_pixels(png_structp png_ptr, png_infop info_ptr)
|
png_get_y_offset_pixels(png_structp png_ptr, png_infop info_ptr)
|
||||||
{
|
{
|
||||||
#if defined(PNG_READ_oFFs_SUPPORTED) || defined(PNG_WRITE_oFFs_SUPPORTED)
|
#if defined(PNG_oFFs_SUPPORTED)
|
||||||
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs))
|
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs))
|
||||||
{
|
{
|
||||||
png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns");
|
png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns");
|
||||||
@@ -403,6 +403,39 @@ png_get_sRGB(png_structp png_ptr, png_infop info_ptr, int *file_srgb_intent)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_READ_iCCP_SUPPORTED)
|
||||||
|
png_uint_32
|
||||||
|
png_get_iCCP(png_structp png_ptr, png_infop info_ptr,
|
||||||
|
png_charpp name, int *compression_type,
|
||||||
|
png_charpp profile, png_int_32 *proflen)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP)
|
||||||
|
&& name != NULL && profile != NULL && proflen != NULL)
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function\n", "iCCP");
|
||||||
|
*name = info_ptr->iccp_name;
|
||||||
|
*profile = info_ptr->iccp_profile;
|
||||||
|
/* compression_type is a dummy so the API won't have to change
|
||||||
|
if we introduce multiple compression types later. */
|
||||||
|
*proflen = (int)info_ptr->iccp_proflen;
|
||||||
|
*compression_type = (int)info_ptr->iccp_compression;
|
||||||
|
return (PNG_INFO_iCCP);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_READ_sPLT_SUPPORTED) || defined(PNG_READ_zTXt_SUPPORTED)
|
||||||
|
png_uint_32
|
||||||
|
png_get_spalettes(png_structp png_ptr, png_infop info_ptr,
|
||||||
|
png_spalette_pp spalettes)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL && spalettes != NULL)
|
||||||
|
*spalettes = info_ptr->splt_palettes;
|
||||||
|
return ((png_uint_32)info_ptr->splt_palettes_num);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(PNG_READ_hIST_SUPPORTED)
|
#if defined(PNG_READ_hIST_SUPPORTED)
|
||||||
png_uint_32
|
png_uint_32
|
||||||
png_get_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p *hist)
|
png_get_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p *hist)
|
||||||
@@ -467,7 +500,7 @@ png_get_IHDR(png_structp png_ptr, png_infop info_ptr,
|
|||||||
#if defined(PNG_READ_oFFs_SUPPORTED)
|
#if defined(PNG_READ_oFFs_SUPPORTED)
|
||||||
png_uint_32
|
png_uint_32
|
||||||
png_get_oFFs(png_structp png_ptr, png_infop info_ptr,
|
png_get_oFFs(png_structp png_ptr, png_infop info_ptr,
|
||||||
png_uint_32 *offset_x, png_uint_32 *offset_y, int *unit_type)
|
png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type)
|
||||||
{
|
{
|
||||||
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)
|
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)
|
||||||
&& offset_x != NULL && offset_y != NULL && unit_type != NULL)
|
&& offset_x != NULL && offset_y != NULL && unit_type != NULL)
|
||||||
@@ -506,6 +539,22 @@ png_get_pCAL(png_structp png_ptr, png_infop info_ptr,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_READ_sCAL_SUPPORTED) || defined(PNG_WRITE_sCAL_SUPPORTED)
|
||||||
|
png_uint_32
|
||||||
|
png_get_sCAL(png_structp png_ptr, png_infop info_ptr,
|
||||||
|
png_charpp unit, double *width, double *height)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL && info_ptr->valid & PNG_INFO_sCAL)
|
||||||
|
{
|
||||||
|
*unit = info_ptr->scal_unit;
|
||||||
|
*width = info_ptr->scal_pixel_width;
|
||||||
|
*height = info_ptr->scal_pixel_height;
|
||||||
|
return (PNG_INFO_sCAL);
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(PNG_READ_pHYs_SUPPORTED)
|
#if defined(PNG_READ_pHYs_SUPPORTED)
|
||||||
png_uint_32
|
png_uint_32
|
||||||
png_get_pHYs(png_structp png_ptr, png_infop info_ptr,
|
png_get_pHYs(png_structp png_ptr, png_infop info_ptr,
|
||||||
@@ -567,7 +616,7 @@ png_get_sBIT(png_structp png_ptr, png_infop info_ptr, png_color_8p *sig_bit)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(PNG_READ_tEXt_SUPPORTED) || defined(PNG_READ_zTXt_SUPPORTED)
|
#if defined(PNG_READ_TEXT_SUPPORTED)
|
||||||
png_uint_32
|
png_uint_32
|
||||||
png_get_text(png_structp png_ptr, png_infop info_ptr, png_textp *text_ptr,
|
png_get_text(png_structp png_ptr, png_infop info_ptr, png_textp *text_ptr,
|
||||||
int *num_text)
|
int *num_text)
|
||||||
|
|||||||
2
pngmem.c
2
pngmem.c
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngmem.c - stub functions for memory allocation
|
/* pngmem.c - stub functions for memory allocation
|
||||||
*
|
*
|
||||||
* libpng 1.0.5a - October 23, 1999
|
* libpng 1.0.5f - December 6, 1999
|
||||||
* For conditions of distribution and use, see copyright notice in png.h
|
* For conditions of distribution and use, see copyright notice in png.h
|
||||||
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
||||||
* Copyright (c) 1996, 1997 Andreas Dilger
|
* Copyright (c) 1996, 1997 Andreas Dilger
|
||||||
|
|||||||
215
pngpread.c
215
pngpread.c
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngpread.c - read a png file in push mode
|
/* pngpread.c - read a png file in push mode
|
||||||
*
|
*
|
||||||
* libpng 1.0.5a - October 23, 1999
|
* libpng 1.0.5f - December 6, 1999
|
||||||
* For conditions of distribution and use, see copyright notice in png.h
|
* For conditions of distribution and use, see copyright notice in png.h
|
||||||
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
||||||
* Copyright (c) 1996, 1997 Andreas Dilger
|
* Copyright (c) 1996, 1997 Andreas Dilger
|
||||||
@@ -13,6 +13,17 @@
|
|||||||
|
|
||||||
#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
|
#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
|
||||||
|
|
||||||
|
/* push model modes */
|
||||||
|
#define PNG_READ_SIG_MODE 0
|
||||||
|
#define PNG_READ_CHUNK_MODE 1
|
||||||
|
#define PNG_READ_IDAT_MODE 2
|
||||||
|
#define PNG_SKIP_MODE 3
|
||||||
|
#define PNG_READ_tEXt_MODE 4
|
||||||
|
#define PNG_READ_zTXt_MODE 5
|
||||||
|
#define PNG_READ_DONE_MODE 6
|
||||||
|
#define PNG_READ_iTXt_MODE 7
|
||||||
|
#define PNG_ERROR_MODE 8
|
||||||
|
|
||||||
void
|
void
|
||||||
png_process_data(png_structp png_ptr, png_infop info_ptr,
|
png_process_data(png_structp png_ptr, png_infop info_ptr,
|
||||||
png_bytep buffer, png_size_t buffer_size)
|
png_bytep buffer, png_size_t buffer_size)
|
||||||
@@ -61,6 +72,13 @@ png_process_some_data(png_structp png_ptr, png_infop info_ptr)
|
|||||||
png_push_read_zTXt(png_ptr, info_ptr);
|
png_push_read_zTXt(png_ptr, info_ptr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_iTXt_SUPPORTED)
|
||||||
|
case PNG_READ_iTXt_MODE:
|
||||||
|
{
|
||||||
|
png_push_read_iTXt(png_ptr, info_ptr);
|
||||||
|
break;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
case PNG_SKIP_MODE:
|
case PNG_SKIP_MODE:
|
||||||
{
|
{
|
||||||
@@ -116,13 +134,58 @@ png_push_read_sig(png_structp png_ptr, png_infop info_ptr)
|
|||||||
void
|
void
|
||||||
png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
||||||
{
|
{
|
||||||
|
#ifdef PNG_USE_LOCAL_ARRAYS
|
||||||
|
PNG_IHDR;
|
||||||
|
PNG_IDAT;
|
||||||
|
PNG_IEND;
|
||||||
|
PNG_PLTE;
|
||||||
|
#if defined(PNG_READ_bKGD_SUPPORTED)
|
||||||
|
PNG_bKGD;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_cHRM_SUPPORTED)
|
||||||
|
PNG_cHRM;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_gAMA_SUPPORTED)
|
||||||
|
PNG_gAMA;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_hIST_SUPPORTED)
|
||||||
|
PNG_hIST;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_oFFs_SUPPORTED)
|
||||||
|
PNG_oFFs;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_pCAL_SUPPORTED)
|
||||||
|
PNG_pCAL;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_pHYs_SUPPORTED)
|
||||||
|
PNG_pHYs;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_sBIT_SUPPORTED)
|
||||||
|
PNG_sBIT;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_sRGB_SUPPORTED)
|
||||||
|
PNG_sRGB;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_tEXt_SUPPORTED)
|
||||||
|
PNG_tEXt;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_tIME_SUPPORTED)
|
||||||
|
PNG_tIME;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_tRNS_SUPPORTED)
|
||||||
|
PNG_tRNS;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_zTXt_SUPPORTED)
|
||||||
|
PNG_zTXt;
|
||||||
|
#endif
|
||||||
|
#endif /* PNG_USE_LOCAL_ARRAYS */
|
||||||
/* First we make sure we have enough data for the 4 byte chunk name
|
/* First we make sure we have enough data for the 4 byte chunk name
|
||||||
* and the 4 byte chunk length before proceeding with decoding the
|
* and the 4 byte chunk length before proceeding with decoding the
|
||||||
* chunk data. To fully decode each of these chunks, we also make
|
* chunk data. To fully decode each of these chunks, we also make
|
||||||
* sure we have enough data in the buffer for the 4 byte CRC at the
|
* sure we have enough data in the buffer for the 4 byte CRC at the
|
||||||
* end of every chunk (except IDAT, which is handled separately).
|
* end of every chunk (except IDAT, which is handled separately).
|
||||||
*/
|
*/
|
||||||
if (!(png_ptr->flags & PNG_FLAG_HAVE_CHUNK_HEADER))
|
if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
|
||||||
{
|
{
|
||||||
png_byte chunk_length[4];
|
png_byte chunk_length[4];
|
||||||
|
|
||||||
@@ -136,7 +199,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
|||||||
png_ptr->push_length = png_get_uint_32(chunk_length);
|
png_ptr->push_length = png_get_uint_32(chunk_length);
|
||||||
png_reset_crc(png_ptr);
|
png_reset_crc(png_ptr);
|
||||||
png_crc_read(png_ptr, png_ptr->chunk_name, 4);
|
png_crc_read(png_ptr, png_ptr->chunk_name, 4);
|
||||||
png_ptr->flags |= PNG_FLAG_HAVE_CHUNK_HEADER;
|
png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4))
|
if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4))
|
||||||
@@ -159,7 +222,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
|||||||
|
|
||||||
png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length);
|
png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length);
|
||||||
}
|
}
|
||||||
else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
|
else if (!png_memcmp(png_ptr->chunk_name, (png_bytep)png_IDAT, 4))
|
||||||
{
|
{
|
||||||
/* If we reach an IDAT chunk, this means we have read all of the
|
/* If we reach an IDAT chunk, this means we have read all of the
|
||||||
* header chunks, and we can start reading the image (or if this
|
* header chunks, and we can start reading the image (or if this
|
||||||
@@ -337,13 +400,19 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
|
|||||||
{
|
{
|
||||||
png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length);
|
png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_iTXt_SUPPORTED)
|
||||||
|
else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4))
|
||||||
|
{
|
||||||
|
png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length);
|
png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
png_ptr->flags &= ~PNG_FLAG_HAVE_CHUNK_HEADER;
|
png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -496,7 +565,10 @@ png_push_restore_buffer(png_structp png_ptr, png_bytep buffer,
|
|||||||
void
|
void
|
||||||
png_push_read_IDAT(png_structp png_ptr)
|
png_push_read_IDAT(png_structp png_ptr)
|
||||||
{
|
{
|
||||||
if (!(png_ptr->flags & PNG_FLAG_HAVE_CHUNK_HEADER))
|
#ifdef PNG_USE_LOCAL_ARRAYS
|
||||||
|
PNG_IDAT;
|
||||||
|
#endif
|
||||||
|
if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
|
||||||
{
|
{
|
||||||
png_byte chunk_length[4];
|
png_byte chunk_length[4];
|
||||||
|
|
||||||
@@ -511,9 +583,9 @@ png_push_read_IDAT(png_structp png_ptr)
|
|||||||
|
|
||||||
png_reset_crc(png_ptr);
|
png_reset_crc(png_ptr);
|
||||||
png_crc_read(png_ptr, png_ptr->chunk_name, 4);
|
png_crc_read(png_ptr, png_ptr->chunk_name, 4);
|
||||||
png_ptr->flags |= PNG_FLAG_HAVE_CHUNK_HEADER;
|
png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
|
||||||
|
|
||||||
if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
|
if (png_memcmp(png_ptr->chunk_name, (png_bytep)png_IDAT, 4))
|
||||||
{
|
{
|
||||||
png_ptr->process_mode = PNG_READ_CHUNK_MODE;
|
png_ptr->process_mode = PNG_READ_CHUNK_MODE;
|
||||||
if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
|
if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
|
||||||
@@ -576,7 +648,7 @@ png_push_read_IDAT(png_structp png_ptr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
png_crc_finish(png_ptr, 0);
|
png_crc_finish(png_ptr, 0);
|
||||||
png_ptr->flags &= ~PNG_FLAG_HAVE_CHUNK_HEADER;
|
png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -767,6 +839,32 @@ png_push_process_row(png_structp png_ptr)
|
|||||||
void
|
void
|
||||||
png_read_push_finish_row(png_structp png_ptr)
|
png_read_push_finish_row(png_structp png_ptr)
|
||||||
{
|
{
|
||||||
|
#ifdef PNG_USE_LOCAL_ARRAYS
|
||||||
|
/* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
|
||||||
|
|
||||||
|
/* start of interlace block */
|
||||||
|
const int png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
|
||||||
|
|
||||||
|
/* offset to next interlace block */
|
||||||
|
const int png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
|
||||||
|
|
||||||
|
/* start of interlace block in the y direction */
|
||||||
|
const int png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
|
||||||
|
|
||||||
|
/* offset to next interlace block in the y direction */
|
||||||
|
const int png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
|
||||||
|
|
||||||
|
/* Width of interlace block. This is not currently used - if you need
|
||||||
|
* it, uncomment it here and in png.h
|
||||||
|
const int png_pass_width[] = {8, 4, 4, 2, 2, 1, 1};
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Height of interlace block. This is not currently used - if you need
|
||||||
|
* it, uncomment it here and in png.h
|
||||||
|
const int png_pass_height[] = {8, 8, 4, 4, 2, 2, 1};
|
||||||
|
*/
|
||||||
|
#endif
|
||||||
|
|
||||||
png_ptr->row_number++;
|
png_ptr->row_number++;
|
||||||
if (png_ptr->row_number < png_ptr->num_rows)
|
if (png_ptr->row_number < png_ptr->num_rows)
|
||||||
return;
|
return;
|
||||||
@@ -878,6 +976,7 @@ png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr)
|
|||||||
|
|
||||||
text_ptr = (png_textp)png_malloc(png_ptr, (png_uint_32)sizeof(png_text));
|
text_ptr = (png_textp)png_malloc(png_ptr, (png_uint_32)sizeof(png_text));
|
||||||
text_ptr->compression = PNG_TEXT_COMPRESSION_NONE;
|
text_ptr->compression = PNG_TEXT_COMPRESSION_NONE;
|
||||||
|
text_ptr->lang = (char *)NULL;
|
||||||
text_ptr->key = key;
|
text_ptr->key = key;
|
||||||
text_ptr->text = text;
|
text_ptr->text = text;
|
||||||
|
|
||||||
@@ -1057,6 +1156,101 @@ png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr)
|
|||||||
|
|
||||||
text_ptr = (png_textp)png_malloc(png_ptr, (png_uint_32)sizeof(png_text));
|
text_ptr = (png_textp)png_malloc(png_ptr, (png_uint_32)sizeof(png_text));
|
||||||
text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt;
|
text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt;
|
||||||
|
text_ptr->lang = (char *)NULL;
|
||||||
|
text_ptr->key = key;
|
||||||
|
text_ptr->text = text;
|
||||||
|
|
||||||
|
png_set_text(png_ptr, info_ptr, text_ptr, 1);
|
||||||
|
|
||||||
|
png_free(png_ptr, text_ptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_READ_iTXt_SUPPORTED)
|
||||||
|
void
|
||||||
|
png_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
|
||||||
|
{
|
||||||
|
if (png_ptr->mode == PNG_BEFORE_IHDR || png_ptr->mode & PNG_HAVE_IEND)
|
||||||
|
{
|
||||||
|
png_error(png_ptr, "Out of place iTXt");
|
||||||
|
/* to quiet some compiler warnings */
|
||||||
|
if(info_ptr == NULL) return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef PNG_MAX_MALLOC_64K
|
||||||
|
png_ptr->skip_length = 0; /* This may not be necessary */
|
||||||
|
|
||||||
|
if (length > (png_uint_32)65535L) /* Can't hold the entire string in memory */
|
||||||
|
{
|
||||||
|
png_warning(png_ptr, "iTXt chunk too large to fit in memory");
|
||||||
|
png_ptr->skip_length = length - (png_uint_32)65535L;
|
||||||
|
length = (png_uint_32)65535L;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
png_ptr->current_text = (png_charp)png_malloc(png_ptr,
|
||||||
|
(png_uint_32)(length+1));
|
||||||
|
png_ptr->current_text[length] = '\0';
|
||||||
|
png_ptr->current_text_ptr = png_ptr->current_text;
|
||||||
|
png_ptr->current_text_size = (png_size_t)length;
|
||||||
|
png_ptr->current_text_left = (png_size_t)length;
|
||||||
|
png_ptr->process_mode = PNG_READ_iTXt_MODE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr->buffer_size && png_ptr->current_text_left)
|
||||||
|
{
|
||||||
|
png_size_t text_size;
|
||||||
|
|
||||||
|
if (png_ptr->buffer_size < png_ptr->current_text_left)
|
||||||
|
text_size = png_ptr->buffer_size;
|
||||||
|
else
|
||||||
|
text_size = png_ptr->current_text_left;
|
||||||
|
png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
|
||||||
|
png_ptr->current_text_left -= text_size;
|
||||||
|
png_ptr->current_text_ptr += text_size;
|
||||||
|
}
|
||||||
|
if (!(png_ptr->current_text_left))
|
||||||
|
{
|
||||||
|
png_textp text_ptr;
|
||||||
|
png_charp text;
|
||||||
|
png_charp lang;
|
||||||
|
png_charp key;
|
||||||
|
|
||||||
|
if (png_ptr->buffer_size < 4)
|
||||||
|
{
|
||||||
|
png_push_save_buffer(png_ptr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
png_push_crc_finish(png_ptr);
|
||||||
|
|
||||||
|
#if defined(PNG_MAX_MALLOC_64K)
|
||||||
|
if (png_ptr->skip_length)
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
lang = png_ptr->current_text;
|
||||||
|
png_ptr->current_text = 0;
|
||||||
|
|
||||||
|
for (key = lang; *key; key++)
|
||||||
|
/* empty loop */ ;
|
||||||
|
|
||||||
|
if (key != lang + png_ptr->current_text_size)
|
||||||
|
key++;
|
||||||
|
|
||||||
|
for (text = key; *text; text++)
|
||||||
|
/* empty loop */ ;
|
||||||
|
|
||||||
|
if (text != key + png_ptr->current_text_size)
|
||||||
|
text++;
|
||||||
|
|
||||||
|
text_ptr = (png_textp)png_malloc(png_ptr, (png_uint_32)sizeof(png_text));
|
||||||
|
text_ptr->compression = PNG_TEXT_COMPRESSION_NONE;
|
||||||
|
text_ptr->lang = lang;
|
||||||
text_ptr->key = key;
|
text_ptr->key = key;
|
||||||
text_ptr->text = text;
|
text_ptr->text = text;
|
||||||
|
|
||||||
@@ -1115,6 +1309,9 @@ void
|
|||||||
png_progressive_combine_row (png_structp png_ptr,
|
png_progressive_combine_row (png_structp png_ptr,
|
||||||
png_bytep old_row, png_bytep new_row)
|
png_bytep old_row, png_bytep new_row)
|
||||||
{
|
{
|
||||||
|
#ifdef PNG_USE_LOCAL_ARRAYS
|
||||||
|
const int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff};
|
||||||
|
#endif
|
||||||
if (new_row != NULL) /* new_row must == png_ptr->row_buf here. */
|
if (new_row != NULL) /* new_row must == png_ptr->row_buf here. */
|
||||||
png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]);
|
png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]);
|
||||||
}
|
}
|
||||||
|
|||||||
170
pngread.c
170
pngread.c
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngread.c - read a PNG file
|
/* pngread.c - read a PNG file
|
||||||
*
|
*
|
||||||
* libpng 1.0.5a - October 23, 1999
|
* libpng 1.0.5f - December 6, 1999
|
||||||
* For conditions of distribution and use, see copyright notice in png.h
|
* For conditions of distribution and use, see copyright notice in png.h
|
||||||
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
||||||
* Copyright (c) 1996, 1997 Andreas Dilger
|
* Copyright (c) 1996, 1997 Andreas Dilger
|
||||||
@@ -63,7 +63,7 @@ png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,
|
|||||||
|
|
||||||
#ifdef PNG_USER_MEM_SUPPORTED
|
#ifdef PNG_USER_MEM_SUPPORTED
|
||||||
png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn);
|
png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn);
|
||||||
#endif /* PNG_USER_MEM_SUPPORTED */
|
#endif
|
||||||
|
|
||||||
png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn);
|
png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn);
|
||||||
|
|
||||||
@@ -179,6 +179,63 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)
|
|||||||
|
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
|
#ifdef PNG_USE_LOCAL_ARRAYS
|
||||||
|
PNG_IHDR;
|
||||||
|
PNG_IDAT;
|
||||||
|
PNG_IEND;
|
||||||
|
PNG_PLTE;
|
||||||
|
#if defined(PNG_READ_bKGD_SUPPORTED)
|
||||||
|
PNG_bKGD;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_cHRM_SUPPORTED)
|
||||||
|
PNG_cHRM;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_gAMA_SUPPORTED)
|
||||||
|
PNG_gAMA;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_hIST_SUPPORTED)
|
||||||
|
PNG_hIST;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_iCCP_SUPPORTED)
|
||||||
|
PNG_iCCP;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_iTXt_SUPPORTED)
|
||||||
|
PNG_iTXt;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_oFFs_SUPPORTED)
|
||||||
|
PNG_oFFs;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_pCAL_SUPPORTED)
|
||||||
|
PNG_pCAL;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_pHYs_SUPPORTED)
|
||||||
|
PNG_pHYs;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_sBIT_SUPPORTED)
|
||||||
|
PNG_sBIT;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_pCAL_SUPPORTED)
|
||||||
|
PNG_sCAL;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_sPLT_SUPPORTED)
|
||||||
|
PNG_sPLT;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_sRGB_SUPPORTED)
|
||||||
|
PNG_sRGB;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_tEXt_SUPPORTED)
|
||||||
|
PNG_tEXt;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_tIME_SUPPORTED)
|
||||||
|
PNG_tIME;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_tRNS_SUPPORTED)
|
||||||
|
PNG_tRNS;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_zTXt_SUPPORTED)
|
||||||
|
PNG_zTXt;
|
||||||
|
#endif
|
||||||
|
#endif /* PNG_GLOBAL_ARRAYS */
|
||||||
png_byte chunk_length[4];
|
png_byte chunk_length[4];
|
||||||
png_uint_32 length;
|
png_uint_32 length;
|
||||||
|
|
||||||
@@ -236,6 +293,10 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)
|
|||||||
else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4))
|
else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4))
|
||||||
png_handle_pCAL(png_ptr, info_ptr, length);
|
png_handle_pCAL(png_ptr, info_ptr, length);
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(PNG_READ_sCAL_SUPPORTED)
|
||||||
|
else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4))
|
||||||
|
png_handle_sCAL(png_ptr, info_ptr, length);
|
||||||
|
#endif
|
||||||
#if defined(PNG_READ_pHYs_SUPPORTED)
|
#if defined(PNG_READ_pHYs_SUPPORTED)
|
||||||
else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4))
|
else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4))
|
||||||
png_handle_pHYs(png_ptr, info_ptr, length);
|
png_handle_pHYs(png_ptr, info_ptr, length);
|
||||||
@@ -248,6 +309,14 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)
|
|||||||
else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4))
|
else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4))
|
||||||
png_handle_sRGB(png_ptr, info_ptr, length);
|
png_handle_sRGB(png_ptr, info_ptr, length);
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(PNG_READ_iCCP_SUPPORTED)
|
||||||
|
else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4))
|
||||||
|
png_handle_iCCP(png_ptr, info_ptr, length);
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_sPLT_SUPPORTED)
|
||||||
|
else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4))
|
||||||
|
png_handle_sPLT(png_ptr, info_ptr, length);
|
||||||
|
#endif
|
||||||
#if defined(PNG_READ_tEXt_SUPPORTED)
|
#if defined(PNG_READ_tEXt_SUPPORTED)
|
||||||
else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4))
|
else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4))
|
||||||
png_handle_tEXt(png_ptr, info_ptr, length);
|
png_handle_tEXt(png_ptr, info_ptr, length);
|
||||||
@@ -263,6 +332,10 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)
|
|||||||
#if defined(PNG_READ_zTXt_SUPPORTED)
|
#if defined(PNG_READ_zTXt_SUPPORTED)
|
||||||
else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4))
|
else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4))
|
||||||
png_handle_zTXt(png_ptr, info_ptr, length);
|
png_handle_zTXt(png_ptr, info_ptr, length);
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_iTXt_SUPPORTED)
|
||||||
|
else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4))
|
||||||
|
png_handle_iTXt(png_ptr, info_ptr, length);
|
||||||
#endif
|
#endif
|
||||||
else
|
else
|
||||||
png_handle_unknown(png_ptr, info_ptr, length);
|
png_handle_unknown(png_ptr, info_ptr, length);
|
||||||
@@ -297,6 +370,11 @@ png_start_read_image(png_structp png_ptr)
|
|||||||
void
|
void
|
||||||
png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
|
png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
|
||||||
{
|
{
|
||||||
|
#ifdef PNG_USE_LOCAL_ARRAYS
|
||||||
|
PNG_IDAT;
|
||||||
|
const int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff};
|
||||||
|
const int png_pass_mask[7] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff};
|
||||||
|
#endif
|
||||||
int ret;
|
int ret;
|
||||||
png_debug2(1, "in png_read_row (row %d, pass %d)\n",
|
png_debug2(1, "in png_read_row (row %d, pass %d)\n",
|
||||||
png_ptr->row_number, png_ptr->pass);
|
png_ptr->row_number, png_ptr->pass);
|
||||||
@@ -529,7 +607,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
|
|||||||
* not called png_set_interlace_handling(), the display_row buffer will
|
* not called png_set_interlace_handling(), the display_row buffer will
|
||||||
* be ignored, so pass NULL to it.
|
* be ignored, so pass NULL to it.
|
||||||
*
|
*
|
||||||
* [*] png_handle_alpha() does not exist yet, as of libpng version 1.0.5a.
|
* [*] png_handle_alpha() does not exist yet, as of libpng version 1.0.5f.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -578,7 +656,7 @@ png_read_rows(png_structp png_ptr, png_bytepp row,
|
|||||||
* only call this function once. If you desire to have an image for
|
* only call this function once. If you desire to have an image for
|
||||||
* each pass of a interlaced image, use png_read_rows() instead.
|
* each pass of a interlaced image, use png_read_rows() instead.
|
||||||
*
|
*
|
||||||
* [*] png_handle_alpha() does not exist yet, as of libpng version 1.0.5a.
|
* [*] png_handle_alpha() does not exist yet, as of libpng version 1.0.5f.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
png_read_image(png_structp png_ptr, png_bytepp image)
|
png_read_image(png_structp png_ptr, png_bytepp image)
|
||||||
@@ -630,6 +708,64 @@ png_read_end(png_structp png_ptr, png_infop info_ptr)
|
|||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
#ifdef PNG_USE_LOCAL_ARRAYS
|
||||||
|
PNG_IHDR;
|
||||||
|
PNG_IDAT;
|
||||||
|
PNG_IEND;
|
||||||
|
PNG_PLTE;
|
||||||
|
#if defined(PNG_READ_bKGD_SUPPORTED)
|
||||||
|
PNG_bKGD;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_cHRM_SUPPORTED)
|
||||||
|
PNG_cHRM;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_gAMA_SUPPORTED)
|
||||||
|
PNG_gAMA;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_hIST_SUPPORTED)
|
||||||
|
PNG_hIST;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_iCCP_SUPPORTED)
|
||||||
|
PNG_iCCP;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_iTXt_SUPPORTED)
|
||||||
|
PNG_iTXt;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_oFFs_SUPPORTED)
|
||||||
|
PNG_oFFs;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_pCAL_SUPPORTED)
|
||||||
|
PNG_pCAL;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_pHYs_SUPPORTED)
|
||||||
|
PNG_pHYs;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_sBIT_SUPPORTED)
|
||||||
|
PNG_sBIT;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_pCAL_SUPPORTED)
|
||||||
|
PNG_sCAL;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_sPLT_SUPPORTED)
|
||||||
|
PNG_sPLT;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_sRGB_SUPPORTED)
|
||||||
|
PNG_sRGB;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_tEXt_SUPPORTED)
|
||||||
|
PNG_tEXt;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_tIME_SUPPORTED)
|
||||||
|
PNG_tIME;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_tRNS_SUPPORTED)
|
||||||
|
PNG_tRNS;
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_zTXt_SUPPORTED)
|
||||||
|
PNG_zTXt;
|
||||||
|
#endif
|
||||||
|
#endif /* PNG_GLOBAL_ARRAYS */
|
||||||
|
|
||||||
png_read_data(png_ptr, chunk_length, 4);
|
png_read_data(png_ptr, chunk_length, 4);
|
||||||
length = png_get_uint_32(chunk_length);
|
length = png_get_uint_32(chunk_length);
|
||||||
|
|
||||||
@@ -678,6 +814,10 @@ png_read_end(png_structp png_ptr, png_infop info_ptr)
|
|||||||
else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4))
|
else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4))
|
||||||
png_handle_pCAL(png_ptr, info_ptr, length);
|
png_handle_pCAL(png_ptr, info_ptr, length);
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(PNG_READ_sCAL_SUPPORTED)
|
||||||
|
else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4))
|
||||||
|
png_handle_sCAL(png_ptr, info_ptr, length);
|
||||||
|
#endif
|
||||||
#if defined(PNG_READ_pHYs_SUPPORTED)
|
#if defined(PNG_READ_pHYs_SUPPORTED)
|
||||||
else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4))
|
else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4))
|
||||||
png_handle_pHYs(png_ptr, info_ptr, length);
|
png_handle_pHYs(png_ptr, info_ptr, length);
|
||||||
@@ -690,6 +830,14 @@ png_read_end(png_structp png_ptr, png_infop info_ptr)
|
|||||||
else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4))
|
else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4))
|
||||||
png_handle_sRGB(png_ptr, info_ptr, length);
|
png_handle_sRGB(png_ptr, info_ptr, length);
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(PNG_READ_iCCP_SUPPORTED)
|
||||||
|
else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4))
|
||||||
|
png_handle_iCCP(png_ptr, info_ptr, length);
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_sPLT_SUPPORTED)
|
||||||
|
else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4))
|
||||||
|
png_handle_sPLT(png_ptr, info_ptr, length);
|
||||||
|
#endif
|
||||||
#if defined(PNG_READ_tEXt_SUPPORTED)
|
#if defined(PNG_READ_tEXt_SUPPORTED)
|
||||||
else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4))
|
else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4))
|
||||||
png_handle_tEXt(png_ptr, info_ptr, length);
|
png_handle_tEXt(png_ptr, info_ptr, length);
|
||||||
@@ -705,6 +853,10 @@ png_read_end(png_structp png_ptr, png_infop info_ptr)
|
|||||||
#if defined(PNG_READ_zTXt_SUPPORTED)
|
#if defined(PNG_READ_zTXt_SUPPORTED)
|
||||||
else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4))
|
else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4))
|
||||||
png_handle_zTXt(png_ptr, info_ptr, length);
|
png_handle_zTXt(png_ptr, info_ptr, length);
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_READ_iTXt_SUPPORTED)
|
||||||
|
else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4))
|
||||||
|
png_handle_iTXt(png_ptr, info_ptr, length);
|
||||||
#endif
|
#endif
|
||||||
else
|
else
|
||||||
png_handle_unknown(png_ptr, info_ptr, length);
|
png_handle_unknown(png_ptr, info_ptr, length);
|
||||||
@@ -720,7 +872,7 @@ png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr,
|
|||||||
png_infop info_ptr = NULL, end_info_ptr = NULL;
|
png_infop info_ptr = NULL, end_info_ptr = NULL;
|
||||||
#ifdef PNG_USER_MEM_SUPPORTED
|
#ifdef PNG_USER_MEM_SUPPORTED
|
||||||
png_free_ptr free_fn = NULL;
|
png_free_ptr free_fn = NULL;
|
||||||
#endif /* PNG_USER_MEM_SUPPORTED */
|
#endif
|
||||||
|
|
||||||
png_debug(1, "in png_destroy_read_struct\n");
|
png_debug(1, "in png_destroy_read_struct\n");
|
||||||
/* save jump buffer and error functions */
|
/* save jump buffer and error functions */
|
||||||
@@ -741,7 +893,7 @@ png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr,
|
|||||||
|
|
||||||
if (info_ptr != NULL)
|
if (info_ptr != NULL)
|
||||||
{
|
{
|
||||||
#if defined(PNG_READ_tEXt_SUPPORTED) || defined(PNG_READ_zTXt_SUPPORTED)
|
#if defined(PNG_TEXT_SUPPORTED)
|
||||||
png_free(png_ptr, info_ptr->text);
|
png_free(png_ptr, info_ptr->text);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -755,7 +907,7 @@ png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr,
|
|||||||
|
|
||||||
if (end_info_ptr != NULL)
|
if (end_info_ptr != NULL)
|
||||||
{
|
{
|
||||||
#if defined(PNG_READ_tEXt_SUPPORTED) || defined(PNG_READ_zTXt_SUPPORTED)
|
#if defined(PNG_READ_TEXT_SUPPORTED)
|
||||||
png_free(png_ptr, end_info_ptr->text);
|
png_free(png_ptr, end_info_ptr->text);
|
||||||
#endif
|
#endif
|
||||||
#ifdef PNG_USER_MEM_SUPPORTED
|
#ifdef PNG_USER_MEM_SUPPORTED
|
||||||
@@ -813,7 +965,7 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr
|
|||||||
#endif
|
#endif
|
||||||
if (png_ptr->flags & PNG_FLAG_FREE_PALETTE)
|
if (png_ptr->flags & PNG_FLAG_FREE_PALETTE)
|
||||||
png_zfree(png_ptr, png_ptr->palette);
|
png_zfree(png_ptr, png_ptr->palette);
|
||||||
#if defined(PNG_READ_tRNS_SUPPORTED) || defined(PNG_WRITE_tRNS_SUPPORTED) || \
|
#if defined(PNG_tRNS_SUPPORTED) || \
|
||||||
defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
|
defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
|
||||||
if (png_ptr->flags & PNG_FLAG_FREE_TRANS)
|
if (png_ptr->flags & PNG_FLAG_FREE_TRANS)
|
||||||
png_free(png_ptr, png_ptr->trans);
|
png_free(png_ptr, png_ptr->trans);
|
||||||
@@ -858,7 +1010,7 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr
|
|||||||
#endif
|
#endif
|
||||||
#if defined(PNG_TIME_RFC1123_SUPPORTED)
|
#if defined(PNG_TIME_RFC1123_SUPPORTED)
|
||||||
png_free(png_ptr, png_ptr->time_buffer);
|
png_free(png_ptr, png_ptr->time_buffer);
|
||||||
#endif /* PNG_TIME_RFC1123_SUPPORTED */
|
#endif
|
||||||
|
|
||||||
inflateEnd(&png_ptr->zstream);
|
inflateEnd(&png_ptr->zstream);
|
||||||
#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
|
#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
|
||||||
|
|||||||
4
pngrio.c
4
pngrio.c
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngrio.c - functions for data input
|
/* pngrio.c - functions for data input
|
||||||
*
|
*
|
||||||
* libpng 1.0.5a - October 23, 1999
|
* libpng 1.0.5f - December 6, 1999
|
||||||
* For conditions of distribution and use, see copyright notice in png.h
|
* For conditions of distribution and use, see copyright notice in png.h
|
||||||
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
||||||
* Copyright (c) 1996, 1997 Andreas Dilger
|
* Copyright (c) 1996, 1997 Andreas Dilger
|
||||||
@@ -146,6 +146,6 @@ png_set_read_fn(png_structp png_ptr, png_voidp io_ptr,
|
|||||||
|
|
||||||
#if defined(PNG_WRITE_FLUSH_SUPPORTED)
|
#if defined(PNG_WRITE_FLUSH_SUPPORTED)
|
||||||
png_ptr->output_flush_fn = NULL;
|
png_ptr->output_flush_fn = NULL;
|
||||||
#endif /* PNG_WRITE_FLUSH_SUPPORTED */
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
10
pngrtran.c
10
pngrtran.c
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngrtran.c - transforms the data in a row for PNG readers
|
/* pngrtran.c - transforms the data in a row for PNG readers
|
||||||
*
|
*
|
||||||
* libpng 1.0.5a - October 23, 1999
|
* libpng 1.0.5f - December 6, 1999
|
||||||
* For conditions of distribution and use, see copyright notice in png.h
|
* For conditions of distribution and use, see copyright notice in png.h
|
||||||
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
||||||
* Copyright (c) 1996, 1997 Andreas Dilger
|
* Copyright (c) 1996, 1997 Andreas Dilger
|
||||||
@@ -92,13 +92,13 @@ png_set_background(png_structp png_ptr,
|
|||||||
/* Note: if need_expand is set and color_type is either RGB or RGB_ALPHA
|
/* Note: if need_expand is set and color_type is either RGB or RGB_ALPHA
|
||||||
* (in which case need_expand is superfluous anyway), the background color
|
* (in which case need_expand is superfluous anyway), the background color
|
||||||
* might actually be gray yet not be flagged as such. This is not a problem
|
* might actually be gray yet not be flagged as such. This is not a problem
|
||||||
* for the current code, which uses PNG_FLAG_BACKGROUND_IS_GRAY only to
|
* for the current code, which uses PNG_BACKGROUND_IS_GRAY only to
|
||||||
* decide when to do the png_do_gray_to_rgb() transformation.
|
* decide when to do the png_do_gray_to_rgb() transformation.
|
||||||
*/
|
*/
|
||||||
if ((need_expand && !(png_ptr->color_type & PNG_COLOR_MASK_COLOR)) ||
|
if ((need_expand && !(png_ptr->color_type & PNG_COLOR_MASK_COLOR)) ||
|
||||||
(!need_expand && background_color->red == background_color->green &&
|
(!need_expand && background_color->red == background_color->green &&
|
||||||
background_color->red == background_color->blue))
|
background_color->red == background_color->blue))
|
||||||
png_ptr->flags |= PNG_FLAG_BACKGROUND_IS_GRAY;
|
png_ptr->mode |= PNG_BACKGROUND_IS_GRAY;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1171,7 +1171,7 @@ From Andreas Dilger e-mail to png-implement, 26 March 1998:
|
|||||||
/* if gray -> RGB, do so now only if background is non-gray; else do later
|
/* if gray -> RGB, do so now only if background is non-gray; else do later
|
||||||
* for performance reasons */
|
* for performance reasons */
|
||||||
if (png_ptr->transformations & PNG_GRAY_TO_RGB &&
|
if (png_ptr->transformations & PNG_GRAY_TO_RGB &&
|
||||||
!(png_ptr->flags & PNG_FLAG_BACKGROUND_IS_GRAY))
|
!(png_ptr->mode & PNG_BACKGROUND_IS_GRAY))
|
||||||
png_do_gray_to_rgb(&(png_ptr->row_info), png_ptr->row_buf + 1);
|
png_do_gray_to_rgb(&(png_ptr->row_info), png_ptr->row_buf + 1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1245,7 +1245,7 @@ From Andreas Dilger e-mail to png-implement, 26 March 1998:
|
|||||||
#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
|
#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
|
||||||
/* if gray -> RGB, do so now only if we did not do so above */
|
/* if gray -> RGB, do so now only if we did not do so above */
|
||||||
if (png_ptr->transformations & PNG_GRAY_TO_RGB &&
|
if (png_ptr->transformations & PNG_GRAY_TO_RGB &&
|
||||||
png_ptr->flags & PNG_FLAG_BACKGROUND_IS_GRAY)
|
png_ptr->mode & PNG_BACKGROUND_IS_GRAY)
|
||||||
png_do_gray_to_rgb(&(png_ptr->row_info), png_ptr->row_buf + 1);
|
png_do_gray_to_rgb(&(png_ptr->row_info), png_ptr->row_buf + 1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
649
pngrutil.c
649
pngrutil.c
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngrutil.c - utilities to read a PNG file
|
/* pngrutil.c - utilities to read a PNG file
|
||||||
*
|
*
|
||||||
* libpng 1.0.5a - October 23, 1999
|
* libpng 1.0.5f - December 6, 1999
|
||||||
* For conditions of distribution and use, see copyright notice in png.h
|
* For conditions of distribution and use, see copyright notice in png.h
|
||||||
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
||||||
* Copyright (c) 1996, 1997 Andreas Dilger
|
* Copyright (c) 1996, 1997 Andreas Dilger
|
||||||
@@ -136,6 +136,125 @@ png_crc_error(png_structp png_ptr)
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(PNG_READ_zTXt_SUPPORTED) || defined(PNG_READ_iTXt_SUPPORTED) || \
|
||||||
|
defined(PNG_READ_iCCP_SUPPORTED) || defined(PNG_READ_sPLT_SUPPORTED)
|
||||||
|
/*
|
||||||
|
* Decompress trailing data in a chunk. The assumption is that chunkdata
|
||||||
|
* points at an allocated area holding the contents of a chunk with a
|
||||||
|
* trailing compressed part. What we get back is an allocated area
|
||||||
|
* holding the original prefix part and an uncompressed version of the
|
||||||
|
* trailing part (the malloc area passed in is freed).
|
||||||
|
*/
|
||||||
|
png_charp png_decompress_chunk(png_structp png_ptr, int comp_type,
|
||||||
|
png_charp chunkdata, png_size_t chunklength,
|
||||||
|
png_size_t prefix_size)
|
||||||
|
{
|
||||||
|
static char msg[] = "Error decoding compressed text";
|
||||||
|
png_charp text = NULL;
|
||||||
|
png_size_t text_size = (chunklength - prefix_size);
|
||||||
|
|
||||||
|
if (comp_type == PNG_TEXT_COMPRESSION_zTXt)
|
||||||
|
{
|
||||||
|
png_ptr->zstream.next_in = (png_bytep)(chunkdata + prefix_size);
|
||||||
|
png_ptr->zstream.avail_in = (uInt)(chunklength - prefix_size);
|
||||||
|
png_ptr->zstream.next_out = png_ptr->zbuf;
|
||||||
|
png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
|
||||||
|
|
||||||
|
text_size = 0;
|
||||||
|
text = NULL;
|
||||||
|
|
||||||
|
while (png_ptr->zstream.avail_in)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
|
||||||
|
if (ret != Z_OK && ret != Z_STREAM_END)
|
||||||
|
{
|
||||||
|
if (png_ptr->zstream.msg != NULL)
|
||||||
|
png_warning(png_ptr, png_ptr->zstream.msg);
|
||||||
|
else
|
||||||
|
png_warning(png_ptr, msg);
|
||||||
|
inflateReset(&png_ptr->zstream);
|
||||||
|
png_ptr->zstream.avail_in = 0;
|
||||||
|
|
||||||
|
if (text == NULL)
|
||||||
|
{
|
||||||
|
text_size = prefix_size + sizeof(msg) + 1;
|
||||||
|
text = (png_charp)png_malloc(png_ptr, text_size);
|
||||||
|
png_memcpy(text, chunkdata, prefix_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
text[text_size - 1] = 0x00;
|
||||||
|
|
||||||
|
/* Copy what we can of the error message into the text chunk */
|
||||||
|
text_size = (png_size_t)(chunklength - (text - chunkdata) - 1);
|
||||||
|
text_size = sizeof(msg) > text_size ? text_size : sizeof(msg);
|
||||||
|
png_memcpy(text + prefix_size, msg, text_size + 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!png_ptr->zstream.avail_out || ret == Z_STREAM_END)
|
||||||
|
{
|
||||||
|
if (text == NULL)
|
||||||
|
{
|
||||||
|
text_size = prefix_size +
|
||||||
|
png_ptr->zbuf_size - png_ptr->zstream.avail_out;
|
||||||
|
text = (png_charp)png_malloc(png_ptr, text_size + 1);
|
||||||
|
png_memcpy(text + prefix_size, png_ptr->zbuf,
|
||||||
|
text_size - prefix_size);
|
||||||
|
png_memcpy(text, chunkdata, prefix_size);
|
||||||
|
*(text + text_size) = 0x00;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
png_charp tmp;
|
||||||
|
|
||||||
|
tmp = text;
|
||||||
|
text = (png_charp)png_malloc(png_ptr, (png_uint_32)(text_size +
|
||||||
|
png_ptr->zbuf_size - png_ptr->zstream.avail_out + 1));
|
||||||
|
png_memcpy(text, tmp, text_size);
|
||||||
|
png_free(png_ptr, tmp);
|
||||||
|
png_memcpy(text + text_size, png_ptr->zbuf,
|
||||||
|
(png_ptr->zbuf_size - png_ptr->zstream.avail_out));
|
||||||
|
text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out;
|
||||||
|
*(text + text_size) = 0x00;
|
||||||
|
}
|
||||||
|
if (ret == Z_STREAM_END)
|
||||||
|
break;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
png_ptr->zstream.next_out = png_ptr->zbuf;
|
||||||
|
png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inflateReset(&png_ptr->zstream);
|
||||||
|
png_ptr->zstream.avail_in = 0;
|
||||||
|
|
||||||
|
png_free(png_ptr, chunkdata);
|
||||||
|
chunkdata = text;
|
||||||
|
}
|
||||||
|
else /* if (comp_type >= PNG_TEXT_COMPRESSION_LAST) */
|
||||||
|
{
|
||||||
|
png_size_t text_size;
|
||||||
|
#if !defined(PNG_NO_STDIO)
|
||||||
|
char umsg[50];
|
||||||
|
|
||||||
|
sprintf(umsg, "Unknown zTXt compression type %d", comp_type);
|
||||||
|
png_warning(png_ptr, umsg);
|
||||||
|
#else
|
||||||
|
png_warning(png_ptr, "Unknown zTXt compression type");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Copy what we can of the error message into the text chunk */
|
||||||
|
text_size = (png_size_t)(chunklength - (text - chunkdata));
|
||||||
|
text_size = sizeof(msg) > text_size ? text_size : sizeof(msg);
|
||||||
|
png_memcpy(text, msg, text_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
return chunkdata;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* read and check the IDHR chunk */
|
/* read and check the IDHR chunk */
|
||||||
void
|
void
|
||||||
@@ -726,6 +845,195 @@ png_handle_sRGB(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
|
|||||||
}
|
}
|
||||||
#endif /* PNG_READ_sRGB_SUPPORTED */
|
#endif /* PNG_READ_sRGB_SUPPORTED */
|
||||||
|
|
||||||
|
#if defined(PNG_READ_iCCP_SUPPORTED)
|
||||||
|
void
|
||||||
|
png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
|
||||||
|
/* Note: this does not properly handle chunks that are > 64K under DOS */
|
||||||
|
{
|
||||||
|
png_charp chunkdata;
|
||||||
|
png_byte compression_type;
|
||||||
|
png_charp profile;
|
||||||
|
png_uint_32 skip = 0;
|
||||||
|
png_size_t slength, prefix_length;
|
||||||
|
|
||||||
|
png_debug(1, "in png_handle_iCCP\n");
|
||||||
|
|
||||||
|
if (!(png_ptr->mode & PNG_HAVE_IHDR))
|
||||||
|
png_error(png_ptr, "Missing IHDR before iCCP");
|
||||||
|
else if (png_ptr->mode & PNG_HAVE_IDAT)
|
||||||
|
{
|
||||||
|
png_warning(png_ptr, "Invalid iCCP after IDAT");
|
||||||
|
png_crc_finish(png_ptr, length);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (png_ptr->mode & PNG_HAVE_PLTE)
|
||||||
|
/* Should be an error, but we can cope with it */
|
||||||
|
png_warning(png_ptr, "Out of place iCCP chunk");
|
||||||
|
|
||||||
|
else if (info_ptr != NULL && info_ptr->valid & PNG_INFO_iCCP)
|
||||||
|
{
|
||||||
|
png_warning(png_ptr, "Duplicate iCCP chunk");
|
||||||
|
png_crc_finish(png_ptr, length);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef PNG_MAX_MALLOC_64K
|
||||||
|
if (length > (png_uint_32)65535L)
|
||||||
|
{
|
||||||
|
png_warning(png_ptr, "iCCP chunk too large to fit in memory");
|
||||||
|
skip = length - (png_uint_32)65535L;
|
||||||
|
length = (png_uint_32)65535L;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
chunkdata = (png_charp)png_malloc(png_ptr, length + 1);
|
||||||
|
slength = (png_size_t)length;
|
||||||
|
png_crc_read(png_ptr, (png_bytep)chunkdata, slength);
|
||||||
|
|
||||||
|
if (png_crc_finish(png_ptr, skip))
|
||||||
|
{
|
||||||
|
png_free(png_ptr, chunkdata);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
chunkdata[slength] = 0x00;
|
||||||
|
|
||||||
|
for (profile = chunkdata; *profile; profile++)
|
||||||
|
/* empty loop to find end of name */ ;
|
||||||
|
++profile;
|
||||||
|
|
||||||
|
/* there should be at least one NUL (the compression type byte)
|
||||||
|
following the separator, and we should be on it */
|
||||||
|
if (profile >= chunkdata + slength)
|
||||||
|
{
|
||||||
|
png_free(png_ptr, chunkdata);
|
||||||
|
png_error(png_ptr, "malformed iCCP chunk");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* compression should always be zero */
|
||||||
|
compression_type = *profile++;
|
||||||
|
|
||||||
|
prefix_length = profile - chunkdata;
|
||||||
|
chunkdata = png_decompress_chunk(png_ptr, compression_type, chunkdata,
|
||||||
|
slength, prefix_length);
|
||||||
|
|
||||||
|
png_set_iCCP(png_ptr, info_ptr, chunkdata, compression_type,
|
||||||
|
chunkdata + prefix_length, png_strlen(chunkdata + prefix_length));
|
||||||
|
png_free(png_ptr, chunkdata);
|
||||||
|
}
|
||||||
|
#endif /* PNG_READ_iCCP_SUPPORTED */
|
||||||
|
|
||||||
|
#if defined(PNG_READ_sPLT_SUPPORTED)
|
||||||
|
void
|
||||||
|
png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
|
||||||
|
/* Note: this does not properly handle chunks that are > 64K under DOS */
|
||||||
|
{
|
||||||
|
png_bytep chunkdata;
|
||||||
|
png_bytep entry_start;
|
||||||
|
png_spalette new_palette;
|
||||||
|
int data_length, entry_size, i;
|
||||||
|
png_uint_32 skip = 0;
|
||||||
|
png_size_t slength;
|
||||||
|
|
||||||
|
png_debug(1, "in png_handle_sPLT\n");
|
||||||
|
|
||||||
|
if (!(png_ptr->mode & PNG_HAVE_IHDR))
|
||||||
|
png_error(png_ptr, "Missing IHDR before sPLT");
|
||||||
|
else if (png_ptr->mode & PNG_HAVE_IDAT)
|
||||||
|
{
|
||||||
|
png_warning(png_ptr, "Invalid sPLT after IDAT");
|
||||||
|
png_crc_finish(png_ptr, length);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (png_ptr->mode & PNG_HAVE_PLTE)
|
||||||
|
/* Should be an error, but we can cope with it */
|
||||||
|
png_warning(png_ptr, "Out of place sPLT chunk");
|
||||||
|
|
||||||
|
else if (info_ptr != NULL && info_ptr->valid & PNG_INFO_sPLT)
|
||||||
|
{
|
||||||
|
png_warning(png_ptr, "Duplicate sPLT chunk");
|
||||||
|
png_crc_finish(png_ptr, length);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef PNG_MAX_MALLOC_64K
|
||||||
|
if (length > (png_uint_32)65535L)
|
||||||
|
{
|
||||||
|
png_warning(png_ptr, "sPLT chunk too large to fit in memory");
|
||||||
|
skip = length - (png_uint_32)65535L;
|
||||||
|
length = (png_uint_32)65535L;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
chunkdata = (png_bytep)png_malloc(png_ptr, length + 1);
|
||||||
|
slength = (png_size_t)length;
|
||||||
|
png_crc_read(png_ptr, chunkdata, slength);
|
||||||
|
|
||||||
|
if (png_crc_finish(png_ptr, skip))
|
||||||
|
{
|
||||||
|
png_free(png_ptr, chunkdata);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
chunkdata[slength] = 0x00;
|
||||||
|
|
||||||
|
for (entry_start = chunkdata; *entry_start; entry_start++)
|
||||||
|
/* empty loop to find end of name */ ;
|
||||||
|
++entry_start;
|
||||||
|
|
||||||
|
/* a sample depth should follow the separator, and we should be on it */
|
||||||
|
if (entry_start > chunkdata + slength)
|
||||||
|
{
|
||||||
|
png_free(png_ptr, chunkdata);
|
||||||
|
png_error(png_ptr, "malformed sPLT chunk");
|
||||||
|
}
|
||||||
|
|
||||||
|
new_palette.depth = *entry_start++;
|
||||||
|
entry_size = (new_palette.depth == 8 ? 6 : 10);
|
||||||
|
data_length = (slength - (entry_start - chunkdata));
|
||||||
|
|
||||||
|
/* integrity-check the data length */
|
||||||
|
if (data_length % entry_size)
|
||||||
|
{
|
||||||
|
png_free(png_ptr, chunkdata);
|
||||||
|
png_error(png_ptr, "sPLT chunk has bad length");
|
||||||
|
}
|
||||||
|
|
||||||
|
new_palette.nentries = data_length / entry_size;
|
||||||
|
new_palette.entries = (png_spalette_entryp)png_malloc(
|
||||||
|
png_ptr, new_palette.nentries * sizeof(png_spalette_entry));
|
||||||
|
|
||||||
|
for (i = 0; i < new_palette.nentries; i++)
|
||||||
|
{
|
||||||
|
png_spalette_entryp pp = new_palette.entries + i;
|
||||||
|
|
||||||
|
if (new_palette.depth == 8)
|
||||||
|
{
|
||||||
|
pp->red = *entry_start++;
|
||||||
|
pp->green = *entry_start++;
|
||||||
|
pp->blue = *entry_start++;
|
||||||
|
pp->alpha = *entry_start++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pp->red = png_get_uint_16(entry_start); entry_start += 2;
|
||||||
|
pp->green = png_get_uint_16(entry_start); entry_start += 2;
|
||||||
|
pp->blue = png_get_uint_16(entry_start); entry_start += 2;
|
||||||
|
pp->alpha = png_get_uint_16(entry_start); entry_start += 2;
|
||||||
|
}
|
||||||
|
pp->frequency = png_get_uint_16(entry_start); entry_start += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* discard all chunk data except the name and stash that */
|
||||||
|
new_palette.name = (png_charp)chunkdata;
|
||||||
|
|
||||||
|
png_set_spalettes(png_ptr, info_ptr, &new_palette, 1);
|
||||||
|
|
||||||
|
png_free(png_ptr, chunkdata);
|
||||||
|
png_free(png_ptr, new_palette.entries);
|
||||||
|
}
|
||||||
|
#endif /* PNG_READ_sPLT_SUPPORTED */
|
||||||
|
|
||||||
#if defined(PNG_READ_tRNS_SUPPORTED)
|
#if defined(PNG_READ_tRNS_SUPPORTED)
|
||||||
void
|
void
|
||||||
png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
|
png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
|
||||||
@@ -1012,7 +1320,7 @@ void
|
|||||||
png_handle_oFFs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
|
png_handle_oFFs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
|
||||||
{
|
{
|
||||||
png_byte buf[9];
|
png_byte buf[9];
|
||||||
png_uint_32 offset_x, offset_y;
|
png_int_32 offset_x, offset_y;
|
||||||
int unit_type;
|
int unit_type;
|
||||||
|
|
||||||
png_debug(1, "in png_handle_oFFs\n");
|
png_debug(1, "in png_handle_oFFs\n");
|
||||||
@@ -1043,8 +1351,8 @@ png_handle_oFFs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
|
|||||||
if (png_crc_finish(png_ptr, 0))
|
if (png_crc_finish(png_ptr, 0))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
offset_x = png_get_uint_32(buf);
|
offset_x = png_get_int_32(buf);
|
||||||
offset_y = png_get_uint_32(buf + 4);
|
offset_y = png_get_int_32(buf + 4);
|
||||||
unit_type = buf[8];
|
unit_type = buf[8];
|
||||||
png_set_oFFs(png_ptr, info_ptr, offset_x, offset_y, unit_type);
|
png_set_oFFs(png_ptr, info_ptr, offset_x, offset_y, unit_type);
|
||||||
}
|
}
|
||||||
@@ -1167,6 +1475,77 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_READ_sCAL_SUPPORTED)
|
||||||
|
/* read the sCAL chunk */
|
||||||
|
void
|
||||||
|
png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
|
||||||
|
{
|
||||||
|
png_charp unit, ep, vp;
|
||||||
|
double width, height;
|
||||||
|
png_size_t slength;
|
||||||
|
|
||||||
|
png_debug(1, "in png_handle_sCAL\n");
|
||||||
|
|
||||||
|
if (!(png_ptr->mode & PNG_HAVE_IHDR))
|
||||||
|
png_error(png_ptr, "Missing IHDR before sCAL");
|
||||||
|
else if (png_ptr->mode & PNG_HAVE_IDAT)
|
||||||
|
{
|
||||||
|
png_warning(png_ptr, "Invalid sCAL after IDAT");
|
||||||
|
png_crc_finish(png_ptr, length);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (info_ptr != NULL && info_ptr->valid & PNG_INFO_sCAL)
|
||||||
|
{
|
||||||
|
png_warning(png_ptr, "Duplicate sCAL chunk");
|
||||||
|
png_crc_finish(png_ptr, length);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
png_debug1(2, "Allocating and reading sCAL chunk data (%d bytes)\n",
|
||||||
|
length + 1);
|
||||||
|
unit = (png_charp)png_malloc(png_ptr, length + 1);
|
||||||
|
slength = (png_size_t)length;
|
||||||
|
png_crc_read(png_ptr, (png_bytep)unit, slength);
|
||||||
|
|
||||||
|
if (png_crc_finish(png_ptr, 0))
|
||||||
|
{
|
||||||
|
png_free(png_ptr, unit);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
unit[slength] = 0x00; /* null terminate the last string */
|
||||||
|
|
||||||
|
png_debug(3, "Finding end of sCAL unit string\n");
|
||||||
|
for (ep = unit; *ep; ep++)
|
||||||
|
/* empty loop */ ;
|
||||||
|
ep++;
|
||||||
|
|
||||||
|
width = strtod(ep, &vp);
|
||||||
|
if (*vp)
|
||||||
|
png_error(png_ptr, "malformed width string in sCAL chunk");
|
||||||
|
|
||||||
|
for (ep = unit; *ep; ep++)
|
||||||
|
/* empty loop */ ;
|
||||||
|
ep++;
|
||||||
|
|
||||||
|
height = strtod(ep, &vp);
|
||||||
|
if (*vp)
|
||||||
|
png_error(png_ptr, "malformed height string in sCAL chunk");
|
||||||
|
|
||||||
|
if (unit + slength < ep || width <= 0. || height <= 0.)
|
||||||
|
{
|
||||||
|
png_warning(png_ptr, "Invalid sCAL data");
|
||||||
|
png_free(png_ptr, unit);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
png_set_sCAL(png_ptr, info_ptr, unit, width, height);
|
||||||
|
|
||||||
|
png_free(png_ptr, unit);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(PNG_READ_tIME_SUPPORTED)
|
#if defined(PNG_READ_tIME_SUPPORTED)
|
||||||
void
|
void
|
||||||
png_handle_tIME(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
|
png_handle_tIME(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
|
||||||
@@ -1258,6 +1637,7 @@ png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
|
|||||||
|
|
||||||
text_ptr = (png_textp)png_malloc(png_ptr, (png_uint_32)sizeof(png_text));
|
text_ptr = (png_textp)png_malloc(png_ptr, (png_uint_32)sizeof(png_text));
|
||||||
text_ptr->compression = PNG_TEXT_COMPRESSION_NONE;
|
text_ptr->compression = PNG_TEXT_COMPRESSION_NONE;
|
||||||
|
text_ptr->lang = NULL;
|
||||||
text_ptr->key = key;
|
text_ptr->key = key;
|
||||||
text_ptr->text = text;
|
text_ptr->text = text;
|
||||||
|
|
||||||
@@ -1273,12 +1653,11 @@ png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
|
|||||||
void
|
void
|
||||||
png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
|
png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
|
||||||
{
|
{
|
||||||
static char msg[] = "Error decoding zTXt chunk";
|
|
||||||
png_textp text_ptr;
|
png_textp text_ptr;
|
||||||
png_charp key;
|
png_charp chunkdata;
|
||||||
png_charp text;
|
png_charp text;
|
||||||
int comp_type = PNG_TEXT_COMPRESSION_NONE;
|
int comp_type = PNG_TEXT_COMPRESSION_NONE;
|
||||||
png_size_t slength;
|
png_size_t slength, prefix_len;
|
||||||
|
|
||||||
png_debug(1, "in png_handle_zTXt\n");
|
png_debug(1, "in png_handle_zTXt\n");
|
||||||
if (!(png_ptr->mode & PNG_HAVE_IHDR))
|
if (!(png_ptr->mode & PNG_HAVE_IHDR))
|
||||||
@@ -1298,142 +1677,128 @@ png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
key = (png_charp)png_malloc(png_ptr, length + 1);
|
chunkdata = (png_charp)png_malloc(png_ptr, length + 1);
|
||||||
slength = (png_size_t)length;
|
slength = (png_size_t)length;
|
||||||
png_crc_read(png_ptr, (png_bytep)key, slength);
|
png_crc_read(png_ptr, (png_bytep)chunkdata, slength);
|
||||||
if (png_crc_finish(png_ptr, 0))
|
if (png_crc_finish(png_ptr, 0))
|
||||||
{
|
{
|
||||||
png_free(png_ptr, key);
|
png_free(png_ptr, chunkdata);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
key[slength] = 0x00;
|
chunkdata[slength] = 0x00;
|
||||||
|
|
||||||
for (text = key; *text; text++)
|
for (text = chunkdata; *text; text++)
|
||||||
/* empty loop */ ;
|
/* empty loop */ ;
|
||||||
|
|
||||||
/* zTXt must have some text after the keyword */
|
/* zTXt must have some text after the chunkdataword */
|
||||||
if (text == key + slength)
|
if (text == chunkdata + slength)
|
||||||
{
|
{
|
||||||
|
comp_type = PNG_TEXT_COMPRESSION_NONE;
|
||||||
png_warning(png_ptr, "Zero length zTXt chunk");
|
png_warning(png_ptr, "Zero length zTXt chunk");
|
||||||
}
|
}
|
||||||
else if ((comp_type = *(++text)) == PNG_TEXT_COMPRESSION_zTXt)
|
else
|
||||||
{
|
{
|
||||||
png_size_t text_size, key_size;
|
comp_type = *(++text);
|
||||||
text++;
|
text++; /* skip the compression byte */
|
||||||
|
|
||||||
png_ptr->zstream.next_in = (png_bytep)text;
|
|
||||||
png_ptr->zstream.avail_in = (uInt)(length - (text - key));
|
|
||||||
png_ptr->zstream.next_out = png_ptr->zbuf;
|
|
||||||
png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
|
|
||||||
|
|
||||||
key_size = (png_size_t)(text - key);
|
|
||||||
text_size = 0;
|
|
||||||
text = NULL;
|
|
||||||
|
|
||||||
while (png_ptr->zstream.avail_in)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
|
|
||||||
if (ret != Z_OK && ret != Z_STREAM_END)
|
|
||||||
{
|
|
||||||
if (png_ptr->zstream.msg != NULL)
|
|
||||||
png_warning(png_ptr, png_ptr->zstream.msg);
|
|
||||||
else
|
|
||||||
png_warning(png_ptr, msg);
|
|
||||||
inflateReset(&png_ptr->zstream);
|
|
||||||
png_ptr->zstream.avail_in = 0;
|
|
||||||
|
|
||||||
if (text == NULL)
|
|
||||||
{
|
|
||||||
text_size = key_size + sizeof(msg) + 1;
|
|
||||||
text = (png_charp)png_malloc(png_ptr, (png_uint_32)text_size);
|
|
||||||
png_memcpy(text, key, key_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
text[text_size - 1] = 0x00;
|
|
||||||
|
|
||||||
/* Copy what we can of the error message into the text chunk */
|
|
||||||
text_size = (png_size_t)(slength - (text - key) - 1);
|
|
||||||
text_size = sizeof(msg) > text_size ? text_size : sizeof(msg);
|
|
||||||
png_memcpy(text + key_size, msg, text_size + 1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!png_ptr->zstream.avail_out || ret == Z_STREAM_END)
|
|
||||||
{
|
|
||||||
if (text == NULL)
|
|
||||||
{
|
|
||||||
text = (png_charp)png_malloc(png_ptr,
|
|
||||||
(png_uint_32)(png_ptr->zbuf_size - png_ptr->zstream.avail_out
|
|
||||||
+ key_size + 1));
|
|
||||||
png_memcpy(text + key_size, png_ptr->zbuf,
|
|
||||||
png_ptr->zbuf_size - png_ptr->zstream.avail_out);
|
|
||||||
png_memcpy(text, key, key_size);
|
|
||||||
text_size = key_size + png_ptr->zbuf_size -
|
|
||||||
png_ptr->zstream.avail_out;
|
|
||||||
*(text + text_size) = 0x00;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
png_charp tmp;
|
|
||||||
|
|
||||||
tmp = text;
|
|
||||||
text = (png_charp)png_malloc(png_ptr, (png_uint_32)(text_size +
|
|
||||||
png_ptr->zbuf_size - png_ptr->zstream.avail_out + 1));
|
|
||||||
png_memcpy(text, tmp, text_size);
|
|
||||||
png_free(png_ptr, tmp);
|
|
||||||
png_memcpy(text + text_size, png_ptr->zbuf,
|
|
||||||
(png_ptr->zbuf_size - png_ptr->zstream.avail_out));
|
|
||||||
text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out;
|
|
||||||
*(text + text_size) = 0x00;
|
|
||||||
}
|
|
||||||
if (ret != Z_STREAM_END)
|
|
||||||
{
|
|
||||||
png_ptr->zstream.next_out = png_ptr->zbuf;
|
|
||||||
png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inflateReset(&png_ptr->zstream);
|
|
||||||
png_ptr->zstream.avail_in = 0;
|
|
||||||
|
|
||||||
png_free(png_ptr, key);
|
|
||||||
key = text;
|
|
||||||
text += key_size;
|
|
||||||
}
|
}
|
||||||
else /* if (comp_type >= PNG_TEXT_COMPRESSION_LAST) */
|
prefix_len = text - chunkdata;
|
||||||
{
|
|
||||||
png_size_t text_size;
|
|
||||||
#if !defined(PNG_NO_STDIO)
|
|
||||||
char umsg[50];
|
|
||||||
|
|
||||||
sprintf(umsg, "Unknown zTXt compression type %d", comp_type);
|
chunkdata = (png_charp)png_decompress_chunk(png_ptr, comp_type, chunkdata,
|
||||||
png_warning(png_ptr, umsg);
|
(png_size_t)length, prefix_len);
|
||||||
#else
|
|
||||||
png_warning(png_ptr, "Unknown zTXt compression type");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Copy what we can of the error message into the text chunk */
|
|
||||||
text_size = (png_size_t)(slength - (text - key) - 1);
|
|
||||||
text_size = sizeof(msg) > text_size ? text_size : sizeof(msg);
|
|
||||||
png_memcpy(text, msg, text_size + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
text_ptr = (png_textp)png_malloc(png_ptr, (png_uint_32)sizeof(png_text));
|
text_ptr = (png_textp)png_malloc(png_ptr, (png_uint_32)sizeof(png_text));
|
||||||
text_ptr->compression = comp_type;
|
text_ptr->compression = comp_type;
|
||||||
text_ptr->key = key;
|
text_ptr->lang = NULL;
|
||||||
text_ptr->text = text;
|
text_ptr->key = chunkdata;
|
||||||
|
text_ptr->text = chunkdata + prefix_len;
|
||||||
|
|
||||||
|
png_set_text(png_ptr, info_ptr, text_ptr, 1);
|
||||||
|
|
||||||
|
png_free(png_ptr, text_ptr);
|
||||||
|
png_free(png_ptr, chunkdata);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_READ_iTXt_SUPPORTED)
|
||||||
|
/* note: this does not correctly handle chunks that are > 64K under DOS */
|
||||||
|
void
|
||||||
|
png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
|
||||||
|
{
|
||||||
|
png_textp text_ptr;
|
||||||
|
png_charp chunkdata;
|
||||||
|
png_charp lang, text;
|
||||||
|
int comp_type = PNG_TEXT_COMPRESSION_NONE;
|
||||||
|
int comp_flag = 0;
|
||||||
|
png_size_t slength, prefix_len;
|
||||||
|
|
||||||
|
png_debug(1, "in png_handle_iTXt\n");
|
||||||
|
|
||||||
|
if (!(png_ptr->mode & PNG_HAVE_IHDR))
|
||||||
|
png_error(png_ptr, "Missing IHDR before iTXt");
|
||||||
|
|
||||||
|
if (png_ptr->mode & PNG_HAVE_IDAT)
|
||||||
|
png_ptr->mode |= PNG_AFTER_IDAT;
|
||||||
|
|
||||||
|
#ifdef PNG_MAX_MALLOC_64K
|
||||||
|
/* We will no doubt have problems with chunks even half this size, but
|
||||||
|
there is no hard and fast rule to tell us where to stop. */
|
||||||
|
if (length > (png_uint_32)65535L)
|
||||||
|
{
|
||||||
|
png_warning(png_ptr,"iTXt chunk too large to fit in memory");
|
||||||
|
png_crc_finish(png_ptr, length);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
chunkdata = (png_charp)png_malloc(png_ptr, length + 1);
|
||||||
|
slength = (png_size_t)length;
|
||||||
|
png_crc_read(png_ptr, (png_bytep)chunkdata, slength);
|
||||||
|
if (png_crc_finish(png_ptr, 0))
|
||||||
|
{
|
||||||
|
png_free(png_ptr, chunkdata);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
chunkdata[slength] = 0x00;
|
||||||
|
|
||||||
|
for (lang = chunkdata; *lang; lang++)
|
||||||
|
/* empty loop */ ;
|
||||||
|
lang++; /* skip NUL separator */
|
||||||
|
|
||||||
|
/* iTXt must have a language tag and some text after the keyword */
|
||||||
|
if (lang >= chunkdata + slength)
|
||||||
|
{
|
||||||
|
comp_type = PNG_TEXT_COMPRESSION_NONE;
|
||||||
|
png_warning(png_ptr, "Zero length iTXt chunk");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
comp_flag = *lang++;
|
||||||
|
comp_type = *lang++;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (text = lang; *text; text++)
|
||||||
|
/* empty loop */ ;
|
||||||
|
text++; /* skip NUL separator */
|
||||||
|
|
||||||
|
prefix_len = text - chunkdata;
|
||||||
|
|
||||||
|
if (comp_flag)
|
||||||
|
chunkdata = png_decompress_chunk(png_ptr, comp_type, chunkdata,
|
||||||
|
(size_t)length, prefix_len);
|
||||||
|
|
||||||
|
text_ptr = (png_textp)png_malloc(png_ptr, (png_uint_32)sizeof(png_text));
|
||||||
|
text_ptr->compression = (png_byte)comp_type;
|
||||||
|
text_ptr->lang = NULL;
|
||||||
|
text_ptr->key = chunkdata;
|
||||||
|
text_ptr->text = chunkdata + prefix_len;
|
||||||
|
|
||||||
png_set_text(png_ptr, info_ptr, text_ptr, 1);
|
png_set_text(png_ptr, info_ptr, text_ptr, 1);
|
||||||
|
|
||||||
png_free(png_ptr, text_ptr->key);
|
png_free(png_ptr, text_ptr->key);
|
||||||
png_free(png_ptr, text_ptr);
|
png_free(png_ptr, text_ptr);
|
||||||
|
png_free(png_ptr, chunkdata);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1713,6 +2078,13 @@ png_do_read_interlace
|
|||||||
(png_row_infop row_info, png_bytep row, int pass,
|
(png_row_infop row_info, png_bytep row, int pass,
|
||||||
png_uint_32 transformations)
|
png_uint_32 transformations)
|
||||||
{
|
{
|
||||||
|
#ifdef PNG_USE_LOCAL_ARRAYS
|
||||||
|
/* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
|
||||||
|
|
||||||
|
/* offset to next interlace block */
|
||||||
|
const int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
|
||||||
|
#endif
|
||||||
|
|
||||||
png_debug(1,"in png_do_read_interlace\n");
|
png_debug(1,"in png_do_read_interlace\n");
|
||||||
if (row != NULL && row_info != NULL)
|
if (row != NULL && row_info != NULL)
|
||||||
{
|
{
|
||||||
@@ -2051,6 +2423,22 @@ png_read_filter_row
|
|||||||
void
|
void
|
||||||
png_read_finish_row(png_structp png_ptr)
|
png_read_finish_row(png_structp png_ptr)
|
||||||
{
|
{
|
||||||
|
#ifdef PNG_USE_LOCAL_ARRAYS
|
||||||
|
/* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
|
||||||
|
|
||||||
|
/* start of interlace block */
|
||||||
|
const int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
|
||||||
|
|
||||||
|
/* offset to next interlace block */
|
||||||
|
const int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
|
||||||
|
|
||||||
|
/* start of interlace block in the y direction */
|
||||||
|
const int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
|
||||||
|
|
||||||
|
/* offset to next interlace block in the y direction */
|
||||||
|
const int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
|
||||||
|
#endif
|
||||||
|
|
||||||
png_debug(1, "in png_read_finish_row\n");
|
png_debug(1, "in png_read_finish_row\n");
|
||||||
png_ptr->row_number++;
|
png_ptr->row_number++;
|
||||||
if (png_ptr->row_number < png_ptr->num_rows)
|
if (png_ptr->row_number < png_ptr->num_rows)
|
||||||
@@ -2091,6 +2479,9 @@ png_read_finish_row(png_structp png_ptr)
|
|||||||
|
|
||||||
if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
|
if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
|
||||||
{
|
{
|
||||||
|
#ifdef PNG_USE_LOCAL_ARRAYS
|
||||||
|
PNG_IDAT;
|
||||||
|
#endif
|
||||||
char extra;
|
char extra;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@@ -2111,7 +2502,7 @@ png_read_finish_row(png_structp png_ptr)
|
|||||||
|
|
||||||
png_reset_crc(png_ptr);
|
png_reset_crc(png_ptr);
|
||||||
png_crc_read(png_ptr, png_ptr->chunk_name, 4);
|
png_crc_read(png_ptr, png_ptr->chunk_name, 4);
|
||||||
if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
|
if (png_memcmp(png_ptr->chunk_name, (png_bytep)png_IDAT, 4))
|
||||||
png_error(png_ptr, "Not enough image data");
|
png_error(png_ptr, "Not enough image data");
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -2154,6 +2545,22 @@ png_read_finish_row(png_structp png_ptr)
|
|||||||
void
|
void
|
||||||
png_read_start_row(png_structp png_ptr)
|
png_read_start_row(png_structp png_ptr)
|
||||||
{
|
{
|
||||||
|
#ifdef PNG_USE_LOCAL_ARRAYS
|
||||||
|
/* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
|
||||||
|
|
||||||
|
/* start of interlace block */
|
||||||
|
const int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
|
||||||
|
|
||||||
|
/* offset to next interlace block */
|
||||||
|
const int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
|
||||||
|
|
||||||
|
/* start of interlace block in the y direction */
|
||||||
|
const int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
|
||||||
|
|
||||||
|
/* offset to next interlace block in the y direction */
|
||||||
|
const int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
|
||||||
|
#endif
|
||||||
|
|
||||||
int max_pixel_depth;
|
int max_pixel_depth;
|
||||||
png_uint_32 row_bytes;
|
png_uint_32 row_bytes;
|
||||||
|
|
||||||
|
|||||||
133
pngset.c
133
pngset.c
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngset.c - storage of image information into info struct
|
/* pngset.c - storage of image information into info struct
|
||||||
*
|
*
|
||||||
* libpng 1.0.5a - October 23, 1999
|
* libpng 1.0.5f - December 6, 1999
|
||||||
* For conditions of distribution and use, see copyright notice in png.h
|
* For conditions of distribution and use, see copyright notice in png.h
|
||||||
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
||||||
* Copyright (c) 1996, 1997 Andreas Dilger
|
* Copyright (c) 1996, 1997 Andreas Dilger
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
#define PNG_INTERNAL
|
#define PNG_INTERNAL
|
||||||
#include "png.h"
|
#include "png.h"
|
||||||
|
|
||||||
#if defined(PNG_READ_bKGD_SUPPORTED) || defined(PNG_WRITE_bKGD_SUPPORTED)
|
#if defined(PNG_bKGD_SUPPORTED)
|
||||||
void
|
void
|
||||||
png_set_bKGD(png_structp png_ptr, png_infop info_ptr, png_color_16p background)
|
png_set_bKGD(png_structp png_ptr, png_infop info_ptr, png_color_16p background)
|
||||||
{
|
{
|
||||||
@@ -29,7 +29,7 @@ png_set_bKGD(png_structp png_ptr, png_infop info_ptr, png_color_16p background)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(PNG_READ_cHRM_SUPPORTED) || defined(PNG_WRITE_cHRM_SUPPORTED)
|
#if defined(PNG_cHRM_SUPPORTED)
|
||||||
void
|
void
|
||||||
png_set_cHRM(png_structp png_ptr, png_infop info_ptr,
|
png_set_cHRM(png_structp png_ptr, png_infop info_ptr,
|
||||||
double white_x, double white_y, double red_x, double red_y,
|
double white_x, double white_y, double red_x, double red_y,
|
||||||
@@ -51,7 +51,7 @@ png_set_cHRM(png_structp png_ptr, png_infop info_ptr,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(PNG_READ_gAMA_SUPPORTED) || defined(PNG_WRITE_gAMA_SUPPORTED)
|
#if defined(PNG_gAMA_SUPPORTED)
|
||||||
void
|
void
|
||||||
png_set_gAMA(png_structp png_ptr, png_infop info_ptr, double file_gamma)
|
png_set_gAMA(png_structp png_ptr, png_infop info_ptr, double file_gamma)
|
||||||
{
|
{
|
||||||
@@ -64,7 +64,7 @@ png_set_gAMA(png_structp png_ptr, png_infop info_ptr, double file_gamma)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(PNG_READ_hIST_SUPPORTED) || defined(PNG_WRITE_hIST_SUPPORTED)
|
#if defined(PNG_hIST_SUPPORTED)
|
||||||
void
|
void
|
||||||
png_set_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p hist)
|
png_set_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p hist)
|
||||||
{
|
{
|
||||||
@@ -117,10 +117,10 @@ png_set_IHDR(png_structp png_ptr, png_infop info_ptr,
|
|||||||
info_ptr->rowbytes = (info_ptr->width * info_ptr->pixel_depth + 7) >> 3;
|
info_ptr->rowbytes = (info_ptr->width * info_ptr->pixel_depth + 7) >> 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(PNG_READ_oFFs_SUPPORTED) || defined(PNG_WRITE_oFFs_SUPPORTED)
|
#if defined(PNG_oFFs_SUPPORTED)
|
||||||
void
|
void
|
||||||
png_set_oFFs(png_structp png_ptr, png_infop info_ptr,
|
png_set_oFFs(png_structp png_ptr, png_infop info_ptr,
|
||||||
png_uint_32 offset_x, png_uint_32 offset_y, int unit_type)
|
png_int_32 offset_x, png_int_32 offset_y, int unit_type)
|
||||||
{
|
{
|
||||||
png_debug1(1, "in %s storage function\n", "oFFs");
|
png_debug1(1, "in %s storage function\n", "oFFs");
|
||||||
if (png_ptr == NULL || info_ptr == NULL)
|
if (png_ptr == NULL || info_ptr == NULL)
|
||||||
@@ -133,7 +133,7 @@ png_set_oFFs(png_structp png_ptr, png_infop info_ptr,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(PNG_READ_pCAL_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED)
|
#if defined(PNG_pCAL_SUPPORTED)
|
||||||
void
|
void
|
||||||
png_set_pCAL(png_structp png_ptr, png_infop info_ptr,
|
png_set_pCAL(png_structp png_ptr, png_infop info_ptr,
|
||||||
png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams,
|
png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams,
|
||||||
@@ -178,7 +178,29 @@ png_set_pCAL(png_structp png_ptr, png_infop info_ptr,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(PNG_READ_pHYs_SUPPORTED) || defined(PNG_WRITE_pHYs_SUPPORTED)
|
#if defined(PNG_READ_sCAL_SUPPORTED) || defined(PNG_WRITE_sCAL_SUPPORTED)
|
||||||
|
void
|
||||||
|
png_set_sCAL(png_structp png_ptr, png_infop info_ptr,
|
||||||
|
png_charp unit, double width, double height)
|
||||||
|
{
|
||||||
|
png_uint_32 length;
|
||||||
|
|
||||||
|
png_debug1(1, "in %s storage function\n", "sCAL");
|
||||||
|
if (png_ptr == NULL || info_ptr == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
length = png_strlen(unit) + 1;
|
||||||
|
png_debug1(3, "allocating unit for info (%d bytes)\n", length);
|
||||||
|
info_ptr->scal_unit = (png_charp)png_malloc(png_ptr, length);
|
||||||
|
png_memcpy(info_ptr->scal_unit, unit, (png_size_t)length);
|
||||||
|
info_ptr->scal_pixel_width = width;
|
||||||
|
info_ptr->scal_pixel_height = height;
|
||||||
|
|
||||||
|
info_ptr->valid |= PNG_INFO_sCAL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_pHYs_SUPPORTED)
|
||||||
void
|
void
|
||||||
png_set_pHYs(png_structp png_ptr, png_infop info_ptr,
|
png_set_pHYs(png_structp png_ptr, png_infop info_ptr,
|
||||||
png_uint_32 res_x, png_uint_32 res_y, int unit_type)
|
png_uint_32 res_x, png_uint_32 res_y, int unit_type)
|
||||||
@@ -207,7 +229,7 @@ png_set_PLTE(png_structp png_ptr, png_infop info_ptr,
|
|||||||
info_ptr->valid |= PNG_INFO_PLTE;
|
info_ptr->valid |= PNG_INFO_PLTE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(PNG_READ_sBIT_SUPPORTED) || defined(PNG_WRITE_sBIT_SUPPORTED)
|
#if defined(PNG_sBIT_SUPPORTED)
|
||||||
void
|
void
|
||||||
png_set_sBIT(png_structp png_ptr, png_infop info_ptr,
|
png_set_sBIT(png_structp png_ptr, png_infop info_ptr,
|
||||||
png_color_8p sig_bit)
|
png_color_8p sig_bit)
|
||||||
@@ -221,7 +243,7 @@ png_set_sBIT(png_structp png_ptr, png_infop info_ptr,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(PNG_READ_sRGB_SUPPORTED) || defined(PNG_WRITE_sRGB_SUPPORTED)
|
#if defined(PNG_sRGB_SUPPORTED)
|
||||||
void
|
void
|
||||||
png_set_sRGB(png_structp png_ptr, png_infop info_ptr, int intent)
|
png_set_sRGB(png_structp png_ptr, png_infop info_ptr, int intent)
|
||||||
{
|
{
|
||||||
@@ -236,10 +258,10 @@ void
|
|||||||
png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr,
|
png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr,
|
||||||
int intent)
|
int intent)
|
||||||
{
|
{
|
||||||
#if defined(PNG_READ_gAMA_SUPPORTED) || defined(PNG_WRITE_gAMA_SUPPORTED)
|
#if defined(PNG_gAMA_SUPPORTED)
|
||||||
float file_gamma;
|
float file_gamma;
|
||||||
#endif
|
#endif
|
||||||
#if defined(PNG_READ_cHRM_SUPPORTED) || defined(PNG_WRITE_cHRM_SUPPORTED)
|
#if defined(PNG_cHRM_SUPPORTED)
|
||||||
float white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y;
|
float white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y;
|
||||||
#endif
|
#endif
|
||||||
png_debug1(1, "in %s storage function\n", "sRGB_gAMA_and_cHRM");
|
png_debug1(1, "in %s storage function\n", "sRGB_gAMA_and_cHRM");
|
||||||
@@ -248,12 +270,12 @@ png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr,
|
|||||||
|
|
||||||
png_set_sRGB(png_ptr, info_ptr, intent);
|
png_set_sRGB(png_ptr, info_ptr, intent);
|
||||||
|
|
||||||
#if defined(PNG_READ_gAMA_SUPPORTED) || defined(PNG_WRITE_gAMA_SUPPORTED)
|
#if defined(PNG_gAMA_SUPPORTED)
|
||||||
file_gamma = (float).45455;
|
file_gamma = (float).45455;
|
||||||
png_set_gAMA(png_ptr, info_ptr, file_gamma);
|
png_set_gAMA(png_ptr, info_ptr, file_gamma);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(PNG_READ_cHRM_SUPPORTED) || defined(PNG_WRITE_cHRM_SUPPORTED)
|
#if defined(PNG_cHRM_SUPPORTED)
|
||||||
white_x = (float).3127;
|
white_x = (float).3127;
|
||||||
white_y = (float).3290;
|
white_y = (float).3290;
|
||||||
red_x = (float).64;
|
red_x = (float).64;
|
||||||
@@ -270,8 +292,29 @@ png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(PNG_READ_tEXt_SUPPORTED) || defined(PNG_WRITE_tEXt_SUPPORTED) || \
|
#if defined(PNG_iCCP_SUPPORTED)
|
||||||
defined(PNG_READ_zTXt_SUPPORTED) || defined(PNG_WRITE_zTXt_SUPPORTED)
|
void
|
||||||
|
png_set_iCCP(png_structp png_ptr, png_infop info_ptr,
|
||||||
|
png_charp name, int compression_type,
|
||||||
|
png_charp profile, int proflen)
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s storage function\n", "iCCP");
|
||||||
|
if (png_ptr == NULL || info_ptr == NULL || name == NULL || profile == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
info_ptr->iccp_name = png_malloc(png_ptr, png_strlen(name)+1);
|
||||||
|
strcpy(info_ptr->iccp_name, name);
|
||||||
|
info_ptr->iccp_profile = png_malloc(png_ptr, proflen);
|
||||||
|
memcpy(info_ptr->iccp_profile, profile, proflen);
|
||||||
|
info_ptr->iccp_proflen = (png_uint_32)proflen;
|
||||||
|
/* Compression is always zero but is here so the API and info structure
|
||||||
|
* does not have to change * if we introduce multiple compression types */
|
||||||
|
info_ptr->iccp_compression = (png_byte)compression_type;
|
||||||
|
info_ptr->valid |= PNG_INFO_iCCP;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_TEXT_SUPPORTED)
|
||||||
void
|
void
|
||||||
png_set_text(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,
|
png_set_text(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,
|
||||||
int num_text)
|
int num_text)
|
||||||
@@ -320,7 +363,13 @@ png_set_text(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,
|
|||||||
png_charp key,text;
|
png_charp key,text;
|
||||||
|
|
||||||
if (text_ptr[i].key == (png_charp)NULL)
|
if (text_ptr[i].key == (png_charp)NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
#ifdef PNG_iTXt_SUPPORTED
|
||||||
|
textp->lang = text_ptr[i].lang;
|
||||||
|
#else
|
||||||
|
textp->lang = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (text_ptr[i].text[0] == '\0')
|
if (text_ptr[i].text[0] == '\0')
|
||||||
{
|
{
|
||||||
@@ -346,6 +395,7 @@ png_set_text(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,
|
|||||||
|
|
||||||
png_memcpy(textp->key, text_ptr[i].key,
|
png_memcpy(textp->key, text_ptr[i].key,
|
||||||
(png_size_t)(text - key)); /* includes the zero-byte separator */
|
(png_size_t)(text - key)); /* includes the zero-byte separator */
|
||||||
|
|
||||||
textp->text = textp->key + (text-key);
|
textp->text = textp->key + (text-key);
|
||||||
if(textp->text_length)
|
if(textp->text_length)
|
||||||
{
|
{
|
||||||
@@ -362,13 +412,13 @@ png_set_text(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(PNG_READ_tIME_SUPPORTED) || defined(PNG_WRITE_tIME_SUPPORTED)
|
#if defined(PNG_tIME_SUPPORTED)
|
||||||
void
|
void
|
||||||
png_set_tIME(png_structp png_ptr, png_infop info_ptr, png_timep mod_time)
|
png_set_tIME(png_structp png_ptr, png_infop info_ptr, png_timep mod_time)
|
||||||
{
|
{
|
||||||
png_debug1(1, "in %s storage function\n", "tIME");
|
png_debug1(1, "in %s storage function\n", "tIME");
|
||||||
if (png_ptr == NULL || info_ptr == NULL ||
|
if (png_ptr == NULL || info_ptr == NULL ||
|
||||||
(png_ptr->flags & PNG_FLAG_WROTE_tIME))
|
(png_ptr->mode & PNG_WROTE_tIME))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
png_memcpy(&(info_ptr->mod_time), mod_time, sizeof (png_time));
|
png_memcpy(&(info_ptr->mod_time), mod_time, sizeof (png_time));
|
||||||
@@ -376,7 +426,7 @@ png_set_tIME(png_structp png_ptr, png_infop info_ptr, png_timep mod_time)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(PNG_READ_tRNS_SUPPORTED) || defined(PNG_WRITE_tRNS_SUPPORTED)
|
#if defined(PNG_tRNS_SUPPORTED)
|
||||||
void
|
void
|
||||||
png_set_tRNS(png_structp png_ptr, png_infop info_ptr,
|
png_set_tRNS(png_structp png_ptr, png_infop info_ptr,
|
||||||
png_bytep trans, int num_trans, png_color_16p trans_values)
|
png_bytep trans, int num_trans, png_color_16p trans_values)
|
||||||
@@ -402,6 +452,40 @@ png_set_tRNS(png_structp png_ptr, png_infop info_ptr,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_sPLT_SUPPORTED)
|
||||||
|
void
|
||||||
|
png_set_spalettes(png_structp png_ptr,
|
||||||
|
png_infop info_ptr, png_spalette_p entries, int nentries)
|
||||||
|
{
|
||||||
|
png_spalette_p np;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
np = (png_spalette_p)png_malloc(png_ptr,
|
||||||
|
(info_ptr->splt_palettes_num + nentries) * sizeof(png_spalette));
|
||||||
|
|
||||||
|
memcpy(np, info_ptr->splt_palettes,
|
||||||
|
info_ptr->splt_palettes_num * sizeof(png_spalette));
|
||||||
|
png_free(png_ptr, info_ptr->splt_palettes);
|
||||||
|
|
||||||
|
for (i = 0; i < nentries; i++)
|
||||||
|
{
|
||||||
|
png_spalette_p to = np + i;
|
||||||
|
png_spalette_p from = entries + i;
|
||||||
|
|
||||||
|
to->name = (png_charp)png_malloc(png_ptr,
|
||||||
|
png_strlen(from->name) + 1);
|
||||||
|
png_strcpy(to->name, from->name);
|
||||||
|
to->entries = (png_spalette_entryp)png_malloc(png_ptr,
|
||||||
|
from->nentries * sizeof(png_spalette));
|
||||||
|
memcpy(to->entries, from->entries,
|
||||||
|
from->nentries * sizeof(png_spalette));
|
||||||
|
}
|
||||||
|
|
||||||
|
info_ptr->splt_palettes = np;
|
||||||
|
info_ptr->splt_palettes_num += nentries;
|
||||||
|
}
|
||||||
|
#endif /* PNG_sPLT_SUPPORTED */
|
||||||
|
|
||||||
#if defined(PNG_READ_EMPTY_PLTE_SUPPORTED)
|
#if defined(PNG_READ_EMPTY_PLTE_SUPPORTED)
|
||||||
void
|
void
|
||||||
png_permit_empty_plte (png_structp png_ptr, int empty_plte_permitted)
|
png_permit_empty_plte (png_structp png_ptr, int empty_plte_permitted)
|
||||||
@@ -412,3 +496,10 @@ png_permit_empty_plte (png_structp png_ptr, int empty_plte_permitted)
|
|||||||
png_ptr->empty_plte_permitted=(png_byte)empty_plte_permitted;
|
png_ptr->empty_plte_permitted=(png_byte)empty_plte_permitted;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngtrans.c - transforms the data in a row (used by both readers and writers)
|
/* pngtrans.c - transforms the data in a row (used by both readers and writers)
|
||||||
*
|
*
|
||||||
* libpng 1.0.5a - October 23, 1999
|
* libpng 1.0.5f - December 6, 1999
|
||||||
* For conditions of distribution and use, see copyright notice in png.h
|
* For conditions of distribution and use, see copyright notice in png.h
|
||||||
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
||||||
* Copyright (c) 1996, 1997 Andreas Dilger
|
* Copyright (c) 1996, 1997 Andreas Dilger
|
||||||
|
|||||||
31
pngtypes.h
Normal file
31
pngtypes.h
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
/* pngtypes.h - array of chunk-types for libpng
|
||||||
|
*
|
||||||
|
* libpng 1.0.5d - November 28, 1999
|
||||||
|
* For conditions of distribution and use, see copyright notice in png.h
|
||||||
|
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
||||||
|
* Copyright (c) 1996, 1997 Andreas Dilger
|
||||||
|
* Copyright (c) 1998, 1999 Glenn Randers-Pehrson
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Constant strings for known chunk types. If you need to add a chunk,
|
||||||
|
* define the string in png.h and invoke it here.
|
||||||
|
*/
|
||||||
|
|
||||||
|
PNG_IHDR;
|
||||||
|
PNG_IDAT;
|
||||||
|
PNG_IEND;
|
||||||
|
PNG_PLTE;
|
||||||
|
PNG_bKGD;
|
||||||
|
PNG_cHRM;
|
||||||
|
PNG_gAMA;
|
||||||
|
PNG_hIST;
|
||||||
|
PNG_oFFs;
|
||||||
|
PNG_pCAL;
|
||||||
|
PNG_pHYs;
|
||||||
|
PNG_sBIT;
|
||||||
|
PNG_sRGB;
|
||||||
|
PNG_tEXt;
|
||||||
|
PNG_tIME;
|
||||||
|
PNG_tRNS;
|
||||||
|
PNG_zTXt;
|
||||||
|
|
||||||
32
pngvcrd.c
32
pngvcrd.c
@@ -2,7 +2,7 @@
|
|||||||
*
|
*
|
||||||
* For Intel x86 CPU and Microsoft Visual C++ compiler
|
* For Intel x86 CPU and Microsoft Visual C++ compiler
|
||||||
*
|
*
|
||||||
* libpng 1.0.5a - October 23, 1999
|
* libpng 1.0.5f - December 6, 1999
|
||||||
* For conditions of distribution and use, see copyright notice in png.h
|
* For conditions of distribution and use, see copyright notice in png.h
|
||||||
* Copyright (c) 1998, Intel Corporation
|
* Copyright (c) 1998, Intel Corporation
|
||||||
* Copyright (c) 1998, 1999 Glenn Randers-Pehrson
|
* Copyright (c) 1998, 1999 Glenn Randers-Pehrson
|
||||||
@@ -96,6 +96,9 @@ NOT_SUPPORTED:
|
|||||||
void
|
void
|
||||||
png_combine_row(png_structp png_ptr, png_bytep row, int mask)
|
png_combine_row(png_structp png_ptr, png_bytep row, int mask)
|
||||||
{
|
{
|
||||||
|
#ifdef PNG_USE_LOCAL_ARRAYS
|
||||||
|
const int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
|
||||||
|
#endif
|
||||||
#ifdef DISABLE_PNGVCRD_COMBINE
|
#ifdef DISABLE_PNGVCRD_COMBINE
|
||||||
int save_mmx_supported = mmx_supported;
|
int save_mmx_supported = mmx_supported;
|
||||||
#endif
|
#endif
|
||||||
@@ -966,6 +969,9 @@ void
|
|||||||
png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
|
png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
|
||||||
png_uint_32 transformations)
|
png_uint_32 transformations)
|
||||||
{
|
{
|
||||||
|
#ifdef PNG_USE_LOCAL_ARRAYS
|
||||||
|
const int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
|
||||||
|
#endif
|
||||||
#ifdef DISABLE_PNGVCRD_INTERLACE
|
#ifdef DISABLE_PNGVCRD_INTERLACE
|
||||||
int save_mmx_supported = mmx_supported;
|
int save_mmx_supported = mmx_supported;
|
||||||
#endif
|
#endif
|
||||||
@@ -1496,8 +1502,8 @@ loop2_pass0:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sptr -= (width_mmx*2 - 2); // sign fixed
|
sptr -= (width_mmx*2 - 2); // sign fixed
|
||||||
dp -= (width_mmx*16 - 2); // sign fixed
|
dp -= (width_mmx*16 - 2); // sign fixed
|
||||||
for (i = width; i; i--)
|
for (i = width; i; i--)
|
||||||
{
|
{
|
||||||
png_byte v[8];
|
png_byte v[8];
|
||||||
@@ -1541,8 +1547,8 @@ loop2_pass2:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sptr -= (width_mmx*2 - 2); // sign fixed
|
sptr -= (width_mmx*2 - 2); // sign fixed
|
||||||
dp -= (width_mmx*8 - 2); // sign fixed
|
dp -= (width_mmx*8 - 2); // sign fixed
|
||||||
for (i = width; i; i--)
|
for (i = width; i; i--)
|
||||||
{
|
{
|
||||||
png_byte v[8];
|
png_byte v[8];
|
||||||
@@ -1581,8 +1587,8 @@ loop2_pass4:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sptr -= (width_mmx*2 - 2); // sign fixed
|
sptr -= (width_mmx*2 - 2); // sign fixed
|
||||||
dp -= (width_mmx*4 - 2); // sign fixed
|
dp -= (width_mmx*4 - 2); // sign fixed
|
||||||
for (i = width; i; i--)
|
for (i = width; i; i--)
|
||||||
{
|
{
|
||||||
png_byte v[8];
|
png_byte v[8];
|
||||||
@@ -1634,8 +1640,8 @@ loop4_pass0:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sptr -= (width_mmx*4 - 4); // sign fixed
|
sptr -= (width_mmx*4 - 4); // sign fixed
|
||||||
dp -= (width_mmx*32 - 4); // sign fixed
|
dp -= (width_mmx*32 - 4); // sign fixed
|
||||||
for (i = width; i; i--)
|
for (i = width; i; i--)
|
||||||
{
|
{
|
||||||
png_byte v[8];
|
png_byte v[8];
|
||||||
@@ -1679,8 +1685,8 @@ loop4_pass2:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sptr -= (width_mmx*4 - 4); // sign fixed
|
sptr -= (width_mmx*4 - 4); // sign fixed
|
||||||
dp -= (width_mmx*16 - 4); // sign fixed
|
dp -= (width_mmx*16 - 4); // sign fixed
|
||||||
for (i = width; i; i--)
|
for (i = width; i; i--)
|
||||||
{
|
{
|
||||||
png_byte v[8];
|
png_byte v[8];
|
||||||
@@ -1722,8 +1728,8 @@ loop4_pass4:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sptr -= (width_mmx*4 - 4); // sign fixed
|
sptr -= (width_mmx*4 - 4); // sign fixed
|
||||||
dp -= (width_mmx*8 - 4); // sign fixed
|
dp -= (width_mmx*8 - 4); // sign fixed
|
||||||
for (i = width; i; i--)
|
for (i = width; i; i--)
|
||||||
{
|
{
|
||||||
png_byte v[8];
|
png_byte v[8];
|
||||||
|
|||||||
2
pngwio.c
2
pngwio.c
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngwio.c - functions for data output
|
/* pngwio.c - functions for data output
|
||||||
*
|
*
|
||||||
* libpng 1.0.5a - October 23, 1999
|
* libpng 1.0.5f - December 6, 1999
|
||||||
* For conditions of distribution and use, see copyright notice in png.h
|
* For conditions of distribution and use, see copyright notice in png.h
|
||||||
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
||||||
* Copyright (c) 1996, 1997 Andreas Dilger
|
* Copyright (c) 1996, 1997 Andreas Dilger
|
||||||
|
|||||||
85
pngwrite.c
85
pngwrite.c
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngwrite.c - general routines to write a PNG file
|
/* pngwrite.c - general routines to write a PNG file
|
||||||
*
|
*
|
||||||
* libpng 1.0.5a - October 23, 1999
|
* libpng 1.0.5f - December 6, 1999
|
||||||
* For conditions of distribution and use, see copyright notice in png.h
|
* For conditions of distribution and use, see copyright notice in png.h
|
||||||
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
||||||
* Copyright (c) 1996, 1997 Andreas Dilger
|
* Copyright (c) 1996, 1997 Andreas Dilger
|
||||||
@@ -22,13 +22,14 @@
|
|||||||
* them in png_write_end(), and compressing them.
|
* them in png_write_end(), and compressing them.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
png_write_info(png_structp png_ptr, png_infop info_ptr)
|
png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr)
|
||||||
{
|
{
|
||||||
#if defined(PNG_WRITE_tEXt_SUPPORTED) || defined(PNG_WRITE_zTXt_SUPPORTED)
|
#if defined(PNG_WRITE_sPLT_SUPPORTED)
|
||||||
int i;
|
int i;
|
||||||
#endif
|
#endif
|
||||||
|
png_debug(1, "in png_write_info_before_PLTE\n");
|
||||||
png_debug(1, "in png_write_info\n");
|
if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE))
|
||||||
|
{
|
||||||
png_write_sig(png_ptr); /* write PNG signature */
|
png_write_sig(png_ptr); /* write PNG signature */
|
||||||
/* 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,
|
||||||
@@ -49,6 +50,16 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)
|
|||||||
if (info_ptr->valid & PNG_INFO_sRGB)
|
if (info_ptr->valid & PNG_INFO_sRGB)
|
||||||
png_write_sRGB(png_ptr, (int)info_ptr->srgb_intent);
|
png_write_sRGB(png_ptr, (int)info_ptr->srgb_intent);
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(PNG_WRITE_iCCP_SUPPORTED)
|
||||||
|
if (info_ptr->valid & PNG_INFO_iCCP)
|
||||||
|
png_write_iCCP(png_ptr, info_ptr->iccp_name, PNG_TEXT_COMPRESSION_NONE,
|
||||||
|
info_ptr->iccp_profile, (int)info_ptr->iccp_proflen);
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_WRITE_sPLT_SUPPORTED)
|
||||||
|
if (info_ptr->valid & PNG_INFO_sPLT)
|
||||||
|
for (i = 0; i < (int)info_ptr->splt_palettes_num; i++)
|
||||||
|
png_write_sPLT(png_ptr, info_ptr->splt_palettes + i);
|
||||||
|
#endif
|
||||||
#if defined(PNG_WRITE_sBIT_SUPPORTED)
|
#if defined(PNG_WRITE_sBIT_SUPPORTED)
|
||||||
if (info_ptr->valid & PNG_INFO_sBIT)
|
if (info_ptr->valid & PNG_INFO_sBIT)
|
||||||
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);
|
||||||
@@ -61,6 +72,21 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)
|
|||||||
info_ptr->x_green, info_ptr->y_green,
|
info_ptr->x_green, info_ptr->y_green,
|
||||||
info_ptr->x_blue, info_ptr->y_blue);
|
info_ptr->x_blue, info_ptr->y_blue);
|
||||||
#endif
|
#endif
|
||||||
|
png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
png_write_info(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
#if defined(PNG_WRITE_TEXT_SUPPORTED)
|
||||||
|
int i;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
png_debug(1, "in png_write_info\n");
|
||||||
|
|
||||||
|
png_write_info_before_PLTE(png_ptr, info_ptr);
|
||||||
|
|
||||||
if (info_ptr->valid & PNG_INFO_PLTE)
|
if (info_ptr->valid & PNG_INFO_PLTE)
|
||||||
png_write_PLTE(png_ptr, info_ptr->palette,
|
png_write_PLTE(png_ptr, info_ptr->palette,
|
||||||
(png_uint_32)info_ptr->num_palette);
|
(png_uint_32)info_ptr->num_palette);
|
||||||
@@ -103,6 +129,11 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)
|
|||||||
info_ptr->pcal_X1, info_ptr->pcal_type, info_ptr->pcal_nparams,
|
info_ptr->pcal_X1, info_ptr->pcal_type, info_ptr->pcal_nparams,
|
||||||
info_ptr->pcal_units, info_ptr->pcal_params);
|
info_ptr->pcal_units, info_ptr->pcal_params);
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(PNG_WRITE_sCAL_SUPPORTED)
|
||||||
|
if (info_ptr->valid & PNG_INFO_sCAL)
|
||||||
|
png_write_sCAL(png_ptr, info_ptr->scal_unit,
|
||||||
|
info_ptr->scal_pixel_width, info_ptr->scal_pixel_height);
|
||||||
|
#endif
|
||||||
#if defined(PNG_WRITE_pHYs_SUPPORTED)
|
#if defined(PNG_WRITE_pHYs_SUPPORTED)
|
||||||
if (info_ptr->valid & PNG_INFO_pHYs)
|
if (info_ptr->valid & PNG_INFO_pHYs)
|
||||||
png_write_pHYs(png_ptr, info_ptr->x_pixels_per_unit,
|
png_write_pHYs(png_ptr, info_ptr->x_pixels_per_unit,
|
||||||
@@ -112,17 +143,33 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)
|
|||||||
if (info_ptr->valid & PNG_INFO_tIME)
|
if (info_ptr->valid & PNG_INFO_tIME)
|
||||||
{
|
{
|
||||||
png_write_tIME(png_ptr, &(info_ptr->mod_time));
|
png_write_tIME(png_ptr, &(info_ptr->mod_time));
|
||||||
png_ptr->flags |= PNG_FLAG_WROTE_tIME;
|
png_ptr->mode |= PNG_WROTE_tIME;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if defined(PNG_WRITE_tEXt_SUPPORTED) || defined(PNG_WRITE_zTXt_SUPPORTED)
|
#if defined(PNG_WRITE_TEXT_SUPPORTED)
|
||||||
/* Check to see if we need to write text chunks */
|
/* Check to see if we need to write text chunks */
|
||||||
for (i = 0; i < info_ptr->num_text; i++)
|
for (i = 0; i < info_ptr->num_text; i++)
|
||||||
{
|
{
|
||||||
png_debug2(2, "Writing header text chunk %d, type %d\n", i,
|
png_debug2(2, "Writing header text chunk %d, type %d\n", i,
|
||||||
info_ptr->text[i].compression);
|
info_ptr->text[i].compression);
|
||||||
|
/* an internationalized chunk? */
|
||||||
|
if (info_ptr->text[i].lang)
|
||||||
|
{
|
||||||
|
#if defined(PNG_WRITE_iTXt_SUPPORTED)
|
||||||
|
/* write international chunk */
|
||||||
|
png_write_iTXt(png_ptr,
|
||||||
|
info_ptr->text[i].compression,
|
||||||
|
info_ptr->text[i].lang,
|
||||||
|
info_ptr->text[i].key,
|
||||||
|
info_ptr->text[i].text);
|
||||||
|
#else
|
||||||
|
png_warning(png_ptr, "Unable to write international text\n");
|
||||||
|
#endif
|
||||||
|
/* Mark this chunk as written */
|
||||||
|
info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
|
||||||
|
}
|
||||||
/* If we want a compressed text chunk */
|
/* If we want a compressed text chunk */
|
||||||
if (info_ptr->text[i].compression >= PNG_TEXT_COMPRESSION_zTXt)
|
else if (info_ptr->text[i].compression >= PNG_TEXT_COMPRESSION_zTXt)
|
||||||
{
|
{
|
||||||
#if defined(PNG_WRITE_zTXt_SUPPORTED)
|
#if defined(PNG_WRITE_zTXt_SUPPORTED)
|
||||||
/* write compressed chunk */
|
/* write compressed chunk */
|
||||||
@@ -140,7 +187,8 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)
|
|||||||
#if defined(PNG_WRITE_tEXt_SUPPORTED)
|
#if defined(PNG_WRITE_tEXt_SUPPORTED)
|
||||||
/* write uncompressed chunk */
|
/* write uncompressed chunk */
|
||||||
png_write_tEXt(png_ptr, info_ptr->text[i].key,
|
png_write_tEXt(png_ptr, info_ptr->text[i].key,
|
||||||
info_ptr->text[i].text, info_ptr->text[i].text_length);
|
info_ptr->text[i].text,
|
||||||
|
info_ptr->text[i].text_length);
|
||||||
#else
|
#else
|
||||||
png_warning(png_ptr, "Unable to write uncompressed text\n");
|
png_warning(png_ptr, "Unable to write uncompressed text\n");
|
||||||
#endif
|
#endif
|
||||||
@@ -166,16 +214,16 @@ png_write_end(png_structp png_ptr, png_infop info_ptr)
|
|||||||
/* see if user wants us to write information chunks */
|
/* see if user wants us to write information chunks */
|
||||||
if (info_ptr != NULL)
|
if (info_ptr != NULL)
|
||||||
{
|
{
|
||||||
#if defined(PNG_WRITE_tEXt_SUPPORTED) || defined(PNG_WRITE_zTXt_SUPPORTED)
|
#if defined(PNG_WRITE_TEXT_SUPPORTED)
|
||||||
int i; /* local index variable */
|
int i; /* local index variable */
|
||||||
#endif
|
#endif
|
||||||
#if defined(PNG_WRITE_tIME_SUPPORTED)
|
#if defined(PNG_WRITE_tIME_SUPPORTED)
|
||||||
/* check to see if user has supplied a time chunk */
|
/* check to see if user has supplied a time chunk */
|
||||||
if (info_ptr->valid & PNG_INFO_tIME &&
|
if (info_ptr->valid & PNG_INFO_tIME &&
|
||||||
!(png_ptr->flags & PNG_FLAG_WROTE_tIME))
|
!(png_ptr->mode & PNG_WROTE_tIME))
|
||||||
png_write_tIME(png_ptr, &(info_ptr->mod_time));
|
png_write_tIME(png_ptr, &(info_ptr->mod_time));
|
||||||
#endif
|
#endif
|
||||||
#if defined(PNG_WRITE_tEXt_SUPPORTED) || defined(PNG_WRITE_zTXt_SUPPORTED)
|
#if defined(PNG_WRITE_TEXT_SUPPORTED)
|
||||||
/* loop through comment chunks */
|
/* loop through comment chunks */
|
||||||
for (i = 0; i < info_ptr->num_text; i++)
|
for (i = 0; i < info_ptr->num_text; i++)
|
||||||
{
|
{
|
||||||
@@ -630,7 +678,7 @@ png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)
|
|||||||
|
|
||||||
if (info_ptr != NULL)
|
if (info_ptr != NULL)
|
||||||
{
|
{
|
||||||
#if defined(PNG_WRITE_tEXt_SUPPORTED) || defined(PNG_WRITE_zTXt_SUPPORTED)
|
#if defined(PNG_WRITE_TEXT_SUPPORTED)
|
||||||
png_debug(1, "in png_info_destroy\n");
|
png_debug(1, "in png_info_destroy\n");
|
||||||
if (info_ptr->text != NULL)
|
if (info_ptr->text != NULL)
|
||||||
{
|
{
|
||||||
@@ -642,6 +690,11 @@ png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)
|
|||||||
png_free(png_ptr, info_ptr->text[i].key);
|
png_free(png_ptr, info_ptr->text[i].key);
|
||||||
info_ptr->text[i].key = NULL;
|
info_ptr->text[i].key = NULL;
|
||||||
}
|
}
|
||||||
|
if(info_ptr->text[i].lang != NULL)
|
||||||
|
{
|
||||||
|
png_free(png_ptr, info_ptr->text[i].lang);
|
||||||
|
info_ptr->text[i].lang = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
png_free(png_ptr, info_ptr->text);
|
png_free(png_ptr, info_ptr->text);
|
||||||
info_ptr->text = NULL;
|
info_ptr->text = NULL;
|
||||||
@@ -705,16 +758,18 @@ png_write_destroy(png_structp png_ptr)
|
|||||||
png_free(png_ptr, png_ptr->up_row);
|
png_free(png_ptr, png_ptr->up_row);
|
||||||
png_free(png_ptr, png_ptr->avg_row);
|
png_free(png_ptr, png_ptr->avg_row);
|
||||||
png_free(png_ptr, png_ptr->paeth_row);
|
png_free(png_ptr, png_ptr->paeth_row);
|
||||||
|
|
||||||
#if defined(PNG_TIME_RFC1123_SUPPORTED)
|
#if defined(PNG_TIME_RFC1123_SUPPORTED)
|
||||||
png_free(png_ptr, png_ptr->time_buffer);
|
png_free(png_ptr, png_ptr->time_buffer);
|
||||||
#endif /* PNG_TIME_RFC1123_SUPPORTED */
|
#endif
|
||||||
|
|
||||||
#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
|
#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
|
||||||
png_free(png_ptr, png_ptr->prev_filters);
|
png_free(png_ptr, png_ptr->prev_filters);
|
||||||
png_free(png_ptr, png_ptr->filter_weights);
|
png_free(png_ptr, png_ptr->filter_weights);
|
||||||
png_free(png_ptr, png_ptr->inv_filter_weights);
|
png_free(png_ptr, png_ptr->inv_filter_weights);
|
||||||
png_free(png_ptr, png_ptr->filter_costs);
|
png_free(png_ptr, png_ptr->filter_costs);
|
||||||
png_free(png_ptr, png_ptr->inv_filter_costs);
|
png_free(png_ptr, png_ptr->inv_filter_costs);
|
||||||
#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */
|
#endif
|
||||||
|
|
||||||
/* reset structure */
|
/* reset structure */
|
||||||
png_memcpy(tmp_jmp, png_ptr->jmpbuf, sizeof (jmp_buf));
|
png_memcpy(tmp_jmp, png_ptr->jmpbuf, sizeof (jmp_buf));
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngwtran.c - transforms the data in a row for PNG writers
|
/* pngwtran.c - transforms the data in a row for PNG writers
|
||||||
*
|
*
|
||||||
* libpng 1.0.5a - October 23, 1999
|
* libpng 1.0.5f - December 6, 1999
|
||||||
* For conditions of distribution and use, see copyright notice in png.h
|
* For conditions of distribution and use, see copyright notice in png.h
|
||||||
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
* Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
|
||||||
* Copyright (c) 1996, 1997 Andreas Dilger
|
* Copyright (c) 1996, 1997 Andreas Dilger
|
||||||
@@ -19,6 +19,9 @@ png_do_write_transformations(png_structp png_ptr)
|
|||||||
{
|
{
|
||||||
png_debug(1, "in png_do_write_transformations\n");
|
png_debug(1, "in png_do_write_transformations\n");
|
||||||
|
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
|
#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
|
||||||
if (png_ptr->transformations & PNG_USER_TRANSFORM)
|
if (png_ptr->transformations & PNG_USER_TRANSFORM)
|
||||||
if(png_ptr->write_user_transform_fn != NULL)
|
if(png_ptr->write_user_transform_fn != NULL)
|
||||||
|
|||||||
723
pngwutil.c
723
pngwutil.c
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user