istereo

diff libs/libpng/png.c @ 26:862a3329a8f0

wohooo, added a shitload of code from zlib/libpng/libjpeg. When the good lord was raining shared libraries the iphone held a fucking umbrella...
author John Tsiombikas <nuclear@mutantstargoat.com>
date Thu, 08 Sep 2011 06:28:38 +0300
parents
children
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/libs/libpng/png.c	Thu Sep 08 06:28:38 2011 +0300
     1.3 @@ -0,0 +1,799 @@
     1.4 +
     1.5 +/* png.c - location for general purpose libpng functions
     1.6 + *
     1.7 + * Last changed in libpng 1.2.30 [August 15, 2008]
     1.8 + * For conditions of distribution and use, see copyright notice in png.h
     1.9 + * Copyright (c) 1998-2008 Glenn Randers-Pehrson
    1.10 + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
    1.11 + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
    1.12 + */
    1.13 +
    1.14 +#define PNG_INTERNAL
    1.15 +#define PNG_NO_EXTERN
    1.16 +#include "png.h"
    1.17 +
    1.18 +/* Generate a compiler error if there is an old png.h in the search path. */
    1.19 +typedef version_1_2_33 Your_png_h_is_not_version_1_2_33;
    1.20 +
    1.21 +/* Version information for C files.  This had better match the version
    1.22 + * string defined in png.h.  */
    1.23 +
    1.24 +#ifdef PNG_USE_GLOBAL_ARRAYS
    1.25 +/* png_libpng_ver was changed to a function in version 1.0.5c */
    1.26 +PNG_CONST char png_libpng_ver[18] = PNG_LIBPNG_VER_STRING;
    1.27 +
    1.28 +#ifdef PNG_READ_SUPPORTED
    1.29 +
    1.30 +/* png_sig was changed to a function in version 1.0.5c */
    1.31 +/* Place to hold the signature string for a PNG file. */
    1.32 +PNG_CONST png_byte FARDATA png_sig[8] = {137, 80, 78, 71, 13, 10, 26, 10};
    1.33 +#endif /* PNG_READ_SUPPORTED */
    1.34 +
    1.35 +/* Invoke global declarations for constant strings for known chunk types */
    1.36 +PNG_IHDR;
    1.37 +PNG_IDAT;
    1.38 +PNG_IEND;
    1.39 +PNG_PLTE;
    1.40 +PNG_bKGD;
    1.41 +PNG_cHRM;
    1.42 +PNG_gAMA;
    1.43 +PNG_hIST;
    1.44 +PNG_iCCP;
    1.45 +PNG_iTXt;
    1.46 +PNG_oFFs;
    1.47 +PNG_pCAL;
    1.48 +PNG_sCAL;
    1.49 +PNG_pHYs;
    1.50 +PNG_sBIT;
    1.51 +PNG_sPLT;
    1.52 +PNG_sRGB;
    1.53 +PNG_tEXt;
    1.54 +PNG_tIME;
    1.55 +PNG_tRNS;
    1.56 +PNG_zTXt;
    1.57 +
    1.58 +#ifdef PNG_READ_SUPPORTED
    1.59 +/* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
    1.60 +
    1.61 +/* start of interlace block */
    1.62 +PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
    1.63 +
    1.64 +/* offset to next interlace block */
    1.65 +PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
    1.66 +
    1.67 +/* start of interlace block in the y direction */
    1.68 +PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
    1.69 +
    1.70 +/* offset to next interlace block in the y direction */
    1.71 +PNG_CONST int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
    1.72 +
    1.73 +/* Height of interlace block.  This is not currently used - if you need
    1.74 + * it, uncomment it here and in png.h
    1.75 +PNG_CONST int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1};
    1.76 +*/
    1.77 +
    1.78 +/* Mask to determine which pixels are valid in a pass */
    1.79 +PNG_CONST int FARDATA png_pass_mask[] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff};
    1.80 +
    1.81 +/* Mask to determine which pixels to overwrite while displaying */
    1.82 +PNG_CONST int FARDATA png_pass_dsp_mask[]
    1.83 +   = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff};
    1.84 +
    1.85 +#endif /* PNG_READ_SUPPORTED */
    1.86 +#endif /* PNG_USE_GLOBAL_ARRAYS */
    1.87 +
    1.88 +/* Tells libpng that we have already handled the first "num_bytes" bytes
    1.89 + * of the PNG file signature.  If the PNG data is embedded into another
    1.90 + * stream we can set num_bytes = 8 so that libpng will not attempt to read
    1.91 + * or write any of the magic bytes before it starts on the IHDR.
    1.92 + */
    1.93 +
    1.94 +#ifdef PNG_READ_SUPPORTED
    1.95 +void PNGAPI
    1.96 +png_set_sig_bytes(png_structp png_ptr, int num_bytes)
    1.97 +{
    1.98 +   if (png_ptr == NULL) return;
    1.99 +   png_debug(1, "in png_set_sig_bytes\n");
   1.100 +   if (num_bytes > 8)
   1.101 +      png_error(png_ptr, "Too many bytes for PNG signature.");
   1.102 +
   1.103 +   png_ptr->sig_bytes = (png_byte)(num_bytes < 0 ? 0 : num_bytes);
   1.104 +}
   1.105 +
   1.106 +/* Checks whether the supplied bytes match the PNG signature.  We allow
   1.107 + * checking less than the full 8-byte signature so that those apps that
   1.108 + * already read the first few bytes of a file to determine the file type
   1.109 + * can simply check the remaining bytes for extra assurance.  Returns
   1.110 + * an integer less than, equal to, or greater than zero if sig is found,
   1.111 + * respectively, to be less than, to match, or be greater than the correct
   1.112 + * PNG signature (this is the same behaviour as strcmp, memcmp, etc).
   1.113 + */
   1.114 +int PNGAPI
   1.115 +png_sig_cmp(png_bytep sig, png_size_t start, png_size_t num_to_check)
   1.116 +{
   1.117 +   png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10};
   1.118 +   if (num_to_check > 8)
   1.119 +      num_to_check = 8;
   1.120 +   else if (num_to_check < 1)
   1.121 +      return (-1);
   1.122 +
   1.123 +   if (start > 7)
   1.124 +      return (-1);
   1.125 +
   1.126 +   if (start + num_to_check > 8)
   1.127 +      num_to_check = 8 - start;
   1.128 +
   1.129 +   return ((int)(png_memcmp(&sig[start], &png_signature[start], num_to_check)));
   1.130 +}
   1.131 +
   1.132 +#if defined(PNG_1_0_X) || defined(PNG_1_2_X)
   1.133 +/* (Obsolete) function to check signature bytes.  It does not allow one
   1.134 + * to check a partial signature.  This function might be removed in the
   1.135 + * future - use png_sig_cmp().  Returns true (nonzero) if the file is PNG.
   1.136 + */
   1.137 +int PNGAPI
   1.138 +png_check_sig(png_bytep sig, int num)
   1.139 +{
   1.140 +  return ((int)!png_sig_cmp(sig, (png_size_t)0, (png_size_t)num));
   1.141 +}
   1.142 +#endif
   1.143 +#endif /* PNG_READ_SUPPORTED */
   1.144 +
   1.145 +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
   1.146 +/* Function to allocate memory for zlib and clear it to 0. */
   1.147 +#ifdef PNG_1_0_X
   1.148 +voidpf PNGAPI
   1.149 +#else
   1.150 +voidpf /* private */
   1.151 +#endif
   1.152 +png_zalloc(voidpf png_ptr, uInt items, uInt size)
   1.153 +{
   1.154 +   png_voidp ptr;
   1.155 +   png_structp p=(png_structp)png_ptr;
   1.156 +   png_uint_32 save_flags=p->flags;
   1.157 +   png_uint_32 num_bytes;
   1.158 +
   1.159 +   if (png_ptr == NULL) return (NULL);
   1.160 +   if (items > PNG_UINT_32_MAX/size)
   1.161 +   {
   1.162 +     png_warning (p, "Potential overflow in png_zalloc()");
   1.163 +     return (NULL);
   1.164 +   }
   1.165 +   num_bytes = (png_uint_32)items * size;
   1.166 +
   1.167 +   p->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK;
   1.168 +   ptr = (png_voidp)png_malloc((png_structp)png_ptr, num_bytes);
   1.169 +   p->flags=save_flags;
   1.170 +
   1.171 +#if defined(PNG_1_0_X) && !defined(PNG_NO_ZALLOC_ZERO)
   1.172 +   if (ptr == NULL)
   1.173 +       return ((voidpf)ptr);
   1.174 +
   1.175 +   if (num_bytes > (png_uint_32)0x8000L)
   1.176 +   {
   1.177 +      png_memset(ptr, 0, (png_size_t)0x8000L);
   1.178 +      png_memset((png_bytep)ptr + (png_size_t)0x8000L, 0,
   1.179 +         (png_size_t)(num_bytes - (png_uint_32)0x8000L));
   1.180 +   }
   1.181 +   else
   1.182 +   {
   1.183 +      png_memset(ptr, 0, (png_size_t)num_bytes);
   1.184 +   }
   1.185 +#endif
   1.186 +   return ((voidpf)ptr);
   1.187 +}
   1.188 +
   1.189 +/* function to free memory for zlib */
   1.190 +#ifdef PNG_1_0_X
   1.191 +void PNGAPI
   1.192 +#else
   1.193 +void /* private */
   1.194 +#endif
   1.195 +png_zfree(voidpf png_ptr, voidpf ptr)
   1.196 +{
   1.197 +   png_free((png_structp)png_ptr, (png_voidp)ptr);
   1.198 +}
   1.199 +
   1.200 +/* Reset the CRC variable to 32 bits of 1's.  Care must be taken
   1.201 + * in case CRC is > 32 bits to leave the top bits 0.
   1.202 + */
   1.203 +void /* PRIVATE */
   1.204 +png_reset_crc(png_structp png_ptr)
   1.205 +{
   1.206 +   png_ptr->crc = crc32(0, Z_NULL, 0);
   1.207 +}
   1.208 +
   1.209 +/* Calculate the CRC over a section of data.  We can only pass as
   1.210 + * much data to this routine as the largest single buffer size.  We
   1.211 + * also check that this data will actually be used before going to the
   1.212 + * trouble of calculating it.
   1.213 + */
   1.214 +void /* PRIVATE */
   1.215 +png_calculate_crc(png_structp png_ptr, png_bytep ptr, png_size_t length)
   1.216 +{
   1.217 +   int need_crc = 1;
   1.218 +
   1.219 +   if (png_ptr->chunk_name[0] & 0x20)                     /* ancillary */
   1.220 +   {
   1.221 +      if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) ==
   1.222 +          (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN))
   1.223 +         need_crc = 0;
   1.224 +   }
   1.225 +   else                                                    /* critical */
   1.226 +   {
   1.227 +      if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE)
   1.228 +         need_crc = 0;
   1.229 +   }
   1.230 +
   1.231 +   if (need_crc)
   1.232 +      png_ptr->crc = crc32(png_ptr->crc, ptr, (uInt)length);
   1.233 +}
   1.234 +
   1.235 +/* Allocate the memory for an info_struct for the application.  We don't
   1.236 + * really need the png_ptr, but it could potentially be useful in the
   1.237 + * future.  This should be used in favour of malloc(png_sizeof(png_info))
   1.238 + * and png_info_init() so that applications that want to use a shared
   1.239 + * libpng don't have to be recompiled if png_info changes size.
   1.240 + */
   1.241 +png_infop PNGAPI
   1.242 +png_create_info_struct(png_structp png_ptr)
   1.243 +{
   1.244 +   png_infop info_ptr;
   1.245 +
   1.246 +   png_debug(1, "in png_create_info_struct\n");
   1.247 +   if (png_ptr == NULL) return (NULL);
   1.248 +#ifdef PNG_USER_MEM_SUPPORTED
   1.249 +   info_ptr = (png_infop)png_create_struct_2(PNG_STRUCT_INFO,
   1.250 +      png_ptr->malloc_fn, png_ptr->mem_ptr);
   1.251 +#else
   1.252 +   info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO);
   1.253 +#endif
   1.254 +   if (info_ptr != NULL)
   1.255 +      png_info_init_3(&info_ptr, png_sizeof(png_info));
   1.256 +
   1.257 +   return (info_ptr);
   1.258 +}
   1.259 +
   1.260 +/* This function frees the memory associated with a single info struct.
   1.261 + * Normally, one would use either png_destroy_read_struct() or
   1.262 + * png_destroy_write_struct() to free an info struct, but this may be
   1.263 + * useful for some applications.
   1.264 + */
   1.265 +void PNGAPI
   1.266 +png_destroy_info_struct(png_structp png_ptr, png_infopp info_ptr_ptr)
   1.267 +{
   1.268 +   png_infop info_ptr = NULL;
   1.269 +   if (png_ptr == NULL) return;
   1.270 +
   1.271 +   png_debug(1, "in png_destroy_info_struct\n");
   1.272 +   if (info_ptr_ptr != NULL)
   1.273 +      info_ptr = *info_ptr_ptr;
   1.274 +
   1.275 +   if (info_ptr != NULL)
   1.276 +   {
   1.277 +      png_info_destroy(png_ptr, info_ptr);
   1.278 +
   1.279 +#ifdef PNG_USER_MEM_SUPPORTED
   1.280 +      png_destroy_struct_2((png_voidp)info_ptr, png_ptr->free_fn,
   1.281 +          png_ptr->mem_ptr);
   1.282 +#else
   1.283 +      png_destroy_struct((png_voidp)info_ptr);
   1.284 +#endif
   1.285 +      *info_ptr_ptr = NULL;
   1.286 +   }
   1.287 +}
   1.288 +
   1.289 +/* Initialize the info structure.  This is now an internal function (0.89)
   1.290 + * and applications using it are urged to use png_create_info_struct()
   1.291 + * instead.
   1.292 + */
   1.293 +#if defined(PNG_1_0_X) || defined(PNG_1_2_X)
   1.294 +#undef png_info_init
   1.295 +void PNGAPI
   1.296 +png_info_init(png_infop info_ptr)
   1.297 +{
   1.298 +   /* We only come here via pre-1.0.12-compiled applications */
   1.299 +   png_info_init_3(&info_ptr, 0);
   1.300 +}
   1.301 +#endif
   1.302 +
   1.303 +void PNGAPI
   1.304 +png_info_init_3(png_infopp ptr_ptr, png_size_t png_info_struct_size)
   1.305 +{
   1.306 +   png_infop info_ptr = *ptr_ptr;
   1.307 +
   1.308 +   if (info_ptr == NULL) return;
   1.309 +
   1.310 +   png_debug(1, "in png_info_init_3\n");
   1.311 +
   1.312 +   if (png_sizeof(png_info) > png_info_struct_size)
   1.313 +     {
   1.314 +       png_destroy_struct(info_ptr);
   1.315 +       info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO);
   1.316 +       *ptr_ptr = info_ptr;
   1.317 +     }
   1.318 +
   1.319 +   /* set everything to 0 */
   1.320 +   png_memset(info_ptr, 0, png_sizeof(png_info));
   1.321 +}
   1.322 +
   1.323 +#ifdef PNG_FREE_ME_SUPPORTED
   1.324 +void PNGAPI
   1.325 +png_data_freer(png_structp png_ptr, png_infop info_ptr,
   1.326 +   int freer, png_uint_32 mask)
   1.327 +{
   1.328 +   png_debug(1, "in png_data_freer\n");
   1.329 +   if (png_ptr == NULL || info_ptr == NULL)
   1.330 +      return;
   1.331 +   if (freer == PNG_DESTROY_WILL_FREE_DATA)
   1.332 +      info_ptr->free_me |= mask;
   1.333 +   else if (freer == PNG_USER_WILL_FREE_DATA)
   1.334 +      info_ptr->free_me &= ~mask;
   1.335 +   else
   1.336 +      png_warning(png_ptr,
   1.337 +         "Unknown freer parameter in png_data_freer.");
   1.338 +}
   1.339 +#endif
   1.340 +
   1.341 +void PNGAPI
   1.342 +png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask,
   1.343 +   int num)
   1.344 +{
   1.345 +   png_debug(1, "in png_free_data\n");
   1.346 +   if (png_ptr == NULL || info_ptr == NULL)
   1.347 +      return;
   1.348 +
   1.349 +#if defined(PNG_TEXT_SUPPORTED)
   1.350 +/* free text item num or (if num == -1) all text items */
   1.351 +#ifdef PNG_FREE_ME_SUPPORTED
   1.352 +if ((mask & PNG_FREE_TEXT) & info_ptr->free_me)
   1.353 +#else
   1.354 +if (mask & PNG_FREE_TEXT)
   1.355 +#endif
   1.356 +{
   1.357 +   if (num != -1)
   1.358 +   {
   1.359 +     if (info_ptr->text && info_ptr->text[num].key)
   1.360 +     {
   1.361 +         png_free(png_ptr, info_ptr->text[num].key);
   1.362 +         info_ptr->text[num].key = NULL;
   1.363 +     }
   1.364 +   }
   1.365 +   else
   1.366 +   {
   1.367 +       int i;
   1.368 +       for (i = 0; i < info_ptr->num_text; i++)
   1.369 +           png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, i);
   1.370 +       png_free(png_ptr, info_ptr->text);
   1.371 +       info_ptr->text = NULL;
   1.372 +       info_ptr->num_text=0;
   1.373 +   }
   1.374 +}
   1.375 +#endif
   1.376 +
   1.377 +#if defined(PNG_tRNS_SUPPORTED)
   1.378 +/* free any tRNS entry */
   1.379 +#ifdef PNG_FREE_ME_SUPPORTED
   1.380 +if ((mask & PNG_FREE_TRNS) & info_ptr->free_me)
   1.381 +#else
   1.382 +if ((mask & PNG_FREE_TRNS) && (png_ptr->flags & PNG_FLAG_FREE_TRNS))
   1.383 +#endif
   1.384 +{
   1.385 +    png_free(png_ptr, info_ptr->trans);
   1.386 +    info_ptr->trans = NULL;
   1.387 +    info_ptr->valid &= ~PNG_INFO_tRNS;
   1.388 +#ifndef PNG_FREE_ME_SUPPORTED
   1.389 +    png_ptr->flags &= ~PNG_FLAG_FREE_TRNS;
   1.390 +#endif
   1.391 +}
   1.392 +#endif
   1.393 +
   1.394 +#if defined(PNG_sCAL_SUPPORTED)
   1.395 +/* free any sCAL entry */
   1.396 +#ifdef PNG_FREE_ME_SUPPORTED
   1.397 +if ((mask & PNG_FREE_SCAL) & info_ptr->free_me)
   1.398 +#else
   1.399 +if (mask & PNG_FREE_SCAL)
   1.400 +#endif
   1.401 +{
   1.402 +#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED)
   1.403 +    png_free(png_ptr, info_ptr->scal_s_width);
   1.404 +    png_free(png_ptr, info_ptr->scal_s_height);
   1.405 +    info_ptr->scal_s_width = NULL;
   1.406 +    info_ptr->scal_s_height = NULL;
   1.407 +#endif
   1.408 +    info_ptr->valid &= ~PNG_INFO_sCAL;
   1.409 +}
   1.410 +#endif
   1.411 +
   1.412 +#if defined(PNG_pCAL_SUPPORTED)
   1.413 +/* free any pCAL entry */
   1.414 +#ifdef PNG_FREE_ME_SUPPORTED
   1.415 +if ((mask & PNG_FREE_PCAL) & info_ptr->free_me)
   1.416 +#else
   1.417 +if (mask & PNG_FREE_PCAL)
   1.418 +#endif
   1.419 +{
   1.420 +    png_free(png_ptr, info_ptr->pcal_purpose);
   1.421 +    png_free(png_ptr, info_ptr->pcal_units);
   1.422 +    info_ptr->pcal_purpose = NULL;
   1.423 +    info_ptr->pcal_units = NULL;
   1.424 +    if (info_ptr->pcal_params != NULL)
   1.425 +    {
   1.426 +        int i;
   1.427 +        for (i = 0; i < (int)info_ptr->pcal_nparams; i++)
   1.428 +        {
   1.429 +          png_free(png_ptr, info_ptr->pcal_params[i]);
   1.430 +          info_ptr->pcal_params[i]=NULL;
   1.431 +        }
   1.432 +        png_free(png_ptr, info_ptr->pcal_params);
   1.433 +        info_ptr->pcal_params = NULL;
   1.434 +    }
   1.435 +    info_ptr->valid &= ~PNG_INFO_pCAL;
   1.436 +}
   1.437 +#endif
   1.438 +
   1.439 +#if defined(PNG_iCCP_SUPPORTED)
   1.440 +/* free any iCCP entry */
   1.441 +#ifdef PNG_FREE_ME_SUPPORTED
   1.442 +if ((mask & PNG_FREE_ICCP) & info_ptr->free_me)
   1.443 +#else
   1.444 +if (mask & PNG_FREE_ICCP)
   1.445 +#endif
   1.446 +{
   1.447 +    png_free(png_ptr, info_ptr->iccp_name);
   1.448 +    png_free(png_ptr, info_ptr->iccp_profile);
   1.449 +    info_ptr->iccp_name = NULL;
   1.450 +    info_ptr->iccp_profile = NULL;
   1.451 +    info_ptr->valid &= ~PNG_INFO_iCCP;
   1.452 +}
   1.453 +#endif
   1.454 +
   1.455 +#if defined(PNG_sPLT_SUPPORTED)
   1.456 +/* free a given sPLT entry, or (if num == -1) all sPLT entries */
   1.457 +#ifdef PNG_FREE_ME_SUPPORTED
   1.458 +if ((mask & PNG_FREE_SPLT) & info_ptr->free_me)
   1.459 +#else
   1.460 +if (mask & PNG_FREE_SPLT)
   1.461 +#endif
   1.462 +{
   1.463 +   if (num != -1)
   1.464 +   {
   1.465 +      if (info_ptr->splt_palettes)
   1.466 +      {
   1.467 +          png_free(png_ptr, info_ptr->splt_palettes[num].name);
   1.468 +          png_free(png_ptr, info_ptr->splt_palettes[num].entries);
   1.469 +          info_ptr->splt_palettes[num].name = NULL;
   1.470 +          info_ptr->splt_palettes[num].entries = NULL;
   1.471 +      }
   1.472 +   }
   1.473 +   else
   1.474 +   {
   1.475 +       if (info_ptr->splt_palettes_num)
   1.476 +       {
   1.477 +         int i;
   1.478 +         for (i = 0; i < (int)info_ptr->splt_palettes_num; i++)
   1.479 +            png_free_data(png_ptr, info_ptr, PNG_FREE_SPLT, i);
   1.480 +
   1.481 +         png_free(png_ptr, info_ptr->splt_palettes);
   1.482 +         info_ptr->splt_palettes = NULL;
   1.483 +         info_ptr->splt_palettes_num = 0;
   1.484 +       }
   1.485 +       info_ptr->valid &= ~PNG_INFO_sPLT;
   1.486 +   }
   1.487 +}
   1.488 +#endif
   1.489 +
   1.490 +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
   1.491 +  if (png_ptr->unknown_chunk.data)
   1.492 +  {
   1.493 +    png_free(png_ptr, png_ptr->unknown_chunk.data);
   1.494 +    png_ptr->unknown_chunk.data = NULL;
   1.495 +  }
   1.496 +
   1.497 +#ifdef PNG_FREE_ME_SUPPORTED
   1.498 +if ((mask & PNG_FREE_UNKN) & info_ptr->free_me)
   1.499 +#else
   1.500 +if (mask & PNG_FREE_UNKN)
   1.501 +#endif
   1.502 +{
   1.503 +   if (num != -1)
   1.504 +   {
   1.505 +       if (info_ptr->unknown_chunks)
   1.506 +       {
   1.507 +          png_free(png_ptr, info_ptr->unknown_chunks[num].data);
   1.508 +          info_ptr->unknown_chunks[num].data = NULL;
   1.509 +       }
   1.510 +   }
   1.511 +   else
   1.512 +   {
   1.513 +       int i;
   1.514 +
   1.515 +       if (info_ptr->unknown_chunks_num)
   1.516 +       {
   1.517 +         for (i = 0; i < (int)info_ptr->unknown_chunks_num; i++)
   1.518 +            png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, i);
   1.519 +
   1.520 +         png_free(png_ptr, info_ptr->unknown_chunks);
   1.521 +         info_ptr->unknown_chunks = NULL;
   1.522 +         info_ptr->unknown_chunks_num = 0;
   1.523 +       }
   1.524 +   }
   1.525 +}
   1.526 +#endif
   1.527 +
   1.528 +#if defined(PNG_hIST_SUPPORTED)
   1.529 +/* free any hIST entry */
   1.530 +#ifdef PNG_FREE_ME_SUPPORTED
   1.531 +if ((mask & PNG_FREE_HIST)  & info_ptr->free_me)
   1.532 +#else
   1.533 +if ((mask & PNG_FREE_HIST) && (png_ptr->flags & PNG_FLAG_FREE_HIST))
   1.534 +#endif
   1.535 +{
   1.536 +    png_free(png_ptr, info_ptr->hist);
   1.537 +    info_ptr->hist = NULL;
   1.538 +    info_ptr->valid &= ~PNG_INFO_hIST;
   1.539 +#ifndef PNG_FREE_ME_SUPPORTED
   1.540 +    png_ptr->flags &= ~PNG_FLAG_FREE_HIST;
   1.541 +#endif
   1.542 +}
   1.543 +#endif
   1.544 +
   1.545 +/* free any PLTE entry that was internally allocated */
   1.546 +#ifdef PNG_FREE_ME_SUPPORTED
   1.547 +if ((mask & PNG_FREE_PLTE) & info_ptr->free_me)
   1.548 +#else
   1.549 +if ((mask & PNG_FREE_PLTE) && (png_ptr->flags & PNG_FLAG_FREE_PLTE))
   1.550 +#endif
   1.551 +{
   1.552 +    png_zfree(png_ptr, info_ptr->palette);
   1.553 +    info_ptr->palette = NULL;
   1.554 +    info_ptr->valid &= ~PNG_INFO_PLTE;
   1.555 +#ifndef PNG_FREE_ME_SUPPORTED
   1.556 +    png_ptr->flags &= ~PNG_FLAG_FREE_PLTE;
   1.557 +#endif
   1.558 +    info_ptr->num_palette = 0;
   1.559 +}
   1.560 +
   1.561 +#if defined(PNG_INFO_IMAGE_SUPPORTED)
   1.562 +/* free any image bits attached to the info structure */
   1.563 +#ifdef PNG_FREE_ME_SUPPORTED
   1.564 +if ((mask & PNG_FREE_ROWS) & info_ptr->free_me)
   1.565 +#else
   1.566 +if (mask & PNG_FREE_ROWS)
   1.567 +#endif
   1.568 +{
   1.569 +    if (info_ptr->row_pointers)
   1.570 +    {
   1.571 +       int row;
   1.572 +       for (row = 0; row < (int)info_ptr->height; row++)
   1.573 +       {
   1.574 +          png_free(png_ptr, info_ptr->row_pointers[row]);
   1.575 +          info_ptr->row_pointers[row]=NULL;
   1.576 +       }
   1.577 +       png_free(png_ptr, info_ptr->row_pointers);
   1.578 +       info_ptr->row_pointers=NULL;
   1.579 +    }
   1.580 +    info_ptr->valid &= ~PNG_INFO_IDAT;
   1.581 +}
   1.582 +#endif
   1.583 +
   1.584 +#ifdef PNG_FREE_ME_SUPPORTED
   1.585 +   if (num == -1)
   1.586 +     info_ptr->free_me &= ~mask;
   1.587 +   else
   1.588 +     info_ptr->free_me &= ~(mask & ~PNG_FREE_MUL);
   1.589 +#endif
   1.590 +}
   1.591 +
   1.592 +/* This is an internal routine to free any memory that the info struct is
   1.593 + * pointing to before re-using it or freeing the struct itself.  Recall
   1.594 + * that png_free() checks for NULL pointers for us.
   1.595 + */
   1.596 +void /* PRIVATE */
   1.597 +png_info_destroy(png_structp png_ptr, png_infop info_ptr)
   1.598 +{
   1.599 +   png_debug(1, "in png_info_destroy\n");
   1.600 +
   1.601 +   png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1);
   1.602 +
   1.603 +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
   1.604 +   if (png_ptr->num_chunk_list)
   1.605 +   {
   1.606 +       png_free(png_ptr, png_ptr->chunk_list);
   1.607 +       png_ptr->chunk_list=NULL;
   1.608 +       png_ptr->num_chunk_list = 0;
   1.609 +   }
   1.610 +#endif
   1.611 +
   1.612 +   png_info_init_3(&info_ptr, png_sizeof(png_info));
   1.613 +}
   1.614 +#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */
   1.615 +
   1.616 +/* This function returns a pointer to the io_ptr associated with the user
   1.617 + * functions.  The application should free any memory associated with this
   1.618 + * pointer before png_write_destroy() or png_read_destroy() are called.
   1.619 + */
   1.620 +png_voidp PNGAPI
   1.621 +png_get_io_ptr(png_structp png_ptr)
   1.622 +{
   1.623 +   if (png_ptr == NULL) return (NULL);
   1.624 +   return (png_ptr->io_ptr);
   1.625 +}
   1.626 +
   1.627 +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
   1.628 +#if !defined(PNG_NO_STDIO)
   1.629 +/* Initialize the default input/output functions for the PNG file.  If you
   1.630 + * use your own read or write routines, you can call either png_set_read_fn()
   1.631 + * or png_set_write_fn() instead of png_init_io().  If you have defined
   1.632 + * PNG_NO_STDIO, you must use a function of your own because "FILE *" isn't
   1.633 + * necessarily available.
   1.634 + */
   1.635 +void PNGAPI
   1.636 +png_init_io(png_structp png_ptr, png_FILE_p fp)
   1.637 +{
   1.638 +   png_debug(1, "in png_init_io\n");
   1.639 +   if (png_ptr == NULL) return;
   1.640 +   png_ptr->io_ptr = (png_voidp)fp;
   1.641 +}
   1.642 +#endif
   1.643 +
   1.644 +#if defined(PNG_TIME_RFC1123_SUPPORTED)
   1.645 +/* Convert the supplied time into an RFC 1123 string suitable for use in
   1.646 + * a "Creation Time" or other text-based time string.
   1.647 + */
   1.648 +png_charp PNGAPI
   1.649 +png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime)
   1.650 +{
   1.651 +   static PNG_CONST char short_months[12][4] =
   1.652 +        {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
   1.653 +         "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
   1.654 +
   1.655 +   if (png_ptr == NULL) return (NULL);
   1.656 +   if (png_ptr->time_buffer == NULL)
   1.657 +   {
   1.658 +      png_ptr->time_buffer = (png_charp)png_malloc(png_ptr, (png_uint_32)(29*
   1.659 +         png_sizeof(char)));
   1.660 +   }
   1.661 +
   1.662 +#if defined(_WIN32_WCE)
   1.663 +   {
   1.664 +      wchar_t time_buf[29];
   1.665 +      wsprintf(time_buf, TEXT("%d %S %d %02d:%02d:%02d +0000"),
   1.666 +          ptime->day % 32, short_months[(ptime->month - 1) % 12],
   1.667 +        ptime->year, ptime->hour % 24, ptime->minute % 60,
   1.668 +          ptime->second % 61);
   1.669 +      WideCharToMultiByte(CP_ACP, 0, time_buf, -1, png_ptr->time_buffer, 29,
   1.670 +          NULL, NULL);
   1.671 +   }
   1.672 +#else
   1.673 +#ifdef USE_FAR_KEYWORD
   1.674 +   {
   1.675 +      char near_time_buf[29];
   1.676 +      png_snprintf6(near_time_buf, 29, "%d %s %d %02d:%02d:%02d +0000",
   1.677 +          ptime->day % 32, short_months[(ptime->month - 1) % 12],
   1.678 +          ptime->year, ptime->hour % 24, ptime->minute % 60,
   1.679 +          ptime->second % 61);
   1.680 +      png_memcpy(png_ptr->time_buffer, near_time_buf,
   1.681 +          29*png_sizeof(char));
   1.682 +   }
   1.683 +#else
   1.684 +   png_snprintf6(png_ptr->time_buffer, 29, "%d %s %d %02d:%02d:%02d +0000",
   1.685 +       ptime->day % 32, short_months[(ptime->month - 1) % 12],
   1.686 +       ptime->year, ptime->hour % 24, ptime->minute % 60,
   1.687 +       ptime->second % 61);
   1.688 +#endif
   1.689 +#endif /* _WIN32_WCE */
   1.690 +   return ((png_charp)png_ptr->time_buffer);
   1.691 +}
   1.692 +#endif /* PNG_TIME_RFC1123_SUPPORTED */
   1.693 +
   1.694 +#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */
   1.695 +
   1.696 +png_charp PNGAPI
   1.697 +png_get_copyright(png_structp png_ptr)
   1.698 +{
   1.699 +   png_ptr = png_ptr;  /* silence compiler warning about unused png_ptr */
   1.700 +   return ((png_charp) "\n libpng version 1.2.33 - October 31, 2008\n\
   1.701 +   Copyright (c) 1998-2008 Glenn Randers-Pehrson\n\
   1.702 +   Copyright (c) 1996-1997 Andreas Dilger\n\
   1.703 +   Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.\n");
   1.704 +}
   1.705 +
   1.706 +/* The following return the library version as a short string in the
   1.707 + * format 1.0.0 through 99.99.99zz.  To get the version of *.h files
   1.708 + * used with your application, print out PNG_LIBPNG_VER_STRING, which
   1.709 + * is defined in png.h.
   1.710 + * Note: now there is no difference between png_get_libpng_ver() and
   1.711 + * png_get_header_ver().  Due to the version_nn_nn_nn typedef guard,
   1.712 + * it is guaranteed that png.c uses the correct version of png.h.
   1.713 + */
   1.714 +png_charp PNGAPI
   1.715 +png_get_libpng_ver(png_structp png_ptr)
   1.716 +{
   1.717 +   /* Version of *.c files used when building libpng */
   1.718 +   png_ptr = png_ptr;  /* silence compiler warning about unused png_ptr */
   1.719 +   return ((png_charp) PNG_LIBPNG_VER_STRING);
   1.720 +}
   1.721 +
   1.722 +png_charp PNGAPI
   1.723 +png_get_header_ver(png_structp png_ptr)
   1.724 +{
   1.725 +   /* Version of *.h files used when building libpng */
   1.726 +   png_ptr = png_ptr;  /* silence compiler warning about unused png_ptr */
   1.727 +   return ((png_charp) PNG_LIBPNG_VER_STRING);
   1.728 +}
   1.729 +
   1.730 +png_charp PNGAPI
   1.731 +png_get_header_version(png_structp png_ptr)
   1.732 +{
   1.733 +   /* Returns longer string containing both version and date */
   1.734 +   png_ptr = png_ptr;  /* silence compiler warning about unused png_ptr */
   1.735 +   return ((png_charp) PNG_HEADER_VERSION_STRING
   1.736 +#ifndef PNG_READ_SUPPORTED
   1.737 +   "     (NO READ SUPPORT)"
   1.738 +#endif
   1.739 +   "\n");
   1.740 +}
   1.741 +
   1.742 +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
   1.743 +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
   1.744 +int PNGAPI
   1.745 +png_handle_as_unknown(png_structp png_ptr, png_bytep chunk_name)
   1.746 +{
   1.747 +   /* check chunk_name and return "keep" value if it's on the list, else 0 */
   1.748 +   int i;
   1.749 +   png_bytep p;
   1.750 +   if (png_ptr == NULL || chunk_name == NULL || png_ptr->num_chunk_list<=0)
   1.751 +      return 0;
   1.752 +   p = png_ptr->chunk_list + png_ptr->num_chunk_list*5 - 5;
   1.753 +   for (i = png_ptr->num_chunk_list; i; i--, p -= 5)
   1.754 +      if (!png_memcmp(chunk_name, p, 4))
   1.755 +        return ((int)*(p + 4));
   1.756 +   return 0;
   1.757 +}
   1.758 +#endif
   1.759 +
   1.760 +/* This function, added to libpng-1.0.6g, is untested. */
   1.761 +int PNGAPI
   1.762 +png_reset_zstream(png_structp png_ptr)
   1.763 +{
   1.764 +   if (png_ptr == NULL) return Z_STREAM_ERROR;
   1.765 +   return (inflateReset(&png_ptr->zstream));
   1.766 +}
   1.767 +#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */
   1.768 +
   1.769 +/* This function was added to libpng-1.0.7 */
   1.770 +png_uint_32 PNGAPI
   1.771 +png_access_version_number(void)
   1.772 +{
   1.773 +   /* Version of *.c files used when building libpng */
   1.774 +   return((png_uint_32) PNG_LIBPNG_VER);
   1.775 +}
   1.776 +
   1.777 +
   1.778 +#if defined(PNG_READ_SUPPORTED) && defined(PNG_ASSEMBLER_CODE_SUPPORTED)
   1.779 +#if !defined(PNG_1_0_X)
   1.780 +/* this function was added to libpng 1.2.0 */
   1.781 +int PNGAPI
   1.782 +png_mmx_support(void)
   1.783 +{
   1.784 +   /* obsolete, to be removed from libpng-1.4.0 */
   1.785 +    return -1;
   1.786 +}
   1.787 +#endif /* PNG_1_0_X */
   1.788 +#endif /* PNG_READ_SUPPORTED && PNG_ASSEMBLER_CODE_SUPPORTED */
   1.789 +
   1.790 +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
   1.791 +#ifdef PNG_SIZE_T
   1.792 +/* Added at libpng version 1.2.6 */
   1.793 +   PNG_EXTERN png_size_t PNGAPI png_convert_size PNGARG((size_t size));
   1.794 +png_size_t PNGAPI
   1.795 +png_convert_size(size_t size)
   1.796 +{
   1.797 +  if (size > (png_size_t)-1)
   1.798 +     PNG_ABORT();  /* We haven't got access to png_ptr, so no png_error() */
   1.799 +  return ((png_size_t)size);
   1.800 +}
   1.801 +#endif /* PNG_SIZE_T */
   1.802 +#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */