pngpread.c
上传用户:jnfxsk
上传日期:2022-06-16
资源大小:3675k
文件大小:46k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /* pngpread.c - read a png file in push mode
  2.  *
  3.  * libpng version 1.2.8 - December 3, 2004
  4.  * For conditions of distribution and use, see copyright notice in png.h
  5.  * Copyright (c) 1998-2004 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. #define PNG_INTERNAL
  10. #include "png.h"
  11. #ifdef PNG_PROGRESSIVE_READ_SUPPORTED
  12. /* push model modes */
  13. #define PNG_READ_SIG_MODE   0
  14. #define PNG_READ_CHUNK_MODE 1
  15. #define PNG_READ_IDAT_MODE  2
  16. #define PNG_SKIP_MODE       3
  17. #define PNG_READ_tEXt_MODE  4
  18. #define PNG_READ_zTXt_MODE  5
  19. #define PNG_READ_DONE_MODE  6
  20. #define PNG_READ_iTXt_MODE  7
  21. #define PNG_ERROR_MODE      8
  22. void PNGAPI
  23. png_process_data(png_structp png_ptr, png_infop info_ptr,
  24.    png_bytep buffer, png_size_t buffer_size)
  25. {
  26.    png_push_restore_buffer(png_ptr, buffer, buffer_size);
  27.    while (png_ptr->buffer_size)
  28.    {
  29.       png_process_some_data(png_ptr, info_ptr);
  30.    }
  31. }
  32. /* What we do with the incoming data depends on what we were previously
  33.  * doing before we ran out of data...
  34.  */
  35. void /* PRIVATE */
  36. png_process_some_data(png_structp png_ptr, png_infop info_ptr)
  37. {
  38.    switch (png_ptr->process_mode)
  39.    {
  40.       case PNG_READ_SIG_MODE:
  41.       {
  42.          png_push_read_sig(png_ptr, info_ptr);
  43.          break;
  44.       }
  45.       case PNG_READ_CHUNK_MODE:
  46.       {
  47.          png_push_read_chunk(png_ptr, info_ptr);
  48.          break;
  49.       }
  50.       case PNG_READ_IDAT_MODE:
  51.       {
  52.          png_push_read_IDAT(png_ptr);
  53.          break;
  54.       }
  55. #if defined(PNG_READ_tEXt_SUPPORTED)
  56.       case PNG_READ_tEXt_MODE:
  57.       {
  58.          png_push_read_tEXt(png_ptr, info_ptr);
  59.          break;
  60.       }
  61. #endif
  62. #if defined(PNG_READ_zTXt_SUPPORTED)
  63.       case PNG_READ_zTXt_MODE:
  64.       {
  65.          png_push_read_zTXt(png_ptr, info_ptr);
  66.          break;
  67.       }
  68. #endif
  69. #if defined(PNG_READ_iTXt_SUPPORTED)
  70.       case PNG_READ_iTXt_MODE:
  71.       {
  72.          png_push_read_iTXt(png_ptr, info_ptr);
  73.          break;
  74.       }
  75. #endif
  76.       case PNG_SKIP_MODE:
  77.       {
  78.          png_push_crc_finish(png_ptr);
  79.          break;
  80.       }
  81.       default:
  82.       {
  83.          png_ptr->buffer_size = 0;
  84.          break;
  85.       }
  86.    }
  87. }
  88. /* Read any remaining signature bytes from the stream and compare them with
  89.  * the correct PNG signature.  It is possible that this routine is called
  90.  * with bytes already read from the signature, either because they have been
  91.  * checked by the calling application, or because of multiple calls to this
  92.  * routine.
  93.  */
  94. void /* PRIVATE */
  95. png_push_read_sig(png_structp png_ptr, png_infop info_ptr)
  96. {
  97.    png_size_t num_checked = png_ptr->sig_bytes,
  98.              num_to_check = 8 - num_checked;
  99.    if (png_ptr->buffer_size < num_to_check)
  100.    {
  101.       num_to_check = png_ptr->buffer_size;
  102.    }
  103.    png_push_fill_buffer(png_ptr, &(info_ptr->signature[num_checked]),
  104.       num_to_check);
  105.    png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes+num_to_check);
  106.    if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check))
  107.    {
  108.       if (num_checked < 4 &&
  109.           png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4))
  110.          png_error(png_ptr, "Not a PNG file");
  111.       else
  112.          png_error(png_ptr, "PNG file corrupted by ASCII conversion");
  113.    }
  114.    else
  115.    {
  116.       if (png_ptr->sig_bytes >= 8)
  117.       {
  118.          png_ptr->process_mode = PNG_READ_CHUNK_MODE;
  119.       }
  120.    }
  121. }
  122. void /* PRIVATE */
  123. png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
  124. {
  125. #ifdef PNG_USE_LOCAL_ARRAYS
  126.       PNG_IHDR;
  127.       PNG_IDAT;
  128.       PNG_IEND;
  129.       PNG_PLTE;
  130. #if defined(PNG_READ_bKGD_SUPPORTED)
  131.       PNG_bKGD;
  132. #endif
  133. #if defined(PNG_READ_cHRM_SUPPORTED)
  134.       PNG_cHRM;
  135. #endif
  136. #if defined(PNG_READ_gAMA_SUPPORTED)
  137.       PNG_gAMA;
  138. #endif
  139. #if defined(PNG_READ_hIST_SUPPORTED)
  140.       PNG_hIST;
  141. #endif
  142. #if defined(PNG_READ_iCCP_SUPPORTED)
  143.       PNG_iCCP;
  144. #endif
  145. #if defined(PNG_READ_iTXt_SUPPORTED)
  146.       PNG_iTXt;
  147. #endif
  148. #if defined(PNG_READ_oFFs_SUPPORTED)
  149.       PNG_oFFs;
  150. #endif
  151. #if defined(PNG_READ_pCAL_SUPPORTED)
  152.       PNG_pCAL;
  153. #endif
  154. #if defined(PNG_READ_pHYs_SUPPORTED)
  155.       PNG_pHYs;
  156. #endif
  157. #if defined(PNG_READ_sBIT_SUPPORTED)
  158.       PNG_sBIT;
  159. #endif
  160. #if defined(PNG_READ_sCAL_SUPPORTED)
  161.       PNG_sCAL;
  162. #endif
  163. #if defined(PNG_READ_sRGB_SUPPORTED)
  164.       PNG_sRGB;
  165. #endif
  166. #if defined(PNG_READ_sPLT_SUPPORTED)
  167.       PNG_sPLT;
  168. #endif
  169. #if defined(PNG_READ_tEXt_SUPPORTED)
  170.       PNG_tEXt;
  171. #endif
  172. #if defined(PNG_READ_tIME_SUPPORTED)
  173.       PNG_tIME;
  174. #endif
  175. #if defined(PNG_READ_tRNS_SUPPORTED)
  176.       PNG_tRNS;
  177. #endif
  178. #if defined(PNG_READ_zTXt_SUPPORTED)
  179.       PNG_zTXt;
  180. #endif
  181. #endif /* PNG_USE_LOCAL_ARRAYS */
  182.    /* First we make sure we have enough data for the 4 byte chunk name
  183.     * and the 4 byte chunk length before proceeding with decoding the
  184.     * chunk data.  To fully decode each of these chunks, we also make
  185.     * sure we have enough data in the buffer for the 4 byte CRC at the
  186.     * end of every chunk (except IDAT, which is handled separately).
  187.     */
  188.    if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
  189.    {
  190.       png_byte chunk_length[4];
  191.       if (png_ptr->buffer_size < 8)
  192.       {
  193.          png_push_save_buffer(png_ptr);
  194.          return;
  195.       }
  196.       png_push_fill_buffer(png_ptr, chunk_length, 4);
  197.       png_ptr->push_length = png_get_uint_31(png_ptr,chunk_length);
  198.       png_reset_crc(png_ptr);
  199.       png_crc_read(png_ptr, png_ptr->chunk_name, 4);
  200.       png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
  201.    }
  202.    if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4))
  203.    {
  204.       if (png_ptr->push_length + 4 > png_ptr->buffer_size)
  205.       {
  206.          png_push_save_buffer(png_ptr);
  207.          return;
  208.       }
  209.       png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length);
  210.    }
  211.    else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4))
  212.    {
  213.       if (png_ptr->push_length + 4 > png_ptr->buffer_size)
  214.       {
  215.          png_push_save_buffer(png_ptr);
  216.          return;
  217.       }
  218.       png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length);
  219.       png_ptr->process_mode = PNG_READ_DONE_MODE;
  220.       png_push_have_end(png_ptr, info_ptr);
  221.    }
  222. #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
  223.    else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name))
  224.    {
  225.       if (png_ptr->push_length + 4 > png_ptr->buffer_size)
  226.       {
  227.          png_push_save_buffer(png_ptr);
  228.          return;
  229.       }
  230.       if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
  231.          png_ptr->mode |= PNG_HAVE_IDAT;
  232.       png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length);
  233.       if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
  234.          png_ptr->mode |= PNG_HAVE_PLTE;
  235.       else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
  236.       {
  237.          if (!(png_ptr->mode & PNG_HAVE_IHDR))
  238.             png_error(png_ptr, "Missing IHDR before IDAT");
  239.          else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
  240.                   !(png_ptr->mode & PNG_HAVE_PLTE))
  241.             png_error(png_ptr, "Missing PLTE before IDAT");
  242.       }
  243.    }
  244. #endif
  245.    else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
  246.    {
  247.       if (png_ptr->push_length + 4 > png_ptr->buffer_size)
  248.       {
  249.          png_push_save_buffer(png_ptr);
  250.          return;
  251.       }
  252.       png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length);
  253.    }
  254.    else if (!png_memcmp(png_ptr->chunk_name, (png_bytep)png_IDAT, 4))
  255.    {
  256.       /* If we reach an IDAT chunk, this means we have read all of the
  257.        * header chunks, and we can start reading the image (or if this
  258.        * is called after the image has been read - we have an error).
  259.        */
  260.      if (!(png_ptr->mode & PNG_HAVE_IHDR))
  261.        png_error(png_ptr, "Missing IHDR before IDAT");
  262.      else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
  263.          !(png_ptr->mode & PNG_HAVE_PLTE))
  264.        png_error(png_ptr, "Missing PLTE before IDAT");
  265.       if (png_ptr->mode & PNG_HAVE_IDAT)
  266.       {
  267.          if (png_ptr->push_length == 0)
  268.             return;
  269.          if (png_ptr->mode & PNG_AFTER_IDAT)
  270.             png_error(png_ptr, "Too many IDAT's found");
  271.       }
  272.       png_ptr->idat_size = png_ptr->push_length;
  273.       png_ptr->mode |= PNG_HAVE_IDAT;
  274.       png_ptr->process_mode = PNG_READ_IDAT_MODE;
  275.       png_push_have_info(png_ptr, info_ptr);
  276.       png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes;
  277.       png_ptr->zstream.next_out = png_ptr->row_buf;
  278.       return;
  279.    }
  280. #if defined(PNG_READ_gAMA_SUPPORTED)
  281.    else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4))
  282.    {
  283.       if (png_ptr->push_length + 4 > png_ptr->buffer_size)
  284.       {
  285.          png_push_save_buffer(png_ptr);
  286.          return;
  287.       }
  288.       png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length);
  289.    }
  290. #endif
  291. #if defined(PNG_READ_sBIT_SUPPORTED)
  292.    else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4))
  293.    {
  294.       if (png_ptr->push_length + 4 > png_ptr->buffer_size)
  295.       {
  296.          png_push_save_buffer(png_ptr);
  297.          return;
  298.       }
  299.       png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length);
  300.    }
  301. #endif
  302. #if defined(PNG_READ_cHRM_SUPPORTED)
  303.    else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4))
  304.    {
  305.       if (png_ptr->push_length + 4 > png_ptr->buffer_size)
  306.       {
  307.          png_push_save_buffer(png_ptr);
  308.          return;
  309.       }
  310.       png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length);
  311.    }
  312. #endif
  313. #if defined(PNG_READ_sRGB_SUPPORTED)
  314.    else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4))
  315.    {
  316.       if (png_ptr->push_length + 4 > png_ptr->buffer_size)
  317.       {
  318.          png_push_save_buffer(png_ptr);
  319.          return;
  320.       }
  321.       png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length);
  322.    }
  323. #endif
  324. #if defined(PNG_READ_iCCP_SUPPORTED)
  325.    else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4))
  326.    {
  327.       if (png_ptr->push_length + 4 > png_ptr->buffer_size)
  328.       {
  329.          png_push_save_buffer(png_ptr);
  330.          return;
  331.       }
  332.       png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length);
  333.    }
  334. #endif
  335. #if defined(PNG_READ_sPLT_SUPPORTED)
  336.    else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4))
  337.    {
  338.       if (png_ptr->push_length + 4 > png_ptr->buffer_size)
  339.       {
  340.          png_push_save_buffer(png_ptr);
  341.          return;
  342.       }
  343.       png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length);
  344.    }
  345. #endif
  346. #if defined(PNG_READ_tRNS_SUPPORTED)
  347.    else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4))
  348.    {
  349.       if (png_ptr->push_length + 4 > png_ptr->buffer_size)
  350.       {
  351.          png_push_save_buffer(png_ptr);
  352.          return;
  353.       }
  354.       png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length);
  355.    }
  356. #endif
  357. #if defined(PNG_READ_bKGD_SUPPORTED)
  358.    else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4))
  359.    {
  360.       if (png_ptr->push_length + 4 > png_ptr->buffer_size)
  361.       {
  362.          png_push_save_buffer(png_ptr);
  363.          return;
  364.       }
  365.       png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length);
  366.    }
  367. #endif
  368. #if defined(PNG_READ_hIST_SUPPORTED)
  369.    else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4))
  370.    {
  371.       if (png_ptr->push_length + 4 > png_ptr->buffer_size)
  372.       {
  373.          png_push_save_buffer(png_ptr);
  374.          return;
  375.       }
  376.       png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length);
  377.    }
  378. #endif
  379. #if defined(PNG_READ_pHYs_SUPPORTED)
  380.    else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4))
  381.    {
  382.       if (png_ptr->push_length + 4 > png_ptr->buffer_size)
  383.       {
  384.          png_push_save_buffer(png_ptr);
  385.          return;
  386.       }
  387.       png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length);
  388.    }
  389. #endif
  390. #if defined(PNG_READ_oFFs_SUPPORTED)
  391.    else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4))
  392.    {
  393.       if (png_ptr->push_length + 4 > png_ptr->buffer_size)
  394.       {
  395.          png_push_save_buffer(png_ptr);
  396.          return;
  397.       }
  398.       png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length);
  399.    }
  400. #endif
  401. #if defined(PNG_READ_pCAL_SUPPORTED)
  402.    else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4))
  403.    {
  404.       if (png_ptr->push_length + 4 > png_ptr->buffer_size)
  405.       {
  406.          png_push_save_buffer(png_ptr);
  407.          return;
  408.       }
  409.       png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length);
  410.    }
  411. #endif
  412. #if defined(PNG_READ_sCAL_SUPPORTED)
  413.    else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4))
  414.    {
  415.       if (png_ptr->push_length + 4 > png_ptr->buffer_size)
  416.       {
  417.          png_push_save_buffer(png_ptr);
  418.          return;
  419.       }
  420.       png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length);
  421.    }
  422. #endif
  423. #if defined(PNG_READ_tIME_SUPPORTED)
  424.    else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4))
  425.    {
  426.       if (png_ptr->push_length + 4 > png_ptr->buffer_size)
  427.       {
  428.          png_push_save_buffer(png_ptr);
  429.          return;
  430.       }
  431.       png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length);
  432.    }
  433. #endif
  434. #if defined(PNG_READ_tEXt_SUPPORTED)
  435.    else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4))
  436.    {
  437.       if (png_ptr->push_length + 4 > png_ptr->buffer_size)
  438.       {
  439.          png_push_save_buffer(png_ptr);
  440.          return;
  441.       }
  442.       png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length);
  443.    }
  444. #endif
  445. #if defined(PNG_READ_zTXt_SUPPORTED)
  446.    else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4))
  447.    {
  448.       if (png_ptr->push_length + 4 > png_ptr->buffer_size)
  449.       {
  450.          png_push_save_buffer(png_ptr);
  451.          return;
  452.       }
  453.       png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length);
  454.    }
  455. #endif
  456. #if defined(PNG_READ_iTXt_SUPPORTED)
  457.    else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4))
  458.    {
  459.       if (png_ptr->push_length + 4 > png_ptr->buffer_size)
  460.       {
  461.          png_push_save_buffer(png_ptr);
  462.          return;
  463.       }
  464.       png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length);
  465.    }
  466. #endif
  467.    else
  468.    {
  469.       if (png_ptr->push_length + 4 > png_ptr->buffer_size)
  470.       {
  471.          png_push_save_buffer(png_ptr);
  472.          return;
  473.       }
  474.       png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length);
  475.    }
  476.    png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
  477. }
  478. void /* PRIVATE */
  479. png_push_crc_skip(png_structp png_ptr, png_uint_32 skip)
  480. {
  481.    png_ptr->process_mode = PNG_SKIP_MODE;
  482.    png_ptr->skip_length = skip;
  483. }
  484. void /* PRIVATE */
  485. png_push_crc_finish(png_structp png_ptr)
  486. {
  487.    if (png_ptr->skip_length && png_ptr->save_buffer_size)
  488.    {
  489.       png_size_t save_size;
  490.       if (png_ptr->skip_length < (png_uint_32)png_ptr->save_buffer_size)
  491.          save_size = (png_size_t)png_ptr->skip_length;
  492.       else
  493.          save_size = png_ptr->save_buffer_size;
  494.       png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size);
  495.       png_ptr->skip_length -= save_size;
  496.       png_ptr->buffer_size -= save_size;
  497.       png_ptr->save_buffer_size -= save_size;
  498.       png_ptr->save_buffer_ptr += save_size;
  499.    }
  500.    if (png_ptr->skip_length && png_ptr->current_buffer_size)
  501.    {
  502.       png_size_t save_size;
  503.       if (png_ptr->skip_length < (png_uint_32)png_ptr->current_buffer_size)
  504.          save_size = (png_size_t)png_ptr->skip_length;
  505.       else
  506.          save_size = png_ptr->current_buffer_size;
  507.       png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size);
  508.       png_ptr->skip_length -= save_size;
  509.       png_ptr->buffer_size -= save_size;
  510.       png_ptr->current_buffer_size -= save_size;
  511.       png_ptr->current_buffer_ptr += save_size;
  512.    }
  513.    if (!png_ptr->skip_length)
  514.    {
  515.       if (png_ptr->buffer_size < 4)
  516.       {
  517.          png_push_save_buffer(png_ptr);
  518.          return;
  519.       }
  520.       png_crc_finish(png_ptr, 0);
  521.       png_ptr->process_mode = PNG_READ_CHUNK_MODE;
  522.    }
  523. }
  524. void PNGAPI
  525. png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length)
  526. {
  527.    png_bytep ptr;
  528.    ptr = buffer;
  529.    if (png_ptr->save_buffer_size)
  530.    {
  531.       png_size_t save_size;
  532.       if (length < png_ptr->save_buffer_size)
  533.          save_size = length;
  534.       else
  535.          save_size = png_ptr->save_buffer_size;
  536.       png_memcpy(ptr, png_ptr->save_buffer_ptr, save_size);
  537.       length -= save_size;
  538.       ptr += save_size;
  539.       png_ptr->buffer_size -= save_size;
  540.       png_ptr->save_buffer_size -= save_size;
  541.       png_ptr->save_buffer_ptr += save_size;
  542.    }
  543.    if (length && png_ptr->current_buffer_size)
  544.    {
  545.       png_size_t save_size;
  546.       if (length < png_ptr->current_buffer_size)
  547.          save_size = length;
  548.       else
  549.          save_size = png_ptr->current_buffer_size;
  550.       png_memcpy(ptr, png_ptr->current_buffer_ptr, save_size);
  551.       png_ptr->buffer_size -= save_size;
  552.       png_ptr->current_buffer_size -= save_size;
  553.       png_ptr->current_buffer_ptr += save_size;
  554.    }
  555. }
  556. void /* PRIVATE */
  557. png_push_save_buffer(png_structp png_ptr)
  558. {
  559.    if (png_ptr->save_buffer_size)
  560.    {
  561.       if (png_ptr->save_buffer_ptr != png_ptr->save_buffer)
  562.       {
  563.          png_size_t i,istop;
  564.          png_bytep sp;
  565.          png_bytep dp;
  566.          istop = png_ptr->save_buffer_size;
  567.          for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer;
  568.             i < istop; i++, sp++, dp++)
  569.          {
  570.             *dp = *sp;
  571.          }
  572.       }
  573.    }
  574.    if (png_ptr->save_buffer_size + png_ptr->current_buffer_size >
  575.       png_ptr->save_buffer_max)
  576.    {
  577.       png_size_t new_max;
  578.       png_bytep old_buffer;
  579.       if (png_ptr->save_buffer_size > PNG_SIZE_MAX - 
  580.          (png_ptr->current_buffer_size + 256))
  581.       {
  582.         png_error(png_ptr, "Potential overflow of save_buffer");
  583.       }
  584.       new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256;
  585.       old_buffer = png_ptr->save_buffer;
  586.       png_ptr->save_buffer = (png_bytep)png_malloc(png_ptr,
  587.          (png_uint_32)new_max);
  588.       png_memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size);
  589.       png_free(png_ptr, old_buffer);
  590.       png_ptr->save_buffer_max = new_max;
  591.    }
  592.    if (png_ptr->current_buffer_size)
  593.    {
  594.       png_memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size,
  595.          png_ptr->current_buffer_ptr, png_ptr->current_buffer_size);
  596.       png_ptr->save_buffer_size += png_ptr->current_buffer_size;
  597.       png_ptr->current_buffer_size = 0;
  598.    }
  599.    png_ptr->save_buffer_ptr = png_ptr->save_buffer;
  600.    png_ptr->buffer_size = 0;
  601. }
  602. void /* PRIVATE */
  603. png_push_restore_buffer(png_structp png_ptr, png_bytep buffer,
  604.    png_size_t buffer_length)
  605. {
  606.    png_ptr->current_buffer = buffer;
  607.    png_ptr->current_buffer_size = buffer_length;
  608.    png_ptr->buffer_size = buffer_length + png_ptr->save_buffer_size;
  609.    png_ptr->current_buffer_ptr = png_ptr->current_buffer;
  610. }
  611. void /* PRIVATE */
  612. png_push_read_IDAT(png_structp png_ptr)
  613. {
  614. #ifdef PNG_USE_LOCAL_ARRAYS
  615.    PNG_IDAT;
  616. #endif
  617.    if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
  618.    {
  619.       png_byte chunk_length[4];
  620.       if (png_ptr->buffer_size < 8)
  621.       {
  622.          png_push_save_buffer(png_ptr);
  623.          return;
  624.       }
  625.       png_push_fill_buffer(png_ptr, chunk_length, 4);
  626.       png_ptr->push_length = png_get_uint_31(png_ptr,chunk_length);
  627.       png_reset_crc(png_ptr);
  628.       png_crc_read(png_ptr, png_ptr->chunk_name, 4);
  629.       png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
  630.       if (png_memcmp(png_ptr->chunk_name, (png_bytep)png_IDAT, 4))
  631.       {
  632.          png_ptr->process_mode = PNG_READ_CHUNK_MODE;
  633.          if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
  634.             png_error(png_ptr, "Not enough compressed data");
  635.          return;
  636.       }
  637.       png_ptr->idat_size = png_ptr->push_length;
  638.    }
  639.    if (png_ptr->idat_size && png_ptr->save_buffer_size)
  640.    {
  641.       png_size_t save_size;
  642.       if (png_ptr->idat_size < (png_uint_32)png_ptr->save_buffer_size)
  643.       {
  644.          save_size = (png_size_t)png_ptr->idat_size;
  645.          /* check for overflow */
  646.          if((png_uint_32)save_size != png_ptr->idat_size)
  647.             png_error(png_ptr, "save_size overflowed in pngpread");
  648.       }
  649.       else
  650.          save_size = png_ptr->save_buffer_size;
  651.       png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size);
  652.       if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
  653.          png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size);
  654.       png_ptr->idat_size -= save_size;
  655.       png_ptr->buffer_size -= save_size;
  656.       png_ptr->save_buffer_size -= save_size;
  657.       png_ptr->save_buffer_ptr += save_size;
  658.    }
  659.    if (png_ptr->idat_size && png_ptr->current_buffer_size)
  660.    {
  661.       png_size_t save_size;
  662.       if (png_ptr->idat_size < (png_uint_32)png_ptr->current_buffer_size)
  663.       {
  664.          save_size = (png_size_t)png_ptr->idat_size;
  665.          /* check for overflow */
  666.          if((png_uint_32)save_size != png_ptr->idat_size)
  667.             png_error(png_ptr, "save_size overflowed in pngpread");
  668.       }
  669.       else
  670.          save_size = png_ptr->current_buffer_size;
  671.       png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size);
  672.       if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
  673.         png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size);
  674.       png_ptr->idat_size -= save_size;
  675.       png_ptr->buffer_size -= save_size;
  676.       png_ptr->current_buffer_size -= save_size;
  677.       png_ptr->current_buffer_ptr += save_size;
  678.    }
  679.    if (!png_ptr->idat_size)
  680.    {
  681.       if (png_ptr->buffer_size < 4)
  682.       {
  683.          png_push_save_buffer(png_ptr);
  684.          return;
  685.       }
  686.       png_crc_finish(png_ptr, 0);
  687.       png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
  688.       png_ptr->mode |= PNG_AFTER_IDAT;
  689.    }
  690. }
  691. void /* PRIVATE */
  692. png_process_IDAT_data(png_structp png_ptr, png_bytep buffer,
  693.    png_size_t buffer_length)
  694. {
  695.    int ret;
  696.    if ((png_ptr->flags & PNG_FLAG_ZLIB_FINISHED) && buffer_length)
  697.       png_error(png_ptr, "Extra compression data");
  698.    png_ptr->zstream.next_in = buffer;
  699.    png_ptr->zstream.avail_in = (uInt)buffer_length;
  700.    for(;;)
  701.    {
  702.       ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
  703.       if (ret != Z_OK)
  704.       {
  705.          if (ret == Z_STREAM_END)
  706.          {
  707.             if (png_ptr->zstream.avail_in)
  708.                png_error(png_ptr, "Extra compressed data");
  709.             if (!(png_ptr->zstream.avail_out))
  710.             {
  711.                png_push_process_row(png_ptr);
  712.             }
  713.             png_ptr->mode |= PNG_AFTER_IDAT;
  714.             png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
  715.             break;
  716.          }
  717.          else if (ret == Z_BUF_ERROR)
  718.             break;
  719.          else
  720.             png_error(png_ptr, "Decompression Error");
  721.       }
  722.       if (!(png_ptr->zstream.avail_out))
  723.       {
  724.          if ((
  725. #if defined(PNG_READ_INTERLACING_SUPPORTED)
  726.              png_ptr->interlaced && png_ptr->pass > 6) ||
  727.              (!png_ptr->interlaced &&
  728. #endif
  729.              png_ptr->row_number == png_ptr->num_rows))
  730.          {
  731.            if (png_ptr->zstream.avail_in)
  732.              png_warning(png_ptr, "Too much data in IDAT chunks");
  733.            png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
  734.            break;
  735.          }
  736.          png_push_process_row(png_ptr);
  737.          png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes;
  738.          png_ptr->zstream.next_out = png_ptr->row_buf;
  739.       }
  740.       else
  741.          break;
  742.    }
  743. }
  744. void /* PRIVATE */
  745. png_push_process_row(png_structp png_ptr)
  746. {
  747.    png_ptr->row_info.color_type = png_ptr->color_type;
  748.    png_ptr->row_info.width = png_ptr->iwidth;
  749.    png_ptr->row_info.channels = png_ptr->channels;
  750.    png_ptr->row_info.bit_depth = png_ptr->bit_depth;
  751.    png_ptr->row_info.pixel_depth = png_ptr->pixel_depth;
  752.    png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,
  753.        png_ptr->row_info.width);
  754.    png_read_filter_row(png_ptr, &(png_ptr->row_info),
  755.       png_ptr->row_buf + 1, png_ptr->prev_row + 1,
  756.       (int)(png_ptr->row_buf[0]));
  757.    png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf,
  758.       png_ptr->rowbytes + 1);
  759.    if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA))
  760.       png_do_read_transformations(png_ptr);
  761. #if defined(PNG_READ_INTERLACING_SUPPORTED)
  762.    /* blow up interlaced rows to full size */
  763.    if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
  764.    {
  765.       if (png_ptr->pass < 6)
  766. /*       old interface (pre-1.0.9):
  767.          png_do_read_interlace(&(png_ptr->row_info),
  768.             png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations);
  769.  */
  770.          png_do_read_interlace(png_ptr);
  771.     switch (png_ptr->pass)
  772.     {
  773.          case 0:
  774.          {
  775.             int i;
  776.             for (i = 0; i < 8 && png_ptr->pass == 0; i++)
  777.             {
  778.                png_push_have_row(png_ptr, png_ptr->row_buf + 1);
  779.                png_read_push_finish_row(png_ptr); /* updates png_ptr->pass */
  780.             }
  781.             if (png_ptr->pass == 2) /* pass 1 might be empty */
  782.             {
  783.                for (i = 0; i < 4 && png_ptr->pass == 2; i++)
  784.                {
  785.                   png_push_have_row(png_ptr, png_bytep_NULL);
  786.                   png_read_push_finish_row(png_ptr);
  787.                }
  788.             }
  789.             if (png_ptr->pass == 4 && png_ptr->height <= 4)
  790.             {
  791.                for (i = 0; i < 2 && png_ptr->pass == 4; i++)
  792.                {
  793.                   png_push_have_row(png_ptr, png_bytep_NULL);
  794.                   png_read_push_finish_row(png_ptr);
  795.                }
  796.             }
  797.             if (png_ptr->pass == 6 && png_ptr->height <= 4)
  798.             {
  799.                 png_push_have_row(png_ptr, png_bytep_NULL);
  800.                 png_read_push_finish_row(png_ptr);
  801.             }
  802.             break;
  803.          }
  804.          case 1:
  805.          {
  806.             int i;
  807.             for (i = 0; i < 8 && png_ptr->pass == 1; i++)
  808.             {
  809.                png_push_have_row(png_ptr, png_ptr->row_buf + 1);
  810.                png_read_push_finish_row(png_ptr);
  811.             }
  812.             if (png_ptr->pass == 2) /* skip top 4 generated rows */
  813.             {
  814.                for (i = 0; i < 4 && png_ptr->pass == 2; i++)
  815.                {
  816.                   png_push_have_row(png_ptr, png_bytep_NULL);
  817.                   png_read_push_finish_row(png_ptr);
  818.                }
  819.             }
  820.             break;
  821.          }
  822.          case 2:
  823.          {
  824.             int i;
  825.             for (i = 0; i < 4 && png_ptr->pass == 2; i++)
  826.             {
  827.                png_push_have_row(png_ptr, png_ptr->row_buf + 1);
  828.                png_read_push_finish_row(png_ptr);
  829.             }
  830.             for (i = 0; i < 4 && png_ptr->pass == 2; i++)
  831.             {
  832.                png_push_have_row(png_ptr, png_bytep_NULL);
  833.                png_read_push_finish_row(png_ptr);
  834.             }
  835.             if (png_ptr->pass == 4) /* pass 3 might be empty */
  836.             {
  837.                for (i = 0; i < 2 && png_ptr->pass == 4; i++)
  838.                {
  839.                   png_push_have_row(png_ptr, png_bytep_NULL);
  840.                   png_read_push_finish_row(png_ptr);
  841.                }
  842.             }
  843.             break;
  844.          }
  845.          case 3:
  846.          {
  847.             int i;
  848.             for (i = 0; i < 4 && png_ptr->pass == 3; i++)
  849.             {
  850.                png_push_have_row(png_ptr, png_ptr->row_buf + 1);
  851.                png_read_push_finish_row(png_ptr);
  852.             }
  853.             if (png_ptr->pass == 4) /* skip top two generated rows */
  854.             {
  855.                for (i = 0; i < 2 && png_ptr->pass == 4; i++)
  856.                {
  857.                   png_push_have_row(png_ptr, png_bytep_NULL);
  858.                   png_read_push_finish_row(png_ptr);
  859.                }
  860.             }
  861.             break;
  862.          }
  863.          case 4:
  864.          {
  865.             int i;
  866.             for (i = 0; i < 2 && png_ptr->pass == 4; i++)
  867.             {
  868.                png_push_have_row(png_ptr, png_ptr->row_buf + 1);
  869.                png_read_push_finish_row(png_ptr);
  870.             }
  871.             for (i = 0; i < 2 && png_ptr->pass == 4; i++)
  872.             {
  873.                png_push_have_row(png_ptr, png_bytep_NULL);
  874.                png_read_push_finish_row(png_ptr);
  875.             }
  876.             if (png_ptr->pass == 6) /* pass 5 might be empty */
  877.             {
  878.                png_push_have_row(png_ptr, png_bytep_NULL);
  879.                png_read_push_finish_row(png_ptr);
  880.             }
  881.             break;
  882.          }
  883.          case 5:
  884.          {
  885.             int i;
  886.             for (i = 0; i < 2 && png_ptr->pass == 5; i++)
  887.             {
  888.                png_push_have_row(png_ptr, png_ptr->row_buf + 1);
  889.                png_read_push_finish_row(png_ptr);
  890.             }
  891.             if (png_ptr->pass == 6) /* skip top generated row */
  892.             {
  893.                png_push_have_row(png_ptr, png_bytep_NULL);
  894.                png_read_push_finish_row(png_ptr);
  895.             }
  896.             break;
  897.          }
  898.          case 6:
  899.          {
  900.             png_push_have_row(png_ptr, png_ptr->row_buf + 1);
  901.             png_read_push_finish_row(png_ptr);
  902.             if (png_ptr->pass != 6)
  903.                break;
  904.             png_push_have_row(png_ptr, png_bytep_NULL);
  905.             png_read_push_finish_row(png_ptr);
  906.          }
  907.       }
  908.    }
  909.    else
  910. #endif
  911.    {
  912.       png_push_have_row(png_ptr, png_ptr->row_buf + 1);
  913.       png_read_push_finish_row(png_ptr);
  914.    }
  915. }
  916. void /* PRIVATE */
  917. png_read_push_finish_row(png_structp png_ptr)
  918. {
  919. #ifdef PNG_USE_LOCAL_ARRAYS
  920.    /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
  921.    /* start of interlace block */
  922.    const int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
  923.    /* offset to next interlace block */
  924.    const int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
  925.    /* start of interlace block in the y direction */
  926.    const int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
  927.    /* offset to next interlace block in the y direction */
  928.    const int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
  929.    /* Width of interlace block.  This is not currently used - if you need
  930.     * it, uncomment it here and in png.h
  931.    const int FARDATA png_pass_width[] = {8, 4, 4, 2, 2, 1, 1};
  932.    */
  933.    /* Height of interlace block.  This is not currently used - if you need
  934.     * it, uncomment it here and in png.h
  935.    const int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1};
  936.    */
  937. #endif
  938.    png_ptr->row_number++;
  939.    if (png_ptr->row_number < png_ptr->num_rows)
  940.       return;
  941.    if (png_ptr->interlaced)
  942.    {
  943.       png_ptr->row_number = 0;
  944.       png_memset_check(png_ptr, png_ptr->prev_row, 0,
  945.          png_ptr->rowbytes + 1);
  946.       do
  947.       {
  948.          png_ptr->pass++;
  949.          if ((png_ptr->pass == 1 && png_ptr->width < 5) ||
  950.              (png_ptr->pass == 3 && png_ptr->width < 3) ||
  951.              (png_ptr->pass == 5 && png_ptr->width < 2))
  952.            png_ptr->pass++;
  953.          if (png_ptr->pass > 7)
  954.             png_ptr->pass--;
  955.          if (png_ptr->pass >= 7)
  956.             break;
  957.          png_ptr->iwidth = (png_ptr->width +
  958.             png_pass_inc[png_ptr->pass] - 1 -
  959.             png_pass_start[png_ptr->pass]) /
  960.             png_pass_inc[png_ptr->pass];
  961.          png_ptr->irowbytes = PNG_ROWBYTES(png_ptr->pixel_depth,
  962.             png_ptr->iwidth) + 1;
  963.          if (png_ptr->transformations & PNG_INTERLACE)
  964.             break;
  965.          png_ptr->num_rows = (png_ptr->height +
  966.             png_pass_yinc[png_ptr->pass] - 1 -
  967.             png_pass_ystart[png_ptr->pass]) /
  968.             png_pass_yinc[png_ptr->pass];
  969.       } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0);
  970.    }
  971. }
  972. #if defined(PNG_READ_tEXt_SUPPORTED)
  973. void /* PRIVATE */
  974. png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
  975.    length)
  976. {
  977.    if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
  978.       {
  979.          png_error(png_ptr, "Out of place tEXt");
  980.          /* to quiet some compiler warnings */
  981.          if(info_ptr == NULL) return;
  982.       }
  983. #ifdef PNG_MAX_MALLOC_64K
  984.    png_ptr->skip_length = 0;  /* This may not be necessary */
  985.    if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */
  986.    {
  987.       png_warning(png_ptr, "tEXt chunk too large to fit in memory");
  988.       png_ptr->skip_length = length - (png_uint_32)65535L;
  989.       length = (png_uint_32)65535L;
  990.    }
  991. #endif
  992.    png_ptr->current_text = (png_charp)png_malloc(png_ptr,
  993.          (png_uint_32)(length+1));
  994.    png_ptr->current_text[length] = '';
  995.    png_ptr->current_text_ptr = png_ptr->current_text;
  996.    png_ptr->current_text_size = (png_size_t)length;
  997.    png_ptr->current_text_left = (png_size_t)length;
  998.    png_ptr->process_mode = PNG_READ_tEXt_MODE;
  999. }
  1000. void /* PRIVATE */
  1001. png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr)
  1002. {
  1003.    if (png_ptr->buffer_size && png_ptr->current_text_left)
  1004.    {
  1005.       png_size_t text_size;
  1006.       if (png_ptr->buffer_size < png_ptr->current_text_left)
  1007.          text_size = png_ptr->buffer_size;
  1008.       else
  1009.          text_size = png_ptr->current_text_left;
  1010.       png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
  1011.       png_ptr->current_text_left -= text_size;
  1012.       png_ptr->current_text_ptr += text_size;
  1013.    }
  1014.    if (!(png_ptr->current_text_left))
  1015.    {
  1016.       png_textp text_ptr;
  1017.       png_charp text;
  1018.       png_charp key;
  1019.       int ret;
  1020.       if (png_ptr->buffer_size < 4)
  1021.       {
  1022.          png_push_save_buffer(png_ptr);
  1023.          return;
  1024.       }
  1025.       png_push_crc_finish(png_ptr);
  1026. #if defined(PNG_MAX_MALLOC_64K)
  1027.       if (png_ptr->skip_length)
  1028.          return;
  1029. #endif
  1030.       key = png_ptr->current_text;
  1031.       for (text = key; *text; text++)
  1032.          /* empty loop */ ;
  1033.       if (text != key + png_ptr->current_text_size)
  1034.          text++;
  1035.       text_ptr = (png_textp)png_malloc(png_ptr,
  1036.          (png_uint_32)png_sizeof(png_text));
  1037.       text_ptr->compression = PNG_TEXT_COMPRESSION_NONE;
  1038.       text_ptr->key = key;
  1039. #ifdef PNG_iTXt_SUPPORTED
  1040.       text_ptr->lang = NULL;
  1041.       text_ptr->lang_key = NULL;
  1042. #endif
  1043.       text_ptr->text = text;
  1044.       ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
  1045.       png_free(png_ptr, key);
  1046.       png_free(png_ptr, text_ptr);
  1047.       png_ptr->current_text = NULL;
  1048.       if (ret)
  1049.         png_warning(png_ptr, "Insufficient memory to store text chunk.");
  1050.    }
  1051. }
  1052. #endif
  1053. #if defined(PNG_READ_zTXt_SUPPORTED)
  1054. void /* PRIVATE */
  1055. png_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
  1056.    length)
  1057. {
  1058.    if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
  1059.       {
  1060.          png_error(png_ptr, "Out of place zTXt");
  1061.          /* to quiet some compiler warnings */
  1062.          if(info_ptr == NULL) return;
  1063.       }
  1064. #ifdef PNG_MAX_MALLOC_64K
  1065.    /* We can't handle zTXt chunks > 64K, since we don't have enough space
  1066.     * to be able to store the uncompressed data.  Actually, the threshold
  1067.     * is probably around 32K, but it isn't as definite as 64K is.
  1068.     */
  1069.    if (length > (png_uint_32)65535L)
  1070.    {
  1071.       png_warning(png_ptr, "zTXt chunk too large to fit in memory");
  1072.       png_push_crc_skip(png_ptr, length);
  1073.       return;
  1074.    }
  1075. #endif
  1076.    png_ptr->current_text = (png_charp)png_malloc(png_ptr,
  1077.        (png_uint_32)(length+1));
  1078.    png_ptr->current_text[length] = '';
  1079.    png_ptr->current_text_ptr = png_ptr->current_text;
  1080.    png_ptr->current_text_size = (png_size_t)length;
  1081.    png_ptr->current_text_left = (png_size_t)length;
  1082.    png_ptr->process_mode = PNG_READ_zTXt_MODE;
  1083. }
  1084. void /* PRIVATE */
  1085. png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr)
  1086. {
  1087.    if (png_ptr->buffer_size && png_ptr->current_text_left)
  1088.    {
  1089.       png_size_t text_size;
  1090.       if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left)
  1091.          text_size = png_ptr->buffer_size;
  1092.       else
  1093.          text_size = png_ptr->current_text_left;
  1094.       png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
  1095.       png_ptr->current_text_left -= text_size;
  1096.       png_ptr->current_text_ptr += text_size;
  1097.    }
  1098.    if (!(png_ptr->current_text_left))
  1099.    {
  1100.       png_textp text_ptr;
  1101.       png_charp text;
  1102.       png_charp key;
  1103.       int ret;
  1104.       png_size_t text_size, key_size;
  1105.       if (png_ptr->buffer_size < 4)
  1106.       {
  1107.          png_push_save_buffer(png_ptr);
  1108.          return;
  1109.       }
  1110.       png_push_crc_finish(png_ptr);
  1111.       key = png_ptr->current_text;
  1112.       for (text = key; *text; text++)
  1113.          /* empty loop */ ;
  1114.       /* zTXt can't have zero text */
  1115.       if (text == key + png_ptr->current_text_size)
  1116.       {
  1117.          png_ptr->current_text = NULL;
  1118.          png_free(png_ptr, key);
  1119.          return;
  1120.       }
  1121.       text++;
  1122.       if (*text != PNG_TEXT_COMPRESSION_zTXt) /* check compression byte */
  1123.       {
  1124.          png_ptr->current_text = NULL;
  1125.          png_free(png_ptr, key);
  1126.          return;
  1127.       }
  1128.       text++;
  1129.       png_ptr->zstream.next_in = (png_bytep )text;
  1130.       png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size -
  1131.          (text - key));
  1132.       png_ptr->zstream.next_out = png_ptr->zbuf;
  1133.       png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
  1134.       key_size = text - key;
  1135.       text_size = 0;
  1136.       text = NULL;
  1137.       ret = Z_STREAM_END;
  1138.       while (png_ptr->zstream.avail_in)
  1139.       {
  1140.          ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
  1141.          if (ret != Z_OK && ret != Z_STREAM_END)
  1142.          {
  1143.             inflateReset(&png_ptr->zstream);
  1144.             png_ptr->zstream.avail_in = 0;
  1145.             png_ptr->current_text = NULL;
  1146.             png_free(png_ptr, key);
  1147.             png_free(png_ptr, text);
  1148.             return;
  1149.          }
  1150.          if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END)
  1151.          {
  1152.             if (text == NULL)
  1153.             {
  1154.                text = (png_charp)png_malloc(png_ptr,
  1155.                   (png_uint_32)(png_ptr->zbuf_size - png_ptr->zstream.avail_out
  1156.                      + key_size + 1));
  1157.                png_memcpy(text + key_size, png_ptr->zbuf,
  1158.                   png_ptr->zbuf_size - png_ptr->zstream.avail_out);
  1159.                png_memcpy(text, key, key_size);
  1160.                text_size = key_size + png_ptr->zbuf_size -
  1161.                   png_ptr->zstream.avail_out;
  1162.                *(text + text_size) = '';
  1163.             }
  1164.             else
  1165.             {
  1166.                png_charp tmp;
  1167.                tmp = text;
  1168.                text = (png_charp)png_malloc(png_ptr, text_size +
  1169.                   (png_uint_32)(png_ptr->zbuf_size - png_ptr->zstream.avail_out
  1170.                    + 1));
  1171.                png_memcpy(text, tmp, text_size);
  1172.                png_free(png_ptr, tmp);
  1173.                png_memcpy(text + text_size, png_ptr->zbuf,
  1174.                   png_ptr->zbuf_size - png_ptr->zstream.avail_out);
  1175.                text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out;
  1176.                *(text + text_size) = '';
  1177.             }
  1178.             if (ret != Z_STREAM_END)
  1179.             {
  1180.                png_ptr->zstream.next_out = png_ptr->zbuf;
  1181.                png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
  1182.             }
  1183.          }
  1184.          else
  1185.          {
  1186.             break;
  1187.          }
  1188.          if (ret == Z_STREAM_END)
  1189.             break;
  1190.       }
  1191.       inflateReset(&png_ptr->zstream);
  1192.       png_ptr->zstream.avail_in = 0;
  1193.       if (ret != Z_STREAM_END)
  1194.       {
  1195.          png_ptr->current_text = NULL;
  1196.          png_free(png_ptr, key);
  1197.          png_free(png_ptr, text);
  1198.          return;
  1199.       }
  1200.       png_ptr->current_text = NULL;
  1201.       png_free(png_ptr, key);
  1202.       key = text;
  1203.       text += key_size;
  1204.       text_ptr = (png_textp)png_malloc(png_ptr,
  1205.           (png_uint_32)png_sizeof(png_text));
  1206.       text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt;
  1207.       text_ptr->key = key;
  1208. #ifdef PNG_iTXt_SUPPORTED
  1209.       text_ptr->lang = NULL;
  1210.       text_ptr->lang_key = NULL;
  1211. #endif
  1212.       text_ptr->text = text;
  1213.       ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
  1214.       png_free(png_ptr, key);
  1215.       png_free(png_ptr, text_ptr);
  1216.       if (ret)
  1217.         png_warning(png_ptr, "Insufficient memory to store text chunk.");
  1218.    }
  1219. }
  1220. #endif
  1221. #if defined(PNG_READ_iTXt_SUPPORTED)
  1222. void /* PRIVATE */
  1223. png_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
  1224.    length)
  1225. {
  1226.    if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
  1227.       {
  1228.          png_error(png_ptr, "Out of place iTXt");
  1229.          /* to quiet some compiler warnings */
  1230.          if(info_ptr == NULL) return;
  1231.       }
  1232. #ifdef PNG_MAX_MALLOC_64K
  1233.    png_ptr->skip_length = 0;  /* This may not be necessary */
  1234.    if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */
  1235.    {
  1236.       png_warning(png_ptr, "iTXt chunk too large to fit in memory");
  1237.       png_ptr->skip_length = length - (png_uint_32)65535L;
  1238.       length = (png_uint_32)65535L;
  1239.    }
  1240. #endif
  1241.    png_ptr->current_text = (png_charp)png_malloc(png_ptr,
  1242.          (png_uint_32)(length+1));
  1243.    png_ptr->current_text[length] = '';
  1244.    png_ptr->current_text_ptr = png_ptr->current_text;
  1245.    png_ptr->current_text_size = (png_size_t)length;
  1246.    png_ptr->current_text_left = (png_size_t)length;
  1247.    png_ptr->process_mode = PNG_READ_iTXt_MODE;
  1248. }
  1249. void /* PRIVATE */
  1250. png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr)
  1251. {
  1252.    if (png_ptr->buffer_size && png_ptr->current_text_left)
  1253.    {
  1254.       png_size_t text_size;
  1255.       if (png_ptr->buffer_size < png_ptr->current_text_left)
  1256.          text_size = png_ptr->buffer_size;
  1257.       else
  1258.          text_size = png_ptr->current_text_left;
  1259.       png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
  1260.       png_ptr->current_text_left -= text_size;
  1261.       png_ptr->current_text_ptr += text_size;
  1262.    }
  1263.    if (!(png_ptr->current_text_left))
  1264.    {
  1265.       png_textp text_ptr;
  1266.       png_charp key;
  1267.       int comp_flag;
  1268.       png_charp lang;
  1269.       png_charp lang_key;
  1270.       png_charp text;
  1271.       int ret;
  1272.       if (png_ptr->buffer_size < 4)
  1273.       {
  1274.          png_push_save_buffer(png_ptr);
  1275.          return;
  1276.       }
  1277.       png_push_crc_finish(png_ptr);
  1278. #if defined(PNG_MAX_MALLOC_64K)
  1279.       if (png_ptr->skip_length)
  1280.          return;
  1281. #endif
  1282.       key = png_ptr->current_text;
  1283.       for (lang = key; *lang; lang++)
  1284.          /* empty loop */ ;
  1285.       if (lang != key + png_ptr->current_text_size)
  1286.          lang++;
  1287.       comp_flag = *lang++;
  1288.       lang++;     /* skip comp_type, always zero */
  1289.       for (lang_key = lang; *lang_key; lang_key++)
  1290.          /* empty loop */ ;
  1291.       lang_key++;        /* skip NUL separator */
  1292.       for (text = lang_key; *text; text++)
  1293.          /* empty loop */ ;
  1294.       if (text != key + png_ptr->current_text_size)
  1295.          text++;
  1296.       text_ptr = (png_textp)png_malloc(png_ptr,
  1297.          (png_uint_32)png_sizeof(png_text));
  1298.       text_ptr->compression = comp_flag + 2;
  1299.       text_ptr->key = key;
  1300.       text_ptr->lang = lang;
  1301.       text_ptr->lang_key = lang_key;
  1302.       text_ptr->text = text;
  1303.       text_ptr->text_length = 0;
  1304.       text_ptr->itxt_length = png_strlen(text);
  1305.       ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
  1306.       png_ptr->current_text = NULL;
  1307.       png_free(png_ptr, text_ptr);
  1308.       if (ret)
  1309.         png_warning(png_ptr, "Insufficient memory to store iTXt chunk.");
  1310.    }
  1311. }
  1312. #endif
  1313. /* This function is called when we haven't found a handler for this
  1314.  * chunk.  If there isn't a problem with the chunk itself (ie a bad chunk
  1315.  * name or a critical chunk), the chunk is (currently) silently ignored.
  1316.  */
  1317. void /* PRIVATE */
  1318. png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32
  1319.    length)
  1320. {
  1321.    png_uint_32 skip=0;
  1322.    png_check_chunk_name(png_ptr, png_ptr->chunk_name);
  1323.    if (!(png_ptr->chunk_name[0] & 0x20))
  1324.    {
  1325. #if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
  1326.       if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
  1327.            PNG_HANDLE_CHUNK_ALWAYS
  1328. #if defined(PNG_READ_USER_CHUNKS_SUPPORTED)
  1329.            && png_ptr->read_user_chunk_fn == NULL
  1330. #endif
  1331.          )
  1332. #endif
  1333.          png_chunk_error(png_ptr, "unknown critical chunk");
  1334.       /* to quiet compiler warnings about unused info_ptr */
  1335.       if (info_ptr == NULL)
  1336.          return;
  1337.    }
  1338. #if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
  1339.    if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS)
  1340.    {
  1341.        png_unknown_chunk chunk;
  1342. #ifdef PNG_MAX_MALLOC_64K
  1343.        if (length > (png_uint_32)65535L)
  1344.        {
  1345.            png_warning(png_ptr, "unknown chunk too large to fit in memory");
  1346.            skip = length - (png_uint_32)65535L;
  1347.            length = (png_uint_32)65535L;
  1348.        }
  1349. #endif
  1350.        png_strcpy((png_charp)chunk.name, (png_charp)png_ptr->chunk_name);
  1351.        chunk.data = (png_bytep)png_malloc(png_ptr, length);
  1352.        png_crc_read(png_ptr, chunk.data, length);
  1353.        chunk.size = length;
  1354. #if defined(PNG_READ_USER_CHUNKS_SUPPORTED)
  1355.        if(png_ptr->read_user_chunk_fn != NULL)
  1356.        {
  1357.           /* callback to user unknown chunk handler */
  1358.           if ((*(png_ptr->read_user_chunk_fn)) (png_ptr, &chunk) <= 0)
  1359.           {
  1360.              if (!(png_ptr->chunk_name[0] & 0x20))
  1361.                 if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
  1362.                      PNG_HANDLE_CHUNK_ALWAYS)
  1363.                    png_chunk_error(png_ptr, "unknown critical chunk");
  1364.           }
  1365.              png_set_unknown_chunks(png_ptr, info_ptr, &chunk, 1);
  1366.        }
  1367.        else
  1368. #endif
  1369.           png_set_unknown_chunks(png_ptr, info_ptr, &chunk, 1);
  1370.        png_free(png_ptr, chunk.data);
  1371.    }
  1372.    else
  1373. #endif
  1374.       skip=length;
  1375.    png_push_crc_skip(png_ptr, skip);
  1376. }
  1377. void /* PRIVATE */
  1378. png_push_have_info(png_structp png_ptr, png_infop info_ptr)
  1379. {
  1380.    if (png_ptr->info_fn != NULL)
  1381.       (*(png_ptr->info_fn))(png_ptr, info_ptr);
  1382. }
  1383. void /* PRIVATE */
  1384. png_push_have_end(png_structp png_ptr, png_infop info_ptr)
  1385. {
  1386.    if (png_ptr->end_fn != NULL)
  1387.       (*(png_ptr->end_fn))(png_ptr, info_ptr);
  1388. }
  1389. void /* PRIVATE */
  1390. png_push_have_row(png_structp png_ptr, png_bytep row)
  1391. {
  1392.    if (png_ptr->row_fn != NULL)
  1393.       (*(png_ptr->row_fn))(png_ptr, row, png_ptr->row_number,
  1394.          (int)png_ptr->pass);
  1395. }
  1396. void PNGAPI
  1397. png_progressive_combine_row (png_structp png_ptr,
  1398.    png_bytep old_row, png_bytep new_row)
  1399. {
  1400. #ifdef PNG_USE_LOCAL_ARRAYS
  1401.    const int FARDATA png_pass_dsp_mask[7] =
  1402.       {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff};
  1403. #endif
  1404.    if (new_row != NULL)    /* new_row must == png_ptr->row_buf here. */
  1405.       png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]);
  1406. }
  1407. void PNGAPI
  1408. png_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr,
  1409.    png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn,
  1410.    png_progressive_end_ptr end_fn)
  1411. {
  1412.    png_ptr->info_fn = info_fn;
  1413.    png_ptr->row_fn = row_fn;
  1414.    png_ptr->end_fn = end_fn;
  1415.    png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer);
  1416. }
  1417. png_voidp PNGAPI
  1418. png_get_progressive_ptr(png_structp png_ptr)
  1419. {
  1420.    return png_ptr->io_ptr;
  1421. }
  1422. #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */