1893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
2893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* pngread.c - read a PNG file
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.)
8893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *
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
12a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott *
13893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * This file contains routines that an application calls directly to
14893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * read a PNG file or stream.
15893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
16893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
17893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_INTERNAL
185f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#define PNG_NO_PEDANTIC_WARNINGS
19893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include "png.h"
205f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_SUPPORTED
215f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
22893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
23893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Create a PNG structure for reading, and allocate any memory needed. */
24893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_structp PNGAPI
25893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_create_read_struct(png_const_charp user_png_ver, png_voidp error_ptr,
26893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_error_ptr error_fn, png_error_ptr warn_fn)
27893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
28893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
29893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
30893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   return (png_create_read_struct_2(user_png_ver, error_ptr, error_fn,
31893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      warn_fn, png_voidp_NULL, png_malloc_ptr_NULL, png_free_ptr_NULL));
32893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
33893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
345f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott/* Alternate create PNG structure for reading, and allocate any memory
355f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * needed.
365f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott */
37893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_structp PNGAPI
38893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,
39893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,
40893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_malloc_ptr malloc_fn, png_free_ptr free_fn)
41893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
42893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */
43893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
444215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
454215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   volatile
464215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project#endif
47893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_structp png_ptr;
48893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
49893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
50893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef USE_FAR_KEYWORD
51893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   jmp_buf jmpbuf;
52893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
53893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
54893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
55893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   int i;
56893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
574215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_create_read_struct");
585f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
59893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
60893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG,
61893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr);
62893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
63893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG);
64893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
65893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr == NULL)
66893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return (NULL);
67893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
68a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Added at libpng-1.2.6 */
695f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_USER_LIMITS_SUPPORTED
705f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   png_ptr->user_width_max = PNG_USER_WIDTH_MAX;
715f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   png_ptr->user_height_max = PNG_USER_HEIGHT_MAX;
725f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#  ifdef PNG_USER_CHUNK_CACHE_MAX
735f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   /* Added at libpng-1.2.43 and 1.4.0 */
745f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   png_ptr->user_chunk_cache_max = PNG_USER_CHUNK_CACHE_MAX;
755f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#  endif
765f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#  ifdef PNG_SET_USER_CHUNK_MALLOC_MAX
775f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   /* Added at libpng-1.2.43 and 1.4.1 */
785f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   png_ptr->user_chunk_malloc_max = PNG_USER_CHUNK_MALLOC_MAX;
795f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#  endif
80893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
81893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
82893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
83893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef USE_FAR_KEYWORD
84893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (setjmp(jmpbuf))
85893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
86893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (setjmp(png_ptr->jmpbuf))
87893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
88893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
89893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_free(png_ptr, png_ptr->zbuf);
904215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      png_ptr->zbuf = NULL;
91893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
92893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_destroy_struct_2((png_voidp)png_ptr,
93893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         (png_free_ptr)free_fn, (png_voidp)mem_ptr);
94893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
95893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_destroy_struct((png_voidp)png_ptr);
96893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
97893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return (NULL);
98893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
99893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef USE_FAR_KEYWORD
1004215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf));
101893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1025f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#endif /* PNG_SETJMP_SUPPORTED */
103893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn);
106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
107893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
108893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn);
109893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1104215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   if (user_png_ver)
111893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1125f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      i = 0;
1135f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      do
1145f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      {
1155f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         if (user_png_ver[i] != png_libpng_ver[i])
1165f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott            png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
1175f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      } while (png_libpng_ver[i++]);
1185f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott    }
1195f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott    else
1205f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
1215f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
1225f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
1235f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott    if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH)
1245f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott    {
1255f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott       /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so
1265f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott       * we must recompile any applications that use any older library version.
1275f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott       * For versions after libpng 1.0, we will be compatible, so we need
1285f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott       * only check the first digit.
1295f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott       */
1305f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] ||
1315f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott          (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) ||
1325f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott          (user_png_ver[0] == '0' && user_png_ver[2] < '9'))
1335f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      {
1345f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#if defined(PNG_STDIO_SUPPORTED) && !defined(_WIN32_WCE)
1355f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         char msg[80];
1365f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         if (user_png_ver)
1375f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         {
1385f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott           png_snprintf(msg, 80,
1395f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott              "Application was compiled with png.h from libpng-%.20s",
1405f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott              user_png_ver);
1415f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott           png_warning(png_ptr, msg);
1425f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         }
1435f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         png_snprintf(msg, 80,
144893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project             "Application  is  running with png.c from libpng-%.20s",
1455f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott             png_libpng_ver);
1465f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         png_warning(png_ptr, msg);
147893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_ERROR_NUMBERS_SUPPORTED
1495f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         png_ptr->flags = 0;
150893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1515f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         png_error(png_ptr,
1525f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott            "Incompatible libpng version in application and library");
1535f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      }
154893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
156a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Initialize zbuf - compression buffer */
157893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->zbuf_size = PNG_ZBUF_SIZE;
158893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->zbuf = (png_bytep)png_malloc(png_ptr,
159893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     (png_uint_32)png_ptr->zbuf_size);
160893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->zstream.zalloc = png_zalloc;
161893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->zstream.zfree = png_zfree;
162893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->zstream.opaque = (voidpf)png_ptr;
163893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1645f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      switch (inflateInit(&png_ptr->zstream))
1655f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      {
1665f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         case Z_OK: /* Do nothing */ break;
1675f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         case Z_MEM_ERROR:
1685f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory error");
1695f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott            break;
1705f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         case Z_VERSION_ERROR: png_error(png_ptr, "zlib version error");
1715f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott            break;
1725f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         default: png_error(png_ptr, "Unknown zlib error");
1735f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      }
1745f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
175893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
176893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->zstream.next_out = png_ptr->zbuf;
177893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
178893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
179893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL);
180893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
181893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
1825f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott/* Applications that neglect to set up their own setjmp() and then
1835f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   encounter a png_error() will longjmp here.  Since the jmpbuf is
1845f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   then meaningless we abort instead of returning. */
185893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef USE_FAR_KEYWORD
186893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (setjmp(jmpbuf))
1875f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott       PNG_ABORT();
1884215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf));
189893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
190893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (setjmp(png_ptr->jmpbuf))
1915f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott       PNG_ABORT();
192893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1935f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#endif /* PNG_SETJMP_SUPPORTED */
1945f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
1954ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen#ifdef PNG_INDEX_SUPPORTED
1964ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   png_ptr->index = NULL;
1974ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen#endif
1984ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   return (png_ptr);
200893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
201893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
202893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_1_0_X) || defined(PNG_1_2_X)
203893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Initialize PNG structure for reading, and allocate any memory needed.
2045f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * This interface is deprecated in favour of the png_create_read_struct(),
2055f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * and it will disappear as of libpng-1.3.0.
2065f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott */
207893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#undef png_read_init
208893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
209893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_read_init(png_structp png_ptr)
210893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
211893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* We only come here via pre-1.0.7-compiled applications */
212893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_read_init_2(png_ptr, "1.0.6 or earlier", 0, 0);
213893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
214893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
215893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
216893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_read_init_2(png_structp png_ptr, png_const_charp user_png_ver,
217893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_size_t png_struct_size, png_size_t png_info_size)
218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* We only come here via pre-1.0.12-compiled applications */
220a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
221a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
2225f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#if defined(PNG_STDIO_SUPPORTED) && !defined(_WIN32_WCE)
2234215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   if (png_sizeof(png_struct) > png_struct_size ||
224893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_sizeof(png_info) > png_info_size)
225893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
226893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      char msg[80];
2274215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      png_ptr->warning_fn = NULL;
228893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (user_png_ver)
229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        png_snprintf(msg, 80,
231893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project           "Application was compiled with png.h from libpng-%.20s",
232893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project           user_png_ver);
233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        png_warning(png_ptr, msg);
234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
235893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_snprintf(msg, 80,
236893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         "Application  is  running with png.c from libpng-%.20s",
237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_libpng_ver);
238893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_warning(png_ptr, msg);
239893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
240893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
2414215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   if (png_sizeof(png_struct) > png_struct_size)
2425f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   {
2435f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      png_ptr->error_fn = NULL;
244893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_ERROR_NUMBERS_SUPPORTED
2455f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      png_ptr->flags = 0;
246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
2475f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      png_error(png_ptr,
2485f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      "The png struct allocated by the application for reading is"
2495f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      " too small.");
2505f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   }
2514215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   if (png_sizeof(png_info) > png_info_size)
2525f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   {
2535f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      png_ptr->error_fn = NULL;
254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_ERROR_NUMBERS_SUPPORTED
2555f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      png_ptr->flags = 0;
256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
2575f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      png_error(png_ptr,
2585f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott        "The info struct allocated by application for reading is"
2595f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott        " too small.");
2605f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   }
261893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_read_init_3(&png_ptr, user_png_ver, png_struct_size);
262893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
263893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_1_0_X || PNG_1_2_X */
264893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
266893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_read_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver,
267893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_size_t png_struct_size)
268893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
269893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   jmp_buf tmp_jmp;  /* to save current jump buffer */
271893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
272893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
2734215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   int i = 0;
274893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
275893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_structp png_ptr=*ptr_ptr;
276893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
277a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
278a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
279893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
280893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   do
281893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
2825f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      if (user_png_ver[i] != png_libpng_ver[i])
2835f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      {
284893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_LEGACY_SUPPORTED
2855f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott        png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
286893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
2875f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott        png_ptr->warning_fn = NULL;
2885f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott        png_warning(png_ptr,
2895f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         "Application uses deprecated png_read_init() and should be"
2905f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         " recompiled.");
2915f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott        break;
292893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
2935f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      }
294893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   } while (png_libpng_ver[i++]);
295893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
2964215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_read_init_3");
297893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
298893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
299a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Save jump buffer and error functions */
3004215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf));
301893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
302893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
3034215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   if (png_sizeof(png_struct) > png_struct_size)
3044215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   {
3054215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      png_destroy_struct(png_ptr);
3064215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      *ptr_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG);
3074215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      png_ptr = *ptr_ptr;
3084215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   }
309893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
310a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Reset all variables to 0 */
3114215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_memset(png_ptr, 0, png_sizeof(png_struct));
312893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
313893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
314a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Restore jump buffer */
3154215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf));
316893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
317893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
318a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Added at libpng-1.2.6 */
319893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SET_USER_LIMITS_SUPPORTED
3205f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   png_ptr->user_width_max = PNG_USER_WIDTH_MAX;
3215f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   png_ptr->user_height_max = PNG_USER_HEIGHT_MAX;
322893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
323893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
324a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Initialize zbuf - compression buffer */
325893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->zbuf_size = PNG_ZBUF_SIZE;
3265f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   png_ptr->zstream.zalloc = png_zalloc;
327893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->zbuf = (png_bytep)png_malloc(png_ptr,
328893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     (png_uint_32)png_ptr->zbuf_size);
329893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->zstream.zalloc = png_zalloc;
330893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->zstream.zfree = png_zfree;
331893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->zstream.opaque = (voidpf)png_ptr;
332893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
333893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   switch (inflateInit(&png_ptr->zstream))
334893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
3355f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      case Z_OK: /* Do nothing */ break;
3365f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory error"); break;
3375f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      case Z_VERSION_ERROR: png_error(png_ptr, "zlib version error");
3385f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott          break;
3395f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      default: png_error(png_ptr, "Unknown zlib error");
340893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
342893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->zstream.next_out = png_ptr->zbuf;
343893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
344893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
345893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL);
346893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
347893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
3485f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
349893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Read the information before the actual image data.  This has been
350893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * changed in v0.90 to allow reading a file that already has the magic
351893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * bytes read from the stream.  You can tell libpng how many bytes have
352893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * been read from the beginning of the stream (up to the maximum of 8)
353893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * via png_set_sig_bytes(), and we will only check the remaining bytes
354893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * here.  The application can then have access to the signature bytes we
355893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * read if it is determined that this isn't a valid PNG file.
356893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
357893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
358893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_read_info(png_structp png_ptr, png_infop info_ptr)
359893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
3605f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   png_debug(1, "in png_read_info");
3615f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
362a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL || info_ptr == NULL)
363a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
3645f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
365893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* If we haven't checked all of the PNG signature bytes, do so now. */
366893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->sig_bytes < 8)
367893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
368893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_size_t num_checked = png_ptr->sig_bytes,
369893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                 num_to_check = 8 - num_checked;
370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
371893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_read_data(png_ptr, &(info_ptr->signature[num_checked]), num_to_check);
372893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->sig_bytes = 8;
373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
374893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check))
375893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
376893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (num_checked < 4 &&
377893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project             png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4))
378893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_error(png_ptr, "Not a PNG file");
379893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else
380893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_error(png_ptr, "PNG file corrupted by ASCII conversion");
381893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
382893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (num_checked < 3)
383893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE;
384893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
3864215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   for (;;)
387893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
388893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS
389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_IHDR;
390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_IDAT;
391893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_IEND;
392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_PLTE;
3935f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_bKGD_SUPPORTED
394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_bKGD;
395893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
3965f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_cHRM_SUPPORTED
397893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_cHRM;
398893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
3995f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_gAMA_SUPPORTED
400893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_gAMA;
401893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
4025f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_hIST_SUPPORTED
403893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_hIST;
404893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
4055f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_iCCP_SUPPORTED
406893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_iCCP;
407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
4085f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_iTXt_SUPPORTED
409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_iTXt;
410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
4115f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_oFFs_SUPPORTED
412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_oFFs;
413893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
4145f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_pCAL_SUPPORTED
415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_pCAL;
416893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
4175f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_pHYs_SUPPORTED
418893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_pHYs;
419893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
4205f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sBIT_SUPPORTED
421893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_sBIT;
422893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
4235f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sCAL_SUPPORTED
424893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_sCAL;
425893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
4265f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sPLT_SUPPORTED
427893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_sPLT;
428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
4295f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sRGB_SUPPORTED
430893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_sRGB;
431893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
4325f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tEXt_SUPPORTED
433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_tEXt;
434893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
4355f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tIME_SUPPORTED
436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_tIME;
437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
4385f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tRNS_SUPPORTED
439893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_tRNS;
440893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
4415f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_zTXt_SUPPORTED
442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_zTXt;
443893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
444893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USE_LOCAL_ARRAYS */
4454215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      png_uint_32 length = png_read_chunk_header(png_ptr);
4464215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      PNG_CONST png_bytep chunk_name = png_ptr->chunk_name;
447893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
448893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      /* This should be a binary subdivision search or a hash for
449893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       * matching the chunk name rather than a linear search.
450893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       */
4514215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      if (!png_memcmp(chunk_name, png_IDAT, 4))
4524215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project        if (png_ptr->mode & PNG_AFTER_IDAT)
453893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
454893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
4554215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      if (!png_memcmp(chunk_name, png_IHDR, 4))
456893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_IHDR(png_ptr, info_ptr, length);
4574215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_IEND, 4))
458893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_IEND(png_ptr, info_ptr, length);
459893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
4604215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (png_handle_as_unknown(png_ptr, chunk_name))
461893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
4624215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         if (!png_memcmp(chunk_name, png_IDAT, 4))
463893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_ptr->mode |= PNG_HAVE_IDAT;
464893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_unknown(png_ptr, info_ptr, length);
4654215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         if (!png_memcmp(chunk_name, png_PLTE, 4))
466893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_ptr->mode |= PNG_HAVE_PLTE;
4674215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         else if (!png_memcmp(chunk_name, png_IDAT, 4))
468893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
469893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (!(png_ptr->mode & PNG_HAVE_IHDR))
470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_error(png_ptr, "Missing IHDR before IDAT");
471893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
472893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                     !(png_ptr->mode & PNG_HAVE_PLTE))
473893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_error(png_ptr, "Missing PLTE before IDAT");
474893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
475893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
476893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
4784215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_PLTE, 4))
479893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_PLTE(png_ptr, info_ptr, length);
4804215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_IDAT, 4))
481893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
482893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (!(png_ptr->mode & PNG_HAVE_IHDR))
483893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_error(png_ptr, "Missing IHDR before IDAT");
484893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
485893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  !(png_ptr->mode & PNG_HAVE_PLTE))
486893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_error(png_ptr, "Missing PLTE before IDAT");
487893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
488893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->idat_size = length;
489893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->mode |= PNG_HAVE_IDAT;
490893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         break;
491893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
4925f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_bKGD_SUPPORTED
4934215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_bKGD, 4))
494893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_bKGD(png_ptr, info_ptr, length);
495893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
4965f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_cHRM_SUPPORTED
4974215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_cHRM, 4))
498893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_cHRM(png_ptr, info_ptr, length);
499893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
5005f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_gAMA_SUPPORTED
5014215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_gAMA, 4))
502893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_gAMA(png_ptr, info_ptr, length);
503893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
5045f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_hIST_SUPPORTED
5054215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_hIST, 4))
506893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_hIST(png_ptr, info_ptr, length);
507893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
5085f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_oFFs_SUPPORTED
5094215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_oFFs, 4))
510893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_oFFs(png_ptr, info_ptr, length);
511893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
5125f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_pCAL_SUPPORTED
5134215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_pCAL, 4))
514893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_pCAL(png_ptr, info_ptr, length);
515893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
5165f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sCAL_SUPPORTED
5174215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_sCAL, 4))
518893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_sCAL(png_ptr, info_ptr, length);
519893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
5205f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_pHYs_SUPPORTED
5214215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_pHYs, 4))
522893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_pHYs(png_ptr, info_ptr, length);
523893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
5245f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sBIT_SUPPORTED
5254215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_sBIT, 4))
526893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_sBIT(png_ptr, info_ptr, length);
527893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
5285f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sRGB_SUPPORTED
5294215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_sRGB, 4))
530893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_sRGB(png_ptr, info_ptr, length);
531893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
5325f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_iCCP_SUPPORTED
5334215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_iCCP, 4))
534893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_iCCP(png_ptr, info_ptr, length);
535893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
5365f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sPLT_SUPPORTED
5374215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_sPLT, 4))
538893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_sPLT(png_ptr, info_ptr, length);
539893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
5405f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tEXt_SUPPORTED
5414215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_tEXt, 4))
542893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_tEXt(png_ptr, info_ptr, length);
543893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
5445f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tIME_SUPPORTED
5454215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_tIME, 4))
546893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_tIME(png_ptr, info_ptr, length);
547893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
5485f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tRNS_SUPPORTED
5494215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_tRNS, 4))
550893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_tRNS(png_ptr, info_ptr, length);
551893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
5525f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_zTXt_SUPPORTED
5534215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_zTXt, 4))
554893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_zTXt(png_ptr, info_ptr, length);
555893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
5565f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_iTXt_SUPPORTED
5574215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_iTXt, 4))
558893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_iTXt(png_ptr, info_ptr, length);
559893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
560893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
561893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_unknown(png_ptr, info_ptr, length);
562893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
563893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
5645f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
565893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
566a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Optional call to update the users info_ptr structure */
567893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
568893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_read_update_info(png_structp png_ptr, png_infop info_ptr)
569893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
5704215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_read_update_info");
5715f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
572a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
573a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
5744ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen#ifdef PNG_INDEX_SUPPORTED
5754ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   if (png_ptr->index) {
5764ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen      png_read_start_row(png_ptr);
5774ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   }
5784ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen#endif
579893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
580893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_read_start_row(png_ptr);
581893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else
582893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_warning(png_ptr,
583893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      "Ignoring extra png_read_update_info() call; row buffer not reallocated");
5845f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
585893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_read_transform_info(png_ptr, info_ptr);
586893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
587893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
5885f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
589893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Initialize palette, background, etc, after transformations
590893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * are set, but before any reading takes place.  This allows
591893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * the user to obtain a gamma-corrected palette, for example.
592893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * If the user doesn't call this, we will do it ourselves.
593893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
594893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
595893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_start_read_image(png_structp png_ptr)
596893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
5974215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_start_read_image");
5985f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
599a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
600a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
601893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
602893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_read_start_row(png_ptr);
603893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
6045f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
605893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
6065f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
607893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
608893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
609893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
610893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   PNG_CONST PNG_IDAT;
611893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   PNG_CONST int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55,
6124215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      0xff};
613893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   PNG_CONST int png_pass_mask[7] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff};
614893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   int ret;
6155f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
616a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
617a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
6185f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
6194215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug2(1, "in png_read_row (row %lu, pass %d)",
620893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->row_number, png_ptr->pass);
6215f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
622893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
623893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_read_start_row(png_ptr);
624893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->row_number == 0 && png_ptr->pass == 0)
625893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
626a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Check for transforms that have been set but were defined out */
627893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_INVERT_SUPPORTED) && !defined(PNG_READ_INVERT_SUPPORTED)
628893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->transformations & PNG_INVERT_MONO)
629893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_warning(png_ptr, "PNG_READ_INVERT_SUPPORTED is not defined.");
630893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
631893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_FILLER_SUPPORTED) && !defined(PNG_READ_FILLER_SUPPORTED)
632893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->transformations & PNG_FILLER)
633893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_warning(png_ptr, "PNG_READ_FILLER_SUPPORTED is not defined.");
634893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
6355f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#if defined(PNG_WRITE_PACKSWAP_SUPPORTED) && \
6365f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott    !defined(PNG_READ_PACKSWAP_SUPPORTED)
637893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->transformations & PNG_PACKSWAP)
638893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_warning(png_ptr, "PNG_READ_PACKSWAP_SUPPORTED is not defined.");
639893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
640893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_PACK_SUPPORTED) && !defined(PNG_READ_PACK_SUPPORTED)
641893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->transformations & PNG_PACK)
642893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_warning(png_ptr, "PNG_READ_PACK_SUPPORTED is not defined.");
643893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
644893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_SHIFT_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED)
645893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->transformations & PNG_SHIFT)
646893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_warning(png_ptr, "PNG_READ_SHIFT_SUPPORTED is not defined.");
647893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
648893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_BGR_SUPPORTED) && !defined(PNG_READ_BGR_SUPPORTED)
649893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->transformations & PNG_BGR)
650893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_warning(png_ptr, "PNG_READ_BGR_SUPPORTED is not defined.");
651893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
652893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_SWAP_SUPPORTED) && !defined(PNG_READ_SWAP_SUPPORTED)
653893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->transformations & PNG_SWAP_BYTES)
654893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_warning(png_ptr, "PNG_READ_SWAP_SUPPORTED is not defined.");
655893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
656893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
657893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
6585f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_INTERLACING_SUPPORTED
659a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* If interlaced and we do not need a new row, combine row and return */
660893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
661893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
662893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      switch (png_ptr->pass)
663893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
664893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         case 0:
665893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (png_ptr->row_number & 0x07)
666893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
667893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               if (dsp_row != NULL)
668893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_combine_row(png_ptr, dsp_row,
669893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                     png_pass_dsp_mask[png_ptr->pass]);
670893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_finish_row(png_ptr);
671893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               return;
672893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
673893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
674893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         case 1:
675893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if ((png_ptr->row_number & 0x07) || png_ptr->width < 5)
676893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
677893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               if (dsp_row != NULL)
678893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_combine_row(png_ptr, dsp_row,
679893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                     png_pass_dsp_mask[png_ptr->pass]);
680893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_finish_row(png_ptr);
681893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               return;
682893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
683893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
684893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         case 2:
685893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if ((png_ptr->row_number & 0x07) != 4)
686893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
687893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               if (dsp_row != NULL && (png_ptr->row_number & 4))
688893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_combine_row(png_ptr, dsp_row,
689893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                     png_pass_dsp_mask[png_ptr->pass]);
690893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_finish_row(png_ptr);
691893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               return;
692893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
693893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
694893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         case 3:
695893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if ((png_ptr->row_number & 3) || png_ptr->width < 3)
696893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
697893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               if (dsp_row != NULL)
698893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_combine_row(png_ptr, dsp_row,
699893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                     png_pass_dsp_mask[png_ptr->pass]);
700893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_finish_row(png_ptr);
701893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               return;
702893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
703893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
704893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         case 4:
705893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if ((png_ptr->row_number & 3) != 2)
706893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
707893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               if (dsp_row != NULL && (png_ptr->row_number & 2))
708893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_combine_row(png_ptr, dsp_row,
709893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                     png_pass_dsp_mask[png_ptr->pass]);
710893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_finish_row(png_ptr);
711893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               return;
712893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
713893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
714893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         case 5:
715893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if ((png_ptr->row_number & 1) || png_ptr->width < 2)
716893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
717893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               if (dsp_row != NULL)
718893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_combine_row(png_ptr, dsp_row,
719893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                     png_pass_dsp_mask[png_ptr->pass]);
720893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_finish_row(png_ptr);
721893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               return;
722893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
723893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
724893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         case 6:
725893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (!(png_ptr->row_number & 1))
726893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
727893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_read_finish_row(png_ptr);
728893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               return;
729893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
730893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
731893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
732893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
733893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
734893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
735893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (!(png_ptr->mode & PNG_HAVE_IDAT))
736893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_error(png_ptr, "Invalid attempt to read row data");
737893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
738893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->zstream.next_out = png_ptr->row_buf;
7395f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   png_ptr->zstream.avail_out =
7405f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott       (uInt)(PNG_ROWBYTES(png_ptr->pixel_depth,
7415f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott       png_ptr->iwidth) + 1);
742893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   do
743893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
744893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (!(png_ptr->zstream.avail_in))
745893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
746893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         while (!png_ptr->idat_size)
747893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
7484ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen#ifdef PNG_INDEX_SUPPORTED
7494ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen            if (png_ptr->index) {
7504ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen               png_opt_crc_finish(png_ptr, 0, 0);
7514ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen               png_ptr->index->stream_idat_position = png_ptr->total_data_read;
7524ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen            } else
7534ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen#endif
7544ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen               png_crc_finish(png_ptr, 0);
7554ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
756893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
7574215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            png_ptr->idat_size = png_read_chunk_header(png_ptr);
758893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
759893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_error(png_ptr, "Not enough image data");
760893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
761893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size;
762893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->zstream.next_in = png_ptr->zbuf;
763893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (png_ptr->zbuf_size > png_ptr->idat_size)
764893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size;
765893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_crc_read(png_ptr, png_ptr->zbuf,
766893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            (png_size_t)png_ptr->zstream.avail_in);
767893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->idat_size -= png_ptr->zstream.avail_in;
768893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
769893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
770893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (ret == Z_STREAM_END)
771893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
772893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (png_ptr->zstream.avail_out || png_ptr->zstream.avail_in ||
773893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_ptr->idat_size)
774893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_error(png_ptr, "Extra compressed data");
775893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->mode |= PNG_AFTER_IDAT;
776893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
777893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         break;
778893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
779893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (ret != Z_OK)
7804ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen#ifdef PNG_INDEX_SUPPORTED
7814ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen         if (png_ptr->index && png_ptr->row_number != png_ptr->height - 1)
7824ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen#endif
7834ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen            png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg :
784893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                   "Decompression error");
785893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
786893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   } while (png_ptr->zstream.avail_out);
787893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
788893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->row_info.color_type = png_ptr->color_type;
789893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->row_info.width = png_ptr->iwidth;
790893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->row_info.channels = png_ptr->channels;
791893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->row_info.bit_depth = png_ptr->bit_depth;
792893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->row_info.pixel_depth = png_ptr->pixel_depth;
793893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,
794893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       png_ptr->row_info.width);
795893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
7964215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   if (png_ptr->row_buf[0])
797893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_read_filter_row(png_ptr, &(png_ptr->row_info),
798893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->row_buf + 1, png_ptr->prev_row + 1,
799893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      (int)(png_ptr->row_buf[0]));
800893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
801893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf,
802893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->rowbytes + 1);
803893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
8045f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_MNG_FEATURES_SUPPORTED
8054215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
806893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING))
807893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
808893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      /* Intrapixel differencing */
809893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_do_read_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1);
810893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
811893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
812893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
813893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
814893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA))
815893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_do_read_transformations(png_ptr);
816893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
8175f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_INTERLACING_SUPPORTED
818a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Blow up interlaced rows to full size */
819893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->interlaced &&
820893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      (png_ptr->transformations & PNG_INTERLACE))
821893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
822893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_ptr->pass < 6)
823a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         /* Old interface (pre-1.0.9):
824a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott          * png_do_read_interlace(&(png_ptr->row_info),
825a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott          *    png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations);
826a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott          */
827893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_do_read_interlace(png_ptr);
828893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
829893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (dsp_row != NULL)
830893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_combine_row(png_ptr, dsp_row,
831893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_pass_dsp_mask[png_ptr->pass]);
832893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (row != NULL)
833893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_combine_row(png_ptr, row,
834893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_pass_mask[png_ptr->pass]);
835893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
836893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else
837893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
838893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
839893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (row != NULL)
840893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_combine_row(png_ptr, row, 0xff);
841893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (dsp_row != NULL)
842893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_combine_row(png_ptr, dsp_row, 0xff);
843893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
844893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_read_finish_row(png_ptr);
845893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
846893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->read_row_fn != NULL)
847893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      (*(png_ptr->read_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass);
848893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
8495f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
850893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
8515f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
852893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Read one or more rows of image data.  If the image is interlaced,
853893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * and png_set_interlace_handling() has been called, the rows need to
854893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * contain the contents of the rows from the previous pass.  If the
855893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * image has alpha or transparency, and png_handle_alpha()[*] has been
856893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * called, the rows contents must be initialized to the contents of the
857893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * screen.
858893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *
859893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * "row" holds the actual image, and pixels are placed in it
860893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * as they arrive.  If the image is displayed after each pass, it will
861893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * appear to "sparkle" in.  "display_row" can be used to display a
862893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * "chunky" progressive image, with finer detail added as it becomes
863893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * available.  If you do not want this "chunky" display, you may pass
864893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * NULL for display_row.  If you do not want the sparkle display, and
865893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * you have not called png_handle_alpha(), you may pass NULL for rows.
866893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * If you have called png_handle_alpha(), and the image has either an
867893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * alpha channel or a transparency chunk, you must provide a buffer for
868893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * rows.  In this case, you do not have to provide a display_row buffer
869893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * also, but you may.  If the image is not interlaced, or if you have
870893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * not called png_set_interlace_handling(), the display_row buffer will
871893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * be ignored, so pass NULL to it.
872893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *
873893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * [*] png_handle_alpha() does not exist yet, as of this version of libpng
874893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
875893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
876893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
877893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_read_rows(png_structp png_ptr, png_bytepp row,
878893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_bytepp display_row, png_uint_32 num_rows)
879893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
880893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_uint_32 i;
881893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_bytepp rp;
882893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_bytepp dp;
883893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
8844215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_read_rows");
8855f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
886a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
887a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
888893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   rp = row;
889893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   dp = display_row;
890893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (rp != NULL && dp != NULL)
891893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (i = 0; i < num_rows; i++)
892893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
893893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_bytep rptr = *rp++;
894893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_bytep dptr = *dp++;
895893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
896893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_read_row(png_ptr, rptr, dptr);
897893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
8984215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   else if (rp != NULL)
899893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (i = 0; i < num_rows; i++)
900893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
901893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_bytep rptr = *rp;
902893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_read_row(png_ptr, rptr, png_bytep_NULL);
903893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         rp++;
904893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
9054215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   else if (dp != NULL)
906893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (i = 0; i < num_rows; i++)
907893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
908893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_bytep dptr = *dp;
909893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_read_row(png_ptr, png_bytep_NULL, dptr);
910893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         dp++;
911893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
912893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
9135f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
914893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
9154ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen#ifdef PNG_INDEX_SUPPORTED
9164ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen#define IDAT_HEADER_SIZE 8
9174ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
9184ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen/* Set the png read position to a new position based on idat_position and
9194ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen * offset.
9204ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen */
9214ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wenvoid
9224ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wenpng_set_read_offset(png_structp png_ptr,
9234ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen      png_uint_32 idat_position, png_uint_32 bytes_left)
9244ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen{
9254ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   png_seek_data(png_ptr, idat_position);
9264ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   png_ptr->idat_size = png_read_chunk_header(png_ptr);
9274ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
9284ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   // We need to add back IDAT_HEADER_SIZE because in zlib's perspective,
9294ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   // IDAT_HEADER in PNG is already stripped out.
9304ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   png_seek_data(png_ptr, idat_position + IDAT_HEADER_SIZE + png_ptr->idat_size - bytes_left);
9314ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   png_ptr->idat_size = bytes_left;
9324ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen}
9334ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
9344ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen/* Configure png decoder to decode the pass starting from *row.
9354ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen * The requested row may be adjusted to align with an indexing row.
9364ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen * The actual row for the decoder to start its decoding will be returned in
9374ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen * *row.
9384ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen */
9394ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wenvoid PNGAPI
9404ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wenpng_configure_decoder(png_structp png_ptr, int *row, int pass)
9414ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen{
9424ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   png_indexp index = png_ptr->index;
9434ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   int n = *row / index->step[pass];
9444ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   png_line_indexp line_index = index->pass_line_index[pass][n];
9454ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
9464ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   // Adjust row to an indexing row.
9474ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   *row = n * index->step[pass];
9484ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   png_ptr->row_number = *row;
9494ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
9504ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen#ifdef PNG_READ_INTERLACING_SUPPORTED
9514ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   if (png_ptr->interlaced)
9524ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen      png_set_interlaced_pass(png_ptr, pass);
9534ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen#endif
9544ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
9554ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   long row_byte_length =
9564ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen      PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->iwidth) + 1;
9574ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
9584ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   inflateEnd(&png_ptr->zstream);
9594ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   inflateCopy(&png_ptr->zstream, line_index->z_state);
9604ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
9614ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   // Set the png read position to line_index.
9624ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   png_set_read_offset(png_ptr, line_index->stream_idat_position,
9634ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen         line_index->bytes_left_in_idat);
9644ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   png_memcpy_check(png_ptr,
9654ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen         png_ptr->prev_row, line_index->prev_row, row_byte_length);
9664ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   png_ptr->zstream.avail_in = 0;
9674ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen}
9684ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
9694ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen/* Build the line index and store the index in png_ptr->index.
9704ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen */
9714ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wenvoid PNGAPI
9724ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wenpng_build_index(png_structp png_ptr)
9734ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen{
9744ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   // number of rows in a 8x8 block for each interlaced pass.
9754ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   int number_rows_in_pass[7] = {1, 1, 1, 2, 2, 4, 4};
9764ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
9774ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   int ret;
9784ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   png_uint_32 i, j;
9794ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   png_bytep rp;
9804ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   int p, pass_number = 1;
9814ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
9824ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen#ifdef PNG_READ_INTERLACING_SUPPORTED
9834ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   pass_number = png_set_interlace_handling(png_ptr);
9844ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen#endif
9854ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
9864ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   if (png_ptr == NULL)
9874ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen      return;
9884ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
9894ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   png_read_start_row(png_ptr);
9904ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
9914ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen#ifdef PNG_READ_INTERLACING_SUPPORTED
9924ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   if (!png_ptr->interlaced)
9934ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen#endif
9944ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   {
9954ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen      number_rows_in_pass[0] = 8;
9964ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   }
9974ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
9984ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   rp = png_malloc(png_ptr, png_ptr->rowbytes);
9994ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
10004ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   png_indexp index = png_malloc(png_ptr, sizeof(png_index));
10014ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   png_ptr->index = index;
10024ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
10034ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   index->stream_idat_position = png_ptr->total_data_read - IDAT_HEADER_SIZE;
10044ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
10054ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   // Set the default size of index in each pass to 0,
10064ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   // so that we can free index correctly in png_destroy_read_struct.
10074ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   for (p = 0; p < 7; p++)
10084ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen      index->size[p] = 0;
10094ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
10104ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   for (p = 0; p < pass_number; p++)
10114ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   {
10124ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen      // We adjust the index step in each pass to make sure each pass
10134ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen      // has roughly the same size of index.
10144ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen      // This way, we won't consume to much memory in recording index.
10154ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen      index->step[p] = INDEX_SAMPLE_SIZE * (8 / number_rows_in_pass[p]);
10164ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen      index->size[p] =
10174ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen         (png_ptr->height + index->step[p] - 1) / index->step[p];
10184ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen      index->pass_line_index[p] =
10194ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen         png_malloc(png_ptr, index->size[p] * sizeof(png_line_indexp));
10204ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
10214ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen      // Get the row_byte_length seen by the filter. This value may be
10224ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen      // different from the row_byte_length of a bitmap in the case of
10234ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen      // color palette mode.
10244ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen      int row_byte_length =
10254ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen         PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->iwidth) + 1;
10264ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
10274ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen      // Now, we record index for each indexing row.
10284ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen      for (i = 0; i < index->size[p]; i++)
10294ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen      {
10304ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen         png_line_indexp line_index = png_malloc(png_ptr, sizeof(png_line_index));
10314ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen         index->pass_line_index[p][i] = line_index;
10324ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
10334ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen         line_index->z_state = png_malloc(png_ptr, sizeof(z_stream));
10344ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen         inflateCopy(line_index->z_state, &png_ptr->zstream);
10354ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen         line_index->prev_row = png_malloc(png_ptr, row_byte_length);
10364ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen         png_memcpy_check(png_ptr,
10374ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen               line_index->prev_row, png_ptr->prev_row, row_byte_length);
10384ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen         line_index->stream_idat_position = index->stream_idat_position;
10394ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen         line_index->bytes_left_in_idat = png_ptr->idat_size + png_ptr->zstream.avail_in;
10404ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
10414ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen         // Skip the "step" number of rows to the next indexing row.
10424ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen         for (j = 0; j < index->step[p] &&
10434ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen               i * index->step[p] + j < png_ptr->height; j++)
10444ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen         {
10454ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen            png_read_row(png_ptr, rp, png_bytep_NULL);
10464ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen         }
10474ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen      }
10484ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   }
10494ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen   png_free(png_ptr, rp);
10504ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen}
10514ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen#endif
10524ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen
10535f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
1054893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Read the entire image.  If the image has an alpha channel or a tRNS
1055893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * chunk, and you have called png_handle_alpha()[*], you will need to
1056893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * initialize the image to the current image that PNG will be overlaying.
1057893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * We set the num_rows again here, in case it was incorrectly set in
1058893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * png_read_start_row() by a call to png_read_update_info() or
1059893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * png_start_read_image() if png_set_interlace_handling() wasn't called
1060893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * prior to either of these functions like it should have been.  You can
1061893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * only call this function once.  If you desire to have an image for
1062893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * each pass of a interlaced image, use png_read_rows() instead.
1063893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *
1064893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * [*] png_handle_alpha() does not exist yet, as of this version of libpng
1065893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
1066893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
1067893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_read_image(png_structp png_ptr, png_bytepp image)
1068893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
10694215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_uint_32 i, image_height;
1070893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   int pass, j;
1071893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_bytepp rp;
1072893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
10734215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_read_image");
10745f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
1075a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
1076a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
1077893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1078893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_READ_INTERLACING_SUPPORTED
1079893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   pass = png_set_interlace_handling(png_ptr);
1080893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
1081893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->interlaced)
1082893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_error(png_ptr,
1083893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        "Cannot read interlaced image -- interlace handler disabled.");
1084893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   pass = 1;
1085893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1086893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1087893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1088893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   image_height=png_ptr->height;
1089893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->num_rows = image_height; /* Make sure this is set correctly */
1090893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1091893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   for (j = 0; j < pass; j++)
1092893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1093893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      rp = image;
1094893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (i = 0; i < image_height; i++)
1095893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1096893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_read_row(png_ptr, *rp, png_bytep_NULL);
1097893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         rp++;
1098893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1099893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1100893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
11015f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
1102893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
11035f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
1104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Read the end of the PNG file.  Will not read past the end of the
1105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * file, will verify the end is accurate, and will read any comments
1106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * or time information at the end of the file, if info is not NULL.
1107893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
1108893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
1109893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_read_end(png_structp png_ptr, png_infop info_ptr)
1110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
11114215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_read_end");
11125f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
1113a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
1114a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
1115893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_crc_finish(png_ptr, 0); /* Finish off CRC from last IDAT chunk */
1116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   do
1118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS
1120893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_IHDR;
1121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_IDAT;
1122893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_IEND;
1123893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_PLTE;
11245f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_bKGD_SUPPORTED
1125893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_bKGD;
1126893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
11275f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_cHRM_SUPPORTED
1128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_cHRM;
1129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
11305f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_gAMA_SUPPORTED
1131893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_gAMA;
1132893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
11335f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_hIST_SUPPORTED
1134893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_hIST;
1135893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
11365f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_iCCP_SUPPORTED
1137893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_iCCP;
1138893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
11395f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_iTXt_SUPPORTED
1140893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_iTXt;
1141893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
11425f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_oFFs_SUPPORTED
1143893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_oFFs;
1144893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
11455f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_pCAL_SUPPORTED
1146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_pCAL;
1147893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
11485f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_pHYs_SUPPORTED
1149893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_pHYs;
1150893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
11515f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sBIT_SUPPORTED
1152893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_sBIT;
1153893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
11545f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sCAL_SUPPORTED
1155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_sCAL;
1156893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
11575f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sPLT_SUPPORTED
1158893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_sPLT;
1159893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
11605f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sRGB_SUPPORTED
1161893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_sRGB;
1162893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
11635f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tEXt_SUPPORTED
1164893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_tEXt;
1165893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
11665f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tIME_SUPPORTED
1167893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_tIME;
1168893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
11695f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tRNS_SUPPORTED
1170893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_tRNS;
1171893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
11725f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_zTXt_SUPPORTED
1173893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      PNG_CONST PNG_zTXt;
1174893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1175893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USE_LOCAL_ARRAYS */
11764215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      png_uint_32 length = png_read_chunk_header(png_ptr);
11774215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      PNG_CONST png_bytep chunk_name = png_ptr->chunk_name;
1178893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
11794215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      if (!png_memcmp(chunk_name, png_IHDR, 4))
1180893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_IHDR(png_ptr, info_ptr, length);
11814215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_IEND, 4))
1182893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_IEND(png_ptr, info_ptr, length);
1183893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
11844215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (png_handle_as_unknown(png_ptr, chunk_name))
1185893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
11864215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         if (!png_memcmp(chunk_name, png_IDAT, 4))
1187893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
1188893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT))
1189893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_error(png_ptr, "Too many IDAT's found");
1190893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1191893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_unknown(png_ptr, info_ptr, length);
11924215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         if (!png_memcmp(chunk_name, png_PLTE, 4))
1193893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_ptr->mode |= PNG_HAVE_PLTE;
1194893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1195893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
11964215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_IDAT, 4))
1197893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1198893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         /* Zero length IDATs are legal after the last IDAT has been
1199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          * read, but not after other chunks have been read.
1200893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          */
1201893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT))
1202893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_error(png_ptr, "Too many IDAT's found");
1203893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_crc_finish(png_ptr, length);
1204893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
12054215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_PLTE, 4))
1206893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_PLTE(png_ptr, info_ptr, length);
12075f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_bKGD_SUPPORTED
12084215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_bKGD, 4))
1209893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_bKGD(png_ptr, info_ptr, length);
1210893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12115f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_cHRM_SUPPORTED
12124215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_cHRM, 4))
1213893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_cHRM(png_ptr, info_ptr, length);
1214893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12155f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_gAMA_SUPPORTED
12164215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_gAMA, 4))
1217893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_gAMA(png_ptr, info_ptr, length);
1218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12195f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_hIST_SUPPORTED
12204215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_hIST, 4))
1221893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_hIST(png_ptr, info_ptr, length);
1222893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12235f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_oFFs_SUPPORTED
12244215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_oFFs, 4))
1225893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_oFFs(png_ptr, info_ptr, length);
1226893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12275f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_pCAL_SUPPORTED
12284215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_pCAL, 4))
1229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_pCAL(png_ptr, info_ptr, length);
1230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12315f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sCAL_SUPPORTED
12324215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_sCAL, 4))
1233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_sCAL(png_ptr, info_ptr, length);
1234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12355f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_pHYs_SUPPORTED
12364215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_pHYs, 4))
1237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_pHYs(png_ptr, info_ptr, length);
1238893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12395f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sBIT_SUPPORTED
12404215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_sBIT, 4))
1241893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_sBIT(png_ptr, info_ptr, length);
1242893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12435f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sRGB_SUPPORTED
12444215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_sRGB, 4))
1245893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_sRGB(png_ptr, info_ptr, length);
1246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12475f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_iCCP_SUPPORTED
12484215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_iCCP, 4))
1249893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_iCCP(png_ptr, info_ptr, length);
1250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12515f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sPLT_SUPPORTED
12524215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_sPLT, 4))
1253893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_sPLT(png_ptr, info_ptr, length);
1254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12555f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tEXt_SUPPORTED
12564215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_tEXt, 4))
1257893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_tEXt(png_ptr, info_ptr, length);
1258893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12595f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tIME_SUPPORTED
12604215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_tIME, 4))
1261893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_tIME(png_ptr, info_ptr, length);
1262893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12635f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tRNS_SUPPORTED
12644215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_tRNS, 4))
1265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_tRNS(png_ptr, info_ptr, length);
1266893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12675f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_zTXt_SUPPORTED
12684215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_zTXt, 4))
1269893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_zTXt(png_ptr, info_ptr, length);
1270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12715f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_iTXt_SUPPORTED
12724215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      else if (!png_memcmp(chunk_name, png_iTXt, 4))
1273893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_iTXt(png_ptr, info_ptr, length);
1274893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1275893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
1276893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_handle_unknown(png_ptr, info_ptr, length);
1277893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   } while (!(png_ptr->mode & PNG_HAVE_IEND));
1278893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
12795f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
1280893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1281a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Free all memory used by the read */
1282893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
1283893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr,
1284893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_infopp end_info_ptr_ptr)
1285893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1286893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_structp png_ptr = NULL;
1287893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_infop info_ptr = NULL, end_info_ptr = NULL;
1288893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
1289893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_free_ptr free_fn = NULL;
1290893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_voidp mem_ptr = NULL;
1291893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1292893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
12934215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_destroy_read_struct");
12945f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
1295893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr_ptr != NULL)
1296893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr = *png_ptr_ptr;
1297893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr == NULL)
1298893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return;
1299893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1300893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
1301893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   free_fn = png_ptr->free_fn;
1302893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   mem_ptr = png_ptr->mem_ptr;
1303893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1304893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1305893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (info_ptr_ptr != NULL)
1306893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      info_ptr = *info_ptr_ptr;
1307893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1308893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (end_info_ptr_ptr != NULL)
1309893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      end_info_ptr = *end_info_ptr_ptr;
1310893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1311893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_read_destroy(png_ptr, info_ptr, end_info_ptr);
1312893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1313893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (info_ptr != NULL)
1314893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
13155f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_TEXT_SUPPORTED
1316893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, -1);
1317893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1318893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1319893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
1320893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn,
1321893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          (png_voidp)mem_ptr);
1322893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
1323893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_destroy_struct((png_voidp)info_ptr);
1324893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1325893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      *info_ptr_ptr = NULL;
1326893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1327893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1328893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (end_info_ptr != NULL)
1329893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
13305f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_TEXT_SUPPORTED
1331893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_free_data(png_ptr, end_info_ptr, PNG_FREE_TEXT, -1);
1332893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1333893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
1334893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_destroy_struct_2((png_voidp)end_info_ptr, (png_free_ptr)free_fn,
1335893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         (png_voidp)mem_ptr);
1336893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
1337893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_destroy_struct((png_voidp)end_info_ptr);
1338893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1339893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      *end_info_ptr_ptr = NULL;
1340893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
13424215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   if (png_ptr != NULL)
13434215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   {
13444ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen#ifdef PNG_INDEX_SUPPORTED
13454ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen      if (png_ptr->index) {
13464ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen         unsigned int i, p;
13474ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen         png_indexp index = png_ptr->index;
13484ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen         for (p = 0; p < 7; p++) {
13494ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen            for (i = 0; i < index->size[p]; i++) {
13504ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen               inflateEnd(index->pass_line_index[p][i]->z_state);
13514ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen               png_free(png_ptr, index->pass_line_index[p][i]->z_state);
13524ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen               png_free(png_ptr, index->pass_line_index[p][i]->prev_row);
13534ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen               png_free(png_ptr, index->pass_line_index[p][i]);
13544ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen            }
13554ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen            if (index->size[p] != 0) {
13564ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen               png_free(png_ptr, index->pass_line_index[p]);
13574ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen            }
13584ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen         }
13594ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen         png_free(png_ptr, index);
13604ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen      }
13614ce0ee15f268e0161438b4133936cb2826f7fd50Joseph Wen#endif
1362893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
13634215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn,
13644215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project          (png_voidp)mem_ptr);
1365893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
13664215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      png_destroy_struct((png_voidp)png_ptr);
1367893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
13684215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      *png_ptr_ptr = NULL;
13694215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   }
1370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1371893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1372a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Free all memory used by the read (old method) */
1373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
13745f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scottpng_read_destroy(png_structp png_ptr, png_infop info_ptr,
13755f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott    png_infop end_info_ptr)
1376893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1377893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
1378893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   jmp_buf tmp_jmp;
1379893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1380893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_error_ptr error_fn;
1381893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_error_ptr warning_fn;
1382893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_voidp error_ptr;
1383893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
1384893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_free_ptr free_fn;
1385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1386893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
13874215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_read_destroy");
13885f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
1389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (info_ptr != NULL)
1390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_info_destroy(png_ptr, info_ptr);
1391893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (end_info_ptr != NULL)
1393893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_info_destroy(png_ptr, end_info_ptr);
1394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1395893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_free(png_ptr, png_ptr->zbuf);
1396893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_free(png_ptr, png_ptr->big_row_buf);
1397893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_free(png_ptr, png_ptr->prev_row);
13984215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_free(png_ptr, png_ptr->chunkdata);
13995f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_DITHER_SUPPORTED
1400893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_free(png_ptr, png_ptr->palette_lookup);
1401893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_free(png_ptr, png_ptr->dither_index);
1402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
14035f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_GAMMA_SUPPORTED
1404893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_free(png_ptr, png_ptr->gamma_table);
1405893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
14065f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_BACKGROUND_SUPPORTED
1407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_free(png_ptr, png_ptr->gamma_from_1);
1408893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_free(png_ptr, png_ptr->gamma_to_1);
1409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_FREE_ME_SUPPORTED
1411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->free_me & PNG_FREE_PLTE)
1412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_zfree(png_ptr, png_ptr->palette);
1413893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->free_me &= ~PNG_FREE_PLTE;
1414893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
1415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->flags & PNG_FLAG_FREE_PLTE)
1416893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_zfree(png_ptr, png_ptr->palette);
1417893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->flags &= ~PNG_FLAG_FREE_PLTE;
1418893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1419893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_tRNS_SUPPORTED) || \
1420893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
1421893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_FREE_ME_SUPPORTED
1422893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->free_me & PNG_FREE_TRNS)
1423893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_free(png_ptr, png_ptr->trans);
1424893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->free_me &= ~PNG_FREE_TRNS;
1425893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
1426893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->flags & PNG_FLAG_FREE_TRNS)
1427893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_free(png_ptr, png_ptr->trans);
1428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->flags &= ~PNG_FLAG_FREE_TRNS;
1429893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1430893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
14315f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_hIST_SUPPORTED
1432893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_FREE_ME_SUPPORTED
1433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->free_me & PNG_FREE_HIST)
1434893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_free(png_ptr, png_ptr->hist);
1435893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->free_me &= ~PNG_FREE_HIST;
1436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
1437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->flags & PNG_FLAG_FREE_HIST)
1438893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_free(png_ptr, png_ptr->hist);
1439893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->flags &= ~PNG_FLAG_FREE_HIST;
1440893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1441893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
14425f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_GAMMA_SUPPORTED
1443893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->gamma_16_table != NULL)
1444893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1445893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int i;
1446893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int istop = (1 << (8 - png_ptr->gamma_shift));
1447893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (i = 0; i < istop; i++)
1448893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1449893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_free(png_ptr, png_ptr->gamma_16_table[i]);
1450893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1451893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_free(png_ptr, png_ptr->gamma_16_table);
1452893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
14535f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_BACKGROUND_SUPPORTED
1454893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->gamma_16_from_1 != NULL)
1455893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1456893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int i;
1457893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int istop = (1 << (8 - png_ptr->gamma_shift));
1458893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (i = 0; i < istop; i++)
1459893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1460893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_free(png_ptr, png_ptr->gamma_16_from_1[i]);
1461893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1462893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_free(png_ptr, png_ptr->gamma_16_from_1);
1463893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1464893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->gamma_16_to_1 != NULL)
1465893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1466893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int i;
1467893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int istop = (1 << (8 - png_ptr->gamma_shift));
1468893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (i = 0; i < istop; i++)
1469893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_free(png_ptr, png_ptr->gamma_16_to_1[i]);
1471893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1472893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_free(png_ptr, png_ptr->gamma_16_to_1);
1473893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1474893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1475893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
14765f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_TIME_RFC1123_SUPPORTED
1477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_free(png_ptr, png_ptr->time_buffer);
1478893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1479893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1480893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   inflateEnd(&png_ptr->zstream);
1481893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
1482893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_free(png_ptr, png_ptr->save_buffer);
1483893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1484893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1485893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
1486893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_TEXT_SUPPORTED
1487893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_free(png_ptr, png_ptr->current_text);
1488893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_TEXT_SUPPORTED */
1489893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
1490893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1491893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* Save the important info out of the png_struct, in case it is
1492893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * being used again.
1493893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    */
1494893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
14954215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf));
1496893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1497893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1498893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   error_fn = png_ptr->error_fn;
1499893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   warning_fn = png_ptr->warning_fn;
1500893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   error_ptr = png_ptr->error_ptr;
1501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
1502893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   free_fn = png_ptr->free_fn;
1503893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1504893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
15054215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_memset(png_ptr, 0, png_sizeof(png_struct));
1506893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1507893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->error_fn = error_fn;
1508893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->warning_fn = warning_fn;
1509893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->error_ptr = error_ptr;
1510893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
1511893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->free_fn = free_fn;
1512893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1513893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1514893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
15154215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf));
1516893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1517893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1518893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1519893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1520893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
1521893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_read_status_fn(png_structp png_ptr, png_read_status_ptr read_row_fn)
1522893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1523a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
1524a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
1525893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->read_row_fn = read_row_fn;
1526893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1527893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1528893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
15295f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
15305f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_INFO_IMAGE_SUPPORTED
1531893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
1532893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_read_png(png_structp png_ptr, png_infop info_ptr,
1533893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                           int transforms,
1534893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                           voidp params)
1535893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1536893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   int row;
1537893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1538a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
1539a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
15405f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED
1541a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Invert the alpha channel from opacity to transparency
1542893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    */
1543893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (transforms & PNG_TRANSFORM_INVERT_ALPHA)
1544893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       png_set_invert_alpha(png_ptr);
1545893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1546893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1547893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* png_read_info() gives us all of the information from the
1548893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * PNG file before the first IDAT (image data chunk).
1549893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    */
1550893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_read_info(png_ptr, info_ptr);
1551893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (info_ptr->height > PNG_UINT_32_MAX/png_sizeof(png_bytep))
15524215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      png_error(png_ptr, "Image is too high to process with png_read_png()");
1553893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1554893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* -------------- image transformations start here ------------------- */
1555893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
15565f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_16_TO_8_SUPPORTED
1557a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Tell libpng to strip 16 bit/color files down to 8 bits per color.
1558893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    */
1559893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (transforms & PNG_TRANSFORM_STRIP_16)
1560a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      png_set_strip_16(png_ptr);
1561893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1562893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
15635f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
1564893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* Strip alpha bytes from the input data without combining with
1565893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * the background (not recommended).
1566893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    */
1567893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (transforms & PNG_TRANSFORM_STRIP_ALPHA)
1568a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      png_set_strip_alpha(png_ptr);
1569893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1570893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1571893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_PACK_SUPPORTED) && !defined(PNG_READ_EXPAND_SUPPORTED)
1572893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* Extract multiple pixels with bit depths of 1, 2, or 4 from a single
1573893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * byte into separate bytes (useful for paletted and grayscale images).
1574893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    */
1575893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (transforms & PNG_TRANSFORM_PACKING)
1576a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      png_set_packing(png_ptr);
1577893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1578893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
15795f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_PACKSWAP_SUPPORTED
1580893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* Change the order of packed pixels to least significant bit first
1581893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * (not useful if you are using png_set_packing).
1582893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    */
1583893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (transforms & PNG_TRANSFORM_PACKSWAP)
1584a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      png_set_packswap(png_ptr);
1585893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1586893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
15875f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_EXPAND_SUPPORTED
1588893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* Expand paletted colors into true RGB triplets
1589893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * Expand grayscale images to full 8 bits from 1, 2, or 4 bits/pixel
1590893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * Expand paletted or RGB images with transparency to full alpha
1591893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * channels so the data will be available as RGBA quartets.
1592893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    */
1593893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (transforms & PNG_TRANSFORM_EXPAND)
1594a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      if ((png_ptr->bit_depth < 8) ||
1595a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott          (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ||
1596a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott          (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)))
1597893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_expand(png_ptr);
1598893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1599893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1600893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* We don't handle background color or gamma transformation or dithering.
1601893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    */
1602893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
16035f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_INVERT_SUPPORTED
1604a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Invert monochrome files to have 0 as white and 1 as black
1605893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    */
1606893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (transforms & PNG_TRANSFORM_INVERT_MONO)
1607a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      png_set_invert_mono(png_ptr);
1608893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1609893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
16105f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_SHIFT_SUPPORTED
1611893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* If you want to shift the pixel values from the range [0,255] or
1612893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * [0,65535] to the original [0,7] or [0,31], or whatever range the
1613893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * colors were originally in:
1614893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    */
1615893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if ((transforms & PNG_TRANSFORM_SHIFT)
1616893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       && png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT))
1617893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1618893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_color_8p sig_bit;
1619893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1620893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_get_sBIT(png_ptr, info_ptr, &sig_bit);
1621893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_set_shift(png_ptr, sig_bit);
1622893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1623893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1624893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
16255f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_BGR_SUPPORTED
1626a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Flip the RGB pixels to BGR (or RGBA to BGRA)
1627893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    */
1628893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (transforms & PNG_TRANSFORM_BGR)
1629a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      png_set_bgr(png_ptr);
1630893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1631893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
16325f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_SWAP_ALPHA_SUPPORTED
1633a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR)
1634893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    */
1635893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (transforms & PNG_TRANSFORM_SWAP_ALPHA)
1636893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       png_set_swap_alpha(png_ptr);
1637893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1638893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
16395f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_SWAP_SUPPORTED
1640a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Swap bytes of 16 bit files to least significant byte first
1641893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    */
1642893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (transforms & PNG_TRANSFORM_SWAP_ENDIAN)
1643a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      png_set_swap(png_ptr);
1644893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1645893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
16465f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott/* Added at libpng-1.2.41 */
16475f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED
16485f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   /* Invert the alpha channel from opacity to transparency
16495f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott    */
16505f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   if (transforms & PNG_TRANSFORM_INVERT_ALPHA)
16515f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott       png_set_invert_alpha(png_ptr);
16525f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#endif
16535f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
16545f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott/* Added at libpng-1.2.41 */
16555f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
16565f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   /* Expand grayscale image to RGB
16575f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott    */
16585f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   if (transforms & PNG_TRANSFORM_GRAY_TO_RGB)
16595f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott       png_set_gray_to_rgb(png_ptr);
16605f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#endif
16615f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
1662893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* We don't handle adding filler bytes */
1663893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1664893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* Optional call to gamma correct and add the background to the palette
1665893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * and update info structure.  REQUIRED if you are expecting libpng to
1666893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * update the palette for you (i.e., you selected such a transform above).
1667893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    */
1668893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_read_update_info(png_ptr, info_ptr);
1669893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1670893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* -------------- image transformations end here ------------------- */
1671893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1672893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_FREE_ME_SUPPORTED
1673893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0);
1674893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
16754215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   if (info_ptr->row_pointers == NULL)
1676893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1677893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      info_ptr->row_pointers = (png_bytepp)png_malloc(png_ptr,
1678893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         info_ptr->height * png_sizeof(png_bytep));
1679a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      png_memset(info_ptr->row_pointers, 0, info_ptr->height
1680a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         * png_sizeof(png_bytep));
16815f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
1682893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_FREE_ME_SUPPORTED
1683893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      info_ptr->free_me |= PNG_FREE_ROWS;
1684893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
16855f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
1686893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (row = 0; row < (int)info_ptr->height; row++)
1687893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         info_ptr->row_pointers[row] = (png_bytep)png_malloc(png_ptr,
1688893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_get_rowbytes(png_ptr, info_ptr));
1689893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1690893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1691893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_read_image(png_ptr, info_ptr->row_pointers);
1692893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   info_ptr->valid |= PNG_INFO_IDAT;
1693893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1694a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Read rest of file, and get additional chunks in info_ptr - REQUIRED */
1695893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_read_end(png_ptr, info_ptr);
1696893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1697a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   transforms = transforms; /* Quiet compiler warnings */
1698893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   params = params;
1699893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1700893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1701893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_INFO_IMAGE_SUPPORTED */
17025f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
1703893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_READ_SUPPORTED */
1704