1893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
2893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* pngpread.c - read a png file in push mode
3893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *
45f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * Last changed in libpng 1.2.44 [June 26, 2010]
55f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * Copyright (c) 1998-2010 Glenn Randers-Pehrson
6893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
7893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
8a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott *
9a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * This code is released under the libpng license.
10a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * For conditions of distribution and use, see the disclaimer
11a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * and license in png.h
12893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
13893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
14893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_INTERNAL
155f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#define PNG_NO_PEDANTIC_WARNINGS
16893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include "png.h"
17893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
18893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
19a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Push model modes */
20893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_SIG_MODE   0
21893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_CHUNK_MODE 1
22893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_IDAT_MODE  2
23893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_SKIP_MODE       3
24893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_tEXt_MODE  4
25893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_zTXt_MODE  5
26893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_DONE_MODE  6
27893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_iTXt_MODE  7
28893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_ERROR_MODE      8
29893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
30893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
31893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_process_data(png_structp png_ptr, png_infop info_ptr,
32893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_bytep buffer, png_size_t buffer_size)
33893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
34a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL || info_ptr == NULL)
35a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
36a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
37893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_push_restore_buffer(png_ptr, buffer, buffer_size);
38893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
39893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   while (png_ptr->buffer_size)
40893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
41893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_process_some_data(png_ptr, info_ptr);
42893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
43893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
44893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
45893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* What we do with the incoming data depends on what we were previously
46893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * doing before we ran out of data...
47893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
48893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
49893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_process_some_data(png_structp png_ptr, png_infop info_ptr)
50893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
51a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
52a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
53a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
54893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   switch (png_ptr->process_mode)
55893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
56893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      case PNG_READ_SIG_MODE:
57893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
58893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_read_sig(png_ptr, info_ptr);
59893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         break;
60893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
61a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
62893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      case PNG_READ_CHUNK_MODE:
63893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
64893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_read_chunk(png_ptr, info_ptr);
65893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         break;
66893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
67a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
68893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      case PNG_READ_IDAT_MODE:
69893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
70893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_read_IDAT(png_ptr);
71893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         break;
72893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
73a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
745f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tEXt_SUPPORTED
75893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      case PNG_READ_tEXt_MODE:
76893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
77893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_read_tEXt(png_ptr, info_ptr);
78893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         break;
79893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
80a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
81893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
825f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_zTXt_SUPPORTED
83893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      case PNG_READ_zTXt_MODE:
84893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
85893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_read_zTXt(png_ptr, info_ptr);
86893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         break;
87893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
88a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
89893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
905f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_iTXt_SUPPORTED
91893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      case PNG_READ_iTXt_MODE:
92893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
93893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_read_iTXt(png_ptr, info_ptr);
94893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         break;
95893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
96a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
97893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
98893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      case PNG_SKIP_MODE:
99893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
100893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_crc_finish(png_ptr);
101893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         break;
102893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
103a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      default:
105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->buffer_size = 0;
107893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         break;
108893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
109893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
111893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
112893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Read any remaining signature bytes from the stream and compare them with
113893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * the correct PNG signature.  It is possible that this routine is called
114893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * with bytes already read from the signature, either because they have been
115893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * checked by the calling application, or because of multiple calls to this
116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * routine.
117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_read_sig(png_structp png_ptr, png_infop info_ptr)
120893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_size_t num_checked = png_ptr->sig_bytes,
122893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project             num_to_check = 8 - num_checked;
123893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
124893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->buffer_size < num_to_check)
125893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
126893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      num_to_check = png_ptr->buffer_size;
127893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_push_fill_buffer(png_ptr, &(info_ptr->signature[num_checked]),
130893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      num_to_check);
1314215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes + num_to_check);
132893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
133893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check))
134893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
135893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (num_checked < 4 &&
136893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4))
137893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_error(png_ptr, "Not a PNG file");
138893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
139893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_error(png_ptr, "PNG file corrupted by ASCII conversion");
140893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
141893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else
142893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
143893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->sig_bytes >= 8)
144893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
145893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->process_mode = PNG_READ_CHUNK_MODE;
146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
147893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
149893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
150893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
151893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
152893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
153893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS
154893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_IHDR;
155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_IDAT;
156893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_IEND;
157893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_PLTE;
1585f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_bKGD_SUPPORTED
159893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_bKGD;
160893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1615f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_cHRM_SUPPORTED
162893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_cHRM;
163893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1645f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_gAMA_SUPPORTED
165893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_gAMA;
166893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1675f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_hIST_SUPPORTED
168893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_hIST;
169893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1705f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_iCCP_SUPPORTED
171893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_iCCP;
172893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1735f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_iTXt_SUPPORTED
174893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_iTXt;
175893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1765f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_oFFs_SUPPORTED
177893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_oFFs;
178893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1795f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_pCAL_SUPPORTED
180893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_pCAL;
181893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1825f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_pHYs_SUPPORTED
183893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_pHYs;
184893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1855f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sBIT_SUPPORTED
186893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_sBIT;
187893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1885f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sCAL_SUPPORTED
189893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_sCAL;
190893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1915f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sRGB_SUPPORTED
192893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_sRGB;
193893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1945f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sPLT_SUPPORTED
195893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_sPLT;
196893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1975f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tEXt_SUPPORTED
198893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_tEXt;
199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
2005f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tIME_SUPPORTED
201893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_tIME;
202893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
2035f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tRNS_SUPPORTED
204893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_tRNS;
205893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
2065f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_zTXt_SUPPORTED
207893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_zTXt;
208893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
209893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USE_LOCAL_ARRAYS */
2105f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
211893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* First we make sure we have enough data for the 4 byte chunk name
212893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * and the 4 byte chunk length before proceeding with decoding the
213893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * chunk data.  To fully decode each of these chunks, we also make
214893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * sure we have enough data in the buffer for the 4 byte CRC at the
215893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * end of every chunk (except IDAT, which is handled separately).
216893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    */
217893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_byte chunk_length[4];
220893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
221893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->buffer_size < 8)
222893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
223893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
224893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
225893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
226893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
227893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_fill_buffer(png_ptr, chunk_length, 4);
2284215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length);
229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_reset_crc(png_ptr);
230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_crc_read(png_ptr, png_ptr->chunk_name, 4);
2314215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      png_check_chunk_name(png_ptr, png_ptr->chunk_name);
232893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
235893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
2364215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project     if (png_ptr->mode & PNG_AFTER_IDAT)
237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
238893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
239893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4))
240893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
2414215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      if (png_ptr->push_length != 13)
2424215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         png_error(png_ptr, "Invalid IHDR length");
243a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
244893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
245893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
247893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
248893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
249a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length);
251893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
252a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
253893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4))
254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
255893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
257893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
258893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
259893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
260a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
261893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length);
262893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
263893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->process_mode = PNG_READ_DONE_MODE;
264893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_have_end(png_ptr, info_ptr);
265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
266a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
267893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
268893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name))
269893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
271893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
272893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
273893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
274893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
275a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
276893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
277893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->mode |= PNG_HAVE_IDAT;
278a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
279893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length);
280a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
281893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
282893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->mode |= PNG_HAVE_PLTE;
283a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
284893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
285893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
286893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (!(png_ptr->mode & PNG_HAVE_IHDR))
287893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_error(png_ptr, "Missing IHDR before IDAT");
288a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
289893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
290893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  !(png_ptr->mode & PNG_HAVE_PLTE))
291893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_error(png_ptr, "Missing PLTE before IDAT");
292893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
293893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
294a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
295893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
296893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
297893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
298893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
299893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
300893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
301893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
302893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
303893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length);
304893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
305a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
306893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
307893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
308893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      /* If we reach an IDAT chunk, this means we have read all of the
309893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       * header chunks, and we can start reading the image (or if this
310893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       * is called after the image has been read - we have an error).
311893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       */
312a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
313a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      if (!(png_ptr->mode & PNG_HAVE_IHDR))
314a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         png_error(png_ptr, "Missing IHDR before IDAT");
315a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
316a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
317a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott          !(png_ptr->mode & PNG_HAVE_PLTE))
318a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         png_error(png_ptr, "Missing PLTE before IDAT");
319893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
320893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->mode & PNG_HAVE_IDAT)
321893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
322893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (!(png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT))
323a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott            if (png_ptr->push_length == 0)
324a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott               return;
325893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
326893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (png_ptr->mode & PNG_AFTER_IDAT)
327893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_error(png_ptr, "Too many IDAT's found");
328893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
329893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
330893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->idat_size = png_ptr->push_length;
331893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->mode |= PNG_HAVE_IDAT;
332893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->process_mode = PNG_READ_IDAT_MODE;
333893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_have_info(png_ptr, info_ptr);
3345f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      png_ptr->zstream.avail_out =
3355f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott          (uInt) PNG_ROWBYTES(png_ptr->pixel_depth,
3365f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott          png_ptr->iwidth) + 1;
337893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->zstream.next_out = png_ptr->row_buf;
338893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return;
339893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
340a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
3415f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_gAMA_SUPPORTED
342893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 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      }
349a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
350893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length);
351893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
352a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
353893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
3545f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sBIT_SUPPORTED
355893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4))
356893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
357893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
358893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
359893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
360893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
361893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
362a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
363893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length);
364893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
365a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
366893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
3675f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_cHRM_SUPPORTED
368893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4))
369893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
371893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
372893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
374893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
375a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
376893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length);
377893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
378a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
379893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
3805f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sRGB_SUPPORTED
381893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4))
382893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
383893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
384893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
386893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
387893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
388a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length);
390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
391a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
3935f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_iCCP_SUPPORTED
394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4))
395893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
396893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
397893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
398893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
399893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
400893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
401a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length);
403893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
404a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
405893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
4065f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sPLT_SUPPORTED
407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4))
408893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
413893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
414a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length);
416893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
417a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
418893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
4195f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tRNS_SUPPORTED
420893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4))
421893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
422893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
423893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
424893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
425893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
426893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
427a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length);
429893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
430a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
431893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
4325f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_bKGD_SUPPORTED
433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4))
434893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
435893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
438893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
439893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
440a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
441893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length);
442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
443a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
444893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
4455f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_hIST_SUPPORTED
446893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4))
447893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
448893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
449893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
450893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
451893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
452893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
453a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
454893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length);
455893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
456a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
457893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
4585f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_pHYs_SUPPORTED
459893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4))
460893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
461893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
462893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
463893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
464893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
465893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
466a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
467893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length);
468893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
469a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
4715f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_oFFs_SUPPORTED
472893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4))
473893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
474893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
475893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
476893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
478893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
479a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
480893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length);
481893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
482893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
483a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
4845f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_pCAL_SUPPORTED
485893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 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      }
492a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
493893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length);
494893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
495a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
496893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
4975f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sCAL_SUPPORTED
498893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4))
499893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
500893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
502893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
503893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
504893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
505a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
506893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length);
507893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
508a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
509893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
5105f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tIME_SUPPORTED
511893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4))
512893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
513893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
514893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
515893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
516893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
517893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
518a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
519893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length);
520893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
521a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
522893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
5235f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tEXt_SUPPORTED
524893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4))
525893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
526893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
527893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
528893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
529893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
530893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
531a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
532893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length);
533893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
534a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
535893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
5365f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_zTXt_SUPPORTED
537893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4))
538893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
539893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
540893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
541893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
542893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
543893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
544a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
545893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length);
546893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
547a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
548893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
5495f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_iTXt_SUPPORTED
550893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4))
551893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
552893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
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      }
557a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
558893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length);
559893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
560a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
561893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
562893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else
563893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
564893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->push_length + 4 > png_ptr->buffer_size)
565893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
566893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
567893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
568893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
569893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length);
570893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
571893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
572893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
573893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
574893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
575893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
576893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_crc_skip(png_structp png_ptr, png_uint_32 skip)
577893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
578893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->process_mode = PNG_SKIP_MODE;
579893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->skip_length = skip;
580893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
581893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
582893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
583893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_crc_finish(png_structp png_ptr)
584893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
585893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->skip_length && png_ptr->save_buffer_size)
586893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
587893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_size_t save_size;
588893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
589893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->skip_length < (png_uint_32)png_ptr->save_buffer_size)
590893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         save_size = (png_size_t)png_ptr->skip_length;
591893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
592893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         save_size = png_ptr->save_buffer_size;
593893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
594893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size);
595893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
596893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->skip_length -= save_size;
597893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->buffer_size -= save_size;
598893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->save_buffer_size -= save_size;
599893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->save_buffer_ptr += save_size;
600893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
601893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->skip_length && png_ptr->current_buffer_size)
602893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
603893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_size_t save_size;
604893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
605893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->skip_length < (png_uint_32)png_ptr->current_buffer_size)
606893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         save_size = (png_size_t)png_ptr->skip_length;
607893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
608893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         save_size = png_ptr->current_buffer_size;
609893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
610893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size);
611893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
612893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->skip_length -= save_size;
613893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->buffer_size -= save_size;
614893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_buffer_size -= save_size;
615893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_buffer_ptr += save_size;
616893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
617893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!png_ptr->skip_length)
618893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
619893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->buffer_size < 4)
620893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
621893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
622893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
623893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
624893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
625893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_crc_finish(png_ptr, 0);
626893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->process_mode = PNG_READ_CHUNK_MODE;
627893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
628893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
629893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
630893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
631893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length)
632893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
633893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_bytep ptr;
634893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
635a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
636a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
637a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
638893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   ptr = buffer;
639893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->save_buffer_size)
640893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
641893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_size_t save_size;
642893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
643893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (length < png_ptr->save_buffer_size)
644893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         save_size = length;
645893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
646893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         save_size = png_ptr->save_buffer_size;
647893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
648893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_memcpy(ptr, png_ptr->save_buffer_ptr, save_size);
649893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      length -= save_size;
650893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      ptr += save_size;
651893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->buffer_size -= save_size;
652893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->save_buffer_size -= save_size;
653893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->save_buffer_ptr += save_size;
654893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
655893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (length && png_ptr->current_buffer_size)
656893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
657893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_size_t save_size;
658893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
659893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (length < png_ptr->current_buffer_size)
660893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         save_size = length;
661a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
662893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
663893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         save_size = png_ptr->current_buffer_size;
664893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
665893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_memcpy(ptr, png_ptr->current_buffer_ptr, save_size);
666893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->buffer_size -= save_size;
667893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_buffer_size -= save_size;
668893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_buffer_ptr += save_size;
669893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
670893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
671893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
672893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
673893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_save_buffer(png_structp png_ptr)
674893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
675893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->save_buffer_size)
676893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
677893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->save_buffer_ptr != png_ptr->save_buffer)
678893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
6794215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         png_size_t i, istop;
680893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_bytep sp;
681893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_bytep dp;
682893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
683893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         istop = png_ptr->save_buffer_size;
684893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer;
685893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            i < istop; i++, sp++, dp++)
686893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
687893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            *dp = *sp;
688893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
689893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
690893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
691893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->save_buffer_size + png_ptr->current_buffer_size >
692893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->save_buffer_max)
693893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
694893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_size_t new_max;
695893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_bytep old_buffer;
696893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
697893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->save_buffer_size > PNG_SIZE_MAX -
698893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         (png_ptr->current_buffer_size + 256))
699893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
700893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        png_error(png_ptr, "Potential overflow of save_buffer");
701893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
702a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
703893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256;
704893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      old_buffer = png_ptr->save_buffer;
7055f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      png_ptr->save_buffer = (png_bytep)png_malloc_warn(png_ptr,
706893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         (png_uint_32)new_max);
7075f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      if (png_ptr->save_buffer == NULL)
7085f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      {
7095f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott        png_free(png_ptr, old_buffer);
7105f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott        png_error(png_ptr, "Insufficient memory for save_buffer");
7115f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      }
712893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size);
713893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_free(png_ptr, old_buffer);
714893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->save_buffer_max = new_max;
715893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
716893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->current_buffer_size)
717893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
718893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size,
719893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->current_buffer_ptr, png_ptr->current_buffer_size);
720893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->save_buffer_size += png_ptr->current_buffer_size;
721893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_buffer_size = 0;
722893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
723893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->save_buffer_ptr = png_ptr->save_buffer;
724893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->buffer_size = 0;
725893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
726893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
727893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
728893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_restore_buffer(png_structp png_ptr, png_bytep buffer,
729893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_size_t buffer_length)
730893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
731893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_buffer = buffer;
732893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_buffer_size = buffer_length;
733893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->buffer_size = buffer_length + png_ptr->save_buffer_size;
734893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_buffer_ptr = png_ptr->current_buffer;
735893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
736893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
737893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
738893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_read_IDAT(png_structp png_ptr)
739893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
740893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS
741893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   PNG_CONST PNG_IDAT;
742893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
743893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
744893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
745893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_byte chunk_length[4];
746893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
747893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->buffer_size < 8)
748893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
749893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
750893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
751893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
752893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
753893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_fill_buffer(png_ptr, chunk_length, 4);
7544215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length);
755893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_reset_crc(png_ptr);
756893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_crc_read(png_ptr, png_ptr->chunk_name, 4);
757893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
758893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
759893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
760893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
761893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->process_mode = PNG_READ_CHUNK_MODE;
762893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
763893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_error(png_ptr, "Not enough compressed data");
764893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
765893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
766893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
767893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->idat_size = png_ptr->push_length;
768893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
769893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->idat_size && png_ptr->save_buffer_size)
770893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
771893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_size_t save_size;
772893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
773893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->idat_size < (png_uint_32)png_ptr->save_buffer_size)
774893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
775893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         save_size = (png_size_t)png_ptr->idat_size;
776a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
777a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         /* Check for overflow */
7784215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         if ((png_uint_32)save_size != png_ptr->idat_size)
779893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_error(png_ptr, "save_size overflowed in pngpread");
780893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
781893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
782893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         save_size = png_ptr->save_buffer_size;
783893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
784893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size);
785a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
7865f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size);
787a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
788893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->idat_size -= save_size;
789893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->buffer_size -= save_size;
790893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->save_buffer_size -= save_size;
791893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->save_buffer_ptr += save_size;
792893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
793893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->idat_size && png_ptr->current_buffer_size)
794893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
795893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_size_t save_size;
796893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
797893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->idat_size < (png_uint_32)png_ptr->current_buffer_size)
798893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
799893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         save_size = (png_size_t)png_ptr->idat_size;
800a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
801a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         /* Check for overflow */
8024215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         if ((png_uint_32)save_size != png_ptr->idat_size)
803893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_error(png_ptr, "save_size overflowed in pngpread");
804893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
805893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
806893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         save_size = png_ptr->current_buffer_size;
807893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
808893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size);
8095f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
8105f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size);
811893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
812893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->idat_size -= save_size;
813893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->buffer_size -= save_size;
814893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_buffer_size -= save_size;
815893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_buffer_ptr += save_size;
816893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
817893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!png_ptr->idat_size)
818893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
819893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->buffer_size < 4)
820893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
821893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
822893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
823893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
824893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
825893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_crc_finish(png_ptr, 0);
826893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
827893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->mode |= PNG_AFTER_IDAT;
828893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
829893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
830893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
831893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
832893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_process_IDAT_data(png_structp png_ptr, png_bytep buffer,
833893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_size_t buffer_length)
834893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
8355f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   /* The caller checks for a non-zero buffer length. */
8365f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   if (!(buffer_length > 0) || buffer == NULL)
8375f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      png_error(png_ptr, "No IDAT data (internal error)");
838893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
8395f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   /* This routine must process all the data it has been given
8405f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott    * before returning, calling the row callback as required to
8415f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott    * handle the uncompressed results.
8425f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott    */
843893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->zstream.next_in = buffer;
844893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->zstream.avail_in = (uInt)buffer_length;
8455f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
8465f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   /* Keep going until the decompressed data is all processed
8475f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott    * or the stream marked as finished.
8485f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott    */
8495f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   while (png_ptr->zstream.avail_in > 0 &&
8505f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott	  !(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
851893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
8525f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      int ret;
853a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
8545f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      /* We have data for zlib, but we must check that zlib
8555f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott       * has somewhere to put the results.  It doesn't matter
8565f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott       * if we don't expect any results -- it may be the input
8575f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott       * data is just the LZ end code.
8585f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott       */
8595f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      if (!(png_ptr->zstream.avail_out > 0))
8605f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      {
8615f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         png_ptr->zstream.avail_out =
8625f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott             (uInt) PNG_ROWBYTES(png_ptr->pixel_depth,
8635f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott             png_ptr->iwidth) + 1;
8645f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         png_ptr->zstream.next_out = png_ptr->row_buf;
8655f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      }
866893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
8675f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      /* Using Z_SYNC_FLUSH here means that an unterminated
8685f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott       * LZ stream can still be handled (a stream with a missing
8695f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott       * end code), otherwise (Z_NO_FLUSH) a future zlib
8705f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott       * implementation might defer output and, therefore,
8715f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott       * change the current behavior.  (See comments in inflate.c
8725f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott       * for why this doesn't happen at present with zlib 1.2.5.)
8735f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott       */
8745f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      ret = inflate(&png_ptr->zstream, Z_SYNC_FLUSH);
875a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
8765f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      /* Check for any failure before proceeding. */
8775f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      if (ret != Z_OK && ret != Z_STREAM_END)
8785f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      {
8795f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott	 /* Terminate the decompression. */
8805f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott	 png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
8815f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
8825f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         /* This may be a truncated stream (missing or
8835f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott	  * damaged end code).  Treat that as a warning.
8845f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott	  */
8855f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         if (png_ptr->row_number >= png_ptr->num_rows ||
8865f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott	     png_ptr->pass > 6)
8875f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott	    png_warning(png_ptr, "Truncated compressed data in IDAT");
8885f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott	 else
8895f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott	    png_error(png_ptr, "Decompression error in IDAT");
8905f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
8915f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott	 /* Skip the check on unprocessed input */
8925f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         return;
893893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
8945f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
8955f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      /* Did inflate output any data? */
8965f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      if (png_ptr->zstream.next_out != png_ptr->row_buf)
897893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
8985f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott	 /* Is this unexpected data after the last row?
8995f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott	  * If it is, artificially terminate the LZ output
9005f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott	  * here.
9015f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott	  */
9025f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         if (png_ptr->row_number >= png_ptr->num_rows ||
9035f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott	     png_ptr->pass > 6)
904893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
9055f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott	    /* Extra data. */
9065f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott	    png_warning(png_ptr, "Extra compressed data in IDAT");
9075f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott            png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
9085f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott	    /* Do no more processing; skip the unprocessed
9095f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott	     * input check below.
9105f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott	     */
9115f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott            return;
9125f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott	 }
9135f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
9145f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott	 /* Do we have a complete row? */
9155f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott	 if (png_ptr->zstream.avail_out == 0)
9165f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott	    png_push_process_row(png_ptr);
917893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
918a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
9195f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      /* And check for the end of the stream. */
9205f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      if (ret == Z_STREAM_END)
9215f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott	 png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
922893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
9235f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
9245f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   /* All the data should have been processed, if anything
9255f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott    * is left at this point we have bytes of IDAT data
9265f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott    * after the zlib end code.
9275f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott    */
9285f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   if (png_ptr->zstream.avail_in > 0)
9295f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      png_warning(png_ptr, "Extra compression data");
930893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
931893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
932893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
933893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_process_row(png_structp png_ptr)
934893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
935893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->row_info.color_type = png_ptr->color_type;
936893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->row_info.width = png_ptr->iwidth;
937893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->row_info.channels = png_ptr->channels;
938893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->row_info.bit_depth = png_ptr->bit_depth;
939893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->row_info.pixel_depth = png_ptr->pixel_depth;
940893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
941893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,
942893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       png_ptr->row_info.width);
943893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
944893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_read_filter_row(png_ptr, &(png_ptr->row_info),
9455f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott       png_ptr->row_buf + 1, png_ptr->prev_row + 1,
9465f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott       (int)(png_ptr->row_buf[0]));
947893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
948893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf,
949893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->rowbytes + 1);
950893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
951893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA))
952893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_do_read_transformations(png_ptr);
953893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
9545f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_INTERLACING_SUPPORTED
955a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Blow up interlaced rows to full size */
956893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
957893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
958893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->pass < 6)
959893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/*       old interface (pre-1.0.9):
960893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_do_read_interlace(&(png_ptr->row_info),
9615f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott             png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations);
962893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
963893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_do_read_interlace(png_ptr);
964893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
965893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    switch (png_ptr->pass)
966893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    {
967893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         case 0:
968893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
969893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            int i;
970893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0; i < 8 && png_ptr->pass == 0; i++)
971893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
972893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
973a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott               png_read_push_finish_row(png_ptr); /* Updates png_ptr->pass */
974893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
975a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
976a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott            if (png_ptr->pass == 2) /* Pass 1 might be empty */
977893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
978893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               for (i = 0; i < 4 && png_ptr->pass == 2; i++)
979893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               {
980893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_push_have_row(png_ptr, png_bytep_NULL);
981893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_read_push_finish_row(png_ptr);
982893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               }
983893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
984a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
985893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (png_ptr->pass == 4 && png_ptr->height <= 4)
986893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
987893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               for (i = 0; i < 2 && png_ptr->pass == 4; i++)
988893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               {
989893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_push_have_row(png_ptr, png_bytep_NULL);
990893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_read_push_finish_row(png_ptr);
991893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               }
992893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
993a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
994893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (png_ptr->pass == 6 && png_ptr->height <= 4)
995893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
9965f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott                  png_push_have_row(png_ptr, png_bytep_NULL);
997893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                png_read_push_finish_row(png_ptr);
998893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
999a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1000893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
1001893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1002a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1003893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         case 1:
1004893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
1005893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            int i;
1006893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0; i < 8 && png_ptr->pass == 1; i++)
1007893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
1008893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
1009893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_push_finish_row(png_ptr);
1010893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
1011a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1012a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott            if (png_ptr->pass == 2) /* Skip top 4 generated rows */
1013893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
1014893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               for (i = 0; i < 4 && png_ptr->pass == 2; i++)
1015893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               {
1016893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_push_have_row(png_ptr, png_bytep_NULL);
1017893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_read_push_finish_row(png_ptr);
1018893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               }
1019893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
1020a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1021893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
1022893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1023a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1024893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         case 2:
1025893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
1026893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            int i;
1027a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1028893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0; i < 4 && png_ptr->pass == 2; i++)
1029893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
1030893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
1031893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_push_finish_row(png_ptr);
1032893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
1033a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1034893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0; i < 4 && png_ptr->pass == 2; i++)
1035893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
10365f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott                  png_push_have_row(png_ptr, png_bytep_NULL);
1037893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_push_finish_row(png_ptr);
1038893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
1039a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1040a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott            if (png_ptr->pass == 4) /* Pass 3 might be empty */
1041893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
1042893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               for (i = 0; i < 2 && png_ptr->pass == 4; i++)
1043893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               {
1044893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_push_have_row(png_ptr, png_bytep_NULL);
1045893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_read_push_finish_row(png_ptr);
1046893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               }
1047893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
1048a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1049893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
1050893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1051a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1052893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         case 3:
1053893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
1054893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            int i;
1055a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1056893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0; i < 4 && png_ptr->pass == 3; i++)
1057893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
1058893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
1059893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_push_finish_row(png_ptr);
1060893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
1061a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1062a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott            if (png_ptr->pass == 4) /* Skip top two generated rows */
1063893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
1064893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               for (i = 0; i < 2 && png_ptr->pass == 4; i++)
1065893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               {
1066893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_push_have_row(png_ptr, png_bytep_NULL);
1067893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_read_push_finish_row(png_ptr);
1068893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               }
1069893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
1070a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1071893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
1072893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1073a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1074893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         case 4:
1075893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
1076893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            int i;
1077a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1078893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0; i < 2 && png_ptr->pass == 4; i++)
1079893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
1080893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
1081893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_push_finish_row(png_ptr);
1082893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
1083a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1084893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0; i < 2 && png_ptr->pass == 4; i++)
1085893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
10865f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott                  png_push_have_row(png_ptr, png_bytep_NULL);
1087893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_push_finish_row(png_ptr);
1088893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
1089a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1090a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott            if (png_ptr->pass == 6) /* Pass 5 might be empty */
1091893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
10925f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott                  png_push_have_row(png_ptr, png_bytep_NULL);
1093893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_push_finish_row(png_ptr);
1094893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
1095a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1096893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
1097893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1098a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1099893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         case 5:
1100893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
1101893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            int i;
1102a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1103893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0; i < 2 && png_ptr->pass == 5; i++)
1104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
1105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
1106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_push_finish_row(png_ptr);
1107893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
1108a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1109a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott            if (png_ptr->pass == 6) /* Skip top generated row */
1110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
11115f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott                  png_push_have_row(png_ptr, png_bytep_NULL);
1112893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_push_finish_row(png_ptr);
1113893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
1114a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1115893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
1116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         case 6:
1118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
1119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_push_have_row(png_ptr, png_ptr->row_buf + 1);
1120893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_read_push_finish_row(png_ptr);
1121a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1122893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (png_ptr->pass != 6)
1123893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               break;
1124a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
11255f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott                  png_push_have_row(png_ptr, png_bytep_NULL);
1126893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_read_push_finish_row(png_ptr);
1127893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1130893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else
1131893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1132893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1133893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_have_row(png_ptr, png_ptr->row_buf + 1);
1134893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_read_push_finish_row(png_ptr);
1135893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1136893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1137893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1138893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
1139893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_read_push_finish_row(png_structp png_ptr)
1140893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1141893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS
1142a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
1143893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1144a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Start of interlace block */
1145893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
1146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1147a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Offset to next interlace block */
1148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
1149893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1150a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Start of interlace block in the y direction */
1151893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
1152893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1153a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Offset to next interlace block in the y direction */
1154893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   PNG_CONST int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
1155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1156893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* Height of interlace block.  This is not currently used - if you need
1157893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * it, uncomment it here and in png.h
1158893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   PNG_CONST int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1};
1159893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   */
1160893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1161893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1162893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->row_number++;
1163893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->row_number < png_ptr->num_rows)
1164893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return;
1165893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
11665f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_INTERLACING_SUPPORTED
1167893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->interlaced)
1168893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1169893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->row_number = 0;
1170893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_memset_check(png_ptr, png_ptr->prev_row, 0,
1171893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->rowbytes + 1);
1172893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      do
1173893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
11744215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         png_ptr->pass++;
11754215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         if ((png_ptr->pass == 1 && png_ptr->width < 5) ||
11764215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project             (png_ptr->pass == 3 && png_ptr->width < 3) ||
11774215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project             (png_ptr->pass == 5 && png_ptr->width < 2))
11784215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project           png_ptr->pass++;
11794215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
11804215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         if (png_ptr->pass > 7)
11814215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            png_ptr->pass--;
1182a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
11834215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         if (png_ptr->pass >= 7)
11844215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            break;
11854215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
11864215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         png_ptr->iwidth = (png_ptr->width +
11874215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            png_pass_inc[png_ptr->pass] - 1 -
11884215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            png_pass_start[png_ptr->pass]) /
11894215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            png_pass_inc[png_ptr->pass];
11904215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
11914215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         if (png_ptr->transformations & PNG_INTERLACE)
11924215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            break;
11934215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
11944215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         png_ptr->num_rows = (png_ptr->height +
11954215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            png_pass_yinc[png_ptr->pass] - 1 -
11964215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            png_pass_ystart[png_ptr->pass]) /
11974215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            png_pass_yinc[png_ptr->pass];
1198893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0);
1200893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1201a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott#endif /* PNG_READ_INTERLACING_SUPPORTED */
1202893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1203893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
12045f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tEXt_SUPPORTED
1205893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
1206893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
1207893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   length)
1208893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1209893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
1210893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1211893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_error(png_ptr, "Out of place tEXt");
1212a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         info_ptr = info_ptr; /* To quiet some compiler warnings */
1213893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1214893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1215893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K
1216893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->skip_length = 0;  /* This may not be necessary */
1217893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */
1219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1220893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_warning(png_ptr, "tEXt chunk too large to fit in memory");
1221893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->skip_length = length - (png_uint_32)65535L;
1222893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      length = (png_uint_32)65535L;
1223893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1224893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1225893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1226893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text = (png_charp)png_malloc(png_ptr,
12274215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      (png_uint_32)(length + 1));
1228893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text[length] = '\0';
1229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text_ptr = png_ptr->current_text;
1230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text_size = (png_size_t)length;
1231893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text_left = (png_size_t)length;
1232893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->process_mode = PNG_READ_tEXt_MODE;
1233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1235893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
1236893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_read_tEXt(png_structp png_ptr, png_infop info_ptr)
1237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1238893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->buffer_size && png_ptr->current_text_left)
1239893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1240893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_size_t text_size;
1241893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1242893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->buffer_size < png_ptr->current_text_left)
1243893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         text_size = png_ptr->buffer_size;
1244a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1245893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
1246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         text_size = png_ptr->current_text_left;
1247a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1248893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
1249893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_text_left -= text_size;
1250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_text_ptr += text_size;
1251893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1252893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!(png_ptr->current_text_left))
1253893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_textp text_ptr;
1255893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_charp text;
1256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_charp key;
1257893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int ret;
1258893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1259893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->buffer_size < 4)
1260893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1261893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
1262893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
1263893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1264893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_crc_finish(png_ptr);
1266893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
12675f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_MAX_MALLOC_64K
1268893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->skip_length)
1269893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
1270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1271893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1272893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      key = png_ptr->current_text;
1273893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1274893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (text = key; *text; text++)
1275a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         /* Empty loop */ ;
1276893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1277893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (text < key + png_ptr->current_text_size)
1278893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         text++;
1279893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1280893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr = (png_textp)png_malloc(png_ptr,
1281893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         (png_uint_32)png_sizeof(png_text));
1282893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->compression = PNG_TEXT_COMPRESSION_NONE;
1283893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->key = key;
1284893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_iTXt_SUPPORTED
1285893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->lang = NULL;
1286893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->lang_key = NULL;
1287893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1288893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->text = text;
1289893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1290893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
1291893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1292893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_free(png_ptr, key);
1293893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_free(png_ptr, text_ptr);
1294893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_text = NULL;
1295893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1296893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (ret)
1297893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        png_warning(png_ptr, "Insufficient memory to store text chunk.");
1298893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1299893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1300893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1301893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
13025f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_zTXt_SUPPORTED
1303893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
1304893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
1305893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   length)
1306893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1307893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
1308893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1309893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_error(png_ptr, "Out of place zTXt");
1310a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         info_ptr = info_ptr; /* To quiet some compiler warnings */
1311893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1312893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1313893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K
1314893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* We can't handle zTXt chunks > 64K, since we don't have enough space
1315893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * to be able to store the uncompressed data.  Actually, the threshold
1316893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * is probably around 32K, but it isn't as definite as 64K is.
1317893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    */
1318893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (length > (png_uint_32)65535L)
1319893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1320893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_warning(png_ptr, "zTXt chunk too large to fit in memory");
1321893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_crc_skip(png_ptr, length);
1322893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return;
1323893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1324893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1325893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1326893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text = (png_charp)png_malloc(png_ptr,
13274215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      (png_uint_32)(length + 1));
1328893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text[length] = '\0';
1329893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text_ptr = png_ptr->current_text;
1330893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text_size = (png_size_t)length;
1331893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text_left = (png_size_t)length;
1332893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->process_mode = PNG_READ_zTXt_MODE;
1333893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1334893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1335893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
1336893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_read_zTXt(png_structp png_ptr, png_infop info_ptr)
1337893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1338893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->buffer_size && png_ptr->current_text_left)
1339893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1340893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_size_t text_size;
1341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1342893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left)
1343893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         text_size = png_ptr->buffer_size;
1344a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1345893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
1346893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         text_size = png_ptr->current_text_left;
1347a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1348893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
1349893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_text_left -= text_size;
1350893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_text_ptr += text_size;
1351893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1352893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!(png_ptr->current_text_left))
1353893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1354893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_textp text_ptr;
1355893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_charp text;
1356893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_charp key;
1357893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int ret;
1358893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_size_t text_size, key_size;
1359893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1360893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->buffer_size < 4)
1361893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1362893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
1363893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
1364893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1365893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1366893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_crc_finish(png_ptr);
1367893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1368893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      key = png_ptr->current_text;
1369893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (text = key; *text; text++)
1371a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         /* Empty loop */ ;
1372893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      /* zTXt can't have zero text */
1374893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (text >= key + png_ptr->current_text_size)
1375893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1376893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->current_text = NULL;
1377893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_free(png_ptr, key);
1378893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
1379893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1380893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1381893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text++;
1382893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1383a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      if (*text != PNG_TEXT_COMPRESSION_zTXt) /* Check compression byte */
1384893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->current_text = NULL;
1386893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_free(png_ptr, key);
1387893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
1388893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text++;
1391893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->zstream.next_in = (png_bytep )text;
1393893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size -
1394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         (text - key));
1395893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->zstream.next_out = png_ptr->zbuf;
1396893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
1397893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1398893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      key_size = text - key;
1399893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_size = 0;
1400893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text = NULL;
1401893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      ret = Z_STREAM_END;
1402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1403893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      while (png_ptr->zstream.avail_in)
1404893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1405893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
1406893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (ret != Z_OK && ret != Z_STREAM_END)
1407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
1408893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            inflateReset(&png_ptr->zstream);
1409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_ptr->zstream.avail_in = 0;
1410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_ptr->current_text = NULL;
1411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_free(png_ptr, key);
1412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_free(png_ptr, text);
1413893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            return;
1414893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END)
1416893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
1417893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (text == NULL)
1418893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
1419893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               text = (png_charp)png_malloc(png_ptr,
14204215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project                     (png_uint_32)(png_ptr->zbuf_size
14214215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project                     - png_ptr->zstream.avail_out + key_size + 1));
1422a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1423893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_memcpy(text + key_size, png_ptr->zbuf,
1424893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_ptr->zbuf_size - png_ptr->zstream.avail_out);
1425a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1426893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_memcpy(text, key, key_size);
1427a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               text_size = key_size + png_ptr->zbuf_size -
1429893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_ptr->zstream.avail_out;
1430a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1431893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(text + text_size) = '\0';
1432893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
1433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            else
1434893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
1435893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_charp tmp;
1436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               tmp = text;
1438893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               text = (png_charp)png_malloc(png_ptr, text_size +
14394215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project                  (png_uint_32)(png_ptr->zbuf_size
14404215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project                  - png_ptr->zstream.avail_out + 1));
1441a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_memcpy(text, tmp, text_size);
1443893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_free(png_ptr, tmp);
1444a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1445893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_memcpy(text + text_size, png_ptr->zbuf,
1446893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_ptr->zbuf_size - png_ptr->zstream.avail_out);
1447a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1448893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out;
1449893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(text + text_size) = '\0';
1450893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
1451893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (ret != Z_STREAM_END)
1452893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
1453893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_ptr->zstream.next_out = png_ptr->zbuf;
1454893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
1455893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
1456893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1457893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else
1458893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
1459893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
1460893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1461893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1462893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (ret == Z_STREAM_END)
1463893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
1464893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1465893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1466893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      inflateReset(&png_ptr->zstream);
1467893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->zstream.avail_in = 0;
1468893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1469893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (ret != Z_STREAM_END)
1470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1471893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->current_text = NULL;
1472893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_free(png_ptr, key);
1473893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_free(png_ptr, text);
1474893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
1475893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1476893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_text = NULL;
1478893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_free(png_ptr, key);
1479893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      key = text;
1480893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text += key_size;
1481893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1482893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr = (png_textp)png_malloc(png_ptr,
1483893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          (png_uint_32)png_sizeof(png_text));
1484893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt;
1485893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->key = key;
1486893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_iTXt_SUPPORTED
1487893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->lang = NULL;
1488893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->lang_key = NULL;
1489893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1490893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->text = text;
1491893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1492893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
1493893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1494893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_free(png_ptr, key);
1495893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_free(png_ptr, text_ptr);
1496893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1497893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (ret)
1498893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        png_warning(png_ptr, "Insufficient memory to store text chunk.");
1499893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1500893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1502893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
15035f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_iTXt_SUPPORTED
1504893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
1505893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
1506893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   length)
1507893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1508893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
1509893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1510893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_error(png_ptr, "Out of place iTXt");
1511a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         info_ptr = info_ptr; /* To quiet some compiler warnings */
1512893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1513893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1514893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K
1515893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->skip_length = 0;  /* This may not be necessary */
1516893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1517893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */
1518893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1519893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_warning(png_ptr, "iTXt chunk too large to fit in memory");
1520893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->skip_length = length - (png_uint_32)65535L;
1521893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      length = (png_uint_32)65535L;
1522893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1523893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1524893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1525893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text = (png_charp)png_malloc(png_ptr,
15264215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      (png_uint_32)(length + 1));
1527893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text[length] = '\0';
1528893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text_ptr = png_ptr->current_text;
1529893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text_size = (png_size_t)length;
1530893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->current_text_left = (png_size_t)length;
1531893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->process_mode = PNG_READ_iTXt_MODE;
1532893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1533893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1534893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
1535893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_read_iTXt(png_structp png_ptr, png_infop info_ptr)
1536893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1537893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1538893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->buffer_size && png_ptr->current_text_left)
1539893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1540893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_size_t text_size;
1541893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1542893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->buffer_size < png_ptr->current_text_left)
1543893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         text_size = png_ptr->buffer_size;
1544a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1545893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
1546893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         text_size = png_ptr->current_text_left;
1547a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1548893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
1549893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_text_left -= text_size;
1550893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_text_ptr += text_size;
1551893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1552893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!(png_ptr->current_text_left))
1553893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1554893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_textp text_ptr;
1555893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_charp key;
1556893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int comp_flag;
1557893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_charp lang;
1558893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_charp lang_key;
1559893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_charp text;
1560893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int ret;
1561893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1562893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->buffer_size < 4)
1563893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1564893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_push_save_buffer(png_ptr);
1565893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
1566893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1567893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1568893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_push_crc_finish(png_ptr);
1569893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
15705f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_MAX_MALLOC_64K
1571893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->skip_length)
1572893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
1573893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1574893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1575893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      key = png_ptr->current_text;
1576893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1577893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (lang = key; *lang; lang++)
1578a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         /* Empty loop */ ;
1579893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1580893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (lang < key + png_ptr->current_text_size - 3)
1581893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         lang++;
1582893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1583893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      comp_flag = *lang++;
1584a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      lang++;     /* Skip comp_type, always zero */
1585893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1586893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (lang_key = lang; *lang_key; lang_key++)
1587a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         /* Empty loop */ ;
1588a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1589a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      lang_key++;        /* Skip NUL separator */
1590893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1591893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text=lang_key;
1592a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1593893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (lang_key < key + png_ptr->current_text_size - 1)
1594893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1595893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        for (; *text; text++)
1596a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott           /* Empty loop */ ;
1597893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1598893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1599893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (text < key + png_ptr->current_text_size)
1600893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         text++;
1601893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1602893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr = (png_textp)png_malloc(png_ptr,
1603893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         (png_uint_32)png_sizeof(png_text));
1604a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1605893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->compression = comp_flag + 2;
1606893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->key = key;
1607893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->lang = lang;
1608893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->lang_key = lang_key;
1609893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->text = text;
1610893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->text_length = 0;
1611893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      text_ptr->itxt_length = png_strlen(text);
1612893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1613893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
1614893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1615893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->current_text = NULL;
1616893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1617893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_free(png_ptr, text_ptr);
1618893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (ret)
16195f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         png_warning(png_ptr, "Insufficient memory to store iTXt chunk.");
1620893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1621893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1622893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1623893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1624893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* This function is called when we haven't found a handler for this
1625893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * chunk.  If there isn't a problem with the chunk itself (ie a bad chunk
1626893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * name or a critical chunk), the chunk is (currently) silently ignored.
1627893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
1628893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
1629893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32
1630893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   length)
1631893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
16324215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_uint_32 skip = 0;
1633893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1634893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!(png_ptr->chunk_name[0] & 0x20))
1635893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
16365f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
16374215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
16384215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         PNG_HANDLE_CHUNK_ALWAYS
16395f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
16404215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         && png_ptr->read_user_chunk_fn == NULL
1641893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
16424215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         )
1643893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
16444215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         png_chunk_error(png_ptr, "unknown critical chunk");
1645893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1646a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      info_ptr = info_ptr; /* To quiet some compiler warnings */
1647893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1648893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
16495f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
1650893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS)
1651893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1652893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K
1653893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (length > (png_uint_32)65535L)
1654893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1655893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          png_warning(png_ptr, "unknown chunk too large to fit in memory");
1656893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          skip = length - (png_uint_32)65535L;
1657893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          length = (png_uint_32)65535L;
1658893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1659893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1660893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_memcpy((png_charp)png_ptr->unknown_chunk.name,
1661893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                 (png_charp)png_ptr->chunk_name,
1662893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                 png_sizeof(png_ptr->unknown_chunk.name));
16634215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name) - 1]
16644215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project        = '\0';
1665893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1666893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->unknown_chunk.size = (png_size_t)length;
1667a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1668893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (length == 0)
1669893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->unknown_chunk.data = NULL;
1670a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1671893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
1672893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
16734215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr,
16745f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott            (png_uint_32)length);
1675893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length);
1676893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1677a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
16785f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
16794215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      if (png_ptr->read_user_chunk_fn != NULL)
1680893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1681a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         /* Callback to user unknown chunk handler */
1682893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         int ret;
1683893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         ret = (*(png_ptr->read_user_chunk_fn))
1684893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project           (png_ptr, &png_ptr->unknown_chunk);
1685a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1686893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (ret < 0)
1687893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_chunk_error(png_ptr, "error in user chunk");
1688a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1689893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (ret == 0)
1690893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
1691893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (!(png_ptr->chunk_name[0] & 0x20))
16924215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project               if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
1693893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    PNG_HANDLE_CHUNK_ALWAYS)
1694893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_chunk_error(png_ptr, "unknown critical chunk");
1695893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_set_unknown_chunks(png_ptr, info_ptr,
1696893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               &png_ptr->unknown_chunk, 1);
1697893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1698893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1699a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1700893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
1701893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1702893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1);
1703893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_free(png_ptr, png_ptr->unknown_chunk.data);
1704893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->unknown_chunk.data = NULL;
1705893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1706a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1707893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else
1708893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1709893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      skip=length;
1710893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_push_crc_skip(png_ptr, skip);
1711893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1712893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1713893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
1714893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_have_info(png_structp png_ptr, png_infop info_ptr)
1715893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1716893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->info_fn != NULL)
1717893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      (*(png_ptr->info_fn))(png_ptr, info_ptr);
1718893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1719893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1720893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
1721893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_have_end(png_structp png_ptr, png_infop info_ptr)
1722893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1723893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->end_fn != NULL)
1724893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      (*(png_ptr->end_fn))(png_ptr, info_ptr);
1725893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1726893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1727893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
1728893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_have_row(png_structp png_ptr, png_bytep row)
1729893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1730893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->row_fn != NULL)
1731893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      (*(png_ptr->row_fn))(png_ptr, row, png_ptr->row_number,
1732893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         (int)png_ptr->pass);
1733893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1734893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1735893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
1736893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_progressive_combine_row (png_structp png_ptr,
1737893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_bytep old_row, png_bytep new_row)
1738893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1739893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS
1740893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   PNG_CONST int FARDATA png_pass_dsp_mask[7] =
1741893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff};
1742893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
17435f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
1744a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
1745a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
1746a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1747893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (new_row != NULL)    /* new_row must == png_ptr->row_buf here. */
1748893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]);
1749893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1750893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1751893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
1752893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr,
1753893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn,
1754893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_progressive_end_ptr end_fn)
1755893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1756a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
1757a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
1758a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1759893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->info_fn = info_fn;
1760893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->row_fn = row_fn;
1761893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->end_fn = end_fn;
1762893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1763893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer);
1764893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1765893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1766893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_voidp PNGAPI
1767893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_get_progressive_ptr(png_structp png_ptr)
1768893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1769a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
1770a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return (NULL);
1771a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1772893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   return png_ptr->io_ptr;
1773893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1774893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
1775