15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* pngpread.c - read a png file in push mode
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Last changed in libpng 1.2.44 [June 26, 2010]
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 1998-2010 Glenn Randers-Pehrson
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This code is released under the libpng license.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * For conditions of distribution and use, see the disclaimer
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and license in png.h
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_INTERNAL
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_NO_PEDANTIC_WARNINGS
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "png.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Push model modes */
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_READ_SIG_MODE   0
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_READ_CHUNK_MODE 1
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_READ_IDAT_MODE  2
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_SKIP_MODE       3
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_READ_tEXt_MODE  4
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_READ_zTXt_MODE  5
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_READ_DONE_MODE  6
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_READ_iTXt_MODE  7
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_ERROR_MODE      8
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_process_data(png_structp png_ptr, png_infop info_ptr,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_bytep buffer, png_size_t buffer_size)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL || info_ptr == NULL)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_push_restore_buffer(png_ptr, buffer, buffer_size);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   while (png_ptr->buffer_size)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_process_some_data(png_ptr, info_ptr);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* What we do with the incoming data depends on what we were previously
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * doing before we ran out of data...
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_process_some_data(png_structp png_ptr, png_infop info_ptr)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch (png_ptr->process_mode)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case PNG_READ_SIG_MODE:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_read_sig(png_ptr, info_ptr);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         break;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case PNG_READ_CHUNK_MODE:
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_read_chunk(png_ptr, info_ptr);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         break;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case PNG_READ_IDAT_MODE:
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_read_IDAT(png_ptr);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         break;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tEXt_SUPPORTED
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case PNG_READ_tEXt_MODE:
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_read_tEXt(png_ptr, info_ptr);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         break;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_zTXt_SUPPORTED
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case PNG_READ_zTXt_MODE:
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_read_zTXt(png_ptr, info_ptr);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         break;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iTXt_SUPPORTED
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case PNG_READ_iTXt_MODE:
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_read_iTXt(png_ptr, info_ptr);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         break;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case PNG_SKIP_MODE:
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_crc_finish(png_ptr);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         break;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->buffer_size = 0;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         break;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Read any remaining signature bytes from the stream and compare them with
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the correct PNG signature.  It is possible that this routine is called
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * with bytes already read from the signature, either because they have been
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * checked by the calling application, or because of multiple calls to this
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * routine.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_read_sig(png_structp png_ptr, png_infop info_ptr)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_size_t num_checked = png_ptr->sig_bytes,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             num_to_check = 8 - num_checked;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->buffer_size < num_to_check)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      num_to_check = png_ptr->buffer_size;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_push_fill_buffer(png_ptr, &(info_ptr->signature[num_checked]),
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      num_to_check);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes + num_to_check);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check))
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (num_checked < 4 &&
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4))
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_error(png_ptr, "Not a PNG file");
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_error(png_ptr, "PNG file corrupted by ASCII conversion");
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->sig_bytes >= 8)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->process_mode = PNG_READ_CHUNK_MODE;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USE_LOCAL_ARRAYS
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_IHDR;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_IDAT;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_IEND;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_PLTE;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_bKGD_SUPPORTED
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_bKGD;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_cHRM_SUPPORTED
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_cHRM;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_gAMA_SUPPORTED
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_gAMA;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_hIST_SUPPORTED
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_hIST;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iCCP_SUPPORTED
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_iCCP;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iTXt_SUPPORTED
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_iTXt;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_oFFs_SUPPORTED
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_oFFs;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_pCAL_SUPPORTED
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_pCAL;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_pHYs_SUPPORTED
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_pHYs;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sBIT_SUPPORTED
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_sBIT;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sCAL_SUPPORTED
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_sCAL;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sRGB_SUPPORTED
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_sRGB;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sPLT_SUPPORTED
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_sPLT;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tEXt_SUPPORTED
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_tEXt;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tIME_SUPPORTED
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_tIME;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tRNS_SUPPORTED
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_tRNS;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_zTXt_SUPPORTED
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_zTXt;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USE_LOCAL_ARRAYS */
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* First we make sure we have enough data for the 4 byte chunk name
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * and the 4 byte chunk length before proceeding with decoding the
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * chunk data.  To fully decode each of these chunks, we also make
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * sure we have enough data in the buffer for the 4 byte CRC at the
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * end of every chunk (except IDAT, which is handled separately).
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_byte chunk_length[4];
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->buffer_size < 8)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_push_fill_buffer(png_ptr, chunk_length, 4);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_reset_crc(png_ptr);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_crc_read(png_ptr, png_ptr->chunk_name, 4);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_check_chunk_name(png_ptr, png_ptr->chunk_name);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     if (png_ptr->mode & PNG_AFTER_IDAT)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4))
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->push_length != 13)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_error(png_ptr, "Invalid IHDR length");
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4))
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->process_mode = PNG_READ_DONE_MODE;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_push_have_end(png_ptr, info_ptr);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name))
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->mode |= PNG_HAVE_IDAT;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->mode |= PNG_HAVE_PLTE;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (!(png_ptr->mode & PNG_HAVE_IHDR))
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_error(png_ptr, "Missing IHDR before IDAT");
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  !(png_ptr->mode & PNG_HAVE_PLTE))
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_error(png_ptr, "Missing PLTE before IDAT");
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* If we reach an IDAT chunk, this means we have read all of the
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * header chunks, and we can start reading the image (or if this
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * is called after the image has been read - we have an error).
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       */
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!(png_ptr->mode & PNG_HAVE_IHDR))
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_error(png_ptr, "Missing IHDR before IDAT");
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          !(png_ptr->mode & PNG_HAVE_PLTE))
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_error(png_ptr, "Missing PLTE before IDAT");
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->mode & PNG_HAVE_IDAT)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (!(png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT))
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (png_ptr->push_length == 0)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               return;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (png_ptr->mode & PNG_AFTER_IDAT)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_error(png_ptr, "Too many IDAT's found");
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->idat_size = png_ptr->push_length;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->mode |= PNG_HAVE_IDAT;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->process_mode = PNG_READ_IDAT_MODE;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_push_have_info(png_ptr, info_ptr);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->zstream.avail_out =
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (uInt) PNG_ROWBYTES(png_ptr->pixel_depth,
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          png_ptr->iwidth) + 1;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->zstream.next_out = png_ptr->row_buf;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_gAMA_SUPPORTED
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4))
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sBIT_SUPPORTED
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4))
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_cHRM_SUPPORTED
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4))
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sRGB_SUPPORTED
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4))
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iCCP_SUPPORTED
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4))
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sPLT_SUPPORTED
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4))
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tRNS_SUPPORTED
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4))
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_bKGD_SUPPORTED
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4))
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_hIST_SUPPORTED
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4))
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length);
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_pHYs_SUPPORTED
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4))
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_oFFs_SUPPORTED
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4))
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_pCAL_SUPPORTED
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4))
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length);
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sCAL_SUPPORTED
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4))
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length);
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tIME_SUPPORTED
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4))
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length);
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tEXt_SUPPORTED
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4))
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length);
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_zTXt_SUPPORTED
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4))
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length);
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iTXt_SUPPORTED
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4))
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length);
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length);
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_crc_skip(png_structp png_ptr, png_uint_32 skip)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->process_mode = PNG_SKIP_MODE;
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->skip_length = skip;
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_crc_finish(png_structp png_ptr)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->skip_length && png_ptr->save_buffer_size)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_size_t save_size;
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->skip_length < (png_uint_32)png_ptr->save_buffer_size)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         save_size = (png_size_t)png_ptr->skip_length;
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         save_size = png_ptr->save_buffer_size;
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->skip_length -= save_size;
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->buffer_size -= save_size;
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->save_buffer_size -= save_size;
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->save_buffer_ptr += save_size;
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->skip_length && png_ptr->current_buffer_size)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_size_t save_size;
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->skip_length < (png_uint_32)png_ptr->current_buffer_size)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         save_size = (png_size_t)png_ptr->skip_length;
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         save_size = png_ptr->current_buffer_size;
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->skip_length -= save_size;
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->buffer_size -= save_size;
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->current_buffer_size -= save_size;
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->current_buffer_ptr += save_size;
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!png_ptr->skip_length)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->buffer_size < 4)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_crc_finish(png_ptr, 0);
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->process_mode = PNG_READ_CHUNK_MODE;
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_bytep ptr;
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ptr = buffer;
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->save_buffer_size)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_size_t save_size;
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (length < png_ptr->save_buffer_size)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         save_size = length;
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         save_size = png_ptr->save_buffer_size;
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_memcpy(ptr, png_ptr->save_buffer_ptr, save_size);
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      length -= save_size;
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ptr += save_size;
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->buffer_size -= save_size;
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->save_buffer_size -= save_size;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->save_buffer_ptr += save_size;
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (length && png_ptr->current_buffer_size)
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_size_t save_size;
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (length < png_ptr->current_buffer_size)
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         save_size = length;
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         save_size = png_ptr->current_buffer_size;
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_memcpy(ptr, png_ptr->current_buffer_ptr, save_size);
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->buffer_size -= save_size;
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->current_buffer_size -= save_size;
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->current_buffer_ptr += save_size;
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_save_buffer(png_structp png_ptr)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->save_buffer_size)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->save_buffer_ptr != png_ptr->save_buffer)
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_size_t i, istop;
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_bytep sp;
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_bytep dp;
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         istop = png_ptr->save_buffer_size;
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer;
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            i < istop; i++, sp++, dp++)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *dp = *sp;
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->save_buffer_size + png_ptr->current_buffer_size >
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->save_buffer_max)
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_size_t new_max;
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_bytep old_buffer;
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->save_buffer_size > PNG_SIZE_MAX -
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (png_ptr->current_buffer_size + 256))
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        png_error(png_ptr, "Potential overflow of save_buffer");
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256;
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      old_buffer = png_ptr->save_buffer;
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->save_buffer = (png_bytep)png_malloc_warn(png_ptr,
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (png_uint_32)new_max);
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->save_buffer == NULL)
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        png_free(png_ptr, old_buffer);
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        png_error(png_ptr, "Insufficient memory for save_buffer");
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size);
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_free(png_ptr, old_buffer);
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->save_buffer_max = new_max;
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->current_buffer_size)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size,
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->current_buffer_ptr, png_ptr->current_buffer_size);
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->save_buffer_size += png_ptr->current_buffer_size;
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->current_buffer_size = 0;
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->save_buffer_ptr = png_ptr->save_buffer;
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->buffer_size = 0;
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_restore_buffer(png_structp png_ptr, png_bytep buffer,
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_size_t buffer_length)
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->current_buffer = buffer;
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->current_buffer_size = buffer_length;
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->buffer_size = buffer_length + png_ptr->save_buffer_size;
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->current_buffer_ptr = png_ptr->current_buffer;
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_read_IDAT(png_structp png_ptr)
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USE_LOCAL_ARRAYS
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PNG_CONST PNG_IDAT;
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_byte chunk_length[4];
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->buffer_size < 8)
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_push_fill_buffer(png_ptr, chunk_length, 4);
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length);
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_reset_crc(png_ptr);
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_crc_read(png_ptr, png_ptr->chunk_name, 4);
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->process_mode = PNG_READ_CHUNK_MODE;
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_error(png_ptr, "Not enough compressed data");
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->idat_size = png_ptr->push_length;
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->idat_size && png_ptr->save_buffer_size)
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_size_t save_size;
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->idat_size < (png_uint_32)png_ptr->save_buffer_size)
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         save_size = (png_size_t)png_ptr->idat_size;
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* Check for overflow */
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if ((png_uint_32)save_size != png_ptr->idat_size)
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_error(png_ptr, "save_size overflowed in pngpread");
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         save_size = png_ptr->save_buffer_size;
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size);
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size);
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->idat_size -= save_size;
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->buffer_size -= save_size;
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->save_buffer_size -= save_size;
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->save_buffer_ptr += save_size;
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->idat_size && png_ptr->current_buffer_size)
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_size_t save_size;
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->idat_size < (png_uint_32)png_ptr->current_buffer_size)
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         save_size = (png_size_t)png_ptr->idat_size;
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* Check for overflow */
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if ((png_uint_32)save_size != png_ptr->idat_size)
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_error(png_ptr, "save_size overflowed in pngpread");
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         save_size = png_ptr->current_buffer_size;
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size);
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size);
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->idat_size -= save_size;
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->buffer_size -= save_size;
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->current_buffer_size -= save_size;
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->current_buffer_ptr += save_size;
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!png_ptr->idat_size)
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->buffer_size < 4)
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_crc_finish(png_ptr, 0);
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->mode |= PNG_AFTER_IDAT;
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_process_IDAT_data(png_structp png_ptr, png_bytep buffer,
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_size_t buffer_length)
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* The caller checks for a non-zero buffer length. */
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!(buffer_length > 0) || buffer == NULL)
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_error(png_ptr, "No IDAT data (internal error)");
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* This routine must process all the data it has been given
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * before returning, calling the row callback as required to
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * handle the uncompressed results.
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->zstream.next_in = buffer;
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->zstream.avail_in = (uInt)buffer_length;
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Keep going until the decompressed data is all processed
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * or the stream marked as finished.
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   while (png_ptr->zstream.avail_in > 0 &&
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  !(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int ret;
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* We have data for zlib, but we must check that zlib
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * has somewhere to put the results.  It doesn't matter
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * if we don't expect any results -- it may be the input
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * data is just the LZ end code.
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       */
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!(png_ptr->zstream.avail_out > 0))
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->zstream.avail_out =
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             (uInt) PNG_ROWBYTES(png_ptr->pixel_depth,
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             png_ptr->iwidth) + 1;
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->zstream.next_out = png_ptr->row_buf;
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Using Z_SYNC_FLUSH here means that an unterminated
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * LZ stream can still be handled (a stream with a missing
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * end code), otherwise (Z_NO_FLUSH) a future zlib
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * implementation might defer output and, therefore,
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * change the current behavior.  (See comments in inflate.c
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * for why this doesn't happen at present with zlib 1.2.5.)
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       */
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ret = inflate(&png_ptr->zstream, Z_SYNC_FLUSH);
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Check for any failure before proceeding. */
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (ret != Z_OK && ret != Z_STREAM_END)
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 /* Terminate the decompression. */
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* This may be a truncated stream (missing or
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  * damaged end code).  Treat that as a warning.
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  */
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (png_ptr->row_number >= png_ptr->num_rows ||
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     png_ptr->pass > 6)
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    png_warning(png_ptr, "Truncated compressed data in IDAT");
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 else
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    png_error(png_ptr, "Decompression error in IDAT");
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 /* Skip the check on unprocessed input */
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Did inflate output any data? */
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->zstream.next_out != png_ptr->row_buf)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 /* Is this unexpected data after the last row?
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  * If it is, artificially terminate the LZ output
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  * here.
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  */
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (png_ptr->row_number >= png_ptr->num_rows ||
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     png_ptr->pass > 6)
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* Extra data. */
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    png_warning(png_ptr, "Extra compressed data in IDAT");
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* Do no more processing; skip the unprocessed
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * input check below.
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return;
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 }
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 /* Do we have a complete row? */
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 if (png_ptr->zstream.avail_out == 0)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    png_push_process_row(png_ptr);
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* And check for the end of the stream. */
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (ret == Z_STREAM_END)
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* All the data should have been processed, if anything
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * is left at this point we have bytes of IDAT data
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * after the zlib end code.
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->zstream.avail_in > 0)
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_warning(png_ptr, "Extra compression data");
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_process_row(png_structp png_ptr)
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->row_info.color_type = png_ptr->color_type;
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->row_info.width = png_ptr->iwidth;
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->row_info.channels = png_ptr->channels;
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->row_info.bit_depth = png_ptr->bit_depth;
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->row_info.pixel_depth = png_ptr->pixel_depth;
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       png_ptr->row_info.width);
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_read_filter_row(png_ptr, &(png_ptr->row_info),
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       png_ptr->row_buf + 1, png_ptr->prev_row + 1,
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       (int)(png_ptr->row_buf[0]));
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf,
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->rowbytes + 1);
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA))
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_do_read_transformations(png_ptr);
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_INTERLACING_SUPPORTED
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Blow up interlaced rows to full size */
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->pass < 6)
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*       old interface (pre-1.0.9):
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_do_read_interlace(&(png_ptr->row_info),
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations);
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_do_read_interlace(png_ptr);
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (png_ptr->pass)
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         case 0:
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int i;
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            for (i = 0; i < 8 && png_ptr->pass == 0; i++)
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_read_push_finish_row(png_ptr); /* Updates png_ptr->pass */
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (png_ptr->pass == 2) /* Pass 1 might be empty */
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               for (i = 0; i < 4 && png_ptr->pass == 2; i++)
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               {
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_push_have_row(png_ptr, png_bytep_NULL);
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_read_push_finish_row(png_ptr);
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               }
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (png_ptr->pass == 4 && png_ptr->height <= 4)
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               for (i = 0; i < 2 && png_ptr->pass == 4; i++)
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               {
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_push_have_row(png_ptr, png_bytep_NULL);
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_read_push_finish_row(png_ptr);
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               }
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (png_ptr->pass == 6 && png_ptr->height <= 4)
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_push_have_row(png_ptr, png_bytep_NULL);
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                png_read_push_finish_row(png_ptr);
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         case 1:
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int i;
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            for (i = 0; i < 8 && png_ptr->pass == 1; i++)
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_read_push_finish_row(png_ptr);
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (png_ptr->pass == 2) /* Skip top 4 generated rows */
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               for (i = 0; i < 4 && png_ptr->pass == 2; i++)
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               {
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_push_have_row(png_ptr, png_bytep_NULL);
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_read_push_finish_row(png_ptr);
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               }
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         case 2:
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int i;
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            for (i = 0; i < 4 && png_ptr->pass == 2; i++)
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_read_push_finish_row(png_ptr);
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            for (i = 0; i < 4 && png_ptr->pass == 2; i++)
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_push_have_row(png_ptr, png_bytep_NULL);
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_read_push_finish_row(png_ptr);
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (png_ptr->pass == 4) /* Pass 3 might be empty */
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               for (i = 0; i < 2 && png_ptr->pass == 4; i++)
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               {
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_push_have_row(png_ptr, png_bytep_NULL);
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_read_push_finish_row(png_ptr);
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               }
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         case 3:
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int i;
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            for (i = 0; i < 4 && png_ptr->pass == 3; i++)
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_read_push_finish_row(png_ptr);
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (png_ptr->pass == 4) /* Skip top two generated rows */
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               for (i = 0; i < 2 && png_ptr->pass == 4; i++)
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               {
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_push_have_row(png_ptr, png_bytep_NULL);
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_read_push_finish_row(png_ptr);
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               }
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         case 4:
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int i;
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            for (i = 0; i < 2 && png_ptr->pass == 4; i++)
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_read_push_finish_row(png_ptr);
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            for (i = 0; i < 2 && png_ptr->pass == 4; i++)
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_push_have_row(png_ptr, png_bytep_NULL);
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_read_push_finish_row(png_ptr);
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (png_ptr->pass == 6) /* Pass 5 might be empty */
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_push_have_row(png_ptr, png_bytep_NULL);
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_read_push_finish_row(png_ptr);
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         case 5:
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int i;
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            for (i = 0; i < 2 && png_ptr->pass == 5; i++)
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_read_push_finish_row(png_ptr);
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (png_ptr->pass == 6) /* Skip top generated row */
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_push_have_row(png_ptr, png_bytep_NULL);
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_read_push_finish_row(png_ptr);
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         case 6:
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_push_have_row(png_ptr, png_ptr->row_buf + 1);
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_read_push_finish_row(png_ptr);
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (png_ptr->pass != 6)
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               break;
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_push_have_row(png_ptr, png_bytep_NULL);
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_read_push_finish_row(png_ptr);
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_push_have_row(png_ptr, png_ptr->row_buf + 1);
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_read_push_finish_row(png_ptr);
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_read_push_finish_row(png_structp png_ptr)
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USE_LOCAL_ARRAYS
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Start of interlace block */
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Offset to next interlace block */
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Start of interlace block in the y direction */
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Offset to next interlace block in the y direction */
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PNG_CONST int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Height of interlace block.  This is not currently used - if you need
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * it, uncomment it here and in png.h
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PNG_CONST int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1};
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->row_number++;
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->row_number < png_ptr->num_rows)
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_INTERLACING_SUPPORTED
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->interlaced)
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->row_number = 0;
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_memset_check(png_ptr, png_ptr->prev_row, 0,
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->rowbytes + 1);
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      do
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->pass++;
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if ((png_ptr->pass == 1 && png_ptr->width < 5) ||
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             (png_ptr->pass == 3 && png_ptr->width < 3) ||
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             (png_ptr->pass == 5 && png_ptr->width < 2))
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           png_ptr->pass++;
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (png_ptr->pass > 7)
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_ptr->pass--;
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (png_ptr->pass >= 7)
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->iwidth = (png_ptr->width +
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_pass_inc[png_ptr->pass] - 1 -
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_pass_start[png_ptr->pass]) /
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_pass_inc[png_ptr->pass];
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (png_ptr->transformations & PNG_INTERLACE)
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->num_rows = (png_ptr->height +
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_pass_yinc[png_ptr->pass] - 1 -
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_pass_ystart[png_ptr->pass]) /
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_pass_yinc[png_ptr->pass];
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0);
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_READ_INTERLACING_SUPPORTED */
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tEXt_SUPPORTED
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   length)
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_error(png_ptr, "Out of place tEXt");
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         info_ptr = info_ptr; /* To quiet some compiler warnings */
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_MAX_MALLOC_64K
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->skip_length = 0;  /* This may not be necessary */
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_warning(png_ptr, "tEXt chunk too large to fit in memory");
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->skip_length = length - (png_uint_32)65535L;
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      length = (png_uint_32)65535L;
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->current_text = (png_charp)png_malloc(png_ptr,
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (png_uint_32)(length + 1));
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->current_text[length] = '\0';
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->current_text_ptr = png_ptr->current_text;
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->current_text_size = (png_size_t)length;
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->current_text_left = (png_size_t)length;
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->process_mode = PNG_READ_tEXt_MODE;
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr)
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->buffer_size && png_ptr->current_text_left)
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_size_t text_size;
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->buffer_size < png_ptr->current_text_left)
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         text_size = png_ptr->buffer_size;
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         text_size = png_ptr->current_text_left;
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->current_text_left -= text_size;
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->current_text_ptr += text_size;
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!(png_ptr->current_text_left))
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_textp text_ptr;
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_charp text;
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_charp key;
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int ret;
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->buffer_size < 4)
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_push_crc_finish(png_ptr);
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_MAX_MALLOC_64K
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->skip_length)
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key = png_ptr->current_text;
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (text = key; *text; text++)
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* Empty loop */ ;
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (text < key + png_ptr->current_text_size)
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         text++;
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_ptr = (png_textp)png_malloc(png_ptr,
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (png_uint_32)png_sizeof(png_text));
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_ptr->compression = PNG_TEXT_COMPRESSION_NONE;
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_ptr->key = key;
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_iTXt_SUPPORTED
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_ptr->lang = NULL;
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_ptr->lang_key = NULL;
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_ptr->text = text;
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_free(png_ptr, key);
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_free(png_ptr, text_ptr);
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->current_text = NULL;
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (ret)
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        png_warning(png_ptr, "Insufficient memory to store text chunk.");
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_zTXt_SUPPORTED
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   length)
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_error(png_ptr, "Out of place zTXt");
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         info_ptr = info_ptr; /* To quiet some compiler warnings */
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_MAX_MALLOC_64K
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* We can't handle zTXt chunks > 64K, since we don't have enough space
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * to be able to store the uncompressed data.  Actually, the threshold
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * is probably around 32K, but it isn't as definite as 64K is.
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (length > (png_uint_32)65535L)
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_warning(png_ptr, "zTXt chunk too large to fit in memory");
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_push_crc_skip(png_ptr, length);
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->current_text = (png_charp)png_malloc(png_ptr,
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (png_uint_32)(length + 1));
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->current_text[length] = '\0';
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->current_text_ptr = png_ptr->current_text;
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->current_text_size = (png_size_t)length;
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->current_text_left = (png_size_t)length;
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->process_mode = PNG_READ_zTXt_MODE;
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr)
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->buffer_size && png_ptr->current_text_left)
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_size_t text_size;
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left)
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         text_size = png_ptr->buffer_size;
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         text_size = png_ptr->current_text_left;
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->current_text_left -= text_size;
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->current_text_ptr += text_size;
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!(png_ptr->current_text_left))
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_textp text_ptr;
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_charp text;
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_charp key;
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int ret;
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_size_t text_size, key_size;
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->buffer_size < 4)
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_push_crc_finish(png_ptr);
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key = png_ptr->current_text;
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (text = key; *text; text++)
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* Empty loop */ ;
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* zTXt can't have zero text */
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (text >= key + png_ptr->current_text_size)
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->current_text = NULL;
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_free(png_ptr, key);
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text++;
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (*text != PNG_TEXT_COMPRESSION_zTXt) /* Check compression byte */
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->current_text = NULL;
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_free(png_ptr, key);
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text++;
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->zstream.next_in = (png_bytep )text;
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size -
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (text - key));
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->zstream.next_out = png_ptr->zbuf;
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key_size = text - key;
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_size = 0;
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text = NULL;
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ret = Z_STREAM_END;
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while (png_ptr->zstream.avail_in)
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (ret != Z_OK && ret != Z_STREAM_END)
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            inflateReset(&png_ptr->zstream);
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_ptr->zstream.avail_in = 0;
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_ptr->current_text = NULL;
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_free(png_ptr, key);
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_free(png_ptr, text);
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return;
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END)
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (text == NULL)
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               text = (png_charp)png_malloc(png_ptr,
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     (png_uint_32)(png_ptr->zbuf_size
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     - png_ptr->zstream.avail_out + key_size + 1));
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_memcpy(text + key_size, png_ptr->zbuf,
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_ptr->zbuf_size - png_ptr->zstream.avail_out);
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_memcpy(text, key, key_size);
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               text_size = key_size + png_ptr->zbuf_size -
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_ptr->zstream.avail_out;
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               *(text + text_size) = '\0';
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_charp tmp;
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               tmp = text;
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               text = (png_charp)png_malloc(png_ptr, text_size +
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  (png_uint_32)(png_ptr->zbuf_size
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  - png_ptr->zstream.avail_out + 1));
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_memcpy(text, tmp, text_size);
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_free(png_ptr, tmp);
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_memcpy(text + text_size, png_ptr->zbuf,
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_ptr->zbuf_size - png_ptr->zstream.avail_out);
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out;
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               *(text + text_size) = '\0';
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (ret != Z_STREAM_END)
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_ptr->zstream.next_out = png_ptr->zbuf;
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         else
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (ret == Z_STREAM_END)
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      inflateReset(&png_ptr->zstream);
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->zstream.avail_in = 0;
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (ret != Z_STREAM_END)
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->current_text = NULL;
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_free(png_ptr, key);
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_free(png_ptr, text);
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->current_text = NULL;
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_free(png_ptr, key);
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key = text;
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text += key_size;
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_ptr = (png_textp)png_malloc(png_ptr,
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (png_uint_32)png_sizeof(png_text));
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt;
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_ptr->key = key;
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_iTXt_SUPPORTED
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_ptr->lang = NULL;
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_ptr->lang_key = NULL;
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_ptr->text = text;
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_free(png_ptr, key);
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_free(png_ptr, text_ptr);
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (ret)
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        png_warning(png_ptr, "Insufficient memory to store text chunk.");
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iTXt_SUPPORTED
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   length)
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_error(png_ptr, "Out of place iTXt");
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         info_ptr = info_ptr; /* To quiet some compiler warnings */
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_MAX_MALLOC_64K
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->skip_length = 0;  /* This may not be necessary */
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_warning(png_ptr, "iTXt chunk too large to fit in memory");
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->skip_length = length - (png_uint_32)65535L;
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      length = (png_uint_32)65535L;
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->current_text = (png_charp)png_malloc(png_ptr,
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (png_uint_32)(length + 1));
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->current_text[length] = '\0';
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->current_text_ptr = png_ptr->current_text;
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->current_text_size = (png_size_t)length;
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->current_text_left = (png_size_t)length;
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->process_mode = PNG_READ_iTXt_MODE;
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr)
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->buffer_size && png_ptr->current_text_left)
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_size_t text_size;
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->buffer_size < png_ptr->current_text_left)
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         text_size = png_ptr->buffer_size;
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         text_size = png_ptr->current_text_left;
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->current_text_left -= text_size;
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->current_text_ptr += text_size;
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!(png_ptr->current_text_left))
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_textp text_ptr;
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_charp key;
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int comp_flag;
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_charp lang;
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_charp lang_key;
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_charp text;
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int ret;
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->buffer_size < 4)
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_push_save_buffer(png_ptr);
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_push_crc_finish(png_ptr);
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_MAX_MALLOC_64K
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->skip_length)
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key = png_ptr->current_text;
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (lang = key; *lang; lang++)
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* Empty loop */ ;
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (lang < key + png_ptr->current_text_size - 3)
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         lang++;
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      comp_flag = *lang++;
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lang++;     /* Skip comp_type, always zero */
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (lang_key = lang; *lang_key; lang_key++)
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* Empty loop */ ;
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lang_key++;        /* Skip NUL separator */
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text=lang_key;
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (lang_key < key + png_ptr->current_text_size - 1)
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (; *text; text++)
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           /* Empty loop */ ;
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (text < key + png_ptr->current_text_size)
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         text++;
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_ptr = (png_textp)png_malloc(png_ptr,
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (png_uint_32)png_sizeof(png_text));
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_ptr->compression = comp_flag + 2;
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_ptr->key = key;
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_ptr->lang = lang;
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_ptr->lang_key = lang_key;
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_ptr->text = text;
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_ptr->text_length = 0;
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_ptr->itxt_length = png_strlen(text);
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->current_text = NULL;
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_free(png_ptr, text_ptr);
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (ret)
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_warning(png_ptr, "Insufficient memory to store iTXt chunk.");
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This function is called when we haven't found a handler for this
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * chunk.  If there isn't a problem with the chunk itself (ie a bad chunk
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * name or a critical chunk), the chunk is (currently) silently ignored.
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   length)
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_uint_32 skip = 0;
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!(png_ptr->chunk_name[0] & 0x20))
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         PNG_HANDLE_CHUNK_ALWAYS
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         && png_ptr->read_user_chunk_fn == NULL
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         )
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_chunk_error(png_ptr, "unknown critical chunk");
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      info_ptr = info_ptr; /* To quiet some compiler warnings */
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS)
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_MAX_MALLOC_64K
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (length > (png_uint_32)65535L)
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          png_warning(png_ptr, "unknown chunk too large to fit in memory");
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          skip = length - (png_uint_32)65535L;
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          length = (png_uint_32)65535L;
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_memcpy((png_charp)png_ptr->unknown_chunk.name,
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 (png_charp)png_ptr->chunk_name,
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 png_sizeof(png_ptr->unknown_chunk.name));
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name) - 1]
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        = '\0';
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->unknown_chunk.size = (png_size_t)length;
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (length == 0)
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->unknown_chunk.data = NULL;
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr,
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (png_uint_32)length);
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length);
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->read_user_chunk_fn != NULL)
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* Callback to user unknown chunk handler */
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         int ret;
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ret = (*(png_ptr->read_user_chunk_fn))
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           (png_ptr, &png_ptr->unknown_chunk);
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (ret < 0)
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_chunk_error(png_ptr, "error in user chunk");
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (ret == 0)
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!(png_ptr->chunk_name[0] & 0x20))
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    PNG_HANDLE_CHUNK_ALWAYS)
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_chunk_error(png_ptr, "unknown critical chunk");
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_set_unknown_chunks(png_ptr, info_ptr,
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               &png_ptr->unknown_chunk, 1);
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1);
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_free(png_ptr, png_ptr->unknown_chunk.data);
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->unknown_chunk.data = NULL;
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      skip=length;
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_push_crc_skip(png_ptr, skip);
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_have_info(png_structp png_ptr, png_infop info_ptr)
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->info_fn != NULL)
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (*(png_ptr->info_fn))(png_ptr, info_ptr);
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_have_end(png_structp png_ptr, png_infop info_ptr)
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->end_fn != NULL)
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (*(png_ptr->end_fn))(png_ptr, info_ptr);
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_have_row(png_structp png_ptr, png_bytep row)
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->row_fn != NULL)
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (*(png_ptr->row_fn))(png_ptr, row, png_ptr->row_number,
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (int)png_ptr->pass);
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_progressive_combine_row (png_structp png_ptr,
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_bytep old_row, png_bytep new_row)
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USE_LOCAL_ARRAYS
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PNG_CONST int FARDATA png_pass_dsp_mask[7] =
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff};
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (new_row != NULL)    /* new_row must == png_ptr->row_buf here. */
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]);
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr,
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn,
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_progressive_end_ptr end_fn)
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->info_fn = info_fn;
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->row_fn = row_fn;
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->end_fn = end_fn;
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer);
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp PNGAPI
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_get_progressive_ptr(png_structp png_ptr)
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return (NULL);
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return png_ptr->io_ptr;
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
1775