pngpread.c revision 4215dd1533c56e1a89ae6f1d6ea68677fac27fda
1893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
2893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* pngpread.c - read a png file in push mode
3893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *
44215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project * Last changed in libpng 1.2.32 [September 18, 2008]
5893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * For conditions of distribution and use, see copyright notice in png.h
6893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * Copyright (c) 1998-2008 Glenn Randers-Pehrson
7893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
8893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
9893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
10893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
11893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_INTERNAL
12893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include "png.h"
13893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
14893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
15893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* push model modes */
16893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_SIG_MODE   0
17893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_CHUNK_MODE 1
18893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_IDAT_MODE  2
19893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_SKIP_MODE       3
20893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_tEXt_MODE  4
21893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_zTXt_MODE  5
22893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_DONE_MODE  6
23893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_iTXt_MODE  7
24893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_ERROR_MODE      8
25893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
26893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
27893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_process_data(png_structp png_ptr, png_infop info_ptr,
28893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_bytep buffer, png_size_t buffer_size)
29893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
304215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   if (png_ptr == NULL || info_ptr == NULL) return;
31893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_push_restore_buffer(png_ptr, buffer, buffer_size);
32893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
33893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   while (png_ptr->buffer_size)
34893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
35893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_process_some_data(png_ptr, info_ptr);
36893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
37893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
38893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
39893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* What we do with the incoming data depends on what we were previously
40893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * doing before we ran out of data...
41893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
42893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
43893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_process_some_data(png_structp png_ptr, png_infop info_ptr)
44893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
454215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   if (png_ptr == NULL) return;
46893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   switch (png_ptr->process_mode)
47893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
48893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      case PNG_READ_SIG_MODE:
49893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
50893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_read_sig(png_ptr, info_ptr);
51893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         break;
52893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
53893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      case PNG_READ_CHUNK_MODE:
54893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
55893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_read_chunk(png_ptr, info_ptr);
56893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         break;
57893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
58893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      case PNG_READ_IDAT_MODE:
59893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
60893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_read_IDAT(png_ptr);
61893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         break;
62893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
63893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_tEXt_SUPPORTED)
64893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      case PNG_READ_tEXt_MODE:
65893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
66893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_read_tEXt(png_ptr, info_ptr);
67893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         break;
68893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
69893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
70893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_zTXt_SUPPORTED)
71893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      case PNG_READ_zTXt_MODE:
72893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
73893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_read_zTXt(png_ptr, info_ptr);
74893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         break;
75893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
76893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
77893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_iTXt_SUPPORTED)
78893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      case PNG_READ_iTXt_MODE:
79893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
80893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_read_iTXt(png_ptr, info_ptr);
81893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         break;
82893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
83893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
84893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      case PNG_SKIP_MODE:
85893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
86893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_crc_finish(png_ptr);
87893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         break;
88893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
89893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      default:
90893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
91893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->buffer_size = 0;
92893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         break;
93893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
94893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
95893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
96893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
97893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Read any remaining signature bytes from the stream and compare them with
98893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * the correct PNG signature.  It is possible that this routine is called
99893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * with bytes already read from the signature, either because they have been
100893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * checked by the calling application, or because of multiple calls to this
101893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * routine.
102893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
103893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_read_sig(png_structp png_ptr, png_infop info_ptr)
105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_size_t num_checked = png_ptr->sig_bytes,
107893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project             num_to_check = 8 - num_checked;
108893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
109893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->buffer_size < num_to_check)
110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
111893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      num_to_check = png_ptr->buffer_size;
112893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
113893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
114893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_push_fill_buffer(png_ptr, &(info_ptr->signature[num_checked]),
115893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      num_to_check);
1164215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes + num_to_check);
117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check))
119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
120893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (num_checked < 4 &&
121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4))
122893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_error(png_ptr, "Not a PNG file");
123893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
124893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_error(png_ptr, "PNG file corrupted by ASCII conversion");
125893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
126893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else
127893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->sig_bytes >= 8)
129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
130893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->process_mode = PNG_READ_CHUNK_MODE;
131893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
132893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
133893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
134893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
135893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
136893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
137893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
138893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS
139893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_IHDR;
140893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_IDAT;
141893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_IEND;
142893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_PLTE;
143893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_bKGD_SUPPORTED)
144893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_bKGD;
145893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_cHRM_SUPPORTED)
147893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_cHRM;
148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
149893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_gAMA_SUPPORTED)
150893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_gAMA;
151893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
152893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_hIST_SUPPORTED)
153893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_hIST;
154893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_iCCP_SUPPORTED)
156893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_iCCP;
157893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
158893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_iTXt_SUPPORTED)
159893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_iTXt;
160893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
161893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_oFFs_SUPPORTED)
162893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_oFFs;
163893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
164893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_pCAL_SUPPORTED)
165893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_pCAL;
166893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
167893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_pHYs_SUPPORTED)
168893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_pHYs;
169893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
170893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_sBIT_SUPPORTED)
171893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_sBIT;
172893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
173893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_sCAL_SUPPORTED)
174893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_sCAL;
175893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
176893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_sRGB_SUPPORTED)
177893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_sRGB;
178893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
179893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_sPLT_SUPPORTED)
180893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_sPLT;
181893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
182893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_tEXt_SUPPORTED)
183893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_tEXt;
184893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
185893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_tIME_SUPPORTED)
186893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_tIME;
187893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
188893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_tRNS_SUPPORTED)
189893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_tRNS;
190893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
191893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_zTXt_SUPPORTED)
192893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_zTXt;
193893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
194893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USE_LOCAL_ARRAYS */
195893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* First we make sure we have enough data for the 4 byte chunk name
196893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * and the 4 byte chunk length before proceeding with decoding the
197893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * chunk data.  To fully decode each of these chunks, we also make
198893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * sure we have enough data in the buffer for the 4 byte CRC at the
199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * end of every chunk (except IDAT, which is handled separately).
200893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    */
201893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
202893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
203893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_byte chunk_length[4];
204893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
205893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->buffer_size < 8)
206893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
207893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
208893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
209893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
210893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
211893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_fill_buffer(png_ptr, chunk_length, 4);
2124215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length);
213893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_reset_crc(png_ptr);
214893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_crc_read(png_ptr, png_ptr->chunk_name, 4);
2154215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      png_check_chunk_name(png_ptr, png_ptr->chunk_name);
216893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
217893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
2204215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project     if (png_ptr->mode & PNG_AFTER_IDAT)
221893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
222893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
223893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4))
224893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
2254215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      if (png_ptr->push_length != 13)
2264215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         png_error(png_ptr, "Invalid IHDR length");
227893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
228893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
231893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
232893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length);
233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4))
235893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
236893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
238893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
239893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
240893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
241893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length);
242893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
243893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->process_mode = PNG_READ_DONE_MODE;
244893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_have_end(png_ptr, info_ptr);
245893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
247893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name))
248893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
249893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
251893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
252893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
253893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
255893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->mode |= PNG_HAVE_IDAT;
256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length);
257893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
258893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->mode |= PNG_HAVE_PLTE;
259893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
260893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
261893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (!(png_ptr->mode & PNG_HAVE_IHDR))
262893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_error(png_ptr, "Missing IHDR before IDAT");
263893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
264893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  !(png_ptr->mode & PNG_HAVE_PLTE))
265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_error(png_ptr, "Missing PLTE before IDAT");
266893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
267893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
268893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
269893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
271893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
272893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
273893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
274893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
275893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
276893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length);
277893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
278893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
279893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
280893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      /* If we reach an IDAT chunk, this means we have read all of the
281893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       * header chunks, and we can start reading the image (or if this
282893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       * is called after the image has been read - we have an error).
283893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       */
284893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     if (!(png_ptr->mode & PNG_HAVE_IHDR))
285893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       png_error(png_ptr, "Missing IHDR before IDAT");
286893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
287893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         !(png_ptr->mode & PNG_HAVE_PLTE))
288893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       png_error(png_ptr, "Missing PLTE before IDAT");
289893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
290893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->mode & PNG_HAVE_IDAT)
291893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
292893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (!(png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT))
293893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project           if (png_ptr->push_length == 0)
294893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project              return;
295893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
296893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (png_ptr->mode & PNG_AFTER_IDAT)
297893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_error(png_ptr, "Too many IDAT's found");
298893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
299893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
300893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->idat_size = png_ptr->push_length;
301893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->mode |= PNG_HAVE_IDAT;
302893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->process_mode = PNG_READ_IDAT_MODE;
303893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_have_info(png_ptr, info_ptr);
304893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes;
305893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->zstream.next_out = png_ptr->row_buf;
306893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return;
307893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
308893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_gAMA_SUPPORTED)
309893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4))
310893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
311893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
312893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
313893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
314893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
315893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
316893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length);
317893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
318893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
319893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_sBIT_SUPPORTED)
320893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4))
321893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
322893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
323893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
324893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
325893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
326893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
327893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length);
328893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
329893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
330893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_cHRM_SUPPORTED)
331893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4))
332893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
333893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
334893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
335893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
336893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
337893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
338893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length);
339893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
340893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_sRGB_SUPPORTED)
342893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4))
343893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
344893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
345893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
346893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
347893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
348893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
349893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length);
350893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
351893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
352893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_iCCP_SUPPORTED)
353893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4))
354893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
355893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
356893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
357893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
358893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
359893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
360893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length);
361893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
362893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
363893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_sPLT_SUPPORTED)
364893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4))
365893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
366893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
367893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
368893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
369893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
371893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length);
372893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
374893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_tRNS_SUPPORTED)
375893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4))
376893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
377893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
378893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
379893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
380893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
381893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
382893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length);
383893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
384893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_bKGD_SUPPORTED)
386893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4))
387893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
388893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
391893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
393893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length);
394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
395893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
396893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_hIST_SUPPORTED)
397893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4))
398893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
399893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
400893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
401893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
403893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
404893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length);
405893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
406893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_pHYs_SUPPORTED)
408893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4))
409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
413893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
414893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length);
416893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
417893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
418893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_oFFs_SUPPORTED)
419893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4))
420893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
421893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
422893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
423893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
424893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
425893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
426893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length);
427893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
429893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_pCAL_SUPPORTED)
430893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4))
431893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
432893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
434893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
435893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length);
438893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
439893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
440893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_sCAL_SUPPORTED)
441893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4))
442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
443893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
444893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
445893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
446893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
447893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
448893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length);
449893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
450893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
451893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_tIME_SUPPORTED)
452893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4))
453893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
454893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
455893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
456893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
457893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
458893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
459893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length);
460893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
461893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
462893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_tEXt_SUPPORTED)
463893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4))
464893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
465893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
466893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
467893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
468893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
469893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length);
471893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
472893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
473893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_zTXt_SUPPORTED)
474893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4))
475893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
476893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
478893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
479893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
480893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
481893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length);
482893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
483893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
484893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_iTXt_SUPPORTED)
485893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4))
486893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
487893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
488893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
489893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
490893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
491893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
492893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length);
493893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
494893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
495893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else
496893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
497893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
498893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
499893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
500893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
502893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length);
503893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
504893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
505893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
506893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
507893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
508893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
509893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_crc_skip(png_structp png_ptr, png_uint_32 skip)
510893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
511893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->process_mode = PNG_SKIP_MODE;
512893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->skip_length = skip;
513893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
514893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
515893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
516893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_crc_finish(png_structp png_ptr)
517893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
518893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->skip_length && png_ptr->save_buffer_size)
519893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
520893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_size_t save_size;
521893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
522893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->skip_length < (png_uint_32)png_ptr->save_buffer_size)
523893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         save_size = (png_size_t)png_ptr->skip_length;
524893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
525893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         save_size = png_ptr->save_buffer_size;
526893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
527893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size);
528893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
529893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->skip_length -= save_size;
530893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->buffer_size -= save_size;
531893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->save_buffer_size -= save_size;
532893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->save_buffer_ptr += save_size;
533893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
534893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->skip_length && png_ptr->current_buffer_size)
535893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
536893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_size_t save_size;
537893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
538893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->skip_length < (png_uint_32)png_ptr->current_buffer_size)
539893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         save_size = (png_size_t)png_ptr->skip_length;
540893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
541893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         save_size = png_ptr->current_buffer_size;
542893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
543893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size);
544893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
545893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->skip_length -= save_size;
546893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->buffer_size -= save_size;
547893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_buffer_size -= save_size;
548893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_buffer_ptr += save_size;
549893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
550893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!png_ptr->skip_length)
551893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
552893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->buffer_size < 4)
553893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
554893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
555893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
556893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
557893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
558893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_crc_finish(png_ptr, 0);
559893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->process_mode = PNG_READ_CHUNK_MODE;
560893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
561893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
562893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
563893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
564893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length)
565893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
566893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_bytep ptr;
567893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
5684215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   if (png_ptr == NULL) return;
569893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   ptr = buffer;
570893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->save_buffer_size)
571893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
572893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_size_t save_size;
573893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
574893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (length < png_ptr->save_buffer_size)
575893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         save_size = length;
576893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
577893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         save_size = png_ptr->save_buffer_size;
578893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
579893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_memcpy(ptr, png_ptr->save_buffer_ptr, save_size);
580893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      length -= save_size;
581893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      ptr += save_size;
582893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->buffer_size -= save_size;
583893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->save_buffer_size -= save_size;
584893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->save_buffer_ptr += save_size;
585893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
586893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (length && png_ptr->current_buffer_size)
587893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
588893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_size_t save_size;
589893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
590893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (length < png_ptr->current_buffer_size)
591893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         save_size = length;
592893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
593893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         save_size = png_ptr->current_buffer_size;
594893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
595893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_memcpy(ptr, png_ptr->current_buffer_ptr, save_size);
596893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->buffer_size -= save_size;
597893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_buffer_size -= save_size;
598893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_buffer_ptr += save_size;
599893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
600893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
601893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
602893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
603893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_save_buffer(png_structp png_ptr)
604893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
605893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->save_buffer_size)
606893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
607893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->save_buffer_ptr != png_ptr->save_buffer)
608893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
6094215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         png_size_t i, istop;
610893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_bytep sp;
611893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_bytep dp;
612893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
613893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         istop = png_ptr->save_buffer_size;
614893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer;
615893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            i < istop; i++, sp++, dp++)
616893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
617893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            *dp = *sp;
618893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
619893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
620893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
621893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->save_buffer_size + png_ptr->current_buffer_size >
622893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->save_buffer_max)
623893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
624893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_size_t new_max;
625893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_bytep old_buffer;
626893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
627893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->save_buffer_size > PNG_SIZE_MAX -
628893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         (png_ptr->current_buffer_size + 256))
629893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
630893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        png_error(png_ptr, "Potential overflow of save_buffer");
631893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
632893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256;
633893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      old_buffer = png_ptr->save_buffer;
634893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->save_buffer = (png_bytep)png_malloc(png_ptr,
635893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         (png_uint_32)new_max);
636893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size);
637893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_free(png_ptr, old_buffer);
638893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->save_buffer_max = new_max;
639893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
640893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->current_buffer_size)
641893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
642893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size,
643893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->current_buffer_ptr, png_ptr->current_buffer_size);
644893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->save_buffer_size += png_ptr->current_buffer_size;
645893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_buffer_size = 0;
646893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
647893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->save_buffer_ptr = png_ptr->save_buffer;
648893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->buffer_size = 0;
649893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
650893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
651893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
652893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_restore_buffer(png_structp png_ptr, png_bytep buffer,
653893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_size_t buffer_length)
654893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
655893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_buffer = buffer;
656893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_buffer_size = buffer_length;
657893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->buffer_size = buffer_length + png_ptr->save_buffer_size;
658893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_buffer_ptr = png_ptr->current_buffer;
659893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
660893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
661893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
662893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_read_IDAT(png_structp png_ptr)
663893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
664893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS
665893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   PNG_CONST PNG_IDAT;
666893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
667893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
668893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
669893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_byte chunk_length[4];
670893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
671893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->buffer_size < 8)
672893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
673893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
674893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
675893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
676893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
677893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_fill_buffer(png_ptr, chunk_length, 4);
6784215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length);
679893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_reset_crc(png_ptr);
680893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_crc_read(png_ptr, png_ptr->chunk_name, 4);
681893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
682893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
683893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
684893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
685893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->process_mode = PNG_READ_CHUNK_MODE;
686893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
687893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_error(png_ptr, "Not enough compressed data");
688893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
689893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
690893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
691893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->idat_size = png_ptr->push_length;
692893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
693893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->idat_size && png_ptr->save_buffer_size)
694893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
695893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_size_t save_size;
696893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
697893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->idat_size < (png_uint_32)png_ptr->save_buffer_size)
698893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
699893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         save_size = (png_size_t)png_ptr->idat_size;
700893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         /* check for overflow */
7014215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         if ((png_uint_32)save_size != png_ptr->idat_size)
702893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_error(png_ptr, "save_size overflowed in pngpread");
703893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
704893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
705893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         save_size = png_ptr->save_buffer_size;
706893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
707893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size);
708893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
709893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size);
710893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->idat_size -= save_size;
711893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->buffer_size -= save_size;
712893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->save_buffer_size -= save_size;
713893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->save_buffer_ptr += save_size;
714893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
715893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->idat_size && png_ptr->current_buffer_size)
716893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
717893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_size_t save_size;
718893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
719893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->idat_size < (png_uint_32)png_ptr->current_buffer_size)
720893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
721893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         save_size = (png_size_t)png_ptr->idat_size;
722893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         /* check for overflow */
7234215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         if ((png_uint_32)save_size != png_ptr->idat_size)
724893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_error(png_ptr, "save_size overflowed in pngpread");
725893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
726893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
727893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         save_size = png_ptr->current_buffer_size;
728893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
729893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size);
730893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
731893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size);
732893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
733893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->idat_size -= save_size;
734893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->buffer_size -= save_size;
735893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_buffer_size -= save_size;
736893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_buffer_ptr += save_size;
737893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
738893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!png_ptr->idat_size)
739893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
740893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->buffer_size < 4)
741893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
742893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
743893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
744893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
745893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
746893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_crc_finish(png_ptr, 0);
747893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
748893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->mode |= PNG_AFTER_IDAT;
749893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
750893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
751893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
752893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
753893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_process_IDAT_data(png_structp png_ptr, png_bytep buffer,
754893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_size_t buffer_length)
755893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
756893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   int ret;
757893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
758893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if ((png_ptr->flags & PNG_FLAG_ZLIB_FINISHED) && buffer_length)
759893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_error(png_ptr, "Extra compression data");
760893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
761893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->zstream.next_in = buffer;
762893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->zstream.avail_in = (uInt)buffer_length;
7634215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   for (;;)
764893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
765893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
766893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (ret != Z_OK)
767893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
768893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (ret == Z_STREAM_END)
769893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
770893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (png_ptr->zstream.avail_in)
771893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_error(png_ptr, "Extra compressed data");
772893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (!(png_ptr->zstream.avail_out))
773893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
774893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_push_process_row(png_ptr);
775893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
776893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
777893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_ptr->mode |= PNG_AFTER_IDAT;
778893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
779893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
780893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
781893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else if (ret == Z_BUF_ERROR)
782893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
783893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else
784893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_error(png_ptr, "Decompression Error");
785893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
786893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (!(png_ptr->zstream.avail_out))
787893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
788893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if ((
789893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_INTERLACING_SUPPORTED)
790893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project             png_ptr->interlaced && png_ptr->pass > 6) ||
791893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project             (!png_ptr->interlaced &&
792893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
793893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project             png_ptr->row_number == png_ptr->num_rows))
794893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
795893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project           if (png_ptr->zstream.avail_in)
796893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project             png_warning(png_ptr, "Too much data in IDAT chunks");
797893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project           png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
798893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project           break;
799893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
800893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_process_row(png_ptr);
801893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes;
802893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->zstream.next_out = png_ptr->row_buf;
803893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
804893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
805893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         break;
806893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
807893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
808893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
809893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
810893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_process_row(png_structp png_ptr)
811893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
812893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->row_info.color_type = png_ptr->color_type;
813893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->row_info.width = png_ptr->iwidth;
814893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->row_info.channels = png_ptr->channels;
815893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->row_info.bit_depth = png_ptr->bit_depth;
816893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->row_info.pixel_depth = png_ptr->pixel_depth;
817893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
818893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,
819893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       png_ptr->row_info.width);
820893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
821893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_read_filter_row(png_ptr, &(png_ptr->row_info),
822893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->row_buf + 1, png_ptr->prev_row + 1,
823893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      (int)(png_ptr->row_buf[0]));
824893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
825893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf,
826893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->rowbytes + 1);
827893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
828893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA))
829893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_do_read_transformations(png_ptr);
830893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
831893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_INTERLACING_SUPPORTED)
832893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* blow up interlaced rows to full size */
833893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
834893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
835893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->pass < 6)
836893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/*       old interface (pre-1.0.9):
837893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_do_read_interlace(&(png_ptr->row_info),
838893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations);
839893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
840893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_do_read_interlace(png_ptr);
841893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
842893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    switch (png_ptr->pass)
843893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    {
844893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         case 0:
845893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
846893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            int i;
847893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0; i < 8 && png_ptr->pass == 0; i++)
848893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
849893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
850893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_push_finish_row(png_ptr); /* updates png_ptr->pass */
851893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
852893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (png_ptr->pass == 2) /* pass 1 might be empty */
853893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
854893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               for (i = 0; i < 4 && png_ptr->pass == 2; i++)
855893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               {
856893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_push_have_row(png_ptr, png_bytep_NULL);
857893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_read_push_finish_row(png_ptr);
858893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               }
859893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
860893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (png_ptr->pass == 4 && png_ptr->height <= 4)
861893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
862893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               for (i = 0; i < 2 && png_ptr->pass == 4; i++)
863893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               {
864893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_push_have_row(png_ptr, png_bytep_NULL);
865893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_read_push_finish_row(png_ptr);
866893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               }
867893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
868893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (png_ptr->pass == 6 && png_ptr->height <= 4)
869893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
870893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                png_push_have_row(png_ptr, png_bytep_NULL);
871893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                png_read_push_finish_row(png_ptr);
872893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
873893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
874893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
875893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         case 1:
876893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
877893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            int i;
878893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0; i < 8 && png_ptr->pass == 1; i++)
879893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
880893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
881893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_push_finish_row(png_ptr);
882893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
883893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (png_ptr->pass == 2) /* skip top 4 generated rows */
884893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
885893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               for (i = 0; i < 4 && png_ptr->pass == 2; i++)
886893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               {
887893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_push_have_row(png_ptr, png_bytep_NULL);
888893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_read_push_finish_row(png_ptr);
889893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               }
890893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
891893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
892893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
893893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         case 2:
894893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
895893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            int i;
896893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0; i < 4 && png_ptr->pass == 2; i++)
897893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
898893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
899893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_push_finish_row(png_ptr);
900893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
901893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0; i < 4 && png_ptr->pass == 2; i++)
902893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
903893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_push_have_row(png_ptr, png_bytep_NULL);
904893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_push_finish_row(png_ptr);
905893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
906893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (png_ptr->pass == 4) /* pass 3 might be empty */
907893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
908893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               for (i = 0; i < 2 && png_ptr->pass == 4; i++)
909893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               {
910893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_push_have_row(png_ptr, png_bytep_NULL);
911893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_read_push_finish_row(png_ptr);
912893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               }
913893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
914893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
915893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
916893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         case 3:
917893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
918893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            int i;
919893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0; i < 4 && png_ptr->pass == 3; i++)
920893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
921893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
922893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_push_finish_row(png_ptr);
923893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
924893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (png_ptr->pass == 4) /* skip top two generated rows */
925893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
926893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               for (i = 0; i < 2 && png_ptr->pass == 4; i++)
927893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               {
928893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_push_have_row(png_ptr, png_bytep_NULL);
929893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_read_push_finish_row(png_ptr);
930893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               }
931893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
932893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
933893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
934893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         case 4:
935893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
936893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            int i;
937893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0; i < 2 && png_ptr->pass == 4; i++)
938893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
939893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
940893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_push_finish_row(png_ptr);
941893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
942893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0; i < 2 && png_ptr->pass == 4; i++)
943893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
944893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_push_have_row(png_ptr, png_bytep_NULL);
945893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_push_finish_row(png_ptr);
946893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
947893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (png_ptr->pass == 6) /* pass 5 might be empty */
948893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
949893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_push_have_row(png_ptr, png_bytep_NULL);
950893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_push_finish_row(png_ptr);
951893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
952893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
953893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
954893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         case 5:
955893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
956893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            int i;
957893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0; i < 2 && png_ptr->pass == 5; i++)
958893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
959893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
960893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_push_finish_row(png_ptr);
961893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
962893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (png_ptr->pass == 6) /* skip top generated row */
963893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
964893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_push_have_row(png_ptr, png_bytep_NULL);
965893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_push_finish_row(png_ptr);
966893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
967893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
968893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
969893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         case 6:
970893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
971893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_push_have_row(png_ptr, png_ptr->row_buf + 1);
972893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_read_push_finish_row(png_ptr);
973893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (png_ptr->pass != 6)
974893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               break;
975893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_push_have_row(png_ptr, png_bytep_NULL);
976893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_read_push_finish_row(png_ptr);
977893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
978893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
979893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
980893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else
981893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
982893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
983893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_have_row(png_ptr, png_ptr->row_buf + 1);
984893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_read_push_finish_row(png_ptr);
985893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
986893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
987893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
988893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
989893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_read_push_finish_row(png_structp png_ptr)
990893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
991893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS
992893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
993893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
994893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* start of interlace block */
995893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
996893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
997893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* offset to next interlace block */
998893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
999893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1000893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* start of interlace block in the y direction */
1001893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
1002893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1003893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* offset to next interlace block in the y direction */
1004893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   PNG_CONST int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
1005893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1006893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* Height of interlace block.  This is not currently used - if you need
1007893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * it, uncomment it here and in png.h
1008893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   PNG_CONST int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1};
1009893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   */
1010893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1011893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1012893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->row_number++;
1013893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->row_number < png_ptr->num_rows)
1014893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return;
1015893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1016893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->interlaced)
1017893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1018893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->row_number = 0;
1019893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_memset_check(png_ptr, png_ptr->prev_row, 0,
1020893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->rowbytes + 1);
1021893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      do
1022893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
10234215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         png_ptr->pass++;
10244215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         if ((png_ptr->pass == 1 && png_ptr->width < 5) ||
10254215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project             (png_ptr->pass == 3 && png_ptr->width < 3) ||
10264215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project             (png_ptr->pass == 5 && png_ptr->width < 2))
10274215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project           png_ptr->pass++;
10284215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
10294215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         if (png_ptr->pass > 7)
10304215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            png_ptr->pass--;
10314215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         if (png_ptr->pass >= 7)
10324215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            break;
10334215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
10344215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         png_ptr->iwidth = (png_ptr->width +
10354215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            png_pass_inc[png_ptr->pass] - 1 -
10364215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            png_pass_start[png_ptr->pass]) /
10374215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            png_pass_inc[png_ptr->pass];
10384215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
10394215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         png_ptr->irowbytes = PNG_ROWBYTES(png_ptr->pixel_depth,
10404215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            png_ptr->iwidth) + 1;
10414215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
10424215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         if (png_ptr->transformations & PNG_INTERLACE)
10434215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            break;
10444215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
10454215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         png_ptr->num_rows = (png_ptr->height +
10464215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            png_pass_yinc[png_ptr->pass] - 1 -
10474215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            png_pass_ystart[png_ptr->pass]) /
10484215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            png_pass_yinc[png_ptr->pass];
1049893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1050893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0);
1051893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1052893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1053893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1054893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_tEXt_SUPPORTED)
1055893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
1056893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
1057893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   length)
1058893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1059893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
1060893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1061893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_error(png_ptr, "Out of place tEXt");
1062893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         info_ptr = info_ptr; /* to quiet some compiler warnings */
1063893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1064893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1065893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K
1066893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->skip_length = 0;  /* This may not be necessary */
1067893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1068893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */
1069893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1070893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_warning(png_ptr, "tEXt chunk too large to fit in memory");
1071893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->skip_length = length - (png_uint_32)65535L;
1072893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      length = (png_uint_32)65535L;
1073893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1074893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1075893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1076893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text = (png_charp)png_malloc(png_ptr,
10774215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      (png_uint_32)(length + 1));
1078893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text[length] = '\0';
1079893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text_ptr = png_ptr->current_text;
1080893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text_size = (png_size_t)length;
1081893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text_left = (png_size_t)length;
1082893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->process_mode = PNG_READ_tEXt_MODE;
1083893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1084893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1085893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
1086893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_read_tEXt(png_structp png_ptr, png_infop info_ptr)
1087893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1088893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->buffer_size && png_ptr->current_text_left)
1089893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1090893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_size_t text_size;
1091893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1092893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->buffer_size < png_ptr->current_text_left)
1093893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         text_size = png_ptr->buffer_size;
1094893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
1095893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         text_size = png_ptr->current_text_left;
1096893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
1097893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_text_left -= text_size;
1098893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_text_ptr += text_size;
1099893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1100893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!(png_ptr->current_text_left))
1101893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1102893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_textp text_ptr;
1103893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_charp text;
1104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_charp key;
1105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int ret;
1106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1107893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->buffer_size < 4)
1108893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1109893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
1110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
1111893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1112893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1113893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_crc_finish(png_ptr);
1114893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1115893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_MAX_MALLOC_64K)
1116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->skip_length)
1117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
1118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1120893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      key = png_ptr->current_text;
1121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1122893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (text = key; *text; text++)
1123893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         /* empty loop */ ;
1124893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1125893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (text < key + png_ptr->current_text_size)
1126893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         text++;
1127893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr = (png_textp)png_malloc(png_ptr,
1129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         (png_uint_32)png_sizeof(png_text));
1130893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->compression = PNG_TEXT_COMPRESSION_NONE;
1131893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->key = key;
1132893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_iTXt_SUPPORTED
1133893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->lang = NULL;
1134893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->lang_key = NULL;
1135893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1136893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->text = text;
1137893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1138893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
1139893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1140893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_free(png_ptr, key);
1141893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_free(png_ptr, text_ptr);
1142893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_text = NULL;
1143893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1144893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (ret)
1145893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        png_warning(png_ptr, "Insufficient memory to store text chunk.");
1146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1147893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1149893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1150893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_zTXt_SUPPORTED)
1151893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
1152893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
1153893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   length)
1154893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
1156893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1157893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_error(png_ptr, "Out of place zTXt");
1158893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         info_ptr = info_ptr; /* to quiet some compiler warnings */
1159893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1160893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1161893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K
1162893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* We can't handle zTXt chunks > 64K, since we don't have enough space
1163893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * to be able to store the uncompressed data.  Actually, the threshold
1164893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * is probably around 32K, but it isn't as definite as 64K is.
1165893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    */
1166893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (length > (png_uint_32)65535L)
1167893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1168893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_warning(png_ptr, "zTXt chunk too large to fit in memory");
1169893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_crc_skip(png_ptr, length);
1170893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return;
1171893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1172893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1173893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1174893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text = (png_charp)png_malloc(png_ptr,
11754215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      (png_uint_32)(length + 1));
1176893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text[length] = '\0';
1177893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text_ptr = png_ptr->current_text;
1178893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text_size = (png_size_t)length;
1179893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text_left = (png_size_t)length;
1180893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->process_mode = PNG_READ_zTXt_MODE;
1181893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1182893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1183893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
1184893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_read_zTXt(png_structp png_ptr, png_infop info_ptr)
1185893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1186893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->buffer_size && png_ptr->current_text_left)
1187893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1188893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_size_t text_size;
1189893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1190893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left)
1191893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         text_size = png_ptr->buffer_size;
1192893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
1193893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         text_size = png_ptr->current_text_left;
1194893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
1195893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_text_left -= text_size;
1196893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_text_ptr += text_size;
1197893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1198893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!(png_ptr->current_text_left))
1199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1200893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_textp text_ptr;
1201893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_charp text;
1202893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_charp key;
1203893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int ret;
1204893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_size_t text_size, key_size;
1205893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1206893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->buffer_size < 4)
1207893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1208893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
1209893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
1210893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1211893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1212893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_crc_finish(png_ptr);
1213893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1214893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      key = png_ptr->current_text;
1215893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1216893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (text = key; *text; text++)
1217893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         /* empty loop */ ;
1218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      /* zTXt can't have zero text */
1220893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (text >= key + png_ptr->current_text_size)
1221893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1222893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->current_text = NULL;
1223893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_free(png_ptr, key);
1224893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
1225893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1226893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1227893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text++;
1228893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (*text != PNG_TEXT_COMPRESSION_zTXt) /* check compression byte */
1230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1231893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->current_text = NULL;
1232893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_free(png_ptr, key);
1233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
1234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1235893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1236893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text++;
1237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1238893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->zstream.next_in = (png_bytep )text;
1239893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size -
1240893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         (text - key));
1241893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->zstream.next_out = png_ptr->zbuf;
1242893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
1243893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1244893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      key_size = text - key;
1245893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_size = 0;
1246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text = NULL;
1247893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      ret = Z_STREAM_END;
1248893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1249893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      while (png_ptr->zstream.avail_in)
1250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1251893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
1252893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (ret != Z_OK && ret != Z_STREAM_END)
1253893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
1254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            inflateReset(&png_ptr->zstream);
1255893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_ptr->zstream.avail_in = 0;
1256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_ptr->current_text = NULL;
1257893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_free(png_ptr, key);
1258893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_free(png_ptr, text);
1259893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            return;
1260893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1261893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END)
1262893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
1263893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (text == NULL)
1264893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
1265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               text = (png_charp)png_malloc(png_ptr,
12664215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project                     (png_uint_32)(png_ptr->zbuf_size
12674215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project                     - png_ptr->zstream.avail_out + key_size + 1));
1268893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_memcpy(text + key_size, png_ptr->zbuf,
1269893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_ptr->zbuf_size - png_ptr->zstream.avail_out);
1270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_memcpy(text, key, key_size);
1271893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               text_size = key_size + png_ptr->zbuf_size -
1272893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_ptr->zstream.avail_out;
1273893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(text + text_size) = '\0';
1274893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
1275893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            else
1276893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
1277893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_charp tmp;
1278893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1279893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               tmp = text;
1280893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               text = (png_charp)png_malloc(png_ptr, text_size +
12814215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project                  (png_uint_32)(png_ptr->zbuf_size
12824215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project                  - png_ptr->zstream.avail_out + 1));
1283893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_memcpy(text, tmp, text_size);
1284893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_free(png_ptr, tmp);
1285893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_memcpy(text + text_size, png_ptr->zbuf,
1286893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_ptr->zbuf_size - png_ptr->zstream.avail_out);
1287893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out;
1288893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(text + text_size) = '\0';
1289893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
1290893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (ret != Z_STREAM_END)
1291893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
1292893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_ptr->zstream.next_out = png_ptr->zbuf;
1293893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
1294893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
1295893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1296893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else
1297893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
1298893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
1299893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1300893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1301893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (ret == Z_STREAM_END)
1302893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
1303893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1304893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1305893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      inflateReset(&png_ptr->zstream);
1306893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->zstream.avail_in = 0;
1307893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1308893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (ret != Z_STREAM_END)
1309893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1310893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->current_text = NULL;
1311893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_free(png_ptr, key);
1312893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_free(png_ptr, text);
1313893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
1314893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1315893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1316893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_text = NULL;
1317893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_free(png_ptr, key);
1318893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      key = text;
1319893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text += key_size;
1320893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1321893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr = (png_textp)png_malloc(png_ptr,
1322893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          (png_uint_32)png_sizeof(png_text));
1323893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt;
1324893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->key = key;
1325893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_iTXt_SUPPORTED
1326893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->lang = NULL;
1327893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->lang_key = NULL;
1328893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1329893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->text = text;
1330893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1331893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
1332893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1333893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_free(png_ptr, key);
1334893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_free(png_ptr, text_ptr);
1335893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1336893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (ret)
1337893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        png_warning(png_ptr, "Insufficient memory to store text chunk.");
1338893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1339893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1340893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1342893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_iTXt_SUPPORTED)
1343893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
1344893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
1345893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   length)
1346893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1347893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
1348893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1349893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_error(png_ptr, "Out of place iTXt");
1350893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         info_ptr = info_ptr; /* to quiet some compiler warnings */
1351893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1352893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1353893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K
1354893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->skip_length = 0;  /* This may not be necessary */
1355893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1356893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */
1357893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1358893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_warning(png_ptr, "iTXt chunk too large to fit in memory");
1359893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->skip_length = length - (png_uint_32)65535L;
1360893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      length = (png_uint_32)65535L;
1361893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1362893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1363893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1364893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text = (png_charp)png_malloc(png_ptr,
13654215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      (png_uint_32)(length + 1));
1366893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text[length] = '\0';
1367893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text_ptr = png_ptr->current_text;
1368893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text_size = (png_size_t)length;
1369893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text_left = (png_size_t)length;
1370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->process_mode = PNG_READ_iTXt_MODE;
1371893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1372893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
1374893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_read_iTXt(png_structp png_ptr, png_infop info_ptr)
1375893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1376893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1377893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->buffer_size && png_ptr->current_text_left)
1378893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1379893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_size_t text_size;
1380893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1381893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->buffer_size < png_ptr->current_text_left)
1382893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         text_size = png_ptr->buffer_size;
1383893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
1384893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         text_size = png_ptr->current_text_left;
1385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
1386893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_text_left -= text_size;
1387893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_text_ptr += text_size;
1388893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!(png_ptr->current_text_left))
1390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1391893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_textp text_ptr;
1392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_charp key;
1393893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int comp_flag;
1394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_charp lang;
1395893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_charp lang_key;
1396893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_charp text;
1397893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int ret;
1398893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1399893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->buffer_size < 4)
1400893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1401893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
1402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
1403893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1404893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1405893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_crc_finish(png_ptr);
1406893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_MAX_MALLOC_64K)
1408893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->skip_length)
1409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
1410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      key = png_ptr->current_text;
1413893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1414893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (lang = key; *lang; lang++)
1415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         /* empty loop */ ;
1416893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1417893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (lang < key + png_ptr->current_text_size - 3)
1418893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         lang++;
1419893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1420893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      comp_flag = *lang++;
1421893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      lang++;     /* skip comp_type, always zero */
1422893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1423893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (lang_key = lang; *lang_key; lang_key++)
1424893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         /* empty loop */ ;
1425893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      lang_key++;        /* skip NUL separator */
1426893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1427893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text=lang_key;
1428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (lang_key < key + png_ptr->current_text_size - 1)
1429893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1430893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        for (; *text; text++)
1431893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project           /* empty loop */ ;
1432893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1434893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (text < key + png_ptr->current_text_size)
1435893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         text++;
1436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr = (png_textp)png_malloc(png_ptr,
1438893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         (png_uint_32)png_sizeof(png_text));
1439893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->compression = comp_flag + 2;
1440893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->key = key;
1441893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->lang = lang;
1442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->lang_key = lang_key;
1443893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->text = text;
1444893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->text_length = 0;
1445893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->itxt_length = png_strlen(text);
1446893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1447893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
1448893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1449893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_text = NULL;
1450893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1451893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_free(png_ptr, text_ptr);
1452893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (ret)
1453893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        png_warning(png_ptr, "Insufficient memory to store iTXt chunk.");
1454893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1455893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1456893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1457893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1458893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* This function is called when we haven't found a handler for this
1459893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * chunk.  If there isn't a problem with the chunk itself (ie a bad chunk
1460893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * name or a critical chunk), the chunk is (currently) silently ignored.
1461893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
1462893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
1463893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32
1464893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   length)
1465893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
14664215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_uint_32 skip = 0;
1467893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1468893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!(png_ptr->chunk_name[0] & 0x20))
1469893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
14714215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
14724215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         PNG_HANDLE_CHUNK_ALWAYS
1473893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_USER_CHUNKS_SUPPORTED)
14744215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         && png_ptr->read_user_chunk_fn == NULL
1475893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
14764215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         )
1477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
14784215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         png_chunk_error(png_ptr, "unknown critical chunk");
1479893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
14804215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      info_ptr = info_ptr; /* to quiet some compiler warnings */
1481893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1482893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1483893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
1484893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS)
1485893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1486893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K
1487893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (length > (png_uint_32)65535L)
1488893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1489893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          png_warning(png_ptr, "unknown chunk too large to fit in memory");
1490893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          skip = length - (png_uint_32)65535L;
1491893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          length = (png_uint_32)65535L;
1492893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1493893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1494893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_memcpy((png_charp)png_ptr->unknown_chunk.name,
1495893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                 (png_charp)png_ptr->chunk_name,
1496893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                 png_sizeof(png_ptr->unknown_chunk.name));
14974215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name) - 1]
14984215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project        = '\0';
1499893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1500893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->unknown_chunk.size = (png_size_t)length;
1501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (length == 0)
1502893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->unknown_chunk.data = NULL;
1503893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
1504893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
15054215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr,
15064215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project       (png_uint_32)length);
1507893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length);
1508893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1509893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_USER_CHUNKS_SUPPORTED)
15104215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      if (png_ptr->read_user_chunk_fn != NULL)
1511893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1512893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         /* callback to user unknown chunk handler */
1513893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         int ret;
1514893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         ret = (*(png_ptr->read_user_chunk_fn))
1515893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project           (png_ptr, &png_ptr->unknown_chunk);
1516893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (ret < 0)
1517893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_chunk_error(png_ptr, "error in user chunk");
1518893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (ret == 0)
1519893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
1520893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (!(png_ptr->chunk_name[0] & 0x20))
15214215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project               if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
1522893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    PNG_HANDLE_CHUNK_ALWAYS)
1523893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_chunk_error(png_ptr, "unknown critical chunk");
1524893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_set_unknown_chunks(png_ptr, info_ptr,
1525893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               &png_ptr->unknown_chunk, 1);
1526893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1527893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1528893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
1529893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1530893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1);
1531893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_free(png_ptr, png_ptr->unknown_chunk.data);
1532893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->unknown_chunk.data = NULL;
1533893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1534893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else
1535893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1536893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      skip=length;
1537893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_push_crc_skip(png_ptr, skip);
1538893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1539893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1540893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
1541893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_have_info(png_structp png_ptr, png_infop info_ptr)
1542893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1543893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->info_fn != NULL)
1544893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      (*(png_ptr->info_fn))(png_ptr, info_ptr);
1545893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1546893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1547893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
1548893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_have_end(png_structp png_ptr, png_infop info_ptr)
1549893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1550893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->end_fn != NULL)
1551893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      (*(png_ptr->end_fn))(png_ptr, info_ptr);
1552893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1553893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1554893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
1555893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_have_row(png_structp png_ptr, png_bytep row)
1556893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1557893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->row_fn != NULL)
1558893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      (*(png_ptr->row_fn))(png_ptr, row, png_ptr->row_number,
1559893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         (int)png_ptr->pass);
1560893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1561893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1562893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
1563893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_progressive_combine_row (png_structp png_ptr,
1564893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_bytep old_row, png_bytep new_row)
1565893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1566893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS
1567893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   PNG_CONST int FARDATA png_pass_dsp_mask[7] =
1568893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff};
1569893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
15704215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   if (png_ptr == NULL) return;
1571893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (new_row != NULL)    /* new_row must == png_ptr->row_buf here. */
1572893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]);
1573893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1574893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1575893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
1576893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr,
1577893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn,
1578893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_progressive_end_ptr end_fn)
1579893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
15804215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   if (png_ptr == NULL) return;
1581893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->info_fn = info_fn;
1582893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->row_fn = row_fn;
1583893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->end_fn = end_fn;
1584893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1585893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer);
1586893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1587893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1588893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_voidp PNGAPI
1589893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_get_progressive_ptr(png_structp png_ptr)
1590893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
15914215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   if (png_ptr == NULL) return (NULL);
1592893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   return png_ptr->io_ptr;
1593893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1594893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
1595