18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* pngpread.c - read a png file in push mode
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Last changed in libpng 1.2.19 August 18, 2007
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * For conditions of distribution and use, see copyright notice in png.h
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright (c) 1998-2007 Glenn Randers-Pehrson
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_INTERNAL
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "png.h"
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* push model modes */
178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_SIG_MODE   0
188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_CHUNK_MODE 1
198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_IDAT_MODE  2
208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_SKIP_MODE       3
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_tEXt_MODE  4
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_zTXt_MODE  5
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_DONE_MODE  6
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_iTXt_MODE  7
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_ERROR_MODE      8
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_process_data(png_structp png_ptr, png_infop info_ptr,
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_bytep buffer, png_size_t buffer_size)
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr == NULL) return;
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_push_restore_buffer(png_ptr, buffer, buffer_size);
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   while (png_ptr->buffer_size)
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_process_some_data(png_ptr, info_ptr);
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* What we do with the incoming data depends on what we were previously
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * doing before we ran out of data...
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_process_some_data(png_structp png_ptr, png_infop info_ptr)
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr == NULL) return;
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   switch (png_ptr->process_mode)
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case PNG_READ_SIG_MODE:
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_read_sig(png_ptr, info_ptr);
528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         break;
538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case PNG_READ_CHUNK_MODE:
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_read_chunk(png_ptr, info_ptr);
578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         break;
588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case PNG_READ_IDAT_MODE:
608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_read_IDAT(png_ptr);
628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         break;
638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tEXt_SUPPORTED)
658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case PNG_READ_tEXt_MODE:
668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_read_tEXt(png_ptr, info_ptr);
688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         break;
698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_zTXt_SUPPORTED)
728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case PNG_READ_zTXt_MODE:
738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_read_zTXt(png_ptr, info_ptr);
758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         break;
768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_iTXt_SUPPORTED)
798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case PNG_READ_iTXt_MODE:
808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_read_iTXt(png_ptr, info_ptr);
828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         break;
838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case PNG_SKIP_MODE:
868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_crc_finish(png_ptr);
888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         break;
898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      default:
918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->buffer_size = 0;
938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         break;
948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Read any remaining signature bytes from the stream and compare them with
998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the correct PNG signature.  It is possible that this routine is called
1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * with bytes already read from the signature, either because they have been
1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * checked by the calling application, or because of multiple calls to this
1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * routine.
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_read_sig(png_structp png_ptr, png_infop info_ptr)
1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_size_t num_checked = png_ptr->sig_bytes,
1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project             num_to_check = 8 - num_checked;
1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->buffer_size < num_to_check)
1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      num_to_check = png_ptr->buffer_size;
1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_push_fill_buffer(png_ptr, &(info_ptr->signature[num_checked]),
1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      num_to_check);
1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes+num_to_check);
1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check))
1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (num_checked < 4 &&
1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4))
1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_error(png_ptr, "Not a PNG file");
1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_error(png_ptr, "PNG file corrupted by ASCII conversion");
1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else
1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->sig_bytes >= 8)
1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->process_mode = PNG_READ_CHUNK_MODE;
1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS
1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_IHDR;
1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_IDAT;
1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_IEND;
1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_PLTE;
1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_bKGD_SUPPORTED)
1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_bKGD;
1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_cHRM_SUPPORTED)
1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_cHRM;
1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_gAMA_SUPPORTED)
1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_gAMA;
1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_hIST_SUPPORTED)
1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_hIST;
1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_iCCP_SUPPORTED)
1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_iCCP;
1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_iTXt_SUPPORTED)
1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_iTXt;
1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_oFFs_SUPPORTED)
1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_oFFs;
1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_pCAL_SUPPORTED)
1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_pCAL;
1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_pHYs_SUPPORTED)
1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_pHYs;
1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sBIT_SUPPORTED)
1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_sBIT;
1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sCAL_SUPPORTED)
1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_sCAL;
1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sRGB_SUPPORTED)
1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_sRGB;
1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sPLT_SUPPORTED)
1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_sPLT;
1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tEXt_SUPPORTED)
1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_tEXt;
1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tIME_SUPPORTED)
1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_tIME;
1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tRNS_SUPPORTED)
1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_tRNS;
1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_zTXt_SUPPORTED)
1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_zTXt;
1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USE_LOCAL_ARRAYS */
1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* First we make sure we have enough data for the 4 byte chunk name
1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * and the 4 byte chunk length before proceeding with decoding the
1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * chunk data.  To fully decode each of these chunks, we also make
1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * sure we have enough data in the buffer for the 4 byte CRC at the
2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * end of every chunk (except IDAT, which is handled separately).
2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_byte chunk_length[4];
2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->buffer_size < 8)
2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_fill_buffer(png_ptr, chunk_length, 4);
2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->push_length = png_get_uint_31(png_ptr,chunk_length);
2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_reset_crc(png_ptr);
2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_crc_read(png_ptr, png_ptr->chunk_name, 4);
2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!png_memcmp(png_ptr->chunk_name, (png_bytep)png_IDAT, 4))
2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     if(png_ptr->mode & PNG_AFTER_IDAT)
2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4))
2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length);
2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4))
2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length);
2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->process_mode = PNG_READ_DONE_MODE;
2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_have_end(png_ptr, info_ptr);
2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name))
2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->mode |= PNG_HAVE_IDAT;
2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length);
2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->mode |= PNG_HAVE_PLTE;
2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (!(png_ptr->mode & PNG_HAVE_IHDR))
2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "Missing IHDR before IDAT");
2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  !(png_ptr->mode & PNG_HAVE_PLTE))
2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "Missing PLTE before IDAT");
2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length);
2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, (png_bytep)png_IDAT, 4))
2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      /* If we reach an IDAT chunk, this means we have read all of the
2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       * header chunks, and we can start reading the image (or if this
2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       * is called after the image has been read - we have an error).
2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       */
2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     if (!(png_ptr->mode & PNG_HAVE_IHDR))
2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_error(png_ptr, "Missing IHDR before IDAT");
2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         !(png_ptr->mode & PNG_HAVE_PLTE))
2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_error(png_ptr, "Missing PLTE before IDAT");
2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->mode & PNG_HAVE_IDAT)
2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (!(png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT))
2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           if (png_ptr->push_length == 0)
2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project              return;
2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (png_ptr->mode & PNG_AFTER_IDAT)
2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "Too many IDAT's found");
2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->idat_size = png_ptr->push_length;
2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->mode |= PNG_HAVE_IDAT;
3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->process_mode = PNG_READ_IDAT_MODE;
3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_have_info(png_ptr, info_ptr);
3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes;
3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->zstream.next_out = png_ptr->row_buf;
3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return;
3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_gAMA_SUPPORTED)
3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4))
3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length);
3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sBIT_SUPPORTED)
3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4))
3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length);
3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_cHRM_SUPPORTED)
3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4))
3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length);
3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sRGB_SUPPORTED)
3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4))
3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length);
3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_iCCP_SUPPORTED)
3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4))
3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length);
3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sPLT_SUPPORTED)
3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4))
3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length);
3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tRNS_SUPPORTED)
3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4))
3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length);
3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_bKGD_SUPPORTED)
3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4))
3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length);
3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_hIST_SUPPORTED)
3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4))
3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length);
4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_pHYs_SUPPORTED)
4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4))
4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length);
4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_oFFs_SUPPORTED)
4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4))
4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length);
4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_pCAL_SUPPORTED)
4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4))
4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length);
4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sCAL_SUPPORTED)
4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4))
4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length);
4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tIME_SUPPORTED)
4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4))
4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length);
4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tEXt_SUPPORTED)
4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4))
4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length);
4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_zTXt_SUPPORTED)
4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4))
4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length);
4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_iTXt_SUPPORTED)
4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4))
4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length);
4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else
4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length);
5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_crc_skip(png_structp png_ptr, png_uint_32 skip)
5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->process_mode = PNG_SKIP_MODE;
5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->skip_length = skip;
5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_crc_finish(png_structp png_ptr)
5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->skip_length && png_ptr->save_buffer_size)
5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_size_t save_size;
5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->skip_length < (png_uint_32)png_ptr->save_buffer_size)
5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         save_size = (png_size_t)png_ptr->skip_length;
5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         save_size = png_ptr->save_buffer_size;
5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size);
5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->skip_length -= save_size;
5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->buffer_size -= save_size;
5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->save_buffer_size -= save_size;
5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->save_buffer_ptr += save_size;
5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->skip_length && png_ptr->current_buffer_size)
5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_size_t save_size;
5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->skip_length < (png_uint_32)png_ptr->current_buffer_size)
5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         save_size = (png_size_t)png_ptr->skip_length;
5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         save_size = png_ptr->current_buffer_size;
5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size);
5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->skip_length -= save_size;
5448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->buffer_size -= save_size;
5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_buffer_size -= save_size;
5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_buffer_ptr += save_size;
5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!png_ptr->skip_length)
5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->buffer_size < 4)
5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_crc_finish(png_ptr, 0);
5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->process_mode = PNG_READ_CHUNK_MODE;
5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length)
5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_bytep ptr;
5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr == NULL) return;
5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   ptr = buffer;
5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->save_buffer_size)
5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_size_t save_size;
5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (length < png_ptr->save_buffer_size)
5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         save_size = length;
5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         save_size = png_ptr->save_buffer_size;
5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_memcpy(ptr, png_ptr->save_buffer_ptr, save_size);
5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      length -= save_size;
5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      ptr += save_size;
5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->buffer_size -= save_size;
5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->save_buffer_size -= save_size;
5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->save_buffer_ptr += save_size;
5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (length && png_ptr->current_buffer_size)
5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_size_t save_size;
5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (length < png_ptr->current_buffer_size)
5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         save_size = length;
5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         save_size = png_ptr->current_buffer_size;
5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_memcpy(ptr, png_ptr->current_buffer_ptr, save_size);
5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->buffer_size -= save_size;
5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_buffer_size -= save_size;
5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_buffer_ptr += save_size;
5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_save_buffer(png_structp png_ptr)
6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->save_buffer_size)
6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->save_buffer_ptr != png_ptr->save_buffer)
6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_size_t i,istop;
6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_bytep sp;
6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_bytep dp;
6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         istop = png_ptr->save_buffer_size;
6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer;
6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            i < istop; i++, sp++, dp++)
6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            *dp = *sp;
6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->save_buffer_size + png_ptr->current_buffer_size >
6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->save_buffer_max)
6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_size_t new_max;
6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_bytep old_buffer;
6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->save_buffer_size > PNG_SIZE_MAX -
6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         (png_ptr->current_buffer_size + 256))
6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        png_error(png_ptr, "Potential overflow of save_buffer");
6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256;
6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      old_buffer = png_ptr->save_buffer;
6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->save_buffer = (png_bytep)png_malloc(png_ptr,
6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         (png_uint_32)new_max);
6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size);
6358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free(png_ptr, old_buffer);
6368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->save_buffer_max = new_max;
6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->current_buffer_size)
6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size,
6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->current_buffer_ptr, png_ptr->current_buffer_size);
6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->save_buffer_size += png_ptr->current_buffer_size;
6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_buffer_size = 0;
6448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->save_buffer_ptr = png_ptr->save_buffer;
6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->buffer_size = 0;
6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_restore_buffer(png_structp png_ptr, png_bytep buffer,
6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_size_t buffer_length)
6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_buffer = buffer;
6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_buffer_size = buffer_length;
6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->buffer_size = buffer_length + png_ptr->save_buffer_size;
6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_buffer_ptr = png_ptr->current_buffer;
6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_read_IDAT(png_structp png_ptr)
6618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS
6638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   PNG_CONST PNG_IDAT;
6648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
6658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
6668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
6678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_byte chunk_length[4];
6688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->buffer_size < 8)
6708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
6718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
6748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_fill_buffer(png_ptr, chunk_length, 4);
6768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->push_length = png_get_uint_31(png_ptr,chunk_length);
6778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_reset_crc(png_ptr);
6788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_crc_read(png_ptr, png_ptr->chunk_name, 4);
6798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_memcmp(png_ptr->chunk_name, (png_bytep)png_IDAT, 4))
6828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
6838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->process_mode = PNG_READ_CHUNK_MODE;
6848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
6858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "Not enough compressed data");
6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->idat_size = png_ptr->push_length;
6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
6918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->idat_size && png_ptr->save_buffer_size)
6928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
6938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_size_t save_size;
6948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->idat_size < (png_uint_32)png_ptr->save_buffer_size)
6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         save_size = (png_size_t)png_ptr->idat_size;
6988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         /* check for overflow */
6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if((png_uint_32)save_size != png_ptr->idat_size)
7008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "save_size overflowed in pngpread");
7018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
7028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
7038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         save_size = png_ptr->save_buffer_size;
7048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size);
7068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
7078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size);
7088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->idat_size -= save_size;
7098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->buffer_size -= save_size;
7108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->save_buffer_size -= save_size;
7118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->save_buffer_ptr += save_size;
7128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
7138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->idat_size && png_ptr->current_buffer_size)
7148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
7158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_size_t save_size;
7168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->idat_size < (png_uint_32)png_ptr->current_buffer_size)
7188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
7198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         save_size = (png_size_t)png_ptr->idat_size;
7208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         /* check for overflow */
7218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if((png_uint_32)save_size != png_ptr->idat_size)
7228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "save_size overflowed in pngpread");
7238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
7248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
7258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         save_size = png_ptr->current_buffer_size;
7268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size);
7288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
7298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size);
7308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->idat_size -= save_size;
7328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->buffer_size -= save_size;
7338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_buffer_size -= save_size;
7348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_buffer_ptr += save_size;
7358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
7368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!png_ptr->idat_size)
7378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
7388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->buffer_size < 4)
7398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
7408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
7418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
7428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
7438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_crc_finish(png_ptr, 0);
7458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
7468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->mode |= PNG_AFTER_IDAT;
7478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
7488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
7498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
7518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_process_IDAT_data(png_structp png_ptr, png_bytep buffer,
7528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_size_t buffer_length)
7538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
7548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   int ret;
7558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if ((png_ptr->flags & PNG_FLAG_ZLIB_FINISHED) && buffer_length)
7578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_error(png_ptr, "Extra compression data");
7588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.next_in = buffer;
7608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.avail_in = (uInt)buffer_length;
7618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   for(;;)
7628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
7638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
7648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (ret != Z_OK)
7658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
7668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (ret == Z_STREAM_END)
7678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
7688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (png_ptr->zstream.avail_in)
7698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_error(png_ptr, "Extra compressed data");
7708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (!(png_ptr->zstream.avail_out))
7718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
7728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_push_process_row(png_ptr);
7738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
7748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->mode |= PNG_AFTER_IDAT;
7768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
7778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
7788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
7798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         else if (ret == Z_BUF_ERROR)
7808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
7818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         else
7828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "Decompression Error");
7838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
7848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (!(png_ptr->zstream.avail_out))
7858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
7868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if ((
7878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_INTERLACING_SUPPORTED)
7888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project             png_ptr->interlaced && png_ptr->pass > 6) ||
7898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project             (!png_ptr->interlaced &&
7908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
7918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project             png_ptr->row_number == png_ptr->num_rows))
7928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
7938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           if (png_ptr->zstream.avail_in)
7948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project             png_warning(png_ptr, "Too much data in IDAT chunks");
7958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
7968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           break;
7978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
7988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_process_row(png_ptr);
7998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes;
8008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->zstream.next_out = png_ptr->row_buf;
8018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
8028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
8038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         break;
8048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
8058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
8068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
8088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_process_row(png_structp png_ptr)
8098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
8108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_info.color_type = png_ptr->color_type;
8118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_info.width = png_ptr->iwidth;
8128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_info.channels = png_ptr->channels;
8138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_info.bit_depth = png_ptr->bit_depth;
8148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_info.pixel_depth = png_ptr->pixel_depth;
8158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,
8178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_ptr->row_info.width);
8188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_read_filter_row(png_ptr, &(png_ptr->row_info),
8208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->row_buf + 1, png_ptr->prev_row + 1,
8218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      (int)(png_ptr->row_buf[0]));
8228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf,
8248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->rowbytes + 1);
8258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA))
8278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_do_read_transformations(png_ptr);
8288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_INTERLACING_SUPPORTED)
8308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* blow up interlaced rows to full size */
8318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
8328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
8338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->pass < 6)
8348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*       old interface (pre-1.0.9):
8358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_do_read_interlace(&(png_ptr->row_info),
8368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations);
8378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
8388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_do_read_interlace(png_ptr);
8398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    switch (png_ptr->pass)
8418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    {
8428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 0:
8438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
8448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            int i;
8458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for (i = 0; i < 8 && png_ptr->pass == 0; i++)
8468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
8478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
8488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_push_finish_row(png_ptr); /* updates png_ptr->pass */
8498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
8508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (png_ptr->pass == 2) /* pass 1 might be empty */
8518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
8528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               for (i = 0; i < 4 && png_ptr->pass == 2; i++)
8538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               {
8548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_push_have_row(png_ptr, png_bytep_NULL);
8558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_read_push_finish_row(png_ptr);
8568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               }
8578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
8588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (png_ptr->pass == 4 && png_ptr->height <= 4)
8598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
8608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               for (i = 0; i < 2 && png_ptr->pass == 4; i++)
8618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               {
8628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_push_have_row(png_ptr, png_bytep_NULL);
8638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_read_push_finish_row(png_ptr);
8648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               }
8658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
8668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (png_ptr->pass == 6 && png_ptr->height <= 4)
8678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
8688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                png_push_have_row(png_ptr, png_bytep_NULL);
8698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                png_read_push_finish_row(png_ptr);
8708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
8718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
8728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
8738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 1:
8748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
8758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            int i;
8768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for (i = 0; i < 8 && png_ptr->pass == 1; i++)
8778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
8788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
8798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_push_finish_row(png_ptr);
8808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
8818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (png_ptr->pass == 2) /* skip top 4 generated rows */
8828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
8838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               for (i = 0; i < 4 && png_ptr->pass == 2; i++)
8848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               {
8858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_push_have_row(png_ptr, png_bytep_NULL);
8868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_read_push_finish_row(png_ptr);
8878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               }
8888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
8898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
8908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
8918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 2:
8928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
8938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            int i;
8948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for (i = 0; i < 4 && png_ptr->pass == 2; i++)
8958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
8968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
8978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_push_finish_row(png_ptr);
8988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
8998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for (i = 0; i < 4 && png_ptr->pass == 2; i++)
9008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
9018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_push_have_row(png_ptr, png_bytep_NULL);
9028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_push_finish_row(png_ptr);
9038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
9048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (png_ptr->pass == 4) /* pass 3 might be empty */
9058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
9068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               for (i = 0; i < 2 && png_ptr->pass == 4; i++)
9078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               {
9088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_push_have_row(png_ptr, png_bytep_NULL);
9098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_read_push_finish_row(png_ptr);
9108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               }
9118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
9128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
9138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
9148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 3:
9158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
9168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            int i;
9178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for (i = 0; i < 4 && png_ptr->pass == 3; i++)
9188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
9198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
9208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_push_finish_row(png_ptr);
9218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
9228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (png_ptr->pass == 4) /* skip top two generated rows */
9238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
9248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               for (i = 0; i < 2 && png_ptr->pass == 4; i++)
9258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               {
9268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_push_have_row(png_ptr, png_bytep_NULL);
9278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_read_push_finish_row(png_ptr);
9288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               }
9298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
9308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
9318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
9328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 4:
9338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
9348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            int i;
9358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for (i = 0; i < 2 && png_ptr->pass == 4; i++)
9368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
9378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
9388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_push_finish_row(png_ptr);
9398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
9408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for (i = 0; i < 2 && png_ptr->pass == 4; i++)
9418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
9428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_push_have_row(png_ptr, png_bytep_NULL);
9438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_push_finish_row(png_ptr);
9448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
9458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (png_ptr->pass == 6) /* pass 5 might be empty */
9468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
9478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_push_have_row(png_ptr, png_bytep_NULL);
9488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_push_finish_row(png_ptr);
9498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
9508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
9518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
9528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 5:
9538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
9548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            int i;
9558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for (i = 0; i < 2 && png_ptr->pass == 5; i++)
9568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
9578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
9588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_push_finish_row(png_ptr);
9598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
9608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (png_ptr->pass == 6) /* skip top generated row */
9618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
9628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_push_have_row(png_ptr, png_bytep_NULL);
9638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_push_finish_row(png_ptr);
9648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
9658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
9668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
9678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 6:
9688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
9698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_push_have_row(png_ptr, png_ptr->row_buf + 1);
9708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_read_push_finish_row(png_ptr);
9718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (png_ptr->pass != 6)
9728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               break;
9738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_push_have_row(png_ptr, png_bytep_NULL);
9748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_read_push_finish_row(png_ptr);
9758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
9768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
9778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
9788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else
9798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
9808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
9818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_have_row(png_ptr, png_ptr->row_buf + 1);
9828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_read_push_finish_row(png_ptr);
9838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
9848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
9858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
9878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_read_push_finish_row(png_structp png_ptr)
9888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
9898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS
9908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
9918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* start of interlace block */
9938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
9948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* offset to next interlace block */
9968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
9978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* start of interlace block in the y direction */
9998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
10008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* offset to next interlace block in the y direction */
10028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   PNG_CONST int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
10038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* Width of interlace block.  This is not currently used - if you need
10058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * it, uncomment it here and in png.h
10068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   PNG_CONST int FARDATA png_pass_width[] = {8, 4, 4, 2, 2, 1, 1};
10078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   */
10088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* Height of interlace block.  This is not currently used - if you need
10108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * it, uncomment it here and in png.h
10118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   PNG_CONST int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1};
10128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   */
10138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
10148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_number++;
10168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->row_number < png_ptr->num_rows)
10178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return;
10188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->interlaced)
10208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
10218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->row_number = 0;
10228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_memset_check(png_ptr, png_ptr->prev_row, 0,
10238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->rowbytes + 1);
10248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      do
10258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
10268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->pass++;
10278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if ((png_ptr->pass == 1 && png_ptr->width < 5) ||
10288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project             (png_ptr->pass == 3 && png_ptr->width < 3) ||
10298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project             (png_ptr->pass == 5 && png_ptr->width < 2))
10308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           png_ptr->pass++;
10318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (png_ptr->pass > 7)
10338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->pass--;
10348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (png_ptr->pass >= 7)
10358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
10368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->iwidth = (png_ptr->width +
10388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_pass_inc[png_ptr->pass] - 1 -
10398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_pass_start[png_ptr->pass]) /
10408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_pass_inc[png_ptr->pass];
10418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->irowbytes = PNG_ROWBYTES(png_ptr->pixel_depth,
10438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->iwidth) + 1;
10448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (png_ptr->transformations & PNG_INTERLACE)
10468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
10478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->num_rows = (png_ptr->height +
10498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_pass_yinc[png_ptr->pass] - 1 -
10508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_pass_ystart[png_ptr->pass]) /
10518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_pass_yinc[png_ptr->pass];
10528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0);
10548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
10558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
10568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tEXt_SUPPORTED)
10588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
10598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
10608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   length)
10618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
10628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
10638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
10648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_error(png_ptr, "Out of place tEXt");
10658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         info_ptr = info_ptr; /* to quiet some compiler warnings */
10668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
10678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K
10698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->skip_length = 0;  /* This may not be necessary */
10708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */
10728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
10738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr, "tEXt chunk too large to fit in memory");
10748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->skip_length = length - (png_uint_32)65535L;
10758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      length = (png_uint_32)65535L;
10768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
10778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
10788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text = (png_charp)png_malloc(png_ptr,
10808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         (png_uint_32)(length+1));
10818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text[length] = '\0';
10828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text_ptr = png_ptr->current_text;
10838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text_size = (png_size_t)length;
10848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text_left = (png_size_t)length;
10858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->process_mode = PNG_READ_tEXt_MODE;
10868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
10878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
10898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_read_tEXt(png_structp png_ptr, png_infop info_ptr)
10908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
10918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->buffer_size && png_ptr->current_text_left)
10928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
10938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_size_t text_size;
10948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->buffer_size < png_ptr->current_text_left)
10968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         text_size = png_ptr->buffer_size;
10978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
10988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         text_size = png_ptr->current_text_left;
10998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
11008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_text_left -= text_size;
11018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_text_ptr += text_size;
11028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
11038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->current_text_left))
11048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
11058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_textp text_ptr;
11068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_charp text;
11078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_charp key;
11088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int ret;
11098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->buffer_size < 4)
11118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
11128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
11138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
11148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
11158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_crc_finish(png_ptr);
11178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_MAX_MALLOC_64K)
11198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->skip_length)
11208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
11218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
11228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      key = png_ptr->current_text;
11248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (text = key; *text; text++)
11268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         /* empty loop */ ;
11278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (text != key + png_ptr->current_text_size)
11298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         text++;
11308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr = (png_textp)png_malloc(png_ptr,
11328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         (png_uint_32)png_sizeof(png_text));
11338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->compression = PNG_TEXT_COMPRESSION_NONE;
11348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->key = key;
11358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_iTXt_SUPPORTED
11368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->lang = NULL;
11378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->lang_key = NULL;
11388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
11398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->text = text;
11408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
11428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free(png_ptr, key);
11448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free(png_ptr, text_ptr);
11458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_text = NULL;
11468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (ret)
11488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        png_warning(png_ptr, "Insufficient memory to store text chunk.");
11498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
11508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
11518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
11528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_zTXt_SUPPORTED)
11548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
11558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
11568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   length)
11578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
11588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
11598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
11608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_error(png_ptr, "Out of place zTXt");
11618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         info_ptr = info_ptr; /* to quiet some compiler warnings */
11628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
11638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K
11658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* We can't handle zTXt chunks > 64K, since we don't have enough space
11668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * to be able to store the uncompressed data.  Actually, the threshold
11678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * is probably around 32K, but it isn't as definite as 64K is.
11688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
11698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (length > (png_uint_32)65535L)
11708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
11718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr, "zTXt chunk too large to fit in memory");
11728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_crc_skip(png_ptr, length);
11738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return;
11748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
11758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
11768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text = (png_charp)png_malloc(png_ptr,
11788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       (png_uint_32)(length+1));
11798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text[length] = '\0';
11808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text_ptr = png_ptr->current_text;
11818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text_size = (png_size_t)length;
11828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text_left = (png_size_t)length;
11838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->process_mode = PNG_READ_zTXt_MODE;
11848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
11858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
11878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_read_zTXt(png_structp png_ptr, png_infop info_ptr)
11888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
11898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->buffer_size && png_ptr->current_text_left)
11908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
11918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_size_t text_size;
11928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left)
11948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         text_size = png_ptr->buffer_size;
11958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
11968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         text_size = png_ptr->current_text_left;
11978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
11988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_text_left -= text_size;
11998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_text_ptr += text_size;
12008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
12018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->current_text_left))
12028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
12038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_textp text_ptr;
12048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_charp text;
12058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_charp key;
12068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int ret;
12078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_size_t text_size, key_size;
12088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->buffer_size < 4)
12108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
12118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
12128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
12138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
12148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_crc_finish(png_ptr);
12168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      key = png_ptr->current_text;
12188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (text = key; *text; text++)
12208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         /* empty loop */ ;
12218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      /* zTXt can't have zero text */
12238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (text == key + png_ptr->current_text_size)
12248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
12258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->current_text = NULL;
12268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_free(png_ptr, key);
12278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
12288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
12298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text++;
12318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (*text != PNG_TEXT_COMPRESSION_zTXt) /* check compression byte */
12338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
12348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->current_text = NULL;
12358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_free(png_ptr, key);
12368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
12378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
12388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text++;
12408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->zstream.next_in = (png_bytep )text;
12428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size -
12438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         (text - key));
12448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->zstream.next_out = png_ptr->zbuf;
12458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
12468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      key_size = text - key;
12488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_size = 0;
12498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text = NULL;
12508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      ret = Z_STREAM_END;
12518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      while (png_ptr->zstream.avail_in)
12538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
12548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
12558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (ret != Z_OK && ret != Z_STREAM_END)
12568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
12578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            inflateReset(&png_ptr->zstream);
12588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->zstream.avail_in = 0;
12598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->current_text = NULL;
12608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_free(png_ptr, key);
12618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_free(png_ptr, text);
12628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return;
12638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
12648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END)
12658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
12668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (text == NULL)
12678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
12688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               text = (png_charp)png_malloc(png_ptr,
12698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  (png_uint_32)(png_ptr->zbuf_size - png_ptr->zstream.avail_out
12708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                     + key_size + 1));
12718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_memcpy(text + key_size, png_ptr->zbuf,
12728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_ptr->zbuf_size - png_ptr->zstream.avail_out);
12738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_memcpy(text, key, key_size);
12748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               text_size = key_size + png_ptr->zbuf_size -
12758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_ptr->zstream.avail_out;
12768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               *(text + text_size) = '\0';
12778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
12788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            else
12798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
12808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_charp tmp;
12818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               tmp = text;
12838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               text = (png_charp)png_malloc(png_ptr, text_size +
12848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  (png_uint_32)(png_ptr->zbuf_size - png_ptr->zstream.avail_out
12858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   + 1));
12868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_memcpy(text, tmp, text_size);
12878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_free(png_ptr, tmp);
12888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_memcpy(text + text_size, png_ptr->zbuf,
12898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_ptr->zbuf_size - png_ptr->zstream.avail_out);
12908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out;
12918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               *(text + text_size) = '\0';
12928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
12938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (ret != Z_STREAM_END)
12948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
12958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_ptr->zstream.next_out = png_ptr->zbuf;
12968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
12978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
12988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
12998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         else
13008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
13018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
13028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
13038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (ret == Z_STREAM_END)
13058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
13068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
13078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      inflateReset(&png_ptr->zstream);
13098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->zstream.avail_in = 0;
13108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (ret != Z_STREAM_END)
13128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
13138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->current_text = NULL;
13148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_free(png_ptr, key);
13158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_free(png_ptr, text);
13168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
13178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
13188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_text = NULL;
13208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free(png_ptr, key);
13218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      key = text;
13228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text += key_size;
13238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr = (png_textp)png_malloc(png_ptr,
13258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          (png_uint_32)png_sizeof(png_text));
13268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt;
13278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->key = key;
13288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_iTXt_SUPPORTED
13298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->lang = NULL;
13308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->lang_key = NULL;
13318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
13328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->text = text;
13338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
13358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free(png_ptr, key);
13378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free(png_ptr, text_ptr);
13388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (ret)
13408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        png_warning(png_ptr, "Insufficient memory to store text chunk.");
13418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
13428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
13438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
13448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_iTXt_SUPPORTED)
13468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
13478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
13488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   length)
13498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
13508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
13518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
13528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_error(png_ptr, "Out of place iTXt");
13538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         info_ptr = info_ptr; /* to quiet some compiler warnings */
13548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
13558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K
13578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->skip_length = 0;  /* This may not be necessary */
13588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */
13608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
13618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr, "iTXt chunk too large to fit in memory");
13628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->skip_length = length - (png_uint_32)65535L;
13638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      length = (png_uint_32)65535L;
13648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
13658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
13668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text = (png_charp)png_malloc(png_ptr,
13688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         (png_uint_32)(length+1));
13698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text[length] = '\0';
13708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text_ptr = png_ptr->current_text;
13718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text_size = (png_size_t)length;
13728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text_left = (png_size_t)length;
13738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->process_mode = PNG_READ_iTXt_MODE;
13748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
13758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
13778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_read_iTXt(png_structp png_ptr, png_infop info_ptr)
13788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
13798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->buffer_size && png_ptr->current_text_left)
13818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
13828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_size_t text_size;
13838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->buffer_size < png_ptr->current_text_left)
13858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         text_size = png_ptr->buffer_size;
13868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
13878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         text_size = png_ptr->current_text_left;
13888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
13898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_text_left -= text_size;
13908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_text_ptr += text_size;
13918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
13928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->current_text_left))
13938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
13948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_textp text_ptr;
13958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_charp key;
13968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int comp_flag;
13978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_charp lang;
13988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_charp lang_key;
13998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_charp text;
14008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int ret;
14018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->buffer_size < 4)
14038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
14048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
14058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
14068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
14078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_crc_finish(png_ptr);
14098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_MAX_MALLOC_64K)
14118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->skip_length)
14128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
14138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
14148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      key = png_ptr->current_text;
14168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (lang = key; *lang; lang++)
14188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         /* empty loop */ ;
14198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (lang != key + png_ptr->current_text_size)
14218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         lang++;
14228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      comp_flag = *lang++;
14248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      lang++;     /* skip comp_type, always zero */
14258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (lang_key = lang; *lang_key; lang_key++)
14278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         /* empty loop */ ;
14288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      lang_key++;        /* skip NUL separator */
14298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (text = lang_key; *text; text++)
14318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         /* empty loop */ ;
14328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (text != key + png_ptr->current_text_size)
14348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         text++;
14358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr = (png_textp)png_malloc(png_ptr,
14378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         (png_uint_32)png_sizeof(png_text));
14388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->compression = comp_flag + 2;
14398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->key = key;
14408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->lang = lang;
14418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->lang_key = lang_key;
14428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->text = text;
14438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->text_length = 0;
14448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->itxt_length = png_strlen(text);
14458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
14478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_text = NULL;
14498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free(png_ptr, text_ptr);
14518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (ret)
14528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        png_warning(png_ptr, "Insufficient memory to store iTXt chunk.");
14538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
14548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
14558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
14568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* This function is called when we haven't found a handler for this
14588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * chunk.  If there isn't a problem with the chunk itself (ie a bad chunk
14598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * name or a critical chunk), the chunk is (currently) silently ignored.
14608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
14618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
14628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32
14638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   length)
14648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
14658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_uint_32 skip=0;
14668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_check_chunk_name(png_ptr, png_ptr->chunk_name);
14678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->chunk_name[0] & 0x20))
14698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
14708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
14718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
14728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           PNG_HANDLE_CHUNK_ALWAYS
14738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_USER_CHUNKS_SUPPORTED)
14748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           && png_ptr->read_user_chunk_fn == NULL
14758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
14768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         )
14778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
14788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_chunk_error(png_ptr, "unknown critical chunk");
14798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      info_ptr = info_ptr; /* to quiet some compiler warnings */
14818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
14828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
14848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS)
14858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
14868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K
14878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       if (length > (png_uint_32)65535L)
14888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       {
14898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           png_warning(png_ptr, "unknown chunk too large to fit in memory");
14908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           skip = length - (png_uint_32)65535L;
14918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           length = (png_uint_32)65535L;
14928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       }
14938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
14948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_strncpy((png_charp)png_ptr->unknown_chunk.name,
14958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project	 (png_charp)png_ptr->chunk_name,
14968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_sizeof((png_charp)png_ptr->chunk_name));
14978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, length);
14988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_ptr->unknown_chunk.size = (png_size_t)length;
14998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length);
15008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_USER_CHUNKS_SUPPORTED)
15018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       if(png_ptr->read_user_chunk_fn != NULL)
15028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       {
15038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          /* callback to user unknown chunk handler */
15048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          int ret;
15058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          ret = (*(png_ptr->read_user_chunk_fn))
15068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            (png_ptr, &png_ptr->unknown_chunk);
15078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          if (ret < 0)
15088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project             png_chunk_error(png_ptr, "error in user chunk");
15098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          if (ret == 0)
15108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          {
15118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project             if (!(png_ptr->chunk_name[0] & 0x20))
15128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
15138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                     PNG_HANDLE_CHUNK_ALWAYS)
15148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   png_chunk_error(png_ptr, "unknown critical chunk");
15158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                png_set_unknown_chunks(png_ptr, info_ptr,
15168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   &png_ptr->unknown_chunk, 1);
15178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          }
15188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       }
15198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
15208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1);
15218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
15228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_free(png_ptr, png_ptr->unknown_chunk.data);
15238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_ptr->unknown_chunk.data = NULL;
15248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
15258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else
15268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
15278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      skip=length;
15288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_push_crc_skip(png_ptr, skip);
15298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
15308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
15328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_have_info(png_structp png_ptr, png_infop info_ptr)
15338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
15348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->info_fn != NULL)
15358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      (*(png_ptr->info_fn))(png_ptr, info_ptr);
15368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
15378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
15398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_have_end(png_structp png_ptr, png_infop info_ptr)
15408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
15418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->end_fn != NULL)
15428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      (*(png_ptr->end_fn))(png_ptr, info_ptr);
15438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
15448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
15468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_have_row(png_structp png_ptr, png_bytep row)
15478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
15488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->row_fn != NULL)
15498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      (*(png_ptr->row_fn))(png_ptr, row, png_ptr->row_number,
15508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         (int)png_ptr->pass);
15518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
15528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
15548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_progressive_combine_row (png_structp png_ptr,
15558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_bytep old_row, png_bytep new_row)
15568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
15578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS
15588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   PNG_CONST int FARDATA png_pass_dsp_mask[7] =
15598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff};
15608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
15618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr == NULL) return;
15628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (new_row != NULL)    /* new_row must == png_ptr->row_buf here. */
15638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]);
15648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
15658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
15678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr,
15688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn,
15698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_progressive_end_ptr end_fn)
15708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
15718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr == NULL) return;
15728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->info_fn = info_fn;
15738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_fn = row_fn;
15748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->end_fn = end_fn;
15758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer);
15778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
15788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp PNGAPI
15808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_get_progressive_ptr(png_structp png_ptr)
15818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
15828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr == NULL) return (NULL);
15838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   return png_ptr->io_ptr;
15848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
15858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
1586