png.c
上传用户:sesekoo
上传日期:2020-07-18
资源大小:21543k
文件大小:26k
源码类别:

界面编程

开发平台:

Visual C++

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