symbian-qemu-0.9.1-12/libpng-1.2.32/png.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 
       
     2 /* png.c - location for general purpose libpng functions
       
     3  *
       
     4  * Last changed in libpng 1.2.30 [August 15, 2008]
       
     5  * For conditions of distribution and use, see copyright notice in png.h
       
     6  * Copyright (c) 1998-2008 Glenn Randers-Pehrson
       
     7  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
       
     8  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
       
     9  */
       
    10 
       
    11 #define PNG_INTERNAL
       
    12 #define PNG_NO_EXTERN
       
    13 #include "png.h"
       
    14 
       
    15 /* Generate a compiler error if there is an old png.h in the search path. */
       
    16 typedef version_1_2_32 Your_png_h_is_not_version_1_2_32;
       
    17 
       
    18 /* Version information for C files.  This had better match the version
       
    19  * string defined in png.h.  */
       
    20 
       
    21 #ifdef PNG_USE_GLOBAL_ARRAYS
       
    22 /* png_libpng_ver was changed to a function in version 1.0.5c */
       
    23 PNG_CONST char png_libpng_ver[18] = PNG_LIBPNG_VER_STRING;
       
    24 
       
    25 #ifdef PNG_READ_SUPPORTED
       
    26 
       
    27 /* png_sig was changed to a function in version 1.0.5c */
       
    28 /* Place to hold the signature string for a PNG file. */
       
    29 PNG_CONST png_byte FARDATA png_sig[8] = {137, 80, 78, 71, 13, 10, 26, 10};
       
    30 #endif /* PNG_READ_SUPPORTED */
       
    31 
       
    32 /* Invoke global declarations for constant strings for known chunk types */
       
    33 PNG_IHDR;
       
    34 PNG_IDAT;
       
    35 PNG_IEND;
       
    36 PNG_PLTE;
       
    37 PNG_bKGD;
       
    38 PNG_cHRM;
       
    39 PNG_gAMA;
       
    40 PNG_hIST;
       
    41 PNG_iCCP;
       
    42 PNG_iTXt;
       
    43 PNG_oFFs;
       
    44 PNG_pCAL;
       
    45 PNG_sCAL;
       
    46 PNG_pHYs;
       
    47 PNG_sBIT;
       
    48 PNG_sPLT;
       
    49 PNG_sRGB;
       
    50 PNG_tEXt;
       
    51 PNG_tIME;
       
    52 PNG_tRNS;
       
    53 PNG_zTXt;
       
    54 
       
    55 #ifdef PNG_READ_SUPPORTED
       
    56 /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
       
    57 
       
    58 /* start of interlace block */
       
    59 PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
       
    60 
       
    61 /* offset to next interlace block */
       
    62 PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
       
    63 
       
    64 /* start of interlace block in the y direction */
       
    65 PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
       
    66 
       
    67 /* offset to next interlace block in the y direction */
       
    68 PNG_CONST int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
       
    69 
       
    70 /* Height of interlace block.  This is not currently used - if you need
       
    71  * it, uncomment it here and in png.h
       
    72 PNG_CONST int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1};
       
    73 */
       
    74 
       
    75 /* Mask to determine which pixels are valid in a pass */
       
    76 PNG_CONST int FARDATA png_pass_mask[] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff};
       
    77 
       
    78 /* Mask to determine which pixels to overwrite while displaying */
       
    79 PNG_CONST int FARDATA png_pass_dsp_mask[]
       
    80    = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff};
       
    81 
       
    82 #endif /* PNG_READ_SUPPORTED */
       
    83 #endif /* PNG_USE_GLOBAL_ARRAYS */
       
    84 
       
    85 /* Tells libpng that we have already handled the first "num_bytes" bytes
       
    86  * of the PNG file signature.  If the PNG data is embedded into another
       
    87  * stream we can set num_bytes = 8 so that libpng will not attempt to read
       
    88  * or write any of the magic bytes before it starts on the IHDR.
       
    89  */
       
    90 
       
    91 #ifdef PNG_READ_SUPPORTED
       
    92 void PNGAPI
       
    93 png_set_sig_bytes(png_structp png_ptr, int num_bytes)
       
    94 {
       
    95    if (png_ptr == NULL) return;
       
    96    png_debug(1, "in png_set_sig_bytes\n");
       
    97    if (num_bytes > 8)
       
    98       png_error(png_ptr, "Too many bytes for PNG signature.");
       
    99 
       
   100    png_ptr->sig_bytes = (png_byte)(num_bytes < 0 ? 0 : num_bytes);
       
   101 }
       
   102 
       
   103 /* Checks whether the supplied bytes match the PNG signature.  We allow
       
   104  * checking less than the full 8-byte signature so that those apps that
       
   105  * already read the first few bytes of a file to determine the file type
       
   106  * can simply check the remaining bytes for extra assurance.  Returns
       
   107  * an integer less than, equal to, or greater than zero if sig is found,
       
   108  * respectively, to be less than, to match, or be greater than the correct
       
   109  * PNG signature (this is the same behaviour as strcmp, memcmp, etc).
       
   110  */
       
   111 int PNGAPI
       
   112 png_sig_cmp(png_bytep sig, png_size_t start, png_size_t num_to_check)
       
   113 {
       
   114    png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10};
       
   115    if (num_to_check > 8)
       
   116       num_to_check = 8;
       
   117    else if (num_to_check < 1)
       
   118       return (-1);
       
   119 
       
   120    if (start > 7)
       
   121       return (-1);
       
   122 
       
   123    if (start + num_to_check > 8)
       
   124       num_to_check = 8 - start;
       
   125 
       
   126    return ((int)(png_memcmp(&sig[start], &png_signature[start], num_to_check)));
       
   127 }
       
   128 
       
   129 #if defined(PNG_1_0_X) || defined(PNG_1_2_X)
       
   130 /* (Obsolete) function to check signature bytes.  It does not allow one
       
   131  * to check a partial signature.  This function might be removed in the
       
   132  * future - use png_sig_cmp().  Returns true (nonzero) if the file is PNG.
       
   133  */
       
   134 int PNGAPI
       
   135 png_check_sig(png_bytep sig, int num)
       
   136 {
       
   137   return ((int)!png_sig_cmp(sig, (png_size_t)0, (png_size_t)num));
       
   138 }
       
   139 #endif
       
   140 #endif /* PNG_READ_SUPPORTED */
       
   141 
       
   142 #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
       
   143 /* Function to allocate memory for zlib and clear it to 0. */
       
   144 #ifdef PNG_1_0_X
       
   145 voidpf PNGAPI
       
   146 #else
       
   147 voidpf /* private */
       
   148 #endif
       
   149 png_zalloc(voidpf png_ptr, uInt items, uInt size)
       
   150 {
       
   151    png_voidp ptr;
       
   152    png_structp p=(png_structp)png_ptr;
       
   153    png_uint_32 save_flags=p->flags;
       
   154    png_uint_32 num_bytes;
       
   155 
       
   156    if (png_ptr == NULL) return (NULL);
       
   157    if (items > PNG_UINT_32_MAX/size)
       
   158    {
       
   159      png_warning (p, "Potential overflow in png_zalloc()");
       
   160      return (NULL);
       
   161    }
       
   162    num_bytes = (png_uint_32)items * size;
       
   163 
       
   164    p->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK;
       
   165    ptr = (png_voidp)png_malloc((png_structp)png_ptr, num_bytes);
       
   166    p->flags=save_flags;
       
   167 
       
   168 #if defined(PNG_1_0_X) && !defined(PNG_NO_ZALLOC_ZERO)
       
   169    if (ptr == NULL)
       
   170        return ((voidpf)ptr);
       
   171 
       
   172    if (num_bytes > (png_uint_32)0x8000L)
       
   173    {
       
   174       png_memset(ptr, 0, (png_size_t)0x8000L);
       
   175       png_memset((png_bytep)ptr + (png_size_t)0x8000L, 0,
       
   176          (png_size_t)(num_bytes - (png_uint_32)0x8000L));
       
   177    }
       
   178    else
       
   179    {
       
   180       png_memset(ptr, 0, (png_size_t)num_bytes);
       
   181    }
       
   182 #endif
       
   183    return ((voidpf)ptr);
       
   184 }
       
   185 
       
   186 /* function to free memory for zlib */
       
   187 #ifdef PNG_1_0_X
       
   188 void PNGAPI
       
   189 #else
       
   190 void /* private */
       
   191 #endif
       
   192 png_zfree(voidpf png_ptr, voidpf ptr)
       
   193 {
       
   194    png_free((png_structp)png_ptr, (png_voidp)ptr);
       
   195 }
       
   196 
       
   197 /* Reset the CRC variable to 32 bits of 1's.  Care must be taken
       
   198  * in case CRC is > 32 bits to leave the top bits 0.
       
   199  */
       
   200 void /* PRIVATE */
       
   201 png_reset_crc(png_structp png_ptr)
       
   202 {
       
   203    png_ptr->crc = crc32(0, Z_NULL, 0);
       
   204 }
       
   205 
       
   206 /* Calculate the CRC over a section of data.  We can only pass as
       
   207  * much data to this routine as the largest single buffer size.  We
       
   208  * also check that this data will actually be used before going to the
       
   209  * trouble of calculating it.
       
   210  */
       
   211 void /* PRIVATE */
       
   212 png_calculate_crc(png_structp png_ptr, png_bytep ptr, png_size_t length)
       
   213 {
       
   214    int need_crc = 1;
       
   215 
       
   216    if (png_ptr->chunk_name[0] & 0x20)                     /* ancillary */
       
   217    {
       
   218       if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) ==
       
   219           (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN))
       
   220          need_crc = 0;
       
   221    }
       
   222    else                                                    /* critical */
       
   223    {
       
   224       if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE)
       
   225          need_crc = 0;
       
   226    }
       
   227 
       
   228    if (need_crc)
       
   229       png_ptr->crc = crc32(png_ptr->crc, ptr, (uInt)length);
       
   230 }
       
   231 
       
   232 /* Allocate the memory for an info_struct for the application.  We don't
       
   233  * really need the png_ptr, but it could potentially be useful in the
       
   234  * future.  This should be used in favour of malloc(png_sizeof(png_info))
       
   235  * and png_info_init() so that applications that want to use a shared
       
   236  * libpng don't have to be recompiled if png_info changes size.
       
   237  */
       
   238 png_infop PNGAPI
       
   239 png_create_info_struct(png_structp png_ptr)
       
   240 {
       
   241    png_infop info_ptr;
       
   242 
       
   243    png_debug(1, "in png_create_info_struct\n");
       
   244    if (png_ptr == NULL) return (NULL);
       
   245 #ifdef PNG_USER_MEM_SUPPORTED
       
   246    info_ptr = (png_infop)png_create_struct_2(PNG_STRUCT_INFO,
       
   247       png_ptr->malloc_fn, png_ptr->mem_ptr);
       
   248 #else
       
   249    info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO);
       
   250 #endif
       
   251    if (info_ptr != NULL)
       
   252       png_info_init_3(&info_ptr, png_sizeof(png_info));
       
   253 
       
   254    return (info_ptr);
       
   255 }
       
   256 
       
   257 /* This function frees the memory associated with a single info struct.
       
   258  * Normally, one would use either png_destroy_read_struct() or
       
   259  * png_destroy_write_struct() to free an info struct, but this may be
       
   260  * useful for some applications.
       
   261  */
       
   262 void PNGAPI
       
   263 png_destroy_info_struct(png_structp png_ptr, png_infopp info_ptr_ptr)
       
   264 {
       
   265    png_infop info_ptr = NULL;
       
   266    if (png_ptr == NULL) return;
       
   267 
       
   268    png_debug(1, "in png_destroy_info_struct\n");
       
   269    if (info_ptr_ptr != NULL)
       
   270       info_ptr = *info_ptr_ptr;
       
   271 
       
   272    if (info_ptr != NULL)
       
   273    {
       
   274       png_info_destroy(png_ptr, info_ptr);
       
   275 
       
   276 #ifdef PNG_USER_MEM_SUPPORTED
       
   277       png_destroy_struct_2((png_voidp)info_ptr, png_ptr->free_fn,
       
   278           png_ptr->mem_ptr);
       
   279 #else
       
   280       png_destroy_struct((png_voidp)info_ptr);
       
   281 #endif
       
   282       *info_ptr_ptr = NULL;
       
   283    }
       
   284 }
       
   285 
       
   286 /* Initialize the info structure.  This is now an internal function (0.89)
       
   287  * and applications using it are urged to use png_create_info_struct()
       
   288  * instead.
       
   289  */
       
   290 #if defined(PNG_1_0_X) || defined(PNG_1_2_X)
       
   291 #undef png_info_init
       
   292 void PNGAPI
       
   293 png_info_init(png_infop info_ptr)
       
   294 {
       
   295    /* We only come here via pre-1.0.12-compiled applications */
       
   296    png_info_init_3(&info_ptr, 0);
       
   297 }
       
   298 #endif
       
   299 
       
   300 void PNGAPI
       
   301 png_info_init_3(png_infopp ptr_ptr, png_size_t png_info_struct_size)
       
   302 {
       
   303    png_infop info_ptr = *ptr_ptr;
       
   304 
       
   305    if (info_ptr == NULL) return;
       
   306 
       
   307    png_debug(1, "in png_info_init_3\n");
       
   308 
       
   309    if (png_sizeof(png_info) > png_info_struct_size)
       
   310      {
       
   311        png_destroy_struct(info_ptr);
       
   312        info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO);
       
   313        *ptr_ptr = info_ptr;
       
   314      }
       
   315 
       
   316    /* set everything to 0 */
       
   317    png_memset(info_ptr, 0, png_sizeof(png_info));
       
   318 }
       
   319 
       
   320 #ifdef PNG_FREE_ME_SUPPORTED
       
   321 void PNGAPI
       
   322 png_data_freer(png_structp png_ptr, png_infop info_ptr,
       
   323    int freer, png_uint_32 mask)
       
   324 {
       
   325    png_debug(1, "in png_data_freer\n");
       
   326    if (png_ptr == NULL || info_ptr == NULL)
       
   327       return;
       
   328    if (freer == PNG_DESTROY_WILL_FREE_DATA)
       
   329       info_ptr->free_me |= mask;
       
   330    else if (freer == PNG_USER_WILL_FREE_DATA)
       
   331       info_ptr->free_me &= ~mask;
       
   332    else
       
   333       png_warning(png_ptr,
       
   334          "Unknown freer parameter in png_data_freer.");
       
   335 }
       
   336 #endif
       
   337 
       
   338 void PNGAPI
       
   339 png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask,
       
   340    int num)
       
   341 {
       
   342    png_debug(1, "in png_free_data\n");
       
   343    if (png_ptr == NULL || info_ptr == NULL)
       
   344       return;
       
   345 
       
   346 #if defined(PNG_TEXT_SUPPORTED)
       
   347 /* free text item num or (if num == -1) all text items */
       
   348 #ifdef PNG_FREE_ME_SUPPORTED
       
   349 if ((mask & PNG_FREE_TEXT) & info_ptr->free_me)
       
   350 #else
       
   351 if (mask & PNG_FREE_TEXT)
       
   352 #endif
       
   353 {
       
   354    if (num != -1)
       
   355    {
       
   356      if (info_ptr->text && info_ptr->text[num].key)
       
   357      {
       
   358          png_free(png_ptr, info_ptr->text[num].key);
       
   359          info_ptr->text[num].key = NULL;
       
   360      }
       
   361    }
       
   362    else
       
   363    {
       
   364        int i;
       
   365        for (i = 0; i < info_ptr->num_text; i++)
       
   366            png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, i);
       
   367        png_free(png_ptr, info_ptr->text);
       
   368        info_ptr->text = NULL;
       
   369        info_ptr->num_text=0;
       
   370    }
       
   371 }
       
   372 #endif
       
   373 
       
   374 #if defined(PNG_tRNS_SUPPORTED)
       
   375 /* free any tRNS entry */
       
   376 #ifdef PNG_FREE_ME_SUPPORTED
       
   377 if ((mask & PNG_FREE_TRNS) & info_ptr->free_me)
       
   378 #else
       
   379 if ((mask & PNG_FREE_TRNS) && (png_ptr->flags & PNG_FLAG_FREE_TRNS))
       
   380 #endif
       
   381 {
       
   382     png_free(png_ptr, info_ptr->trans);
       
   383     info_ptr->trans = NULL;
       
   384     info_ptr->valid &= ~PNG_INFO_tRNS;
       
   385 #ifndef PNG_FREE_ME_SUPPORTED
       
   386     png_ptr->flags &= ~PNG_FLAG_FREE_TRNS;
       
   387 #endif
       
   388 }
       
   389 #endif
       
   390 
       
   391 #if defined(PNG_sCAL_SUPPORTED)
       
   392 /* free any sCAL entry */
       
   393 #ifdef PNG_FREE_ME_SUPPORTED
       
   394 if ((mask & PNG_FREE_SCAL) & info_ptr->free_me)
       
   395 #else
       
   396 if (mask & PNG_FREE_SCAL)
       
   397 #endif
       
   398 {
       
   399 #if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED)
       
   400     png_free(png_ptr, info_ptr->scal_s_width);
       
   401     png_free(png_ptr, info_ptr->scal_s_height);
       
   402     info_ptr->scal_s_width = NULL;
       
   403     info_ptr->scal_s_height = NULL;
       
   404 #endif
       
   405     info_ptr->valid &= ~PNG_INFO_sCAL;
       
   406 }
       
   407 #endif
       
   408 
       
   409 #if defined(PNG_pCAL_SUPPORTED)
       
   410 /* free any pCAL entry */
       
   411 #ifdef PNG_FREE_ME_SUPPORTED
       
   412 if ((mask & PNG_FREE_PCAL) & info_ptr->free_me)
       
   413 #else
       
   414 if (mask & PNG_FREE_PCAL)
       
   415 #endif
       
   416 {
       
   417     png_free(png_ptr, info_ptr->pcal_purpose);
       
   418     png_free(png_ptr, info_ptr->pcal_units);
       
   419     info_ptr->pcal_purpose = NULL;
       
   420     info_ptr->pcal_units = NULL;
       
   421     if (info_ptr->pcal_params != NULL)
       
   422     {
       
   423         int i;
       
   424         for (i = 0; i < (int)info_ptr->pcal_nparams; i++)
       
   425         {
       
   426           png_free(png_ptr, info_ptr->pcal_params[i]);
       
   427           info_ptr->pcal_params[i]=NULL;
       
   428         }
       
   429         png_free(png_ptr, info_ptr->pcal_params);
       
   430         info_ptr->pcal_params = NULL;
       
   431     }
       
   432     info_ptr->valid &= ~PNG_INFO_pCAL;
       
   433 }
       
   434 #endif
       
   435 
       
   436 #if defined(PNG_iCCP_SUPPORTED)
       
   437 /* free any iCCP entry */
       
   438 #ifdef PNG_FREE_ME_SUPPORTED
       
   439 if ((mask & PNG_FREE_ICCP) & info_ptr->free_me)
       
   440 #else
       
   441 if (mask & PNG_FREE_ICCP)
       
   442 #endif
       
   443 {
       
   444     png_free(png_ptr, info_ptr->iccp_name);
       
   445     png_free(png_ptr, info_ptr->iccp_profile);
       
   446     info_ptr->iccp_name = NULL;
       
   447     info_ptr->iccp_profile = NULL;
       
   448     info_ptr->valid &= ~PNG_INFO_iCCP;
       
   449 }
       
   450 #endif
       
   451 
       
   452 #if defined(PNG_sPLT_SUPPORTED)
       
   453 /* free a given sPLT entry, or (if num == -1) all sPLT entries */
       
   454 #ifdef PNG_FREE_ME_SUPPORTED
       
   455 if ((mask & PNG_FREE_SPLT) & info_ptr->free_me)
       
   456 #else
       
   457 if (mask & PNG_FREE_SPLT)
       
   458 #endif
       
   459 {
       
   460    if (num != -1)
       
   461    {
       
   462       if (info_ptr->splt_palettes)
       
   463       {
       
   464           png_free(png_ptr, info_ptr->splt_palettes[num].name);
       
   465           png_free(png_ptr, info_ptr->splt_palettes[num].entries);
       
   466           info_ptr->splt_palettes[num].name = NULL;
       
   467           info_ptr->splt_palettes[num].entries = NULL;
       
   468       }
       
   469    }
       
   470    else
       
   471    {
       
   472        if (info_ptr->splt_palettes_num)
       
   473        {
       
   474          int i;
       
   475          for (i = 0; i < (int)info_ptr->splt_palettes_num; i++)
       
   476             png_free_data(png_ptr, info_ptr, PNG_FREE_SPLT, i);
       
   477 
       
   478          png_free(png_ptr, info_ptr->splt_palettes);
       
   479          info_ptr->splt_palettes = NULL;
       
   480          info_ptr->splt_palettes_num = 0;
       
   481        }
       
   482        info_ptr->valid &= ~PNG_INFO_sPLT;
       
   483    }
       
   484 }
       
   485 #endif
       
   486 
       
   487 #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
       
   488   if (png_ptr->unknown_chunk.data)
       
   489   {
       
   490     png_free(png_ptr, png_ptr->unknown_chunk.data);
       
   491     png_ptr->unknown_chunk.data = NULL;
       
   492   }
       
   493 
       
   494 #ifdef PNG_FREE_ME_SUPPORTED
       
   495 if ((mask & PNG_FREE_UNKN) & info_ptr->free_me)
       
   496 #else
       
   497 if (mask & PNG_FREE_UNKN)
       
   498 #endif
       
   499 {
       
   500    if (num != -1)
       
   501    {
       
   502        if (info_ptr->unknown_chunks)
       
   503        {
       
   504           png_free(png_ptr, info_ptr->unknown_chunks[num].data);
       
   505           info_ptr->unknown_chunks[num].data = NULL;
       
   506        }
       
   507    }
       
   508    else
       
   509    {
       
   510        int i;
       
   511 
       
   512        if (info_ptr->unknown_chunks_num)
       
   513        {
       
   514          for (i = 0; i < (int)info_ptr->unknown_chunks_num; i++)
       
   515             png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, i);
       
   516 
       
   517          png_free(png_ptr, info_ptr->unknown_chunks);
       
   518          info_ptr->unknown_chunks = NULL;
       
   519          info_ptr->unknown_chunks_num = 0;
       
   520        }
       
   521    }
       
   522 }
       
   523 #endif
       
   524 
       
   525 #if defined(PNG_hIST_SUPPORTED)
       
   526 /* free any hIST entry */
       
   527 #ifdef PNG_FREE_ME_SUPPORTED
       
   528 if ((mask & PNG_FREE_HIST)  & info_ptr->free_me)
       
   529 #else
       
   530 if ((mask & PNG_FREE_HIST) && (png_ptr->flags & PNG_FLAG_FREE_HIST))
       
   531 #endif
       
   532 {
       
   533     png_free(png_ptr, info_ptr->hist);
       
   534     info_ptr->hist = NULL;
       
   535     info_ptr->valid &= ~PNG_INFO_hIST;
       
   536 #ifndef PNG_FREE_ME_SUPPORTED
       
   537     png_ptr->flags &= ~PNG_FLAG_FREE_HIST;
       
   538 #endif
       
   539 }
       
   540 #endif
       
   541 
       
   542 /* free any PLTE entry that was internally allocated */
       
   543 #ifdef PNG_FREE_ME_SUPPORTED
       
   544 if ((mask & PNG_FREE_PLTE) & info_ptr->free_me)
       
   545 #else
       
   546 if ((mask & PNG_FREE_PLTE) && (png_ptr->flags & PNG_FLAG_FREE_PLTE))
       
   547 #endif
       
   548 {
       
   549     png_zfree(png_ptr, info_ptr->palette);
       
   550     info_ptr->palette = NULL;
       
   551     info_ptr->valid &= ~PNG_INFO_PLTE;
       
   552 #ifndef PNG_FREE_ME_SUPPORTED
       
   553     png_ptr->flags &= ~PNG_FLAG_FREE_PLTE;
       
   554 #endif
       
   555     info_ptr->num_palette = 0;
       
   556 }
       
   557 
       
   558 #if defined(PNG_INFO_IMAGE_SUPPORTED)
       
   559 /* free any image bits attached to the info structure */
       
   560 #ifdef PNG_FREE_ME_SUPPORTED
       
   561 if ((mask & PNG_FREE_ROWS) & info_ptr->free_me)
       
   562 #else
       
   563 if (mask & PNG_FREE_ROWS)
       
   564 #endif
       
   565 {
       
   566     if (info_ptr->row_pointers)
       
   567     {
       
   568        int row;
       
   569        for (row = 0; row < (int)info_ptr->height; row++)
       
   570        {
       
   571           png_free(png_ptr, info_ptr->row_pointers[row]);
       
   572           info_ptr->row_pointers[row]=NULL;
       
   573        }
       
   574        png_free(png_ptr, info_ptr->row_pointers);
       
   575        info_ptr->row_pointers=NULL;
       
   576     }
       
   577     info_ptr->valid &= ~PNG_INFO_IDAT;
       
   578 }
       
   579 #endif
       
   580 
       
   581 #ifdef PNG_FREE_ME_SUPPORTED
       
   582    if (num == -1)
       
   583      info_ptr->free_me &= ~mask;
       
   584    else
       
   585      info_ptr->free_me &= ~(mask & ~PNG_FREE_MUL);
       
   586 #endif
       
   587 }
       
   588 
       
   589 /* This is an internal routine to free any memory that the info struct is
       
   590  * pointing to before re-using it or freeing the struct itself.  Recall
       
   591  * that png_free() checks for NULL pointers for us.
       
   592  */
       
   593 void /* PRIVATE */
       
   594 png_info_destroy(png_structp png_ptr, png_infop info_ptr)
       
   595 {
       
   596    png_debug(1, "in png_info_destroy\n");
       
   597 
       
   598    png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1);
       
   599 
       
   600 #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
       
   601    if (png_ptr->num_chunk_list)
       
   602    {
       
   603        png_free(png_ptr, png_ptr->chunk_list);
       
   604        png_ptr->chunk_list=NULL;
       
   605        png_ptr->num_chunk_list = 0;
       
   606    }
       
   607 #endif
       
   608 
       
   609    png_info_init_3(&info_ptr, png_sizeof(png_info));
       
   610 }
       
   611 #endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */
       
   612 
       
   613 /* This function returns a pointer to the io_ptr associated with the user
       
   614  * functions.  The application should free any memory associated with this
       
   615  * pointer before png_write_destroy() or png_read_destroy() are called.
       
   616  */
       
   617 png_voidp PNGAPI
       
   618 png_get_io_ptr(png_structp png_ptr)
       
   619 {
       
   620    if (png_ptr == NULL) return (NULL);
       
   621    return (png_ptr->io_ptr);
       
   622 }
       
   623 
       
   624 #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
       
   625 #if !defined(PNG_NO_STDIO)
       
   626 /* Initialize the default input/output functions for the PNG file.  If you
       
   627  * use your own read or write routines, you can call either png_set_read_fn()
       
   628  * or png_set_write_fn() instead of png_init_io().  If you have defined
       
   629  * PNG_NO_STDIO, you must use a function of your own because "FILE *" isn't
       
   630  * necessarily available.
       
   631  */
       
   632 void PNGAPI
       
   633 png_init_io(png_structp png_ptr, png_FILE_p fp)
       
   634 {
       
   635    png_debug(1, "in png_init_io\n");
       
   636    if (png_ptr == NULL) return;
       
   637    png_ptr->io_ptr = (png_voidp)fp;
       
   638 }
       
   639 #endif
       
   640 
       
   641 #if defined(PNG_TIME_RFC1123_SUPPORTED)
       
   642 /* Convert the supplied time into an RFC 1123 string suitable for use in
       
   643  * a "Creation Time" or other text-based time string.
       
   644  */
       
   645 png_charp PNGAPI
       
   646 png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime)
       
   647 {
       
   648    static PNG_CONST char short_months[12][4] =
       
   649         {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
       
   650          "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
       
   651 
       
   652    if (png_ptr == NULL) return (NULL);
       
   653    if (png_ptr->time_buffer == NULL)
       
   654    {
       
   655       png_ptr->time_buffer = (png_charp)png_malloc(png_ptr, (png_uint_32)(29*
       
   656          png_sizeof(char)));
       
   657    }
       
   658 
       
   659 #if defined(_WIN32_WCE)
       
   660    {
       
   661       wchar_t time_buf[29];
       
   662       wsprintf(time_buf, TEXT("%d %S %d %02d:%02d:%02d +0000"),
       
   663           ptime->day % 32, short_months[(ptime->month - 1) % 12],
       
   664         ptime->year, ptime->hour % 24, ptime->minute % 60,
       
   665           ptime->second % 61);
       
   666       WideCharToMultiByte(CP_ACP, 0, time_buf, -1, png_ptr->time_buffer, 29,
       
   667           NULL, NULL);
       
   668    }
       
   669 #else
       
   670 #ifdef USE_FAR_KEYWORD
       
   671    {
       
   672       char near_time_buf[29];
       
   673       png_snprintf6(near_time_buf, 29, "%d %s %d %02d:%02d:%02d +0000",
       
   674           ptime->day % 32, short_months[(ptime->month - 1) % 12],
       
   675           ptime->year, ptime->hour % 24, ptime->minute % 60,
       
   676           ptime->second % 61);
       
   677       png_memcpy(png_ptr->time_buffer, near_time_buf,
       
   678           29*png_sizeof(char));
       
   679    }
       
   680 #else
       
   681    png_snprintf6(png_ptr->time_buffer, 29, "%d %s %d %02d:%02d:%02d +0000",
       
   682        ptime->day % 32, short_months[(ptime->month - 1) % 12],
       
   683        ptime->year, ptime->hour % 24, ptime->minute % 60,
       
   684        ptime->second % 61);
       
   685 #endif
       
   686 #endif /* _WIN32_WCE */
       
   687    return ((png_charp)png_ptr->time_buffer);
       
   688 }
       
   689 #endif /* PNG_TIME_RFC1123_SUPPORTED */
       
   690 
       
   691 #endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */
       
   692 
       
   693 png_charp PNGAPI
       
   694 png_get_copyright(png_structp png_ptr)
       
   695 {
       
   696    png_ptr = png_ptr;  /* silence compiler warning about unused png_ptr */
       
   697    return ((png_charp) "\n libpng version 1.2.32 - September 18, 2008\n\
       
   698    Copyright (c) 1998-2008 Glenn Randers-Pehrson\n\
       
   699    Copyright (c) 1996-1997 Andreas Dilger\n\
       
   700    Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.\n");
       
   701 }
       
   702 
       
   703 /* The following return the library version as a short string in the
       
   704  * format 1.0.0 through 99.99.99zz.  To get the version of *.h files
       
   705  * used with your application, print out PNG_LIBPNG_VER_STRING, which
       
   706  * is defined in png.h.
       
   707  * Note: now there is no difference between png_get_libpng_ver() and
       
   708  * png_get_header_ver().  Due to the version_nn_nn_nn typedef guard,
       
   709  * it is guaranteed that png.c uses the correct version of png.h.
       
   710  */
       
   711 png_charp PNGAPI
       
   712 png_get_libpng_ver(png_structp png_ptr)
       
   713 {
       
   714    /* Version of *.c files used when building libpng */
       
   715    png_ptr = png_ptr;  /* silence compiler warning about unused png_ptr */
       
   716    return ((png_charp) PNG_LIBPNG_VER_STRING);
       
   717 }
       
   718 
       
   719 png_charp PNGAPI
       
   720 png_get_header_ver(png_structp png_ptr)
       
   721 {
       
   722    /* Version of *.h files used when building libpng */
       
   723    png_ptr = png_ptr;  /* silence compiler warning about unused png_ptr */
       
   724    return ((png_charp) PNG_LIBPNG_VER_STRING);
       
   725 }
       
   726 
       
   727 png_charp PNGAPI
       
   728 png_get_header_version(png_structp png_ptr)
       
   729 {
       
   730    /* Returns longer string containing both version and date */
       
   731    png_ptr = png_ptr;  /* silence compiler warning about unused png_ptr */
       
   732    return ((png_charp) PNG_HEADER_VERSION_STRING
       
   733 #ifndef PNG_READ_SUPPORTED
       
   734    "     (NO READ SUPPORT)"
       
   735 #endif
       
   736    "\n");
       
   737 }
       
   738 
       
   739 #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
       
   740 #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
       
   741 int PNGAPI
       
   742 png_handle_as_unknown(png_structp png_ptr, png_bytep chunk_name)
       
   743 {
       
   744    /* check chunk_name and return "keep" value if it's on the list, else 0 */
       
   745    int i;
       
   746    png_bytep p;
       
   747    if (png_ptr == NULL || chunk_name == NULL || png_ptr->num_chunk_list<=0)
       
   748       return 0;
       
   749    p = png_ptr->chunk_list + png_ptr->num_chunk_list*5 - 5;
       
   750    for (i = png_ptr->num_chunk_list; i; i--, p -= 5)
       
   751       if (!png_memcmp(chunk_name, p, 4))
       
   752         return ((int)*(p + 4));
       
   753    return 0;
       
   754 }
       
   755 #endif
       
   756 
       
   757 /* This function, added to libpng-1.0.6g, is untested. */
       
   758 int PNGAPI
       
   759 png_reset_zstream(png_structp png_ptr)
       
   760 {
       
   761    if (png_ptr == NULL) return Z_STREAM_ERROR;
       
   762    return (inflateReset(&png_ptr->zstream));
       
   763 }
       
   764 #endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */
       
   765 
       
   766 /* This function was added to libpng-1.0.7 */
       
   767 png_uint_32 PNGAPI
       
   768 png_access_version_number(void)
       
   769 {
       
   770    /* Version of *.c files used when building libpng */
       
   771    return((png_uint_32) PNG_LIBPNG_VER);
       
   772 }
       
   773 
       
   774 
       
   775 #if defined(PNG_READ_SUPPORTED) && defined(PNG_ASSEMBLER_CODE_SUPPORTED)
       
   776 #if !defined(PNG_1_0_X)
       
   777 /* this function was added to libpng 1.2.0 */
       
   778 int PNGAPI
       
   779 png_mmx_support(void)
       
   780 {
       
   781    /* obsolete, to be removed from libpng-1.4.0 */
       
   782     return -1;
       
   783 }
       
   784 #endif /* PNG_1_0_X */
       
   785 #endif /* PNG_READ_SUPPORTED && PNG_ASSEMBLER_CODE_SUPPORTED */
       
   786 
       
   787 #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
       
   788 #ifdef PNG_SIZE_T
       
   789 /* Added at libpng version 1.2.6 */
       
   790    PNG_EXTERN png_size_t PNGAPI png_convert_size PNGARG((size_t size));
       
   791 png_size_t PNGAPI
       
   792 png_convert_size(size_t size)
       
   793 {
       
   794   if (size > (png_size_t)-1)
       
   795      PNG_ABORT();  /* We haven't got access to png_ptr, so no png_error() */
       
   796   return ((png_size_t)size);
       
   797 }
       
   798 #endif /* PNG_SIZE_T */
       
   799 #endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */