18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* pngpread.c - read a png file in push mode
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
4c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * Last changed in libpng 1.2.44 [June 26, 2010]
5c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * Copyright (c) 1998-2010 Glenn Randers-Pehrson
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
8c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner *
9c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * This code is released under the libpng license.
10c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * For conditions of distribution and use, see the disclaimer
11c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * and license in png.h
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_INTERNAL
15c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#define PNG_NO_PEDANTIC_WARNINGS
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "png.h"
178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
19c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner/* Push model modes */
208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_SIG_MODE   0
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_CHUNK_MODE 1
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_IDAT_MODE  2
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_SKIP_MODE       3
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_tEXt_MODE  4
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_zTXt_MODE  5
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_DONE_MODE  6
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_iTXt_MODE  7
288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_ERROR_MODE      8
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_process_data(png_structp png_ptr, png_infop info_ptr,
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_bytep buffer, png_size_t buffer_size)
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
34c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL || info_ptr == NULL)
35c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
36c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_push_restore_buffer(png_ptr, buffer, buffer_size);
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   while (png_ptr->buffer_size)
408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_process_some_data(png_ptr, info_ptr);
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* What we do with the incoming data depends on what we were previously
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * doing before we ran out of data...
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_process_some_data(png_structp png_ptr, png_infop info_ptr)
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
51c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
52c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
53c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   switch (png_ptr->process_mode)
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case PNG_READ_SIG_MODE:
578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_read_sig(png_ptr, info_ptr);
598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         break;
608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
61c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case PNG_READ_CHUNK_MODE:
638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_read_chunk(png_ptr, info_ptr);
658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         break;
668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
67c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case PNG_READ_IDAT_MODE:
698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_read_IDAT(png_ptr);
718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         break;
728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
73c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
74c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tEXt_SUPPORTED
758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case PNG_READ_tEXt_MODE:
768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_read_tEXt(png_ptr, info_ptr);
788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         break;
798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
80c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
82c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_zTXt_SUPPORTED
838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case PNG_READ_zTXt_MODE:
848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_read_zTXt(png_ptr, info_ptr);
868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         break;
878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
88c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
90c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_iTXt_SUPPORTED
918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case PNG_READ_iTXt_MODE:
928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_read_iTXt(png_ptr, info_ptr);
948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         break;
958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
96c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case PNG_SKIP_MODE:
998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_crc_finish(png_ptr);
1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         break;
1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
103c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      default:
1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->buffer_size = 0;
1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         break;
1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Read any remaining signature bytes from the stream and compare them with
1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the correct PNG signature.  It is possible that this routine is called
1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * with bytes already read from the signature, either because they have been
1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * checked by the calling application, or because of multiple calls to this
1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * routine.
1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_read_sig(png_structp png_ptr, png_infop info_ptr)
1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_size_t num_checked = png_ptr->sig_bytes,
1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project             num_to_check = 8 - num_checked;
1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->buffer_size < num_to_check)
1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      num_to_check = png_ptr->buffer_size;
1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_push_fill_buffer(png_ptr, &(info_ptr->signature[num_checked]),
1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      num_to_check);
131c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes + num_to_check);
1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check))
1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (num_checked < 4 &&
1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4))
1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_error(png_ptr, "Not a PNG file");
1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_error(png_ptr, "PNG file corrupted by ASCII conversion");
1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else
1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->sig_bytes >= 8)
1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->process_mode = PNG_READ_CHUNK_MODE;
1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS
1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_IHDR;
1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_IDAT;
1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_IEND;
1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_PLTE;
158c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_bKGD_SUPPORTED
1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_bKGD;
1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
161c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_cHRM_SUPPORTED
1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_cHRM;
1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
164c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_gAMA_SUPPORTED
1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_gAMA;
1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
167c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_hIST_SUPPORTED
1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_hIST;
1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
170c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_iCCP_SUPPORTED
1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_iCCP;
1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
173c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_iTXt_SUPPORTED
1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_iTXt;
1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
176c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_oFFs_SUPPORTED
1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_oFFs;
1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
179c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_pCAL_SUPPORTED
1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_pCAL;
1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
182c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_pHYs_SUPPORTED
1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_pHYs;
1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
185c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sBIT_SUPPORTED
1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_sBIT;
1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
188c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sCAL_SUPPORTED
1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_sCAL;
1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
191c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sRGB_SUPPORTED
1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_sRGB;
1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
194c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sPLT_SUPPORTED
1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_sPLT;
1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
197c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tEXt_SUPPORTED
1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_tEXt;
1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
200c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tIME_SUPPORTED
2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_tIME;
2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
203c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tRNS_SUPPORTED
2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_tRNS;
2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
206c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_zTXt_SUPPORTED
2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_zTXt;
2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USE_LOCAL_ARRAYS */
210c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* First we make sure we have enough data for the 4 byte chunk name
2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * and the 4 byte chunk length before proceeding with decoding the
2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * chunk data.  To fully decode each of these chunks, we also make
2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * sure we have enough data in the buffer for the 4 byte CRC at the
2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * end of every chunk (except IDAT, which is handled separately).
2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_byte chunk_length[4];
2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->buffer_size < 8)
2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_fill_buffer(png_ptr, chunk_length, 4);
228c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length);
2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_reset_crc(png_ptr);
2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_crc_read(png_ptr, png_ptr->chunk_name, 4);
231c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_check_chunk_name(png_ptr, png_ptr->chunk_name);
2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
235c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
236c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner     if (png_ptr->mode & PNG_AFTER_IDAT)
2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4))
2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
241c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if (png_ptr->push_length != 13)
242c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         png_error(png_ptr, "Invalid IHDR length");
243c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
249c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length);
2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
252c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4))
2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
260c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length);
2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->process_mode = PNG_READ_DONE_MODE;
2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_have_end(png_ptr, info_ptr);
2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
266c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name))
2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
275c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->mode |= PNG_HAVE_IDAT;
278c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length);
280c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->mode |= PNG_HAVE_PLTE;
283c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (!(png_ptr->mode & PNG_HAVE_IHDR))
2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "Missing IHDR before IDAT");
288c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  !(png_ptr->mode & PNG_HAVE_PLTE))
2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "Missing PLTE before IDAT");
2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
294c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length);
3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
305c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
306c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      /* If we reach an IDAT chunk, this means we have read all of the
3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       * header chunks, and we can start reading the image (or if this
3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       * is called after the image has been read - we have an error).
3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       */
312c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
313c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if (!(png_ptr->mode & PNG_HAVE_IHDR))
314c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         png_error(png_ptr, "Missing IHDR before IDAT");
315c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
316c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
317c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner          !(png_ptr->mode & PNG_HAVE_PLTE))
318c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         png_error(png_ptr, "Missing PLTE before IDAT");
3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->mode & PNG_HAVE_IDAT)
3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (!(png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT))
323c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            if (png_ptr->push_length == 0)
324c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner               return;
3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (png_ptr->mode & PNG_AFTER_IDAT)
3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "Too many IDAT's found");
3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->idat_size = png_ptr->push_length;
3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->mode |= PNG_HAVE_IDAT;
3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->process_mode = PNG_READ_IDAT_MODE;
3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_have_info(png_ptr, info_ptr);
334c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_ptr->zstream.avail_out =
335c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner          (uInt) PNG_ROWBYTES(png_ptr->pixel_depth,
336c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner          png_ptr->iwidth) + 1;
3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->zstream.next_out = png_ptr->row_buf;
3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return;
3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
340c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
341c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_gAMA_SUPPORTED
3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4))
3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
349c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length);
3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
352c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
354c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sBIT_SUPPORTED
3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4))
3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
362c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length);
3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
365c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
367c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_cHRM_SUPPORTED
3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4))
3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
375c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length);
3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
378c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
380c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sRGB_SUPPORTED
3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4))
3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
388c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length);
3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
391c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
393c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_iCCP_SUPPORTED
3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4))
3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
401c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length);
4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
404c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
406c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sPLT_SUPPORTED
4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4))
4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
414c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length);
4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
417c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
419c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tRNS_SUPPORTED
4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4))
4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
427c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length);
4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
430c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
432c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_bKGD_SUPPORTED
4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4))
4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
440c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length);
4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
443c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
445c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_hIST_SUPPORTED
4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4))
4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
453c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length);
4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
456c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
458c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_pHYs_SUPPORTED
4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4))
4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
466c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length);
4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
469c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
471c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_oFFs_SUPPORTED
4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 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      }
479c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length);
4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
483c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
484c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_pCAL_SUPPORTED
4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4))
4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
492c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length);
4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
495c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
497c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sCAL_SUPPORTED
4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4))
4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
505c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length);
5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
508c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
510c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tIME_SUPPORTED
5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4))
5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
518c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length);
5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
521c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
523c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tEXt_SUPPORTED
5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4))
5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
531c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length);
5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
534c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
536c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_zTXt_SUPPORTED
5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4))
5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
544c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length);
5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
547c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
549c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_iTXt_SUPPORTED
5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4))
5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
557c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length);
5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
560c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else
5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length);
5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_crc_skip(png_structp png_ptr, png_uint_32 skip)
5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->process_mode = PNG_SKIP_MODE;
5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->skip_length = skip;
5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_crc_finish(png_structp png_ptr)
5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->skip_length && png_ptr->save_buffer_size)
5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_size_t save_size;
5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->skip_length < (png_uint_32)png_ptr->save_buffer_size)
5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         save_size = (png_size_t)png_ptr->skip_length;
5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         save_size = png_ptr->save_buffer_size;
5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size);
5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->skip_length -= save_size;
5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->buffer_size -= save_size;
5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->save_buffer_size -= save_size;
5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->save_buffer_ptr += save_size;
6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->skip_length && png_ptr->current_buffer_size)
6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_size_t save_size;
6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->skip_length < (png_uint_32)png_ptr->current_buffer_size)
6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         save_size = (png_size_t)png_ptr->skip_length;
6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         save_size = png_ptr->current_buffer_size;
6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size);
6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->skip_length -= save_size;
6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->buffer_size -= save_size;
6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_buffer_size -= save_size;
6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_buffer_ptr += save_size;
6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!png_ptr->skip_length)
6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->buffer_size < 4)
6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_crc_finish(png_ptr, 0);
6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->process_mode = PNG_READ_CHUNK_MODE;
6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length)
6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_bytep ptr;
6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
635c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
636c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
637c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   ptr = buffer;
6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->save_buffer_size)
6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_size_t save_size;
6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (length < png_ptr->save_buffer_size)
6448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         save_size = length;
6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         save_size = png_ptr->save_buffer_size;
6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_memcpy(ptr, png_ptr->save_buffer_ptr, save_size);
6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      length -= save_size;
6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      ptr += save_size;
6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->buffer_size -= save_size;
6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->save_buffer_size -= save_size;
6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->save_buffer_ptr += save_size;
6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (length && png_ptr->current_buffer_size)
6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_size_t save_size;
6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (length < png_ptr->current_buffer_size)
6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         save_size = length;
661c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
6638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         save_size = png_ptr->current_buffer_size;
6648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_memcpy(ptr, png_ptr->current_buffer_ptr, save_size);
6668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->buffer_size -= save_size;
6678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_buffer_size -= save_size;
6688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_buffer_ptr += save_size;
6698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
6708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
6718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_save_buffer(png_structp png_ptr)
6748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->save_buffer_size)
6768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
6778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->save_buffer_ptr != png_ptr->save_buffer)
6788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
679c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         png_size_t i, istop;
6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_bytep sp;
6818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_bytep dp;
6828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         istop = png_ptr->save_buffer_size;
6848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer;
6858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            i < istop; i++, sp++, dp++)
6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            *dp = *sp;
6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
6918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->save_buffer_size + png_ptr->current_buffer_size >
6928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->save_buffer_max)
6938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
6948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_size_t new_max;
6958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_bytep old_buffer;
6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->save_buffer_size > PNG_SIZE_MAX -
6988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         (png_ptr->current_buffer_size + 256))
6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
7008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        png_error(png_ptr, "Potential overflow of save_buffer");
7018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
702c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
7038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256;
7048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      old_buffer = png_ptr->save_buffer;
705c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_ptr->save_buffer = (png_bytep)png_malloc_warn(png_ptr,
7068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         (png_uint_32)new_max);
707c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if (png_ptr->save_buffer == NULL)
708c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      {
709c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner        png_free(png_ptr, old_buffer);
710c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner        png_error(png_ptr, "Insufficient memory for save_buffer");
711c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      }
7128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size);
7138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free(png_ptr, old_buffer);
7148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->save_buffer_max = new_max;
7158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
7168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->current_buffer_size)
7178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
7188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size,
7198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->current_buffer_ptr, png_ptr->current_buffer_size);
7208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->save_buffer_size += png_ptr->current_buffer_size;
7218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_buffer_size = 0;
7228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
7238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->save_buffer_ptr = png_ptr->save_buffer;
7248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->buffer_size = 0;
7258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
7268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
7288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_restore_buffer(png_structp png_ptr, png_bytep buffer,
7298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_size_t buffer_length)
7308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
7318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_buffer = buffer;
7328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_buffer_size = buffer_length;
7338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->buffer_size = buffer_length + png_ptr->save_buffer_size;
7348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_buffer_ptr = png_ptr->current_buffer;
7358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
7368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
7388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_read_IDAT(png_structp png_ptr)
7398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
7408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS
7418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   PNG_CONST PNG_IDAT;
7428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
7438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
7448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
7458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_byte chunk_length[4];
7468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->buffer_size < 8)
7488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
7498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
7508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
7518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
7528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_fill_buffer(png_ptr, chunk_length, 4);
754c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length);
7558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_reset_crc(png_ptr);
7568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_crc_read(png_ptr, png_ptr->chunk_name, 4);
7578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
7588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
759c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
7608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
7618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->process_mode = PNG_READ_CHUNK_MODE;
7628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
7638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "Not enough compressed data");
7648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
7658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
7668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->idat_size = png_ptr->push_length;
7688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
7698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->idat_size && png_ptr->save_buffer_size)
7708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
7718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_size_t save_size;
7728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->idat_size < (png_uint_32)png_ptr->save_buffer_size)
7748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
7758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         save_size = (png_size_t)png_ptr->idat_size;
776c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
777c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         /* Check for overflow */
778c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         if ((png_uint_32)save_size != png_ptr->idat_size)
7798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "save_size overflowed in pngpread");
7808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
7818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
7828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         save_size = png_ptr->save_buffer_size;
7838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size);
785c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
786c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size);
787c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
7888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->idat_size -= save_size;
7898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->buffer_size -= save_size;
7908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->save_buffer_size -= save_size;
7918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->save_buffer_ptr += save_size;
7928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
7938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->idat_size && png_ptr->current_buffer_size)
7948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
7958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_size_t save_size;
7968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->idat_size < (png_uint_32)png_ptr->current_buffer_size)
7988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
7998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         save_size = (png_size_t)png_ptr->idat_size;
800c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
801c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         /* Check for overflow */
802c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         if ((png_uint_32)save_size != png_ptr->idat_size)
8038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "save_size overflowed in pngpread");
8048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
8058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
8068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         save_size = png_ptr->current_buffer_size;
8078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size);
809c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
810c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size);
8118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->idat_size -= save_size;
8138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->buffer_size -= save_size;
8148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_buffer_size -= save_size;
8158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_buffer_ptr += save_size;
8168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
8178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!png_ptr->idat_size)
8188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
8198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->buffer_size < 4)
8208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
8218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
8228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
8238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
8248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_crc_finish(png_ptr, 0);
8268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
8278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->mode |= PNG_AFTER_IDAT;
8288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
8298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
8308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
8328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_process_IDAT_data(png_structp png_ptr, png_bytep buffer,
8338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_size_t buffer_length)
8348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
835c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* The caller checks for a non-zero buffer length. */
836c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (!(buffer_length > 0) || buffer == NULL)
837c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_error(png_ptr, "No IDAT data (internal error)");
8388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
839c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* This routine must process all the data it has been given
840c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner    * before returning, calling the row callback as required to
841c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner    * handle the uncompressed results.
842c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner    */
8438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.next_in = buffer;
8448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.avail_in = (uInt)buffer_length;
845c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
846c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Keep going until the decompressed data is all processed
847c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner    * or the stream marked as finished.
848c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner    */
849c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   while (png_ptr->zstream.avail_in > 0 &&
850c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner	  !(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
8518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
852c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      int ret;
853c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
854c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      /* We have data for zlib, but we must check that zlib
855c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner       * has somewhere to put the results.  It doesn't matter
856c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner       * if we don't expect any results -- it may be the input
857c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner       * data is just the LZ end code.
858c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner       */
859c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if (!(png_ptr->zstream.avail_out > 0))
8608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
861c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         png_ptr->zstream.avail_out =
862c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner             (uInt) PNG_ROWBYTES(png_ptr->pixel_depth,
863c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner             png_ptr->iwidth) + 1;
864c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         png_ptr->zstream.next_out = png_ptr->row_buf;
865c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      }
8668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
867c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      /* Using Z_SYNC_FLUSH here means that an unterminated
868c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner       * LZ stream can still be handled (a stream with a missing
869c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner       * end code), otherwise (Z_NO_FLUSH) a future zlib
870c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner       * implementation might defer output and, therefore,
871c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner       * change the current behavior.  (See comments in inflate.c
872c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner       * for why this doesn't happen at present with zlib 1.2.5.)
873c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner       */
874c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      ret = inflate(&png_ptr->zstream, Z_SYNC_FLUSH);
875c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
876c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      /* Check for any failure before proceeding. */
877c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if (ret != Z_OK && ret != Z_STREAM_END)
878c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      {
879c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner	 /* Terminate the decompression. */
880c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner	 png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
881c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
882c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         /* This may be a truncated stream (missing or
883c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner	  * damaged end code).  Treat that as a warning.
884c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner	  */
885c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         if (png_ptr->row_number >= png_ptr->num_rows ||
886c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner	     png_ptr->pass > 6)
887c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner	    png_warning(png_ptr, "Truncated compressed data in IDAT");
888c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner	 else
889c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner	    png_error(png_ptr, "Decompression error in IDAT");
890c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
891c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner	 /* Skip the check on unprocessed input */
892c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         return;
8938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
894c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
895c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      /* Did inflate output any data? */
896c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if (png_ptr->zstream.next_out != png_ptr->row_buf)
8978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
898c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner	 /* Is this unexpected data after the last row?
899c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner	  * If it is, artificially terminate the LZ output
900c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner	  * here.
901c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner	  */
902c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         if (png_ptr->row_number >= png_ptr->num_rows ||
903c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner	     png_ptr->pass > 6)
9048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
905c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner	    /* Extra data. */
906c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner	    png_warning(png_ptr, "Extra compressed data in IDAT");
907c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
908c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner	    /* Do no more processing; skip the unprocessed
909c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner	     * input check below.
910c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner	     */
911c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            return;
912c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner	 }
913c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
914c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner	 /* Do we have a complete row? */
915c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner	 if (png_ptr->zstream.avail_out == 0)
916c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner	    png_push_process_row(png_ptr);
9178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
918c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
919c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      /* And check for the end of the stream. */
920c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if (ret == Z_STREAM_END)
921c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner	 png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
9228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
923c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
924c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* All the data should have been processed, if anything
925c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner    * is left at this point we have bytes of IDAT data
926c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner    * after the zlib end code.
927c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner    */
928c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr->zstream.avail_in > 0)
929c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_warning(png_ptr, "Extra compression data");
9308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
9318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
9338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_process_row(png_structp png_ptr)
9348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
9358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_info.color_type = png_ptr->color_type;
9368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_info.width = png_ptr->iwidth;
9378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_info.channels = png_ptr->channels;
9388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_info.bit_depth = png_ptr->bit_depth;
9398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_info.pixel_depth = png_ptr->pixel_depth;
9408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,
9428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_ptr->row_info.width);
9438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_read_filter_row(png_ptr, &(png_ptr->row_info),
945c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner       png_ptr->row_buf + 1, png_ptr->prev_row + 1,
946c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner       (int)(png_ptr->row_buf[0]));
9478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf,
9498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->rowbytes + 1);
9508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA))
9528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_do_read_transformations(png_ptr);
9538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
954c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_INTERLACING_SUPPORTED
955c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Blow up interlaced rows to full size */
9568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
9578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
9588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->pass < 6)
9598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*       old interface (pre-1.0.9):
9608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_do_read_interlace(&(png_ptr->row_info),
961c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner             png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations);
9628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
9638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_do_read_interlace(png_ptr);
9648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    switch (png_ptr->pass)
9668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    {
9678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 0:
9688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
9698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            int i;
9708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for (i = 0; i < 8 && png_ptr->pass == 0; i++)
9718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
9728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
973c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner               png_read_push_finish_row(png_ptr); /* Updates png_ptr->pass */
9748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
975c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
976c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            if (png_ptr->pass == 2) /* Pass 1 might be empty */
9778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
9788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               for (i = 0; i < 4 && png_ptr->pass == 2; i++)
9798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               {
9808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_push_have_row(png_ptr, png_bytep_NULL);
9818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_read_push_finish_row(png_ptr);
9828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               }
9838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
984c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
9858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (png_ptr->pass == 4 && png_ptr->height <= 4)
9868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
9878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               for (i = 0; i < 2 && png_ptr->pass == 4; i++)
9888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               {
9898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_push_have_row(png_ptr, png_bytep_NULL);
9908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_read_push_finish_row(png_ptr);
9918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               }
9928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
993c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
9948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (png_ptr->pass == 6 && png_ptr->height <= 4)
9958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
996c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner                  png_push_have_row(png_ptr, png_bytep_NULL);
9978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                png_read_push_finish_row(png_ptr);
9988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
999c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
10008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
10018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
1002c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
10038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 1:
10048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
10058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            int i;
10068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for (i = 0; i < 8 && png_ptr->pass == 1; i++)
10078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
10088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
10098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_push_finish_row(png_ptr);
10108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1011c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1012c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            if (png_ptr->pass == 2) /* Skip top 4 generated rows */
10138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
10148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               for (i = 0; i < 4 && png_ptr->pass == 2; i++)
10158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               {
10168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_push_have_row(png_ptr, png_bytep_NULL);
10178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_read_push_finish_row(png_ptr);
10188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               }
10198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1020c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
10218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
10228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
1023c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
10248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 2:
10258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
10268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            int i;
1027c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
10288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for (i = 0; i < 4 && png_ptr->pass == 2; i++)
10298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
10308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
10318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_push_finish_row(png_ptr);
10328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1033c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
10348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for (i = 0; i < 4 && png_ptr->pass == 2; i++)
10358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
1036c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner                  png_push_have_row(png_ptr, png_bytep_NULL);
10378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_push_finish_row(png_ptr);
10388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1039c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1040c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            if (png_ptr->pass == 4) /* Pass 3 might be empty */
10418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
10428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               for (i = 0; i < 2 && png_ptr->pass == 4; i++)
10438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               {
10448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_push_have_row(png_ptr, png_bytep_NULL);
10458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_read_push_finish_row(png_ptr);
10468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               }
10478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1048c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
10498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
10508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
1051c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
10528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 3:
10538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
10548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            int i;
1055c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
10568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for (i = 0; i < 4 && png_ptr->pass == 3; i++)
10578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
10588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
10598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_push_finish_row(png_ptr);
10608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1061c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1062c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            if (png_ptr->pass == 4) /* Skip top two generated rows */
10638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
10648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               for (i = 0; i < 2 && png_ptr->pass == 4; i++)
10658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               {
10668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_push_have_row(png_ptr, png_bytep_NULL);
10678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_read_push_finish_row(png_ptr);
10688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               }
10698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1070c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
10718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
10728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
1073c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
10748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 4:
10758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
10768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            int i;
1077c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
10788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for (i = 0; i < 2 && png_ptr->pass == 4; i++)
10798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
10808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
10818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_push_finish_row(png_ptr);
10828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1083c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
10848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for (i = 0; i < 2 && png_ptr->pass == 4; i++)
10858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
1086c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner                  png_push_have_row(png_ptr, png_bytep_NULL);
10878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_push_finish_row(png_ptr);
10888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1089c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1090c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            if (png_ptr->pass == 6) /* Pass 5 might be empty */
10918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
1092c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner                  png_push_have_row(png_ptr, png_bytep_NULL);
10938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_push_finish_row(png_ptr);
10948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1095c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
10968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
10978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
1098c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
10998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 5:
11008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
11018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            int i;
1102c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
11038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for (i = 0; i < 2 && png_ptr->pass == 5; i++)
11048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
11058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
11068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_push_finish_row(png_ptr);
11078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1108c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1109c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            if (png_ptr->pass == 6) /* Skip top generated row */
11108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
1111c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner                  png_push_have_row(png_ptr, png_bytep_NULL);
11128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_push_finish_row(png_ptr);
11138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1114c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
11158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
11168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
11178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 6:
11188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
11198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_push_have_row(png_ptr, png_ptr->row_buf + 1);
11208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_read_push_finish_row(png_ptr);
1121c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
11228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (png_ptr->pass != 6)
11238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               break;
1124c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1125c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner                  png_push_have_row(png_ptr, png_bytep_NULL);
11268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_read_push_finish_row(png_ptr);
11278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
11288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
11298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
11308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else
11318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
11328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
11338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_have_row(png_ptr, png_ptr->row_buf + 1);
11348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_read_push_finish_row(png_ptr);
11358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
11368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
11378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
11398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_read_push_finish_row(png_structp png_ptr)
11408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
11418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS
1142c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
11438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1144c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Start of interlace block */
11458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
11468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1147c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Offset to next interlace block */
11488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
11498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1150c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Start of interlace block in the y direction */
11518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
11528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1153c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Offset to next interlace block in the y direction */
11548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   PNG_CONST int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
11558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* Height of interlace block.  This is not currently used - if you need
11578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * it, uncomment it here and in png.h
11588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   PNG_CONST int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1};
11598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   */
11608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
11618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_number++;
11638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->row_number < png_ptr->num_rows)
11648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return;
11658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1166c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_INTERLACING_SUPPORTED
11678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->interlaced)
11688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
11698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->row_number = 0;
11708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_memset_check(png_ptr, png_ptr->prev_row, 0,
11718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->rowbytes + 1);
11728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      do
11738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
11748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->pass++;
11758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if ((png_ptr->pass == 1 && png_ptr->width < 5) ||
11768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project             (png_ptr->pass == 3 && png_ptr->width < 3) ||
11778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project             (png_ptr->pass == 5 && png_ptr->width < 2))
11788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           png_ptr->pass++;
11798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (png_ptr->pass > 7)
11818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->pass--;
1182c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
11838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (png_ptr->pass >= 7)
11848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
11858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->iwidth = (png_ptr->width +
11878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_pass_inc[png_ptr->pass] - 1 -
11888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_pass_start[png_ptr->pass]) /
11898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_pass_inc[png_ptr->pass];
11908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (png_ptr->transformations & PNG_INTERLACE)
11928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
11938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->num_rows = (png_ptr->height +
11958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_pass_yinc[png_ptr->pass] - 1 -
11968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_pass_ystart[png_ptr->pass]) /
11978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_pass_yinc[png_ptr->pass];
11988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0);
12008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
1201c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#endif /* PNG_READ_INTERLACING_SUPPORTED */
12028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
12038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1204c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tEXt_SUPPORTED
12058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
12068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
12078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   length)
12088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
12098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
12108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
12118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_error(png_ptr, "Out of place tEXt");
1212c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         info_ptr = info_ptr; /* To quiet some compiler warnings */
12138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
12148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K
12168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->skip_length = 0;  /* This may not be necessary */
12178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */
12198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
12208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr, "tEXt chunk too large to fit in memory");
12218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->skip_length = length - (png_uint_32)65535L;
12228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      length = (png_uint_32)65535L;
12238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
12248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
12258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text = (png_charp)png_malloc(png_ptr,
1227c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      (png_uint_32)(length + 1));
12288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text[length] = '\0';
12298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text_ptr = png_ptr->current_text;
12308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text_size = (png_size_t)length;
12318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text_left = (png_size_t)length;
12328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->process_mode = PNG_READ_tEXt_MODE;
12338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
12348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
12368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_read_tEXt(png_structp png_ptr, png_infop info_ptr)
12378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
12388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->buffer_size && png_ptr->current_text_left)
12398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
12408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_size_t text_size;
12418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->buffer_size < png_ptr->current_text_left)
12438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         text_size = png_ptr->buffer_size;
1244c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
12458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
12468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         text_size = png_ptr->current_text_left;
1247c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
12488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
12498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_text_left -= text_size;
12508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_text_ptr += text_size;
12518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
12528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->current_text_left))
12538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
12548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_textp text_ptr;
12558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_charp text;
12568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_charp key;
12578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int ret;
12588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->buffer_size < 4)
12608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
12618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
12628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
12638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
12648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_crc_finish(png_ptr);
12668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1267c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_MAX_MALLOC_64K
12688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->skip_length)
12698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
12708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
12718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      key = png_ptr->current_text;
12738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (text = key; *text; text++)
1275c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         /* Empty loop */ ;
12768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1277c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if (text < key + png_ptr->current_text_size)
12788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         text++;
12798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr = (png_textp)png_malloc(png_ptr,
12818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         (png_uint_32)png_sizeof(png_text));
12828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->compression = PNG_TEXT_COMPRESSION_NONE;
12838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->key = key;
12848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_iTXt_SUPPORTED
12858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->lang = NULL;
12868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->lang_key = NULL;
12878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
12888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->text = text;
12898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
12918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free(png_ptr, key);
12938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free(png_ptr, text_ptr);
12948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_text = NULL;
12958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (ret)
12978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        png_warning(png_ptr, "Insufficient memory to store text chunk.");
12988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
12998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
13008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
13018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1302c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_zTXt_SUPPORTED
13038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
13048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
13058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   length)
13068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
13078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
13088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
13098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_error(png_ptr, "Out of place zTXt");
1310c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         info_ptr = info_ptr; /* To quiet some compiler warnings */
13118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
13128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K
13148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* We can't handle zTXt chunks > 64K, since we don't have enough space
13158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * to be able to store the uncompressed data.  Actually, the threshold
13168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * is probably around 32K, but it isn't as definite as 64K is.
13178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
13188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (length > (png_uint_32)65535L)
13198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
13208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr, "zTXt chunk too large to fit in memory");
13218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_crc_skip(png_ptr, length);
13228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return;
13238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
13248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
13258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text = (png_charp)png_malloc(png_ptr,
1327c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      (png_uint_32)(length + 1));
13288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text[length] = '\0';
13298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text_ptr = png_ptr->current_text;
13308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text_size = (png_size_t)length;
13318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text_left = (png_size_t)length;
13328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->process_mode = PNG_READ_zTXt_MODE;
13338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
13348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
13368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_read_zTXt(png_structp png_ptr, png_infop info_ptr)
13378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
13388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->buffer_size && png_ptr->current_text_left)
13398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
13408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_size_t text_size;
13418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left)
13438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         text_size = png_ptr->buffer_size;
1344c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
13458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
13468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         text_size = png_ptr->current_text_left;
1347c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
13488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
13498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_text_left -= text_size;
13508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_text_ptr += text_size;
13518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
13528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->current_text_left))
13538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
13548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_textp text_ptr;
13558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_charp text;
13568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_charp key;
13578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int ret;
13588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_size_t text_size, key_size;
13598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->buffer_size < 4)
13618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
13628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
13638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
13648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
13658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_crc_finish(png_ptr);
13678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      key = png_ptr->current_text;
13698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (text = key; *text; text++)
1371c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         /* Empty loop */ ;
13728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      /* zTXt can't have zero text */
1374c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if (text >= key + png_ptr->current_text_size)
13758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
13768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->current_text = NULL;
13778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_free(png_ptr, key);
13788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
13798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
13808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text++;
13828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1383c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if (*text != PNG_TEXT_COMPRESSION_zTXt) /* Check compression byte */
13848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
13858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->current_text = NULL;
13868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_free(png_ptr, key);
13878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
13888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
13898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text++;
13918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->zstream.next_in = (png_bytep )text;
13938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size -
13948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         (text - key));
13958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->zstream.next_out = png_ptr->zbuf;
13968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
13978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      key_size = text - key;
13998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_size = 0;
14008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text = NULL;
14018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      ret = Z_STREAM_END;
14028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      while (png_ptr->zstream.avail_in)
14048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
14058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
14068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (ret != Z_OK && ret != Z_STREAM_END)
14078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
14088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            inflateReset(&png_ptr->zstream);
14098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->zstream.avail_in = 0;
14108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->current_text = NULL;
14118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_free(png_ptr, key);
14128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_free(png_ptr, text);
14138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return;
14148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
14158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END)
14168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
14178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (text == NULL)
14188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
14198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               text = (png_charp)png_malloc(png_ptr,
1420c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner                     (png_uint_32)(png_ptr->zbuf_size
1421c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner                     - png_ptr->zstream.avail_out + key_size + 1));
1422c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
14238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_memcpy(text + key_size, png_ptr->zbuf,
14248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_ptr->zbuf_size - png_ptr->zstream.avail_out);
1425c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
14268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_memcpy(text, key, key_size);
1427c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
14288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               text_size = key_size + png_ptr->zbuf_size -
14298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_ptr->zstream.avail_out;
1430c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
14318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               *(text + text_size) = '\0';
14328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
14338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            else
14348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
14358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_charp tmp;
14368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               tmp = text;
14388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               text = (png_charp)png_malloc(png_ptr, text_size +
1439c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner                  (png_uint_32)(png_ptr->zbuf_size
1440c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner                  - png_ptr->zstream.avail_out + 1));
1441c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
14428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_memcpy(text, tmp, text_size);
14438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_free(png_ptr, tmp);
1444c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
14458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_memcpy(text + text_size, png_ptr->zbuf,
14468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_ptr->zbuf_size - png_ptr->zstream.avail_out);
1447c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
14488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out;
14498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               *(text + text_size) = '\0';
14508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
14518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (ret != Z_STREAM_END)
14528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
14538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_ptr->zstream.next_out = png_ptr->zbuf;
14548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
14558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
14568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
14578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         else
14588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
14598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
14608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
14618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (ret == Z_STREAM_END)
14638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
14648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
14658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      inflateReset(&png_ptr->zstream);
14678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->zstream.avail_in = 0;
14688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (ret != Z_STREAM_END)
14708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
14718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->current_text = NULL;
14728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_free(png_ptr, key);
14738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_free(png_ptr, text);
14748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
14758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
14768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_text = NULL;
14788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free(png_ptr, key);
14798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      key = text;
14808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text += key_size;
14818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr = (png_textp)png_malloc(png_ptr,
14838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          (png_uint_32)png_sizeof(png_text));
14848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt;
14858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->key = key;
14868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_iTXt_SUPPORTED
14878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->lang = NULL;
14888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->lang_key = NULL;
14898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
14908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->text = text;
14918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
14938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free(png_ptr, key);
14958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free(png_ptr, text_ptr);
14968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (ret)
14988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        png_warning(png_ptr, "Insufficient memory to store text chunk.");
14998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
15008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
15018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
15028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1503c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_iTXt_SUPPORTED
15048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
15058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
15068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   length)
15078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
15088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
15098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
15108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_error(png_ptr, "Out of place iTXt");
1511c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         info_ptr = info_ptr; /* To quiet some compiler warnings */
15128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
15138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K
15158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->skip_length = 0;  /* This may not be necessary */
15168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */
15188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
15198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr, "iTXt chunk too large to fit in memory");
15208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->skip_length = length - (png_uint_32)65535L;
15218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      length = (png_uint_32)65535L;
15228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
15238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
15248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text = (png_charp)png_malloc(png_ptr,
1526c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      (png_uint_32)(length + 1));
15278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text[length] = '\0';
15288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text_ptr = png_ptr->current_text;
15298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text_size = (png_size_t)length;
15308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->current_text_left = (png_size_t)length;
15318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->process_mode = PNG_READ_iTXt_MODE;
15328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
15338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
15358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_read_iTXt(png_structp png_ptr, png_infop info_ptr)
15368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
15378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->buffer_size && png_ptr->current_text_left)
15398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
15408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_size_t text_size;
15418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->buffer_size < png_ptr->current_text_left)
15438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         text_size = png_ptr->buffer_size;
1544c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
15458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
15468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         text_size = png_ptr->current_text_left;
1547c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
15488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
15498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_text_left -= text_size;
15508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_text_ptr += text_size;
15518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
15528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->current_text_left))
15538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
15548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_textp text_ptr;
15558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_charp key;
15568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int comp_flag;
15578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_charp lang;
15588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_charp lang_key;
15598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_charp text;
15608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int ret;
15618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->buffer_size < 4)
15638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
15648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_push_save_buffer(png_ptr);
15658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
15668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
15678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_push_crc_finish(png_ptr);
15698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1570c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_MAX_MALLOC_64K
15718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->skip_length)
15728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
15738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
15748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      key = png_ptr->current_text;
15768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (lang = key; *lang; lang++)
1578c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         /* Empty loop */ ;
15798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1580c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if (lang < key + png_ptr->current_text_size - 3)
15818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         lang++;
15828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      comp_flag = *lang++;
1584c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      lang++;     /* Skip comp_type, always zero */
15858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (lang_key = lang; *lang_key; lang_key++)
1587c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         /* Empty loop */ ;
15888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1589c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      lang_key++;        /* Skip NUL separator */
15908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1591c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      text=lang_key;
1592c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1593c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if (lang_key < key + png_ptr->current_text_size - 1)
1594c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      {
1595c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner        for (; *text; text++)
1596c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner           /* Empty loop */ ;
1597c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      }
1598c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1599c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if (text < key + png_ptr->current_text_size)
16008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         text++;
16018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
16028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr = (png_textp)png_malloc(png_ptr,
16038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         (png_uint_32)png_sizeof(png_text));
1604c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
16058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->compression = comp_flag + 2;
16068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->key = key;
16078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->lang = lang;
16088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->lang_key = lang_key;
16098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->text = text;
16108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->text_length = 0;
16118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      text_ptr->itxt_length = png_strlen(text);
16128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
16138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
16148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
16158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->current_text = NULL;
16168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
16178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free(png_ptr, text_ptr);
16188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (ret)
1619c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         png_warning(png_ptr, "Insufficient memory to store iTXt chunk.");
16208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
16218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
16228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
16238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
16248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* This function is called when we haven't found a handler for this
16258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * chunk.  If there isn't a problem with the chunk itself (ie a bad chunk
16268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * name or a critical chunk), the chunk is (currently) silently ignored.
16278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
16288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
16298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32
16308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   length)
16318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1632c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_uint_32 skip = 0;
16338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
16348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->chunk_name[0] & 0x20))
16358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
1636c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
1637c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
1638c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         PNG_HANDLE_CHUNK_ALWAYS
1639c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
1640c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         && png_ptr->read_user_chunk_fn == NULL
16418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
16428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         )
16438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
16448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_chunk_error(png_ptr, "unknown critical chunk");
16458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1646c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      info_ptr = info_ptr; /* To quiet some compiler warnings */
16478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
16488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1649c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
16508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS)
16518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
16528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K
1653c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if (length > (png_uint_32)65535L)
1654c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      {
1655c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner          png_warning(png_ptr, "unknown chunk too large to fit in memory");
1656c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner          skip = length - (png_uint_32)65535L;
1657c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner          length = (png_uint_32)65535L;
1658c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      }
16598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1660c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_memcpy((png_charp)png_ptr->unknown_chunk.name,
1661c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner                 (png_charp)png_ptr->chunk_name,
1662c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner                 png_sizeof(png_ptr->unknown_chunk.name));
1663c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name) - 1]
1664c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner        = '\0';
1665c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1666c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_ptr->unknown_chunk.size = (png_size_t)length;
1667c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1668c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if (length == 0)
1669c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         png_ptr->unknown_chunk.data = NULL;
1670c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1671c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else
1672c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      {
1673c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr,
1674c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            (png_uint_32)length);
1675c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length);
1676c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      }
1677c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1678c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
1679c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if (png_ptr->read_user_chunk_fn != NULL)
1680c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      {
1681c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         /* Callback to user unknown chunk handler */
1682c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         int ret;
1683c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         ret = (*(png_ptr->read_user_chunk_fn))
1684c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner           (png_ptr, &png_ptr->unknown_chunk);
1685c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1686c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         if (ret < 0)
1687c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            png_chunk_error(png_ptr, "error in user chunk");
1688c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1689c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         if (ret == 0)
1690c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         {
1691c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            if (!(png_ptr->chunk_name[0] & 0x20))
1692c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner               if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
1693c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner                    PNG_HANDLE_CHUNK_ALWAYS)
1694c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner                  png_chunk_error(png_ptr, "unknown critical chunk");
1695c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            png_set_unknown_chunks(png_ptr, info_ptr,
1696c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner               &png_ptr->unknown_chunk, 1);
1697c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         }
1698c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      }
1699c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1700c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else
17018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1702c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner        png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1);
1703c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_free(png_ptr, png_ptr->unknown_chunk.data);
1704c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_ptr->unknown_chunk.data = NULL;
17058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
1706c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
17078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else
17088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
17098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      skip=length;
17108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_push_crc_skip(png_ptr, skip);
17118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
17128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
17138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
17148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_have_info(png_structp png_ptr, png_infop info_ptr)
17158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
17168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->info_fn != NULL)
17178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      (*(png_ptr->info_fn))(png_ptr, info_ptr);
17188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
17198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
17208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
17218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_have_end(png_structp png_ptr, png_infop info_ptr)
17228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
17238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->end_fn != NULL)
17248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      (*(png_ptr->end_fn))(png_ptr, info_ptr);
17258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
17268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
17278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
17288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_have_row(png_structp png_ptr, png_bytep row)
17298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
17308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->row_fn != NULL)
17318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      (*(png_ptr->row_fn))(png_ptr, row, png_ptr->row_number,
17328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         (int)png_ptr->pass);
17338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
17348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
17358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
17368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_progressive_combine_row (png_structp png_ptr,
17378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_bytep old_row, png_bytep new_row)
17388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
17398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS
17408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   PNG_CONST int FARDATA png_pass_dsp_mask[7] =
17418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff};
17428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1743c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1744c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
1745c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
1746c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
17478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (new_row != NULL)    /* new_row must == png_ptr->row_buf here. */
17488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]);
17498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
17508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
17518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
17528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr,
17538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn,
17548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_progressive_end_ptr end_fn)
17558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1756c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
1757c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
1758c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
17598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->info_fn = info_fn;
17608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_fn = row_fn;
17618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->end_fn = end_fn;
17628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
17638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer);
17648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
17658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
17668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp PNGAPI
17678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_get_progressive_ptr(png_structp png_ptr)
17688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1769c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
1770c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return (NULL);
1771c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
17728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   return png_ptr->io_ptr;
17738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
17748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
1775