xref: /plan9/sys/src/cmd/gs/libpng/png.c (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
17dd7cddfSDavid du Colombier 
27dd7cddfSDavid du Colombier /* png.c - location for general purpose libpng functions
37dd7cddfSDavid du Colombier  *
4*593dc095SDavid du Colombier  * libpng version 1.2.8 - December 3, 2004
57dd7cddfSDavid du Colombier  * For conditions of distribution and use, see copyright notice in png.h
6*593dc095SDavid du Colombier  * Copyright (c) 1998-2004 Glenn Randers-Pehrson
7*593dc095SDavid du Colombier  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
8*593dc095SDavid du Colombier  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
97dd7cddfSDavid du Colombier  */
107dd7cddfSDavid du Colombier 
117dd7cddfSDavid du Colombier #define PNG_INTERNAL
127dd7cddfSDavid du Colombier #define PNG_NO_EXTERN
137dd7cddfSDavid du Colombier #include "png.h"
147dd7cddfSDavid du Colombier 
15*593dc095SDavid du Colombier /* Generate a compiler error if there is an old png.h in the search path. */
16*593dc095SDavid du Colombier typedef version_1_2_8 Your_png_h_is_not_version_1_2_8;
17*593dc095SDavid du Colombier 
187dd7cddfSDavid du Colombier /* Version information for C files.  This had better match the version
19*593dc095SDavid du Colombier  * string defined in png.h.  */
207dd7cddfSDavid du Colombier 
21*593dc095SDavid du Colombier #ifdef PNG_USE_GLOBAL_ARRAYS
22*593dc095SDavid du Colombier /* png_libpng_ver was changed to a function in version 1.0.5c */
23*593dc095SDavid du Colombier const char png_libpng_ver[18] = PNG_LIBPNG_VER_STRING;
24*593dc095SDavid du Colombier 
25*593dc095SDavid du Colombier /* png_sig was changed to a function in version 1.0.5c */
267dd7cddfSDavid du Colombier /* Place to hold the signature string for a PNG file. */
27*593dc095SDavid du Colombier const png_byte FARDATA png_sig[8] = {137, 80, 78, 71, 13, 10, 26, 10};
287dd7cddfSDavid du Colombier 
29*593dc095SDavid du Colombier /* Invoke global declarations for constant strings for known chunk types */
30*593dc095SDavid du Colombier PNG_IHDR;
31*593dc095SDavid du Colombier PNG_IDAT;
32*593dc095SDavid du Colombier PNG_IEND;
33*593dc095SDavid du Colombier PNG_PLTE;
34*593dc095SDavid du Colombier PNG_bKGD;
35*593dc095SDavid du Colombier PNG_cHRM;
36*593dc095SDavid du Colombier PNG_gAMA;
37*593dc095SDavid du Colombier PNG_hIST;
38*593dc095SDavid du Colombier PNG_iCCP;
39*593dc095SDavid du Colombier PNG_iTXt;
40*593dc095SDavid du Colombier PNG_oFFs;
41*593dc095SDavid du Colombier PNG_pCAL;
42*593dc095SDavid du Colombier PNG_sCAL;
43*593dc095SDavid du Colombier PNG_pHYs;
44*593dc095SDavid du Colombier PNG_sBIT;
45*593dc095SDavid du Colombier PNG_sPLT;
46*593dc095SDavid du Colombier PNG_sRGB;
47*593dc095SDavid du Colombier PNG_tEXt;
48*593dc095SDavid du Colombier PNG_tIME;
49*593dc095SDavid du Colombier PNG_tRNS;
50*593dc095SDavid du Colombier PNG_zTXt;
517dd7cddfSDavid du Colombier 
527dd7cddfSDavid du Colombier /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
537dd7cddfSDavid du Colombier 
547dd7cddfSDavid du Colombier /* start of interlace block */
55*593dc095SDavid du Colombier const int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
567dd7cddfSDavid du Colombier 
577dd7cddfSDavid du Colombier /* offset to next interlace block */
58*593dc095SDavid du Colombier const int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
597dd7cddfSDavid du Colombier 
607dd7cddfSDavid du Colombier /* start of interlace block in the y direction */
61*593dc095SDavid du Colombier const int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
627dd7cddfSDavid du Colombier 
637dd7cddfSDavid du Colombier /* offset to next interlace block in the y direction */
64*593dc095SDavid du Colombier const int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
657dd7cddfSDavid du Colombier 
66*593dc095SDavid du Colombier /* width of interlace block (used in assembler routines only) */
67*593dc095SDavid du Colombier #ifdef PNG_HAVE_ASSEMBLER_COMBINE_ROW
68*593dc095SDavid du Colombier const int FARDATA png_pass_width[] = {8, 4, 4, 2, 2, 1, 1};
69*593dc095SDavid du Colombier #endif
707dd7cddfSDavid du Colombier 
717dd7cddfSDavid du Colombier /* Height of interlace block.  This is not currently used - if you need
727dd7cddfSDavid du Colombier  * it, uncomment it here and in png.h
73*593dc095SDavid du Colombier const int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1};
747dd7cddfSDavid du Colombier */
757dd7cddfSDavid du Colombier 
767dd7cddfSDavid du Colombier /* Mask to determine which pixels are valid in a pass */
77*593dc095SDavid du Colombier const int FARDATA png_pass_mask[] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff};
787dd7cddfSDavid du Colombier 
797dd7cddfSDavid du Colombier /* Mask to determine which pixels to overwrite while displaying */
80*593dc095SDavid du Colombier const int FARDATA png_pass_dsp_mask[]
81*593dc095SDavid du Colombier    = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff};
827dd7cddfSDavid du Colombier 
83*593dc095SDavid du Colombier #endif /* PNG_USE_GLOBAL_ARRAYS */
847dd7cddfSDavid du Colombier 
857dd7cddfSDavid du Colombier /* Tells libpng that we have already handled the first "num_bytes" bytes
867dd7cddfSDavid du Colombier  * of the PNG file signature.  If the PNG data is embedded into another
877dd7cddfSDavid du Colombier  * stream we can set num_bytes = 8 so that libpng will not attempt to read
887dd7cddfSDavid du Colombier  * or write any of the magic bytes before it starts on the IHDR.
897dd7cddfSDavid du Colombier  */
90*593dc095SDavid du Colombier 
91*593dc095SDavid du Colombier void PNGAPI
png_set_sig_bytes(png_structp png_ptr,int num_bytes)927dd7cddfSDavid du Colombier png_set_sig_bytes(png_structp png_ptr, int num_bytes)
937dd7cddfSDavid du Colombier {
947dd7cddfSDavid du Colombier    png_debug(1, "in png_set_sig_bytes\n");
957dd7cddfSDavid du Colombier    if (num_bytes > 8)
967dd7cddfSDavid du Colombier       png_error(png_ptr, "Too many bytes for PNG signature.");
977dd7cddfSDavid du Colombier 
98*593dc095SDavid du Colombier    png_ptr->sig_bytes = (png_byte)(num_bytes < 0 ? 0 : num_bytes);
997dd7cddfSDavid du Colombier }
1007dd7cddfSDavid du Colombier 
1017dd7cddfSDavid du Colombier /* Checks whether the supplied bytes match the PNG signature.  We allow
1027dd7cddfSDavid du Colombier  * checking less than the full 8-byte signature so that those apps that
1037dd7cddfSDavid du Colombier  * already read the first few bytes of a file to determine the file type
1047dd7cddfSDavid du Colombier  * can simply check the remaining bytes for extra assurance.  Returns
1057dd7cddfSDavid du Colombier  * an integer less than, equal to, or greater than zero if sig is found,
1067dd7cddfSDavid du Colombier  * respectively, to be less than, to match, or be greater than the correct
1077dd7cddfSDavid du Colombier  * PNG signature (this is the same behaviour as strcmp, memcmp, etc).
1087dd7cddfSDavid du Colombier  */
109*593dc095SDavid du Colombier int PNGAPI
png_sig_cmp(png_bytep sig,png_size_t start,png_size_t num_to_check)1107dd7cddfSDavid du Colombier png_sig_cmp(png_bytep sig, png_size_t start, png_size_t num_to_check)
1117dd7cddfSDavid du Colombier {
112*593dc095SDavid du Colombier    png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10};
1137dd7cddfSDavid du Colombier    if (num_to_check > 8)
1147dd7cddfSDavid du Colombier       num_to_check = 8;
1157dd7cddfSDavid du Colombier    else if (num_to_check < 1)
1167dd7cddfSDavid du Colombier       return (0);
1177dd7cddfSDavid du Colombier 
1187dd7cddfSDavid du Colombier    if (start > 7)
1197dd7cddfSDavid du Colombier       return (0);
1207dd7cddfSDavid du Colombier 
1217dd7cddfSDavid du Colombier    if (start + num_to_check > 8)
1227dd7cddfSDavid du Colombier       num_to_check = 8 - start;
1237dd7cddfSDavid du Colombier 
124*593dc095SDavid du Colombier    return ((int)(png_memcmp(&sig[start], &png_signature[start], num_to_check)));
1257dd7cddfSDavid du Colombier }
1267dd7cddfSDavid du Colombier 
1277dd7cddfSDavid du Colombier /* (Obsolete) function to check signature bytes.  It does not allow one
128*593dc095SDavid du Colombier  * to check a partial signature.  This function might be removed in the
129*593dc095SDavid du Colombier  * future - use png_sig_cmp().  Returns true (nonzero) if the file is a PNG.
1307dd7cddfSDavid du Colombier  */
131*593dc095SDavid du Colombier int PNGAPI
png_check_sig(png_bytep sig,int num)1327dd7cddfSDavid du Colombier png_check_sig(png_bytep sig, int num)
1337dd7cddfSDavid du Colombier {
1347dd7cddfSDavid du Colombier   return ((int)!png_sig_cmp(sig, (png_size_t)0, (png_size_t)num));
1357dd7cddfSDavid du Colombier }
1367dd7cddfSDavid du Colombier 
137*593dc095SDavid du Colombier /* Function to allocate memory for zlib and clear it to 0. */
138*593dc095SDavid du Colombier #ifdef PNG_1_0_X
139*593dc095SDavid du Colombier voidpf PNGAPI
140*593dc095SDavid du Colombier #else
141*593dc095SDavid du Colombier voidpf /* private */
142*593dc095SDavid du Colombier #endif
png_zalloc(voidpf png_ptr,uInt items,uInt size)1437dd7cddfSDavid du Colombier png_zalloc(voidpf png_ptr, uInt items, uInt size)
1447dd7cddfSDavid du Colombier {
1457dd7cddfSDavid du Colombier    png_voidp ptr;
146*593dc095SDavid du Colombier    png_structp p=png_ptr;
147*593dc095SDavid du Colombier    png_uint_32 save_flags=p->flags;
1487dd7cddfSDavid du Colombier    png_uint_32 num_bytes;
1497dd7cddfSDavid du Colombier 
150*593dc095SDavid du Colombier    if (items > PNG_UINT_32_MAX/size)
151*593dc095SDavid du Colombier    {
152*593dc095SDavid du Colombier      png_warning (png_ptr, "Potential overflow in png_zalloc()");
153*593dc095SDavid du Colombier      return (NULL);
154*593dc095SDavid du Colombier    }
1557dd7cddfSDavid du Colombier    num_bytes = (png_uint_32)items * size;
156*593dc095SDavid du Colombier 
157*593dc095SDavid du Colombier    p->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK;
1587dd7cddfSDavid du Colombier    ptr = (png_voidp)png_malloc((png_structp)png_ptr, num_bytes);
159*593dc095SDavid du Colombier    p->flags=save_flags;
160*593dc095SDavid du Colombier 
161*593dc095SDavid du Colombier #if defined(PNG_1_0_X) && !defined(PNG_NO_ZALLOC_ZERO)
162*593dc095SDavid du Colombier    if (ptr == NULL)
163*593dc095SDavid du Colombier        return ((voidpf)ptr);
164*593dc095SDavid du Colombier 
165*593dc095SDavid du Colombier    if (num_bytes > (png_uint_32)0x8000L)
1667dd7cddfSDavid du Colombier    {
1677dd7cddfSDavid du Colombier       png_memset(ptr, 0, (png_size_t)0x8000L);
1687dd7cddfSDavid du Colombier       png_memset((png_bytep)ptr + (png_size_t)0x8000L, 0,
1697dd7cddfSDavid du Colombier          (png_size_t)(num_bytes - (png_uint_32)0x8000L));
1707dd7cddfSDavid du Colombier    }
1717dd7cddfSDavid du Colombier    else
1727dd7cddfSDavid du Colombier    {
1737dd7cddfSDavid du Colombier       png_memset(ptr, 0, (png_size_t)num_bytes);
1747dd7cddfSDavid du Colombier    }
175*593dc095SDavid du Colombier #endif
1767dd7cddfSDavid du Colombier    return ((voidpf)ptr);
1777dd7cddfSDavid du Colombier }
1787dd7cddfSDavid du Colombier 
1797dd7cddfSDavid du Colombier /* function to free memory for zlib */
180*593dc095SDavid du Colombier #ifdef PNG_1_0_X
181*593dc095SDavid du Colombier void PNGAPI
182*593dc095SDavid du Colombier #else
183*593dc095SDavid du Colombier void /* private */
184*593dc095SDavid du Colombier #endif
png_zfree(voidpf png_ptr,voidpf ptr)1857dd7cddfSDavid du Colombier png_zfree(voidpf png_ptr, voidpf ptr)
1867dd7cddfSDavid du Colombier {
1877dd7cddfSDavid du Colombier    png_free((png_structp)png_ptr, (png_voidp)ptr);
1887dd7cddfSDavid du Colombier }
1897dd7cddfSDavid du Colombier 
1907dd7cddfSDavid du Colombier /* Reset the CRC variable to 32 bits of 1's.  Care must be taken
1917dd7cddfSDavid du Colombier  * in case CRC is > 32 bits to leave the top bits 0.
1927dd7cddfSDavid du Colombier  */
193*593dc095SDavid du Colombier void /* PRIVATE */
png_reset_crc(png_structp png_ptr)1947dd7cddfSDavid du Colombier png_reset_crc(png_structp png_ptr)
1957dd7cddfSDavid du Colombier {
1967dd7cddfSDavid du Colombier    png_ptr->crc = crc32(0, Z_NULL, 0);
1977dd7cddfSDavid du Colombier }
1987dd7cddfSDavid du Colombier 
1997dd7cddfSDavid du Colombier /* Calculate the CRC over a section of data.  We can only pass as
2007dd7cddfSDavid du Colombier  * much data to this routine as the largest single buffer size.  We
2017dd7cddfSDavid du Colombier  * also check that this data will actually be used before going to the
2027dd7cddfSDavid du Colombier  * trouble of calculating it.
2037dd7cddfSDavid du Colombier  */
204*593dc095SDavid du Colombier void /* PRIVATE */
png_calculate_crc(png_structp png_ptr,png_bytep ptr,png_size_t length)2057dd7cddfSDavid du Colombier png_calculate_crc(png_structp png_ptr, png_bytep ptr, png_size_t length)
2067dd7cddfSDavid du Colombier {
2077dd7cddfSDavid du Colombier    int need_crc = 1;
2087dd7cddfSDavid du Colombier 
2097dd7cddfSDavid du Colombier    if (png_ptr->chunk_name[0] & 0x20)                     /* ancillary */
2107dd7cddfSDavid du Colombier    {
2117dd7cddfSDavid du Colombier       if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) ==
2127dd7cddfSDavid du Colombier           (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN))
2137dd7cddfSDavid du Colombier          need_crc = 0;
2147dd7cddfSDavid du Colombier    }
2157dd7cddfSDavid du Colombier    else                                                    /* critical */
2167dd7cddfSDavid du Colombier    {
2177dd7cddfSDavid du Colombier       if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE)
2187dd7cddfSDavid du Colombier          need_crc = 0;
2197dd7cddfSDavid du Colombier    }
2207dd7cddfSDavid du Colombier 
2217dd7cddfSDavid du Colombier    if (need_crc)
222*593dc095SDavid du Colombier       png_ptr->crc = crc32(png_ptr->crc, ptr, (uInt)length);
2237dd7cddfSDavid du Colombier }
2247dd7cddfSDavid du Colombier 
2257dd7cddfSDavid du Colombier /* Allocate the memory for an info_struct for the application.  We don't
2267dd7cddfSDavid du Colombier  * really need the png_ptr, but it could potentially be useful in the
227*593dc095SDavid du Colombier  * future.  This should be used in favour of malloc(png_sizeof(png_info))
2287dd7cddfSDavid du Colombier  * and png_info_init() so that applications that want to use a shared
2297dd7cddfSDavid du Colombier  * libpng don't have to be recompiled if png_info changes size.
2307dd7cddfSDavid du Colombier  */
231*593dc095SDavid du Colombier png_infop PNGAPI
png_create_info_struct(png_structp png_ptr)2327dd7cddfSDavid du Colombier png_create_info_struct(png_structp png_ptr)
2337dd7cddfSDavid du Colombier {
2347dd7cddfSDavid du Colombier    png_infop info_ptr;
2357dd7cddfSDavid du Colombier 
2367dd7cddfSDavid du Colombier    png_debug(1, "in png_create_info_struct\n");
237*593dc095SDavid du Colombier    if(png_ptr == NULL) return (NULL);
238*593dc095SDavid du Colombier #ifdef PNG_USER_MEM_SUPPORTED
239*593dc095SDavid du Colombier    info_ptr = (png_infop)png_create_struct_2(PNG_STRUCT_INFO,
240*593dc095SDavid du Colombier       png_ptr->malloc_fn, png_ptr->mem_ptr);
241*593dc095SDavid du Colombier #else
242*593dc095SDavid du Colombier    info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO);
243*593dc095SDavid du Colombier #endif
244*593dc095SDavid du Colombier    if (info_ptr != NULL)
245*593dc095SDavid du Colombier       png_info_init_3(&info_ptr, png_sizeof(png_info));
2467dd7cddfSDavid du Colombier 
2477dd7cddfSDavid du Colombier    return (info_ptr);
2487dd7cddfSDavid du Colombier }
2497dd7cddfSDavid du Colombier 
2507dd7cddfSDavid du Colombier /* This function frees the memory associated with a single info struct.
2517dd7cddfSDavid du Colombier  * Normally, one would use either png_destroy_read_struct() or
2527dd7cddfSDavid du Colombier  * png_destroy_write_struct() to free an info struct, but this may be
2537dd7cddfSDavid du Colombier  * useful for some applications.
2547dd7cddfSDavid du Colombier  */
255*593dc095SDavid du Colombier void PNGAPI
png_destroy_info_struct(png_structp png_ptr,png_infopp info_ptr_ptr)2567dd7cddfSDavid du Colombier png_destroy_info_struct(png_structp png_ptr, png_infopp info_ptr_ptr)
2577dd7cddfSDavid du Colombier {
2587dd7cddfSDavid du Colombier    png_infop info_ptr = NULL;
2597dd7cddfSDavid du Colombier 
2607dd7cddfSDavid du Colombier    png_debug(1, "in png_destroy_info_struct\n");
2617dd7cddfSDavid du Colombier    if (info_ptr_ptr != NULL)
2627dd7cddfSDavid du Colombier       info_ptr = *info_ptr_ptr;
2637dd7cddfSDavid du Colombier 
2647dd7cddfSDavid du Colombier    if (info_ptr != NULL)
2657dd7cddfSDavid du Colombier    {
2667dd7cddfSDavid du Colombier       png_info_destroy(png_ptr, info_ptr);
2677dd7cddfSDavid du Colombier 
268*593dc095SDavid du Colombier #ifdef PNG_USER_MEM_SUPPORTED
269*593dc095SDavid du Colombier       png_destroy_struct_2((png_voidp)info_ptr, png_ptr->free_fn,
270*593dc095SDavid du Colombier           png_ptr->mem_ptr);
271*593dc095SDavid du Colombier #else
2727dd7cddfSDavid du Colombier       png_destroy_struct((png_voidp)info_ptr);
273*593dc095SDavid du Colombier #endif
274*593dc095SDavid du Colombier       *info_ptr_ptr = NULL;
2757dd7cddfSDavid du Colombier    }
2767dd7cddfSDavid du Colombier }
2777dd7cddfSDavid du Colombier 
2787dd7cddfSDavid du Colombier /* Initialize the info structure.  This is now an internal function (0.89)
2797dd7cddfSDavid du Colombier  * and applications using it are urged to use png_create_info_struct()
2807dd7cddfSDavid du Colombier  * instead.
2817dd7cddfSDavid du Colombier  */
282*593dc095SDavid du Colombier #if defined(PNG_1_0_X) || defined (PNG_1_2_X)
283*593dc095SDavid du Colombier #undef png_info_init
284*593dc095SDavid du Colombier void PNGAPI
png_info_init(png_infop info_ptr)2857dd7cddfSDavid du Colombier png_info_init(png_infop info_ptr)
2867dd7cddfSDavid du Colombier {
287*593dc095SDavid du Colombier    /* We only come here via pre-1.0.12-compiled applications */
288*593dc095SDavid du Colombier    png_info_init_3(&info_ptr, 0);
289*593dc095SDavid du Colombier }
290*593dc095SDavid du Colombier #endif
291*593dc095SDavid du Colombier 
292*593dc095SDavid du Colombier void PNGAPI
png_info_init_3(png_infopp ptr_ptr,png_size_t png_info_struct_size)293*593dc095SDavid du Colombier png_info_init_3(png_infopp ptr_ptr, png_size_t png_info_struct_size)
294*593dc095SDavid du Colombier {
295*593dc095SDavid du Colombier    png_infop info_ptr = *ptr_ptr;
296*593dc095SDavid du Colombier 
297*593dc095SDavid du Colombier    png_debug(1, "in png_info_init_3\n");
298*593dc095SDavid du Colombier 
299*593dc095SDavid du Colombier    if(png_sizeof(png_info) > png_info_struct_size)
300*593dc095SDavid du Colombier      {
301*593dc095SDavid du Colombier        png_destroy_struct(info_ptr);
302*593dc095SDavid du Colombier        info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO);
303*593dc095SDavid du Colombier        *ptr_ptr = info_ptr;
304*593dc095SDavid du Colombier      }
305*593dc095SDavid du Colombier 
3067dd7cddfSDavid du Colombier    /* set everything to 0 */
307*593dc095SDavid du Colombier    png_memset(info_ptr, 0, png_sizeof (png_info));
308*593dc095SDavid du Colombier }
309*593dc095SDavid du Colombier 
310*593dc095SDavid du Colombier #ifdef PNG_FREE_ME_SUPPORTED
311*593dc095SDavid du Colombier void PNGAPI
png_data_freer(png_structp png_ptr,png_infop info_ptr,int freer,png_uint_32 mask)312*593dc095SDavid du Colombier png_data_freer(png_structp png_ptr, png_infop info_ptr,
313*593dc095SDavid du Colombier    int freer, png_uint_32 mask)
314*593dc095SDavid du Colombier {
315*593dc095SDavid du Colombier    png_debug(1, "in png_data_freer\n");
316*593dc095SDavid du Colombier    if (png_ptr == NULL || info_ptr == NULL)
317*593dc095SDavid du Colombier       return;
318*593dc095SDavid du Colombier    if(freer == PNG_DESTROY_WILL_FREE_DATA)
319*593dc095SDavid du Colombier       info_ptr->free_me |= mask;
320*593dc095SDavid du Colombier    else if(freer == PNG_USER_WILL_FREE_DATA)
321*593dc095SDavid du Colombier       info_ptr->free_me &= ~mask;
322*593dc095SDavid du Colombier    else
323*593dc095SDavid du Colombier       png_warning(png_ptr,
324*593dc095SDavid du Colombier          "Unknown freer parameter in png_data_freer.");
325*593dc095SDavid du Colombier }
326*593dc095SDavid du Colombier #endif
327*593dc095SDavid du Colombier 
328*593dc095SDavid du Colombier void PNGAPI
png_free_data(png_structp png_ptr,png_infop info_ptr,png_uint_32 mask,int num)329*593dc095SDavid du Colombier png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask,
330*593dc095SDavid du Colombier    int num)
331*593dc095SDavid du Colombier {
332*593dc095SDavid du Colombier    png_debug(1, "in png_free_data\n");
333*593dc095SDavid du Colombier    if (png_ptr == NULL || info_ptr == NULL)
334*593dc095SDavid du Colombier       return;
335*593dc095SDavid du Colombier 
336*593dc095SDavid du Colombier #if defined(PNG_TEXT_SUPPORTED)
337*593dc095SDavid du Colombier /* free text item num or (if num == -1) all text items */
338*593dc095SDavid du Colombier #ifdef PNG_FREE_ME_SUPPORTED
339*593dc095SDavid du Colombier if ((mask & PNG_FREE_TEXT) & info_ptr->free_me)
340*593dc095SDavid du Colombier #else
341*593dc095SDavid du Colombier if (mask & PNG_FREE_TEXT)
342*593dc095SDavid du Colombier #endif
343*593dc095SDavid du Colombier {
344*593dc095SDavid du Colombier    if (num != -1)
345*593dc095SDavid du Colombier    {
346*593dc095SDavid du Colombier      if (info_ptr->text && info_ptr->text[num].key)
347*593dc095SDavid du Colombier      {
348*593dc095SDavid du Colombier          png_free(png_ptr, info_ptr->text[num].key);
349*593dc095SDavid du Colombier          info_ptr->text[num].key = NULL;
350*593dc095SDavid du Colombier      }
351*593dc095SDavid du Colombier    }
352*593dc095SDavid du Colombier    else
353*593dc095SDavid du Colombier    {
354*593dc095SDavid du Colombier        int i;
355*593dc095SDavid du Colombier        for (i = 0; i < info_ptr->num_text; i++)
356*593dc095SDavid du Colombier            png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, i);
357*593dc095SDavid du Colombier        png_free(png_ptr, info_ptr->text);
358*593dc095SDavid du Colombier        info_ptr->text = NULL;
359*593dc095SDavid du Colombier        info_ptr->num_text=0;
360*593dc095SDavid du Colombier    }
361*593dc095SDavid du Colombier }
362*593dc095SDavid du Colombier #endif
363*593dc095SDavid du Colombier 
364*593dc095SDavid du Colombier #if defined(PNG_tRNS_SUPPORTED)
365*593dc095SDavid du Colombier /* free any tRNS entry */
366*593dc095SDavid du Colombier #ifdef PNG_FREE_ME_SUPPORTED
367*593dc095SDavid du Colombier if ((mask & PNG_FREE_TRNS) & info_ptr->free_me)
368*593dc095SDavid du Colombier #else
369*593dc095SDavid du Colombier if ((mask & PNG_FREE_TRNS) && (png_ptr->flags & PNG_FLAG_FREE_TRNS))
370*593dc095SDavid du Colombier #endif
371*593dc095SDavid du Colombier {
372*593dc095SDavid du Colombier     png_free(png_ptr, info_ptr->trans);
373*593dc095SDavid du Colombier     info_ptr->valid &= ~PNG_INFO_tRNS;
374*593dc095SDavid du Colombier #ifndef PNG_FREE_ME_SUPPORTED
375*593dc095SDavid du Colombier     png_ptr->flags &= ~PNG_FLAG_FREE_TRNS;
376*593dc095SDavid du Colombier #endif
377*593dc095SDavid du Colombier     info_ptr->trans = NULL;
378*593dc095SDavid du Colombier }
379*593dc095SDavid du Colombier #endif
380*593dc095SDavid du Colombier 
381*593dc095SDavid du Colombier #if defined(PNG_sCAL_SUPPORTED)
382*593dc095SDavid du Colombier /* free any sCAL entry */
383*593dc095SDavid du Colombier #ifdef PNG_FREE_ME_SUPPORTED
384*593dc095SDavid du Colombier if ((mask & PNG_FREE_SCAL) & info_ptr->free_me)
385*593dc095SDavid du Colombier #else
386*593dc095SDavid du Colombier if (mask & PNG_FREE_SCAL)
387*593dc095SDavid du Colombier #endif
388*593dc095SDavid du Colombier {
389*593dc095SDavid du Colombier #if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED)
390*593dc095SDavid du Colombier     png_free(png_ptr, info_ptr->scal_s_width);
391*593dc095SDavid du Colombier     png_free(png_ptr, info_ptr->scal_s_height);
392*593dc095SDavid du Colombier     info_ptr->scal_s_width = NULL;
393*593dc095SDavid du Colombier     info_ptr->scal_s_height = NULL;
394*593dc095SDavid du Colombier #endif
395*593dc095SDavid du Colombier     info_ptr->valid &= ~PNG_INFO_sCAL;
396*593dc095SDavid du Colombier }
397*593dc095SDavid du Colombier #endif
398*593dc095SDavid du Colombier 
399*593dc095SDavid du Colombier #if defined(PNG_pCAL_SUPPORTED)
400*593dc095SDavid du Colombier /* free any pCAL entry */
401*593dc095SDavid du Colombier #ifdef PNG_FREE_ME_SUPPORTED
402*593dc095SDavid du Colombier if ((mask & PNG_FREE_PCAL) & info_ptr->free_me)
403*593dc095SDavid du Colombier #else
404*593dc095SDavid du Colombier if (mask & PNG_FREE_PCAL)
405*593dc095SDavid du Colombier #endif
406*593dc095SDavid du Colombier {
407*593dc095SDavid du Colombier     png_free(png_ptr, info_ptr->pcal_purpose);
408*593dc095SDavid du Colombier     png_free(png_ptr, info_ptr->pcal_units);
409*593dc095SDavid du Colombier     info_ptr->pcal_purpose = NULL;
410*593dc095SDavid du Colombier     info_ptr->pcal_units = NULL;
411*593dc095SDavid du Colombier     if (info_ptr->pcal_params != NULL)
412*593dc095SDavid du Colombier     {
413*593dc095SDavid du Colombier         int i;
414*593dc095SDavid du Colombier         for (i = 0; i < (int)info_ptr->pcal_nparams; i++)
415*593dc095SDavid du Colombier         {
416*593dc095SDavid du Colombier           png_free(png_ptr, info_ptr->pcal_params[i]);
417*593dc095SDavid du Colombier           info_ptr->pcal_params[i]=NULL;
418*593dc095SDavid du Colombier         }
419*593dc095SDavid du Colombier         png_free(png_ptr, info_ptr->pcal_params);
420*593dc095SDavid du Colombier         info_ptr->pcal_params = NULL;
421*593dc095SDavid du Colombier     }
422*593dc095SDavid du Colombier     info_ptr->valid &= ~PNG_INFO_pCAL;
423*593dc095SDavid du Colombier }
424*593dc095SDavid du Colombier #endif
425*593dc095SDavid du Colombier 
426*593dc095SDavid du Colombier #if defined(PNG_iCCP_SUPPORTED)
427*593dc095SDavid du Colombier /* free any iCCP entry */
428*593dc095SDavid du Colombier #ifdef PNG_FREE_ME_SUPPORTED
429*593dc095SDavid du Colombier if ((mask & PNG_FREE_ICCP) & info_ptr->free_me)
430*593dc095SDavid du Colombier #else
431*593dc095SDavid du Colombier if (mask & PNG_FREE_ICCP)
432*593dc095SDavid du Colombier #endif
433*593dc095SDavid du Colombier {
434*593dc095SDavid du Colombier     png_free(png_ptr, info_ptr->iccp_name);
435*593dc095SDavid du Colombier     png_free(png_ptr, info_ptr->iccp_profile);
436*593dc095SDavid du Colombier     info_ptr->iccp_name = NULL;
437*593dc095SDavid du Colombier     info_ptr->iccp_profile = NULL;
438*593dc095SDavid du Colombier     info_ptr->valid &= ~PNG_INFO_iCCP;
439*593dc095SDavid du Colombier }
440*593dc095SDavid du Colombier #endif
441*593dc095SDavid du Colombier 
442*593dc095SDavid du Colombier #if defined(PNG_sPLT_SUPPORTED)
443*593dc095SDavid du Colombier /* free a given sPLT entry, or (if num == -1) all sPLT entries */
444*593dc095SDavid du Colombier #ifdef PNG_FREE_ME_SUPPORTED
445*593dc095SDavid du Colombier if ((mask & PNG_FREE_SPLT) & info_ptr->free_me)
446*593dc095SDavid du Colombier #else
447*593dc095SDavid du Colombier if (mask & PNG_FREE_SPLT)
448*593dc095SDavid du Colombier #endif
449*593dc095SDavid du Colombier {
450*593dc095SDavid du Colombier    if (num != -1)
451*593dc095SDavid du Colombier    {
452*593dc095SDavid du Colombier       if(info_ptr->splt_palettes)
453*593dc095SDavid du Colombier       {
454*593dc095SDavid du Colombier           png_free(png_ptr, info_ptr->splt_palettes[num].name);
455*593dc095SDavid du Colombier           png_free(png_ptr, info_ptr->splt_palettes[num].entries);
456*593dc095SDavid du Colombier           info_ptr->splt_palettes[num].name = NULL;
457*593dc095SDavid du Colombier           info_ptr->splt_palettes[num].entries = NULL;
458*593dc095SDavid du Colombier       }
459*593dc095SDavid du Colombier    }
460*593dc095SDavid du Colombier    else
461*593dc095SDavid du Colombier    {
462*593dc095SDavid du Colombier        if(info_ptr->splt_palettes_num)
463*593dc095SDavid du Colombier        {
464*593dc095SDavid du Colombier          int i;
465*593dc095SDavid du Colombier          for (i = 0; i < (int)info_ptr->splt_palettes_num; i++)
466*593dc095SDavid du Colombier             png_free_data(png_ptr, info_ptr, PNG_FREE_SPLT, i);
467*593dc095SDavid du Colombier 
468*593dc095SDavid du Colombier          png_free(png_ptr, info_ptr->splt_palettes);
469*593dc095SDavid du Colombier          info_ptr->splt_palettes = NULL;
470*593dc095SDavid du Colombier          info_ptr->splt_palettes_num = 0;
471*593dc095SDavid du Colombier        }
472*593dc095SDavid du Colombier        info_ptr->valid &= ~PNG_INFO_sPLT;
473*593dc095SDavid du Colombier    }
474*593dc095SDavid du Colombier }
475*593dc095SDavid du Colombier #endif
476*593dc095SDavid du Colombier 
477*593dc095SDavid du Colombier #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
478*593dc095SDavid du Colombier #ifdef PNG_FREE_ME_SUPPORTED
479*593dc095SDavid du Colombier if ((mask & PNG_FREE_UNKN) & info_ptr->free_me)
480*593dc095SDavid du Colombier #else
481*593dc095SDavid du Colombier if (mask & PNG_FREE_UNKN)
482*593dc095SDavid du Colombier #endif
483*593dc095SDavid du Colombier {
484*593dc095SDavid du Colombier    if (num != -1)
485*593dc095SDavid du Colombier    {
486*593dc095SDavid du Colombier        if(info_ptr->unknown_chunks)
487*593dc095SDavid du Colombier        {
488*593dc095SDavid du Colombier           png_free(png_ptr, info_ptr->unknown_chunks[num].data);
489*593dc095SDavid du Colombier           info_ptr->unknown_chunks[num].data = NULL;
490*593dc095SDavid du Colombier        }
491*593dc095SDavid du Colombier    }
492*593dc095SDavid du Colombier    else
493*593dc095SDavid du Colombier    {
494*593dc095SDavid du Colombier        int i;
495*593dc095SDavid du Colombier 
496*593dc095SDavid du Colombier        if(info_ptr->unknown_chunks_num)
497*593dc095SDavid du Colombier        {
498*593dc095SDavid du Colombier          for (i = 0; i < (int)info_ptr->unknown_chunks_num; i++)
499*593dc095SDavid du Colombier             png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, i);
500*593dc095SDavid du Colombier 
501*593dc095SDavid du Colombier          png_free(png_ptr, info_ptr->unknown_chunks);
502*593dc095SDavid du Colombier          info_ptr->unknown_chunks = NULL;
503*593dc095SDavid du Colombier          info_ptr->unknown_chunks_num = 0;
504*593dc095SDavid du Colombier        }
505*593dc095SDavid du Colombier    }
506*593dc095SDavid du Colombier }
507*593dc095SDavid du Colombier #endif
508*593dc095SDavid du Colombier 
509*593dc095SDavid du Colombier #if defined(PNG_hIST_SUPPORTED)
510*593dc095SDavid du Colombier /* free any hIST entry */
511*593dc095SDavid du Colombier #ifdef PNG_FREE_ME_SUPPORTED
512*593dc095SDavid du Colombier if ((mask & PNG_FREE_HIST)  & info_ptr->free_me)
513*593dc095SDavid du Colombier #else
514*593dc095SDavid du Colombier if ((mask & PNG_FREE_HIST) && (png_ptr->flags & PNG_FLAG_FREE_HIST))
515*593dc095SDavid du Colombier #endif
516*593dc095SDavid du Colombier {
517*593dc095SDavid du Colombier     png_free(png_ptr, info_ptr->hist);
518*593dc095SDavid du Colombier     info_ptr->hist = NULL;
519*593dc095SDavid du Colombier     info_ptr->valid &= ~PNG_INFO_hIST;
520*593dc095SDavid du Colombier #ifndef PNG_FREE_ME_SUPPORTED
521*593dc095SDavid du Colombier     png_ptr->flags &= ~PNG_FLAG_FREE_HIST;
522*593dc095SDavid du Colombier #endif
523*593dc095SDavid du Colombier }
524*593dc095SDavid du Colombier #endif
525*593dc095SDavid du Colombier 
526*593dc095SDavid du Colombier /* free any PLTE entry that was internally allocated */
527*593dc095SDavid du Colombier #ifdef PNG_FREE_ME_SUPPORTED
528*593dc095SDavid du Colombier if ((mask & PNG_FREE_PLTE) & info_ptr->free_me)
529*593dc095SDavid du Colombier #else
530*593dc095SDavid du Colombier if ((mask & PNG_FREE_PLTE) && (png_ptr->flags & PNG_FLAG_FREE_PLTE))
531*593dc095SDavid du Colombier #endif
532*593dc095SDavid du Colombier {
533*593dc095SDavid du Colombier     png_zfree(png_ptr, info_ptr->palette);
534*593dc095SDavid du Colombier     info_ptr->palette = NULL;
535*593dc095SDavid du Colombier     info_ptr->valid &= ~PNG_INFO_PLTE;
536*593dc095SDavid du Colombier #ifndef PNG_FREE_ME_SUPPORTED
537*593dc095SDavid du Colombier     png_ptr->flags &= ~PNG_FLAG_FREE_PLTE;
538*593dc095SDavid du Colombier #endif
539*593dc095SDavid du Colombier     info_ptr->num_palette = 0;
540*593dc095SDavid du Colombier }
541*593dc095SDavid du Colombier 
542*593dc095SDavid du Colombier #if defined(PNG_INFO_IMAGE_SUPPORTED)
543*593dc095SDavid du Colombier /* free any image bits attached to the info structure */
544*593dc095SDavid du Colombier #ifdef PNG_FREE_ME_SUPPORTED
545*593dc095SDavid du Colombier if ((mask & PNG_FREE_ROWS) & info_ptr->free_me)
546*593dc095SDavid du Colombier #else
547*593dc095SDavid du Colombier if (mask & PNG_FREE_ROWS)
548*593dc095SDavid du Colombier #endif
549*593dc095SDavid du Colombier {
550*593dc095SDavid du Colombier     if(info_ptr->row_pointers)
551*593dc095SDavid du Colombier     {
552*593dc095SDavid du Colombier        int row;
553*593dc095SDavid du Colombier        for (row = 0; row < (int)info_ptr->height; row++)
554*593dc095SDavid du Colombier        {
555*593dc095SDavid du Colombier           png_free(png_ptr, info_ptr->row_pointers[row]);
556*593dc095SDavid du Colombier           info_ptr->row_pointers[row]=NULL;
557*593dc095SDavid du Colombier        }
558*593dc095SDavid du Colombier        png_free(png_ptr, info_ptr->row_pointers);
559*593dc095SDavid du Colombier        info_ptr->row_pointers=NULL;
560*593dc095SDavid du Colombier     }
561*593dc095SDavid du Colombier     info_ptr->valid &= ~PNG_INFO_IDAT;
562*593dc095SDavid du Colombier }
563*593dc095SDavid du Colombier #endif
564*593dc095SDavid du Colombier 
565*593dc095SDavid du Colombier #ifdef PNG_FREE_ME_SUPPORTED
566*593dc095SDavid du Colombier    if(num == -1)
567*593dc095SDavid du Colombier      info_ptr->free_me &= ~mask;
568*593dc095SDavid du Colombier    else
569*593dc095SDavid du Colombier      info_ptr->free_me &= ~(mask & ~PNG_FREE_MUL);
570*593dc095SDavid du Colombier #endif
5717dd7cddfSDavid du Colombier }
5727dd7cddfSDavid du Colombier 
5737dd7cddfSDavid du Colombier /* This is an internal routine to free any memory that the info struct is
5747dd7cddfSDavid du Colombier  * pointing to before re-using it or freeing the struct itself.  Recall
5757dd7cddfSDavid du Colombier  * that png_free() checks for NULL pointers for us.
5767dd7cddfSDavid du Colombier  */
577*593dc095SDavid du Colombier void /* PRIVATE */
png_info_destroy(png_structp png_ptr,png_infop info_ptr)5787dd7cddfSDavid du Colombier png_info_destroy(png_structp png_ptr, png_infop info_ptr)
5797dd7cddfSDavid du Colombier {
5807dd7cddfSDavid du Colombier    png_debug(1, "in png_info_destroy\n");
581*593dc095SDavid du Colombier 
582*593dc095SDavid du Colombier    png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1);
583*593dc095SDavid du Colombier 
584*593dc095SDavid du Colombier #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
585*593dc095SDavid du Colombier    if (png_ptr->num_chunk_list)
5867dd7cddfSDavid du Colombier    {
587*593dc095SDavid du Colombier        png_free(png_ptr, png_ptr->chunk_list);
588*593dc095SDavid du Colombier        png_ptr->chunk_list=NULL;
589*593dc095SDavid du Colombier        png_ptr->num_chunk_list=0;
5907dd7cddfSDavid du Colombier    }
5917dd7cddfSDavid du Colombier #endif
5927dd7cddfSDavid du Colombier 
593*593dc095SDavid du Colombier    png_info_init_3(&info_ptr, png_sizeof(png_info));
5947dd7cddfSDavid du Colombier }
5957dd7cddfSDavid du Colombier 
5967dd7cddfSDavid du Colombier /* This function returns a pointer to the io_ptr associated with the user
5977dd7cddfSDavid du Colombier  * functions.  The application should free any memory associated with this
5987dd7cddfSDavid du Colombier  * pointer before png_write_destroy() or png_read_destroy() are called.
5997dd7cddfSDavid du Colombier  */
600*593dc095SDavid du Colombier png_voidp PNGAPI
png_get_io_ptr(png_structp png_ptr)6017dd7cddfSDavid du Colombier png_get_io_ptr(png_structp png_ptr)
6027dd7cddfSDavid du Colombier {
6037dd7cddfSDavid du Colombier    return (png_ptr->io_ptr);
6047dd7cddfSDavid du Colombier }
6057dd7cddfSDavid du Colombier 
6067dd7cddfSDavid du Colombier #if !defined(PNG_NO_STDIO)
6077dd7cddfSDavid du Colombier /* Initialize the default input/output functions for the PNG file.  If you
6087dd7cddfSDavid du Colombier  * use your own read or write routines, you can call either png_set_read_fn()
609*593dc095SDavid du Colombier  * or png_set_write_fn() instead of png_init_io().  If you have defined
610*593dc095SDavid du Colombier  * PNG_NO_STDIO, you must use a function of your own because "FILE *" isn't
611*593dc095SDavid du Colombier  * necessarily available.
6127dd7cddfSDavid du Colombier  */
613*593dc095SDavid du Colombier void PNGAPI
png_init_io(png_structp png_ptr,png_FILE_p fp)614*593dc095SDavid du Colombier png_init_io(png_structp png_ptr, png_FILE_p fp)
6157dd7cddfSDavid du Colombier {
6167dd7cddfSDavid du Colombier    png_debug(1, "in png_init_io\n");
6177dd7cddfSDavid du Colombier    png_ptr->io_ptr = (png_voidp)fp;
6187dd7cddfSDavid du Colombier }
6197dd7cddfSDavid du Colombier #endif
620*593dc095SDavid du Colombier 
621*593dc095SDavid du Colombier #if defined(PNG_TIME_RFC1123_SUPPORTED)
622*593dc095SDavid du Colombier /* Convert the supplied time into an RFC 1123 string suitable for use in
623*593dc095SDavid du Colombier  * a "Creation Time" or other text-based time string.
624*593dc095SDavid du Colombier  */
625*593dc095SDavid du Colombier png_charp PNGAPI
png_convert_to_rfc1123(png_structp png_ptr,png_timep ptime)626*593dc095SDavid du Colombier png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime)
627*593dc095SDavid du Colombier {
628*593dc095SDavid du Colombier    static PNG_CONST char short_months[12][4] =
629*593dc095SDavid du Colombier         {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
630*593dc095SDavid du Colombier          "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
631*593dc095SDavid du Colombier 
632*593dc095SDavid du Colombier    if (png_ptr->time_buffer == NULL)
633*593dc095SDavid du Colombier    {
634*593dc095SDavid du Colombier       png_ptr->time_buffer = (png_charp)png_malloc(png_ptr, (png_uint_32)(29*
635*593dc095SDavid du Colombier          png_sizeof(char)));
636*593dc095SDavid du Colombier    }
637*593dc095SDavid du Colombier 
638*593dc095SDavid du Colombier #if defined(_WIN32_WCE)
639*593dc095SDavid du Colombier    {
640*593dc095SDavid du Colombier       wchar_t time_buf[29];
641*593dc095SDavid du Colombier       wsprintf(time_buf, TEXT("%d %S %d %02d:%02d:%02d +0000"),
642*593dc095SDavid du Colombier           ptime->day % 32, short_months[(ptime->month - 1) % 12],
643*593dc095SDavid du Colombier         ptime->year, ptime->hour % 24, ptime->minute % 60,
644*593dc095SDavid du Colombier           ptime->second % 61);
645*593dc095SDavid du Colombier       WideCharToMultiByte(CP_ACP, 0, time_buf, -1, png_ptr->time_buffer, 29,
646*593dc095SDavid du Colombier           NULL, NULL);
647*593dc095SDavid du Colombier    }
648*593dc095SDavid du Colombier #else
649*593dc095SDavid du Colombier #ifdef USE_FAR_KEYWORD
650*593dc095SDavid du Colombier    {
651*593dc095SDavid du Colombier       char near_time_buf[29];
652*593dc095SDavid du Colombier       sprintf(near_time_buf, "%d %s %d %02d:%02d:%02d +0000",
653*593dc095SDavid du Colombier           ptime->day % 32, short_months[(ptime->month - 1) % 12],
654*593dc095SDavid du Colombier           ptime->year, ptime->hour % 24, ptime->minute % 60,
655*593dc095SDavid du Colombier           ptime->second % 61);
656*593dc095SDavid du Colombier       png_memcpy(png_ptr->time_buffer, near_time_buf,
657*593dc095SDavid du Colombier           29*png_sizeof(char));
658*593dc095SDavid du Colombier    }
659*593dc095SDavid du Colombier #else
660*593dc095SDavid du Colombier    sprintf(png_ptr->time_buffer, "%d %s %d %02d:%02d:%02d +0000",
661*593dc095SDavid du Colombier        ptime->day % 32, short_months[(ptime->month - 1) % 12],
662*593dc095SDavid du Colombier        ptime->year, ptime->hour % 24, ptime->minute % 60,
663*593dc095SDavid du Colombier        ptime->second % 61);
664*593dc095SDavid du Colombier #endif
665*593dc095SDavid du Colombier #endif /* _WIN32_WCE */
666*593dc095SDavid du Colombier    return ((png_charp)png_ptr->time_buffer);
667*593dc095SDavid du Colombier }
668*593dc095SDavid du Colombier #endif /* PNG_TIME_RFC1123_SUPPORTED */
669*593dc095SDavid du Colombier 
670*593dc095SDavid du Colombier #if 0
671*593dc095SDavid du Colombier /* Signature string for a PNG file. */
672*593dc095SDavid du Colombier png_bytep PNGAPI
673*593dc095SDavid du Colombier png_sig_bytes(void)
674*593dc095SDavid du Colombier {
675*593dc095SDavid du Colombier    return ((png_bytep)"\211\120\116\107\015\012\032\012");
676*593dc095SDavid du Colombier }
677*593dc095SDavid du Colombier #endif
678*593dc095SDavid du Colombier 
679*593dc095SDavid du Colombier png_charp PNGAPI
png_get_copyright(png_structp png_ptr)680*593dc095SDavid du Colombier png_get_copyright(png_structp png_ptr)
681*593dc095SDavid du Colombier {
682*593dc095SDavid du Colombier    if (&png_ptr != NULL)  /* silence compiler warning about unused png_ptr */
683*593dc095SDavid du Colombier    return ((png_charp) "\n libpng version 1.2.8 - December 3, 2004\n\
684*593dc095SDavid du Colombier    Copyright (c) 1998-2004 Glenn Randers-Pehrson\n\
685*593dc095SDavid du Colombier    Copyright (c) 1996-1997 Andreas Dilger\n\
686*593dc095SDavid du Colombier    Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.\n");
687*593dc095SDavid du Colombier    return ((png_charp) "");
688*593dc095SDavid du Colombier }
689*593dc095SDavid du Colombier 
690*593dc095SDavid du Colombier /* The following return the library version as a short string in the
691*593dc095SDavid du Colombier  * format 1.0.0 through 99.99.99zz.  To get the version of *.h files
692*593dc095SDavid du Colombier  * used with your application, print out PNG_LIBPNG_VER_STRING, which
693*593dc095SDavid du Colombier  * is defined in png.h.
694*593dc095SDavid du Colombier  * Note: now there is no difference between png_get_libpng_ver() and
695*593dc095SDavid du Colombier  * png_get_header_ver().  Due to the version_nn_nn_nn typedef guard,
696*593dc095SDavid du Colombier  * it is guaranteed that png.c uses the correct version of png.h.
697*593dc095SDavid du Colombier  */
698*593dc095SDavid du Colombier png_charp PNGAPI
png_get_libpng_ver(png_structp png_ptr)699*593dc095SDavid du Colombier png_get_libpng_ver(png_structp png_ptr)
700*593dc095SDavid du Colombier {
701*593dc095SDavid du Colombier    /* Version of *.c files used when building libpng */
702*593dc095SDavid du Colombier    if (&png_ptr != NULL)  /* silence compiler warning about unused png_ptr */
703*593dc095SDavid du Colombier       return ((png_charp) PNG_LIBPNG_VER_STRING);
704*593dc095SDavid du Colombier    return ((png_charp) "");
705*593dc095SDavid du Colombier }
706*593dc095SDavid du Colombier 
707*593dc095SDavid du Colombier png_charp PNGAPI
png_get_header_ver(png_structp png_ptr)708*593dc095SDavid du Colombier png_get_header_ver(png_structp png_ptr)
709*593dc095SDavid du Colombier {
710*593dc095SDavid du Colombier    /* Version of *.h files used when building libpng */
711*593dc095SDavid du Colombier    if (&png_ptr != NULL)  /* silence compiler warning about unused png_ptr */
712*593dc095SDavid du Colombier       return ((png_charp) PNG_LIBPNG_VER_STRING);
713*593dc095SDavid du Colombier    return ((png_charp) "");
714*593dc095SDavid du Colombier }
715*593dc095SDavid du Colombier 
716*593dc095SDavid du Colombier png_charp PNGAPI
png_get_header_version(png_structp png_ptr)717*593dc095SDavid du Colombier png_get_header_version(png_structp png_ptr)
718*593dc095SDavid du Colombier {
719*593dc095SDavid du Colombier    /* Returns longer string containing both version and date */
720*593dc095SDavid du Colombier    if (&png_ptr != NULL)  /* silence compiler warning about unused png_ptr */
721*593dc095SDavid du Colombier       return ((png_charp) PNG_HEADER_VERSION_STRING);
722*593dc095SDavid du Colombier    return ((png_charp) "");
723*593dc095SDavid du Colombier }
724*593dc095SDavid du Colombier 
725*593dc095SDavid du Colombier #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
726*593dc095SDavid du Colombier int PNGAPI
png_handle_as_unknown(png_structp png_ptr,png_bytep chunk_name)727*593dc095SDavid du Colombier png_handle_as_unknown(png_structp png_ptr, png_bytep chunk_name)
728*593dc095SDavid du Colombier {
729*593dc095SDavid du Colombier    /* check chunk_name and return "keep" value if it's on the list, else 0 */
730*593dc095SDavid du Colombier    int i;
731*593dc095SDavid du Colombier    png_bytep p;
732*593dc095SDavid du Colombier    if((png_ptr == NULL && chunk_name == NULL) || png_ptr->num_chunk_list<=0)
733*593dc095SDavid du Colombier       return 0;
734*593dc095SDavid du Colombier    p=png_ptr->chunk_list+png_ptr->num_chunk_list*5-5;
735*593dc095SDavid du Colombier    for (i = png_ptr->num_chunk_list; i; i--, p-=5)
736*593dc095SDavid du Colombier       if (!png_memcmp(chunk_name, p, 4))
737*593dc095SDavid du Colombier         return ((int)*(p+4));
738*593dc095SDavid du Colombier    return 0;
739*593dc095SDavid du Colombier }
740*593dc095SDavid du Colombier #endif
741*593dc095SDavid du Colombier 
742*593dc095SDavid du Colombier /* This function, added to libpng-1.0.6g, is untested. */
743*593dc095SDavid du Colombier int PNGAPI
png_reset_zstream(png_structp png_ptr)744*593dc095SDavid du Colombier png_reset_zstream(png_structp png_ptr)
745*593dc095SDavid du Colombier {
746*593dc095SDavid du Colombier    return (inflateReset(&png_ptr->zstream));
747*593dc095SDavid du Colombier }
748*593dc095SDavid du Colombier 
749*593dc095SDavid du Colombier /* This function was added to libpng-1.0.7 */
750*593dc095SDavid du Colombier png_uint_32 PNGAPI
png_access_version_number(void)751*593dc095SDavid du Colombier png_access_version_number(void)
752*593dc095SDavid du Colombier {
753*593dc095SDavid du Colombier    /* Version of *.c files used when building libpng */
754*593dc095SDavid du Colombier    return((png_uint_32) PNG_LIBPNG_VER);
755*593dc095SDavid du Colombier }
756*593dc095SDavid du Colombier 
757*593dc095SDavid du Colombier 
758*593dc095SDavid du Colombier #if !defined(PNG_1_0_X)
759*593dc095SDavid du Colombier #if defined(PNG_ASSEMBLER_CODE_SUPPORTED)
760*593dc095SDavid du Colombier     /* GRR:  could add this:   && defined(PNG_MMX_CODE_SUPPORTED) */
761*593dc095SDavid du Colombier /* this INTERNAL function was added to libpng 1.2.0 */
762*593dc095SDavid du Colombier void /* PRIVATE */
png_init_mmx_flags(png_structp png_ptr)763*593dc095SDavid du Colombier png_init_mmx_flags (png_structp png_ptr)
764*593dc095SDavid du Colombier {
765*593dc095SDavid du Colombier     png_ptr->mmx_rowbytes_threshold = 0;
766*593dc095SDavid du Colombier     png_ptr->mmx_bitdepth_threshold = 0;
767*593dc095SDavid du Colombier 
768*593dc095SDavid du Colombier #  if (defined(PNG_USE_PNGVCRD) || defined(PNG_USE_PNGGCCRD))
769*593dc095SDavid du Colombier 
770*593dc095SDavid du Colombier     png_ptr->asm_flags |= PNG_ASM_FLAG_MMX_SUPPORT_COMPILED;
771*593dc095SDavid du Colombier 
772*593dc095SDavid du Colombier     if (png_mmx_support() > 0) {
773*593dc095SDavid du Colombier         png_ptr->asm_flags |= PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU
774*593dc095SDavid du Colombier #    ifdef PNG_HAVE_ASSEMBLER_COMBINE_ROW
775*593dc095SDavid du Colombier                               | PNG_ASM_FLAG_MMX_READ_COMBINE_ROW
776*593dc095SDavid du Colombier #    endif
777*593dc095SDavid du Colombier #    ifdef PNG_HAVE_ASSEMBLER_READ_INTERLACE
778*593dc095SDavid du Colombier                               | PNG_ASM_FLAG_MMX_READ_INTERLACE
779*593dc095SDavid du Colombier #    endif
780*593dc095SDavid du Colombier #    ifndef PNG_HAVE_ASSEMBLER_READ_FILTER_ROW
781*593dc095SDavid du Colombier                               ;
782*593dc095SDavid du Colombier #    else
783*593dc095SDavid du Colombier                               | PNG_ASM_FLAG_MMX_READ_FILTER_SUB
784*593dc095SDavid du Colombier                               | PNG_ASM_FLAG_MMX_READ_FILTER_UP
785*593dc095SDavid du Colombier                               | PNG_ASM_FLAG_MMX_READ_FILTER_AVG
786*593dc095SDavid du Colombier                               | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ;
787*593dc095SDavid du Colombier 
788*593dc095SDavid du Colombier         png_ptr->mmx_rowbytes_threshold = PNG_MMX_ROWBYTES_THRESHOLD_DEFAULT;
789*593dc095SDavid du Colombier         png_ptr->mmx_bitdepth_threshold = PNG_MMX_BITDEPTH_THRESHOLD_DEFAULT;
790*593dc095SDavid du Colombier #    endif
791*593dc095SDavid du Colombier     } else {
792*593dc095SDavid du Colombier         png_ptr->asm_flags &= ~( PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU
793*593dc095SDavid du Colombier                                | PNG_MMX_READ_FLAGS
794*593dc095SDavid du Colombier                                | PNG_MMX_WRITE_FLAGS );
795*593dc095SDavid du Colombier     }
796*593dc095SDavid du Colombier 
797*593dc095SDavid du Colombier #  else /* !((PNGVCRD || PNGGCCRD) && PNG_ASSEMBLER_CODE_SUPPORTED)) */
798*593dc095SDavid du Colombier 
799*593dc095SDavid du Colombier     /* clear all MMX flags; no support is compiled in */
800*593dc095SDavid du Colombier     png_ptr->asm_flags &= ~( PNG_MMX_FLAGS );
801*593dc095SDavid du Colombier 
802*593dc095SDavid du Colombier #  endif /* ?(PNGVCRD || PNGGCCRD) */
803*593dc095SDavid du Colombier }
804*593dc095SDavid du Colombier 
805*593dc095SDavid du Colombier #endif /* !(PNG_ASSEMBLER_CODE_SUPPORTED) */
806*593dc095SDavid du Colombier 
807*593dc095SDavid du Colombier /* this function was added to libpng 1.2.0 */
808*593dc095SDavid du Colombier #if !defined(PNG_USE_PNGGCCRD) && \
809*593dc095SDavid du Colombier     !(defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_USE_PNGVCRD))
810*593dc095SDavid du Colombier int PNGAPI
png_mmx_support(void)811*593dc095SDavid du Colombier png_mmx_support(void)
812*593dc095SDavid du Colombier {
813*593dc095SDavid du Colombier     return -1;
814*593dc095SDavid du Colombier }
815*593dc095SDavid du Colombier #endif
816*593dc095SDavid du Colombier #endif /* PNG_1_0_X */
817*593dc095SDavid du Colombier 
818*593dc095SDavid du Colombier #ifdef PNG_SIZE_T
819*593dc095SDavid du Colombier /* Added at libpng version 1.2.6 */
820*593dc095SDavid du Colombier    PNG_EXTERN png_size_t PNGAPI png_convert_size PNGARG((size_t size));
821*593dc095SDavid du Colombier png_size_t PNGAPI
png_convert_size(size_t size)822*593dc095SDavid du Colombier png_convert_size(size_t size)
823*593dc095SDavid du Colombier {
824*593dc095SDavid du Colombier   if (size > (png_size_t)-1)
825*593dc095SDavid du Colombier      PNG_ABORT();  /* We haven't got access to png_ptr, so no png_error() */
826*593dc095SDavid du Colombier   return ((png_size_t)size);
827*593dc095SDavid du Colombier }
828*593dc095SDavid du Colombier #endif /* PNG_SIZE_T */
829