18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* pngread.c - read a PNG file
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
4c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * Last changed in libpng 1.2.44 [June 26, 2010]
5c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * Copyright (c) 1998-2010 Glenn Randers-Pehrson
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
9c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * This code is released under the libpng license.
10c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * For conditions of distribution and use, see the disclaimer
11c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * and license in png.h
12c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner *
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * This file contains routines that an application calls directly to
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * read a PNG file or stream.
158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_INTERNAL
18c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#define PNG_NO_PEDANTIC_WARNINGS
198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "png.h"
20c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_SUPPORTED
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Create a PNG structure for reading, and allocate any memory needed. */
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_structp PNGAPI
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_create_read_struct(png_const_charp user_png_ver, png_voidp error_ptr,
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_error_ptr error_fn, png_error_ptr warn_fn)
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   return (png_create_read_struct_2(user_png_ver, error_ptr, error_fn,
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      warn_fn, png_voidp_NULL, png_malloc_ptr_NULL, png_free_ptr_NULL));
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
34c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner/* Alternate create PNG structure for reading, and allocate any memory
35c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * needed.
36c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner */
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_structp PNGAPI
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,
398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,
408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_malloc_ptr malloc_fn, png_free_ptr free_fn)
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
44c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_SETJMP_SUPPORTED
45c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   volatile
46c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#endif
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_structp png_ptr;
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef USE_FAR_KEYWORD
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   jmp_buf jmpbuf;
528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   int i;
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
57c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_create_read_struct");
58c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG,
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr);
628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG);
648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr == NULL)
668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return (NULL);
678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
68c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Added at libpng-1.2.6 */
69c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_USER_LIMITS_SUPPORTED
70c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_ptr->user_width_max = PNG_USER_WIDTH_MAX;
71c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_ptr->user_height_max = PNG_USER_HEIGHT_MAX;
72c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#  ifdef PNG_USER_CHUNK_CACHE_MAX
73c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Added at libpng-1.2.43 and 1.4.0 */
74c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_ptr->user_chunk_cache_max = PNG_USER_CHUNK_CACHE_MAX;
75c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#  endif
76c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#  ifdef PNG_SET_USER_CHUNK_MALLOC_MAX
77c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Added at libpng-1.2.43 and 1.4.1 */
78c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_ptr->user_chunk_malloc_max = PNG_USER_CHUNK_MALLOC_MAX;
79c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#  endif
808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef USE_FAR_KEYWORD
848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (setjmp(jmpbuf))
858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (setjmp(png_ptr->jmpbuf))
878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free(png_ptr, png_ptr->zbuf);
90c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_ptr->zbuf = NULL;
918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_destroy_struct_2((png_voidp)png_ptr,
938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         (png_free_ptr)free_fn, (png_voidp)mem_ptr);
948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_destroy_struct((png_voidp)png_ptr);
968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return (NULL);
988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef USE_FAR_KEYWORD
100c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf));
1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
102c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#endif /* PNG_SETJMP_SUPPORTED */
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn);
1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn);
1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
110c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (user_png_ver)
1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
112c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      i = 0;
113c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      do
114c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      {
115c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         if (user_png_ver[i] != png_libpng_ver[i])
116c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
117c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      } while (png_libpng_ver[i++]);
118c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner    }
119c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner    else
120c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
121c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
122c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
123c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner    if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH)
124c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner    {
125c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner       /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so
126c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner       * we must recompile any applications that use any older library version.
127c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner       * For versions after libpng 1.0, we will be compatible, so we need
128c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner       * only check the first digit.
129c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner       */
130c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] ||
131c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner          (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) ||
132c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner          (user_png_ver[0] == '0' && user_png_ver[2] < '9'))
133c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      {
134c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#if defined(PNG_STDIO_SUPPORTED) && !defined(_WIN32_WCE)
135c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         char msg[80];
136c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         if (user_png_ver)
137c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         {
138c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner           png_snprintf(msg, 80,
139c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner              "Application was compiled with png.h from libpng-%.20s",
140c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner              user_png_ver);
141c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner           png_warning(png_ptr, msg);
142c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         }
143c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         png_snprintf(msg, 80,
1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project             "Application  is  running with png.c from libpng-%.20s",
145c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner             png_libpng_ver);
146c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         png_warning(png_ptr, msg);
1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_ERROR_NUMBERS_SUPPORTED
149c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         png_ptr->flags = 0;
1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
151c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         png_error(png_ptr,
152c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            "Incompatible libpng version in application and library");
153c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      }
1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
156c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Initialize zbuf - compression buffer */
1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zbuf_size = PNG_ZBUF_SIZE;
1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zbuf = (png_bytep)png_malloc(png_ptr,
1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     (png_uint_32)png_ptr->zbuf_size);
1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.zalloc = png_zalloc;
1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.zfree = png_zfree;
1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.opaque = (voidpf)png_ptr;
1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
164c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      switch (inflateInit(&png_ptr->zstream))
165c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      {
166c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         case Z_OK: /* Do nothing */ break;
167c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         case Z_MEM_ERROR:
168c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory error");
169c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            break;
170c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         case Z_VERSION_ERROR: png_error(png_ptr, "zlib version error");
171c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            break;
172c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         default: png_error(png_ptr, "Unknown zlib error");
173c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      }
174c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.next_out = png_ptr->zbuf;
1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL);
1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
182c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner/* Applications that neglect to set up their own setjmp() and then
183c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   encounter a png_error() will longjmp here.  Since the jmpbuf is
184c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   then meaningless we abort instead of returning. */
1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef USE_FAR_KEYWORD
1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (setjmp(jmpbuf))
187c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner       PNG_ABORT();
188c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf));
1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (setjmp(png_ptr->jmpbuf))
191c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner       PNG_ABORT();
1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
193c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#endif /* PNG_SETJMP_SUPPORTED */
194c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
195c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_INDEX_SUPPORTED
196c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_ptr->index = NULL;
1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
198c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   return (png_ptr);
2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_1_0_X) || defined(PNG_1_2_X)
2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Initialize PNG structure for reading, and allocate any memory needed.
204c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * This interface is deprecated in favour of the png_create_read_struct(),
205c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * and it will disappear as of libpng-1.3.0.
206c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner */
2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef png_read_init
2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_read_init(png_structp png_ptr)
2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* We only come here via pre-1.0.7-compiled applications */
2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_read_init_2(png_ptr, "1.0.6 or earlier", 0, 0);
2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_read_init_2(png_structp png_ptr, png_const_charp user_png_ver,
2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_size_t png_struct_size, png_size_t png_info_size)
2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* We only come here via pre-1.0.12-compiled applications */
220c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
221c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
222c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#if defined(PNG_STDIO_SUPPORTED) && !defined(_WIN32_WCE)
223c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_sizeof(png_struct) > png_struct_size ||
2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_sizeof(png_info) > png_info_size)
2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      char msg[80];
227c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_ptr->warning_fn = NULL;
2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (user_png_ver)
2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        png_snprintf(msg, 80,
2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           "Application was compiled with png.h from libpng-%.20s",
2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           user_png_ver);
2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        png_warning(png_ptr, msg);
2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_snprintf(msg, 80,
2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         "Application  is  running with png.c from libpng-%.20s",
2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_libpng_ver);
2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr, msg);
2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
241c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_sizeof(png_struct) > png_struct_size)
242c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   {
243c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_ptr->error_fn = NULL;
2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_ERROR_NUMBERS_SUPPORTED
245c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_ptr->flags = 0;
246c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#endif
247c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_error(png_ptr,
248c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      "The png struct allocated by the application for reading is"
249c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      " too small.");
250c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   }
251c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_sizeof(png_info) > png_info_size)
252c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   {
253c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_ptr->error_fn = NULL;
2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_ERROR_NUMBERS_SUPPORTED
255c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_ptr->flags = 0;
2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
257c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_error(png_ptr,
258c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner        "The info struct allocated by application for reading is"
259c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner        " too small.");
260c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   }
2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_read_init_3(&png_ptr, user_png_ver, png_struct_size);
2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_1_0_X || PNG_1_2_X */
2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_read_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver,
2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_size_t png_struct_size)
2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   jmp_buf tmp_jmp;  /* to save current jump buffer */
2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
273c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   int i = 0;
2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_structp png_ptr=*ptr_ptr;
2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
277c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
278c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   do
2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
282c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if (user_png_ver[i] != png_libpng_ver[i])
283c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      {
2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_LEGACY_SUPPORTED
285c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner        png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
287c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner        png_ptr->warning_fn = NULL;
288c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner        png_warning(png_ptr,
289c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         "Application uses deprecated png_read_init() and should be"
290c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         " recompiled.");
291c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner        break;
2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
293c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      }
2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   } while (png_libpng_ver[i++]);
2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
296c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_read_init_3");
2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
299c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Save jump buffer and error functions */
300c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf));
3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
303c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_sizeof(png_struct) > png_struct_size)
304c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   {
305c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_destroy_struct(png_ptr);
306c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      *ptr_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG);
307c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_ptr = *ptr_ptr;
308c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   }
3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
310c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Reset all variables to 0 */
311c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_memset(png_ptr, 0, png_sizeof(png_struct));
3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
314c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Restore jump buffer */
315c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf));
3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
318c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Added at libpng-1.2.6 */
3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SET_USER_LIMITS_SUPPORTED
320c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_ptr->user_width_max = PNG_USER_WIDTH_MAX;
321c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_ptr->user_height_max = PNG_USER_HEIGHT_MAX;
3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
324c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Initialize zbuf - compression buffer */
3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zbuf_size = PNG_ZBUF_SIZE;
326c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_ptr->zstream.zalloc = png_zalloc;
3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zbuf = (png_bytep)png_malloc(png_ptr,
3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     (png_uint_32)png_ptr->zbuf_size);
3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.zalloc = png_zalloc;
3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.zfree = png_zfree;
3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.opaque = (voidpf)png_ptr;
3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   switch (inflateInit(&png_ptr->zstream))
3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
335c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      case Z_OK: /* Do nothing */ break;
336c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory error"); break;
337c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      case Z_VERSION_ERROR: png_error(png_ptr, "zlib version error");
338c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner          break;
339c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      default: png_error(png_ptr, "Unknown zlib error");
3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.next_out = png_ptr->zbuf;
3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL);
3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
348c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Read the information before the actual image data.  This has been
3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * changed in v0.90 to allow reading a file that already has the magic
3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * bytes read from the stream.  You can tell libpng how many bytes have
3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * been read from the beginning of the stream (up to the maximum of 8)
3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * via png_set_sig_bytes(), and we will only check the remaining bytes
3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * here.  The application can then have access to the signature bytes we
3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * read if it is determined that this isn't a valid PNG file.
3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_read_info(png_structp png_ptr, png_infop info_ptr)
3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
360c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_read_info");
361c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
362c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL || info_ptr == NULL)
363c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
364c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* If we haven't checked all of the PNG signature bytes, do so now. */
3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->sig_bytes < 8)
3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_size_t num_checked = png_ptr->sig_bytes,
3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                 num_to_check = 8 - num_checked;
3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_read_data(png_ptr, &(info_ptr->signature[num_checked]), num_to_check);
3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->sig_bytes = 8;
3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check))
3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (num_checked < 4 &&
3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project             png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4))
3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "Not a PNG file");
3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         else
3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "PNG file corrupted by ASCII conversion");
3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (num_checked < 3)
3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE;
3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
386c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   for (;;)
3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS
3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_IHDR;
3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_IDAT;
3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_IEND;
3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_PLTE;
393c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_bKGD_SUPPORTED
3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_bKGD;
3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
396c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_cHRM_SUPPORTED
3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_cHRM;
3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
399c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_gAMA_SUPPORTED
4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_gAMA;
4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
402c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_hIST_SUPPORTED
4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_hIST;
4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
405c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_iCCP_SUPPORTED
4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_iCCP;
4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
408c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_iTXt_SUPPORTED
4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_iTXt;
4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
411c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_oFFs_SUPPORTED
4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_oFFs;
4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
414c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_pCAL_SUPPORTED
4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_pCAL;
4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
417c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_pHYs_SUPPORTED
4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_pHYs;
4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
420c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sBIT_SUPPORTED
4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_sBIT;
4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
423c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sCAL_SUPPORTED
4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_sCAL;
4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
426c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sPLT_SUPPORTED
4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_sPLT;
4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
429c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sRGB_SUPPORTED
4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_sRGB;
4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
432c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tEXt_SUPPORTED
4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_tEXt;
4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
435c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tIME_SUPPORTED
4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_tIME;
4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
438c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tRNS_SUPPORTED
4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_tRNS;
4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
441c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_zTXt_SUPPORTED
4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_zTXt;
4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USE_LOCAL_ARRAYS */
445c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_uint_32 length = png_read_chunk_header(png_ptr);
446c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      PNG_CONST png_bytep chunk_name = png_ptr->chunk_name;
4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      /* This should be a binary subdivision search or a hash for
4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       * matching the chunk name rather than a linear search.
4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       */
451c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if (!png_memcmp(chunk_name, png_IDAT, 4))
452c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner        if (png_ptr->mode & PNG_AFTER_IDAT)
4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
455c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if (!png_memcmp(chunk_name, png_IHDR, 4))
4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_IHDR(png_ptr, info_ptr, length);
457c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_IEND, 4))
4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_IEND(png_ptr, info_ptr, length);
4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
460c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (png_handle_as_unknown(png_ptr, chunk_name))
4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
462c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         if (!png_memcmp(chunk_name, png_IDAT, 4))
4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->mode |= PNG_HAVE_IDAT;
4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_unknown(png_ptr, info_ptr, length);
465c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         if (!png_memcmp(chunk_name, png_PLTE, 4))
4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->mode |= PNG_HAVE_PLTE;
467c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         else if (!png_memcmp(chunk_name, png_IDAT, 4))
4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (!(png_ptr->mode & PNG_HAVE_IHDR))
4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_error(png_ptr, "Missing IHDR before IDAT");
4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                     !(png_ptr->mode & PNG_HAVE_PLTE))
4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_error(png_ptr, "Missing PLTE before IDAT");
4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
478c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_PLTE, 4))
4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_PLTE(png_ptr, info_ptr, length);
480c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_IDAT, 4))
4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (!(png_ptr->mode & PNG_HAVE_IHDR))
4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "Missing IHDR before IDAT");
4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  !(png_ptr->mode & PNG_HAVE_PLTE))
4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "Missing PLTE before IDAT");
4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->idat_size = length;
4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->mode |= PNG_HAVE_IDAT;
4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         break;
4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
492c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_bKGD_SUPPORTED
493c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_bKGD, 4))
4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_bKGD(png_ptr, info_ptr, length);
4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
496c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_cHRM_SUPPORTED
497c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_cHRM, 4))
4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_cHRM(png_ptr, info_ptr, length);
4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
500c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_gAMA_SUPPORTED
501c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_gAMA, 4))
5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_gAMA(png_ptr, info_ptr, length);
5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
504c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_hIST_SUPPORTED
505c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_hIST, 4))
5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_hIST(png_ptr, info_ptr, length);
5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
508c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_oFFs_SUPPORTED
509c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_oFFs, 4))
5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_oFFs(png_ptr, info_ptr, length);
5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
512c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_pCAL_SUPPORTED
513c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_pCAL, 4))
5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_pCAL(png_ptr, info_ptr, length);
5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
516c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sCAL_SUPPORTED
517c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_sCAL, 4))
5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_sCAL(png_ptr, info_ptr, length);
5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
520c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_pHYs_SUPPORTED
521c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_pHYs, 4))
5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_pHYs(png_ptr, info_ptr, length);
5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
524c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sBIT_SUPPORTED
525c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_sBIT, 4))
5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_sBIT(png_ptr, info_ptr, length);
5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
528c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sRGB_SUPPORTED
529c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_sRGB, 4))
5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_sRGB(png_ptr, info_ptr, length);
5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
532c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_iCCP_SUPPORTED
533c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_iCCP, 4))
5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_iCCP(png_ptr, info_ptr, length);
5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
536c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sPLT_SUPPORTED
537c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_sPLT, 4))
5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_sPLT(png_ptr, info_ptr, length);
5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
540c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tEXt_SUPPORTED
541c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_tEXt, 4))
5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_tEXt(png_ptr, info_ptr, length);
5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
544c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tIME_SUPPORTED
545c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_tIME, 4))
5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_tIME(png_ptr, info_ptr, length);
5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
548c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tRNS_SUPPORTED
549c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_tRNS, 4))
5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_tRNS(png_ptr, info_ptr, length);
5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
552c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_zTXt_SUPPORTED
553c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_zTXt, 4))
5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_zTXt(png_ptr, info_ptr, length);
5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
556c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_iTXt_SUPPORTED
557c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_iTXt, 4))
5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_iTXt(png_ptr, info_ptr, length);
5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
5608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_unknown(png_ptr, info_ptr, length);
5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
564c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
566c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner/* Optional call to update the users info_ptr structure */
5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_read_update_info(png_structp png_ptr, png_infop info_ptr)
5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
570c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_read_update_info");
571c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
572c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
573c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
574c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_INDEX_SUPPORTED
575c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr->index) {
576c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_read_start_row(png_ptr);
577c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   }
578c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#endif
5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_read_start_row(png_ptr);
5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else
5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr,
5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      "Ignoring extra png_read_update_info() call; row buffer not reallocated");
584c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_read_transform_info(png_ptr, info_ptr);
5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
588c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Initialize palette, background, etc, after transformations
5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * are set, but before any reading takes place.  This allows
5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the user to obtain a gamma-corrected palette, for example.
5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * If the user doesn't call this, we will do it ourselves.
5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_start_read_image(png_structp png_ptr)
5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
597c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_start_read_image");
598c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
599c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
600c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_read_start_row(png_ptr);
6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
604c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
606c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   PNG_CONST PNG_IDAT;
6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   PNG_CONST int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55,
612c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      0xff};
6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   PNG_CONST int png_pass_mask[7] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff};
6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   int ret;
615c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
616c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
617c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
618c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
619c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug2(1, "in png_read_row (row %lu, pass %d)",
6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->row_number, png_ptr->pass);
621c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_read_start_row(png_ptr);
6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->row_number == 0 && png_ptr->pass == 0)
6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
626c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Check for transforms that have been set but were defined out */
6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_INVERT_SUPPORTED) && !defined(PNG_READ_INVERT_SUPPORTED)
6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->transformations & PNG_INVERT_MONO)
6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr, "PNG_READ_INVERT_SUPPORTED is not defined.");
6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_FILLER_SUPPORTED) && !defined(PNG_READ_FILLER_SUPPORTED)
6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->transformations & PNG_FILLER)
6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr, "PNG_READ_FILLER_SUPPORTED is not defined.");
6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
635c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#if defined(PNG_WRITE_PACKSWAP_SUPPORTED) && \
636c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner    !defined(PNG_READ_PACKSWAP_SUPPORTED)
6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->transformations & PNG_PACKSWAP)
6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr, "PNG_READ_PACKSWAP_SUPPORTED is not defined.");
6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_PACK_SUPPORTED) && !defined(PNG_READ_PACK_SUPPORTED)
6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->transformations & PNG_PACK)
6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr, "PNG_READ_PACK_SUPPORTED is not defined.");
6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
6448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_SHIFT_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED)
6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->transformations & PNG_SHIFT)
6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr, "PNG_READ_SHIFT_SUPPORTED is not defined.");
6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_BGR_SUPPORTED) && !defined(PNG_READ_BGR_SUPPORTED)
6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->transformations & PNG_BGR)
6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr, "PNG_READ_BGR_SUPPORTED is not defined.");
6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_SWAP_SUPPORTED) && !defined(PNG_READ_SWAP_SUPPORTED)
6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->transformations & PNG_SWAP_BYTES)
6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr, "PNG_READ_SWAP_SUPPORTED is not defined.");
6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
658c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_INTERLACING_SUPPORTED
659c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* If interlaced and we do not need a new row, combine row and return */
6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
6618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      switch (png_ptr->pass)
6638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
6648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 0:
6658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (png_ptr->row_number & 0x07)
6668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
6678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               if (dsp_row != NULL)
6688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_combine_row(png_ptr, dsp_row,
6698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                     png_pass_dsp_mask[png_ptr->pass]);
6708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_finish_row(png_ptr);
6718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               return;
6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
6748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 1:
6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if ((png_ptr->row_number & 0x07) || png_ptr->width < 5)
6768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
6778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               if (dsp_row != NULL)
6788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_combine_row(png_ptr, dsp_row,
6798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                     png_pass_dsp_mask[png_ptr->pass]);
6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_finish_row(png_ptr);
6818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               return;
6828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
6838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
6848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 2:
6858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if ((png_ptr->row_number & 0x07) != 4)
6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               if (dsp_row != NULL && (png_ptr->row_number & 4))
6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_combine_row(png_ptr, dsp_row,
6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                     png_pass_dsp_mask[png_ptr->pass]);
6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_finish_row(png_ptr);
6918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               return;
6928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
6938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
6948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 3:
6958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if ((png_ptr->row_number & 3) || png_ptr->width < 3)
6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               if (dsp_row != NULL)
6988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_combine_row(png_ptr, dsp_row,
6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                     png_pass_dsp_mask[png_ptr->pass]);
7008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_finish_row(png_ptr);
7018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               return;
7028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
7038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
7048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 4:
7058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if ((png_ptr->row_number & 3) != 2)
7068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
7078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               if (dsp_row != NULL && (png_ptr->row_number & 2))
7088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_combine_row(png_ptr, dsp_row,
7098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                     png_pass_dsp_mask[png_ptr->pass]);
7108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_finish_row(png_ptr);
7118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               return;
7128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
7138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
7148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 5:
7158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if ((png_ptr->row_number & 1) || png_ptr->width < 2)
7168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
7178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               if (dsp_row != NULL)
7188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_combine_row(png_ptr, dsp_row,
7198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                     png_pass_dsp_mask[png_ptr->pass]);
7208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_finish_row(png_ptr);
7218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               return;
7228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
7238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
7248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 6:
7258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (!(png_ptr->row_number & 1))
7268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
7278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_finish_row(png_ptr);
7288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               return;
7298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
7308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
7318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
7328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
7338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
7348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->mode & PNG_HAVE_IDAT))
7368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_error(png_ptr, "Invalid attempt to read row data");
7378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.next_out = png_ptr->row_buf;
739c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_ptr->zstream.avail_out =
740c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner       (uInt)(PNG_ROWBYTES(png_ptr->pixel_depth,
741c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner       png_ptr->iwidth) + 1);
7428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   do
7438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
7448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (!(png_ptr->zstream.avail_in))
7458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
7468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         while (!png_ptr->idat_size)
7478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
748c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_INDEX_SUPPORTED
749c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            if (png_ptr->index) {
750c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner               png_opt_crc_finish(png_ptr, 0, 0);
751c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner               png_ptr->index->stream_idat_position = png_ptr->total_data_read;
752c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            } else
753c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#endif
754c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner               png_crc_finish(png_ptr, 0);
7558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
757c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            png_ptr->idat_size = png_read_chunk_header(png_ptr);
7588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
7598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_error(png_ptr, "Not enough image data");
7608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
7618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size;
7628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->zstream.next_in = png_ptr->zbuf;
7638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (png_ptr->zbuf_size > png_ptr->idat_size)
7648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size;
7658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_crc_read(png_ptr, png_ptr->zbuf,
7668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            (png_size_t)png_ptr->zstream.avail_in);
7678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->idat_size -= png_ptr->zstream.avail_in;
7688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
7698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
7708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (ret == Z_STREAM_END)
7718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
7728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (png_ptr->zstream.avail_out || png_ptr->zstream.avail_in ||
7738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->idat_size)
7748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "Extra compressed data");
7758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->mode |= PNG_AFTER_IDAT;
7768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
7778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         break;
7788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
779c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if (ret != Z_OK) {
780c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_INDEX_SUPPORTED
781c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         if (png_ptr->index) {
782c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            if (png_ptr->row_number != png_ptr->height - 1) {
783c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner               png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg :
784c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner                     "Decompression error");
785c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            }
786c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         } else
787c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#endif
788c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg :
789c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner                  "Decompression error");
790c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      }
7918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   } while (png_ptr->zstream.avail_out);
7928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_info.color_type = png_ptr->color_type;
7948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_info.width = png_ptr->iwidth;
7958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_info.channels = png_ptr->channels;
7968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_info.bit_depth = png_ptr->bit_depth;
7978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_info.pixel_depth = png_ptr->pixel_depth;
7988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,
7998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_ptr->row_info.width);
8008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
801c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr->row_buf[0])
8028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_read_filter_row(png_ptr, &(png_ptr->row_info),
8038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->row_buf + 1, png_ptr->prev_row + 1,
8048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      (int)(png_ptr->row_buf[0]));
8058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf,
8078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->rowbytes + 1);
8088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
809c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_MNG_FEATURES_SUPPORTED
810c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
8118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING))
8128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
8138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      /* Intrapixel differencing */
8148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_do_read_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1);
8158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
8168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
8178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA))
8208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_do_read_transformations(png_ptr);
8218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
822c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_INTERLACING_SUPPORTED
823c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Blow up interlaced rows to full size */
8248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->interlaced &&
8258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      (png_ptr->transformations & PNG_INTERLACE))
8268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
8278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->pass < 6)
828c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         /* Old interface (pre-1.0.9):
829c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner          * png_do_read_interlace(&(png_ptr->row_info),
830c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner          *    png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations);
831c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner          */
8328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_do_read_interlace(png_ptr);
8338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (dsp_row != NULL)
8358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_combine_row(png_ptr, dsp_row,
8368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_pass_dsp_mask[png_ptr->pass]);
8378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (row != NULL)
8388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_combine_row(png_ptr, row,
8398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_pass_mask[png_ptr->pass]);
8408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
8418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else
8428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
8438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
8448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (row != NULL)
8458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_combine_row(png_ptr, row, 0xff);
8468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (dsp_row != NULL)
8478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_combine_row(png_ptr, dsp_row, 0xff);
8488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
8498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_read_finish_row(png_ptr);
8508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->read_row_fn != NULL)
8528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      (*(png_ptr->read_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass);
8538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
854c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
8558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
856c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
8578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Read one or more rows of image data.  If the image is interlaced,
8588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * and png_set_interlace_handling() has been called, the rows need to
8598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * contain the contents of the rows from the previous pass.  If the
8608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * image has alpha or transparency, and png_handle_alpha()[*] has been
8618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * called, the rows contents must be initialized to the contents of the
8628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * screen.
8638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
8648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * "row" holds the actual image, and pixels are placed in it
8658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * as they arrive.  If the image is displayed after each pass, it will
8668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * appear to "sparkle" in.  "display_row" can be used to display a
8678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * "chunky" progressive image, with finer detail added as it becomes
8688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * available.  If you do not want this "chunky" display, you may pass
8698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * NULL for display_row.  If you do not want the sparkle display, and
8708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * you have not called png_handle_alpha(), you may pass NULL for rows.
8718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * If you have called png_handle_alpha(), and the image has either an
8728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * alpha channel or a transparency chunk, you must provide a buffer for
8738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * rows.  In this case, you do not have to provide a display_row buffer
8748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * also, but you may.  If the image is not interlaced, or if you have
8758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * not called png_set_interlace_handling(), the display_row buffer will
8768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * be ignored, so pass NULL to it.
8778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
8788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * [*] png_handle_alpha() does not exist yet, as of this version of libpng
8798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
8808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
8828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_read_rows(png_structp png_ptr, png_bytepp row,
8838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_bytepp display_row, png_uint_32 num_rows)
8848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
8858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_uint_32 i;
8868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_bytepp rp;
8878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_bytepp dp;
8888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
889c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_read_rows");
890c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
891c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
892c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
8938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   rp = row;
8948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   dp = display_row;
8958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (rp != NULL && dp != NULL)
8968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (i = 0; i < num_rows; i++)
8978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
8988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_bytep rptr = *rp++;
8998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_bytep dptr = *dp++;
9008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_read_row(png_ptr, rptr, dptr);
9028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
903c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   else if (rp != NULL)
9048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (i = 0; i < num_rows; i++)
9058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
9068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_bytep rptr = *rp;
9078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_read_row(png_ptr, rptr, png_bytep_NULL);
9088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         rp++;
9098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
910c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   else if (dp != NULL)
9118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (i = 0; i < num_rows; i++)
9128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
9138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_bytep dptr = *dp;
9148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_read_row(png_ptr, png_bytep_NULL, dptr);
9158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         dp++;
9168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
9178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
918c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
919c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
920c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_INDEX_SUPPORTED
921c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#define IDAT_HEADER_SIZE 8
922c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
923c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner/* Set the png read position to a new position based on idat_position and
924c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * offset.
925c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner */
926c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turnervoid
927c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turnerpng_set_read_offset(png_structp png_ptr,
928c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_uint_32 idat_position, png_uint_32 bytes_left)
929c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner{
930c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_seek_data(png_ptr, idat_position);
931c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_ptr->idat_size = png_read_chunk_header(png_ptr);
932c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
933c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   // We need to add back IDAT_HEADER_SIZE because in zlib's perspective,
934c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   // IDAT_HEADER in PNG is already stripped out.
935c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_seek_data(png_ptr, idat_position + IDAT_HEADER_SIZE + png_ptr->idat_size - bytes_left);
936c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_ptr->idat_size = bytes_left;
937c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner}
9388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
939c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner/* Configure png decoder to decode the pass starting from *row.
940c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * The requested row may be adjusted to align with an indexing row.
941c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * The actual row for the decoder to start its decoding will be returned in
942c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * *row.
943c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner */
944c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turnervoid PNGAPI
945c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turnerpng_configure_decoder(png_structp png_ptr, int *row, int pass)
946c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner{
947c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_indexp index = png_ptr->index;
948c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   int n = *row / index->step[pass];
949c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_line_indexp line_index = index->pass_line_index[pass][n];
950c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
951c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   // Adjust row to an indexing row.
952c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   *row = n * index->step[pass];
953c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_ptr->row_number = *row;
954c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
955c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_INTERLACING_SUPPORTED
956c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr->interlaced)
957c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_set_interlaced_pass(png_ptr, pass);
958c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#endif
959c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
960c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   long row_byte_length =
961c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->iwidth) + 1;
962c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
963c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   inflateEnd(&png_ptr->zstream);
964c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   inflateCopy(&png_ptr->zstream, line_index->z_state);
965c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
966c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   // Set the png read position to line_index.
967c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_set_read_offset(png_ptr, line_index->stream_idat_position,
968c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         line_index->bytes_left_in_idat);
969c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_memcpy_check(png_ptr,
970c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         png_ptr->prev_row, line_index->prev_row, row_byte_length);
971c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_ptr->zstream.avail_in = 0;
972c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner}
973c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
974c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner/* Build the line index and store the index in png_ptr->index.
975c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner */
976c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turnervoid PNGAPI
977c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turnerpng_build_index(png_structp png_ptr)
978c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner{
979c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   // number of rows in a 8x8 block for each interlaced pass.
980c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   int number_rows_in_pass[7] = {1, 1, 1, 2, 2, 4, 4};
981c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
982c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   int ret;
983c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_uint_32 i, j;
984c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_bytep rp;
985c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   int p, pass_number = 1;
986c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
987c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_INTERLACING_SUPPORTED
988c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   pass_number = png_set_interlace_handling(png_ptr);
989c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#endif
990c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
991c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
992c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
993c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
994c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_read_start_row(png_ptr);
995c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
996c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_INTERLACING_SUPPORTED
997c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (!png_ptr->interlaced)
998c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#endif
999c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   {
1000c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      number_rows_in_pass[0] = 8;
1001c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   }
1002c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1003c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   rp = png_malloc(png_ptr, png_ptr->rowbytes);
1004c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1005c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_indexp index = png_malloc(png_ptr, sizeof(png_index));
1006c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_ptr->index = index;
1007c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1008c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   index->stream_idat_position = png_ptr->total_data_read - IDAT_HEADER_SIZE;
1009c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1010c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   // Set the default size of index in each pass to 0,
1011c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   // so that we can free index correctly in png_destroy_read_struct.
1012c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   for (p = 0; p < 7; p++)
1013c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      index->size[p] = 0;
1014c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1015c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   for (p = 0; p < pass_number; p++)
1016c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   {
1017c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      // We adjust the index step in each pass to make sure each pass
1018c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      // has roughly the same size of index.
1019c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      // This way, we won't consume to much memory in recording index.
1020c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      index->step[p] = INDEX_SAMPLE_SIZE * (8 / number_rows_in_pass[p]);
1021c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      index->size[p] =
1022c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         (png_ptr->height + index->step[p] - 1) / index->step[p];
1023c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      index->pass_line_index[p] =
1024c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         png_malloc(png_ptr, index->size[p] * sizeof(png_line_indexp));
1025c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1026c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      // Get the row_byte_length seen by the filter. This value may be
1027c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      // different from the row_byte_length of a bitmap in the case of
1028c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      // color palette mode.
1029c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      int row_byte_length =
1030c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->iwidth) + 1;
1031c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1032c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      // Now, we record index for each indexing row.
1033c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      for (i = 0; i < index->size[p]; i++)
1034c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      {
1035c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         png_line_indexp line_index = png_malloc(png_ptr, sizeof(png_line_index));
1036c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         index->pass_line_index[p][i] = line_index;
1037c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1038c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         line_index->z_state = png_malloc(png_ptr, sizeof(z_stream));
1039c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         inflateCopy(line_index->z_state, &png_ptr->zstream);
1040c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         line_index->prev_row = png_malloc(png_ptr, row_byte_length);
1041c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         png_memcpy_check(png_ptr,
1042c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner               line_index->prev_row, png_ptr->prev_row, row_byte_length);
1043c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         line_index->stream_idat_position = index->stream_idat_position;
1044c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         line_index->bytes_left_in_idat = png_ptr->idat_size + png_ptr->zstream.avail_in;
1045c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1046c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         // Skip the "step" number of rows to the next indexing row.
1047c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         for (j = 0; j < index->step[p] &&
1048c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner               i * index->step[p] + j < png_ptr->height; j++)
1049c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         {
1050c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            png_read_row(png_ptr, rp, png_bytep_NULL);
1051c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         }
1052c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      }
1053c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   }
1054c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_free(png_ptr, rp);
1055c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner}
1056c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#endif
1057c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1058c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
10598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Read the entire image.  If the image has an alpha channel or a tRNS
10608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * chunk, and you have called png_handle_alpha()[*], you will need to
10618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * initialize the image to the current image that PNG will be overlaying.
10628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * We set the num_rows again here, in case it was incorrectly set in
10638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * png_read_start_row() by a call to png_read_update_info() or
10648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * png_start_read_image() if png_set_interlace_handling() wasn't called
10658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * prior to either of these functions like it should have been.  You can
10668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * only call this function once.  If you desire to have an image for
10678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * each pass of a interlaced image, use png_read_rows() instead.
10688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
10698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * [*] png_handle_alpha() does not exist yet, as of this version of libpng
10708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
10718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
10728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_read_image(png_structp png_ptr, png_bytepp image)
10738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1074c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_uint_32 i, image_height;
10758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   int pass, j;
10768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_bytepp rp;
10778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1078c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_read_image");
1079c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1080c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
1081c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
10828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_READ_INTERLACING_SUPPORTED
10848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   pass = png_set_interlace_handling(png_ptr);
10858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
10868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->interlaced)
10878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_error(png_ptr,
10888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        "Cannot read interlaced image -- interlace handler disabled.");
10898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   pass = 1;
10908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
10918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   image_height=png_ptr->height;
10948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->num_rows = image_height; /* Make sure this is set correctly */
10958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   for (j = 0; j < pass; j++)
10978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
10988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      rp = image;
10998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (i = 0; i < image_height; i++)
11008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
11018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_read_row(png_ptr, *rp, png_bytep_NULL);
11028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         rp++;
11038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
11048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
11058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1106c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
11078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1108c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
11098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Read the end of the PNG file.  Will not read past the end of the
11108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * file, will verify the end is accurate, and will read any comments
11118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * or time information at the end of the file, if info is not NULL.
11128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
11138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
11148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_read_end(png_structp png_ptr, png_infop info_ptr)
11158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1116c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_read_end");
1117c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1118c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
1119c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
11208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_crc_finish(png_ptr, 0); /* Finish off CRC from last IDAT chunk */
11218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   do
11238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
11248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS
11258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_IHDR;
11268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_IDAT;
11278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_IEND;
11288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_PLTE;
1129c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_bKGD_SUPPORTED
11308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_bKGD;
11318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1132c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_cHRM_SUPPORTED
11338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_cHRM;
11348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1135c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_gAMA_SUPPORTED
11368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_gAMA;
11378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1138c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_hIST_SUPPORTED
11398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_hIST;
11408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1141c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_iCCP_SUPPORTED
11428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_iCCP;
11438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1144c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_iTXt_SUPPORTED
11458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_iTXt;
11468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1147c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_oFFs_SUPPORTED
11488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_oFFs;
11498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1150c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_pCAL_SUPPORTED
11518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_pCAL;
11528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1153c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_pHYs_SUPPORTED
11548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_pHYs;
11558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1156c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sBIT_SUPPORTED
11578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_sBIT;
11588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1159c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sCAL_SUPPORTED
11608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_sCAL;
11618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1162c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sPLT_SUPPORTED
11638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_sPLT;
11648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1165c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sRGB_SUPPORTED
11668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_sRGB;
11678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1168c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tEXt_SUPPORTED
11698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_tEXt;
11708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1171c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tIME_SUPPORTED
11728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_tIME;
11738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1174c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tRNS_SUPPORTED
11758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_tRNS;
11768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1177c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_zTXt_SUPPORTED
11788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_zTXt;
11798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
11808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USE_LOCAL_ARRAYS */
1181c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_uint_32 length = png_read_chunk_header(png_ptr);
1182c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      PNG_CONST png_bytep chunk_name = png_ptr->chunk_name;
11838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1184c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if (!png_memcmp(chunk_name, png_IHDR, 4))
11858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_IHDR(png_ptr, info_ptr, length);
1186c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_IEND, 4))
11878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_IEND(png_ptr, info_ptr, length);
11888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
1189c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (png_handle_as_unknown(png_ptr, chunk_name))
11908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
1191c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         if (!png_memcmp(chunk_name, png_IDAT, 4))
11928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
11938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT))
11948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_error(png_ptr, "Too many IDAT's found");
11958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
11968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_unknown(png_ptr, info_ptr, length);
1197c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         if (!png_memcmp(chunk_name, png_PLTE, 4))
11988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->mode |= PNG_HAVE_PLTE;
11998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
12008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1201c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_IDAT, 4))
12028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
12038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         /* Zero length IDATs are legal after the last IDAT has been
12048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          * read, but not after other chunks have been read.
12058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          */
12068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT))
12078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "Too many IDAT's found");
12088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_crc_finish(png_ptr, length);
12098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
1210c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_PLTE, 4))
12118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_PLTE(png_ptr, info_ptr, length);
1212c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_bKGD_SUPPORTED
1213c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_bKGD, 4))
12148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_bKGD(png_ptr, info_ptr, length);
12158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1216c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_cHRM_SUPPORTED
1217c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_cHRM, 4))
12188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_cHRM(png_ptr, info_ptr, length);
12198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1220c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_gAMA_SUPPORTED
1221c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_gAMA, 4))
12228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_gAMA(png_ptr, info_ptr, length);
12238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1224c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_hIST_SUPPORTED
1225c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_hIST, 4))
12268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_hIST(png_ptr, info_ptr, length);
12278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1228c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_oFFs_SUPPORTED
1229c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_oFFs, 4))
12308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_oFFs(png_ptr, info_ptr, length);
12318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1232c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_pCAL_SUPPORTED
1233c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_pCAL, 4))
12348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_pCAL(png_ptr, info_ptr, length);
12358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1236c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sCAL_SUPPORTED
1237c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_sCAL, 4))
12388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_sCAL(png_ptr, info_ptr, length);
12398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1240c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_pHYs_SUPPORTED
1241c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_pHYs, 4))
12428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_pHYs(png_ptr, info_ptr, length);
12438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1244c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sBIT_SUPPORTED
1245c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_sBIT, 4))
12468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_sBIT(png_ptr, info_ptr, length);
12478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1248c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sRGB_SUPPORTED
1249c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_sRGB, 4))
12508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_sRGB(png_ptr, info_ptr, length);
12518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1252c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_iCCP_SUPPORTED
1253c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_iCCP, 4))
12548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_iCCP(png_ptr, info_ptr, length);
12558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1256c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sPLT_SUPPORTED
1257c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_sPLT, 4))
12588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_sPLT(png_ptr, info_ptr, length);
12598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1260c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tEXt_SUPPORTED
1261c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_tEXt, 4))
12628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_tEXt(png_ptr, info_ptr, length);
12638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1264c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tIME_SUPPORTED
1265c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_tIME, 4))
12668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_tIME(png_ptr, info_ptr, length);
12678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1268c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tRNS_SUPPORTED
1269c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_tRNS, 4))
12708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_tRNS(png_ptr, info_ptr, length);
12718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1272c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_zTXt_SUPPORTED
1273c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_zTXt, 4))
12748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_zTXt(png_ptr, info_ptr, length);
12758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1276c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_iTXt_SUPPORTED
1277c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      else if (!png_memcmp(chunk_name, png_iTXt, 4))
12788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_iTXt(png_ptr, info_ptr, length);
12798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
12808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
12818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_unknown(png_ptr, info_ptr, length);
12828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   } while (!(png_ptr->mode & PNG_HAVE_IEND));
12838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1284c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
12858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1286c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner/* Free all memory used by the read */
12878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
12888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr,
12898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_infopp end_info_ptr_ptr)
12908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
12918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_structp png_ptr = NULL;
12928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_infop info_ptr = NULL, end_info_ptr = NULL;
12938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
1294c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_free_ptr free_fn = NULL;
1295c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_voidp mem_ptr = NULL;
12968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
12978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1298c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_destroy_read_struct");
1299c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
13008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr_ptr != NULL)
13018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr = *png_ptr_ptr;
1302c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
1303c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
1304c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1305c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_USER_MEM_SUPPORTED
1306c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   free_fn = png_ptr->free_fn;
1307c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   mem_ptr = png_ptr->mem_ptr;
1308c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#endif
13098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (info_ptr_ptr != NULL)
13118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      info_ptr = *info_ptr_ptr;
13128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (end_info_ptr_ptr != NULL)
13148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      end_info_ptr = *end_info_ptr_ptr;
13158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_read_destroy(png_ptr, info_ptr, end_info_ptr);
13178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (info_ptr != NULL)
13198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
1320c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_TEXT_SUPPORTED
13218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, -1);
13228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
13238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
13258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn,
13268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          (png_voidp)mem_ptr);
13278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
13288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_destroy_struct((png_voidp)info_ptr);
13298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
13308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      *info_ptr_ptr = NULL;
13318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
13328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (end_info_ptr != NULL)
13348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
1335c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_TEXT_SUPPORTED
13368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free_data(png_ptr, end_info_ptr, PNG_FREE_TEXT, -1);
13378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
13388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
13398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_destroy_struct_2((png_voidp)end_info_ptr, (png_free_ptr)free_fn,
13408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         (png_voidp)mem_ptr);
13418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
13428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_destroy_struct((png_voidp)end_info_ptr);
13438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
13448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      *end_info_ptr_ptr = NULL;
13458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
13468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr != NULL)
13488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
1349c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_INDEX_SUPPORTED
1350c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if (png_ptr->index) {
1351c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         unsigned int i, p;
1352c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         png_indexp index = png_ptr->index;
1353c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         for (p = 0; p < 7; p++) {
1354c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            for (i = 0; i < index->size[p]; i++) {
1355c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner               inflateEnd(index->pass_line_index[p][i]->z_state);
1356c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner               png_free(png_ptr, index->pass_line_index[p][i]->z_state);
1357c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner               png_free(png_ptr, index->pass_line_index[p][i]->prev_row);
1358c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner               png_free(png_ptr, index->pass_line_index[p][i]);
1359c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            }
1360c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            if (index->size[p] != 0) {
1361c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner               png_free(png_ptr, index->pass_line_index[p]);
1362c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner            }
1363c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         }
1364c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         png_free(png_ptr, index);
1365c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      }
1366c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#endif
13678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
13688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn,
13698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          (png_voidp)mem_ptr);
13708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
13718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_destroy_struct((png_voidp)png_ptr);
13728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
13738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      *png_ptr_ptr = NULL;
13748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
13758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
13768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1377c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner/* Free all memory used by the read (old method) */
13788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
1379c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turnerpng_read_destroy(png_structp png_ptr, png_infop info_ptr,
1380c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner    png_infop end_info_ptr)
13818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
13828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
13838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   jmp_buf tmp_jmp;
13848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
13858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_error_ptr error_fn;
13868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_error_ptr warning_fn;
13878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_voidp error_ptr;
13888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
13898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free_ptr free_fn;
13908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
13918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1392c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_read_destroy");
1393c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
13948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (info_ptr != NULL)
13958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_info_destroy(png_ptr, info_ptr);
13968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (end_info_ptr != NULL)
13988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_info_destroy(png_ptr, end_info_ptr);
13998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->zbuf);
14018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->big_row_buf);
14028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->prev_row);
1403c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_free(png_ptr, png_ptr->chunkdata);
1404c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_DITHER_SUPPORTED
14058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->palette_lookup);
14068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->dither_index);
14078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1408c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_GAMMA_SUPPORTED
14098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->gamma_table);
14108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1411c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_BACKGROUND_SUPPORTED
14128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->gamma_from_1);
14138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->gamma_to_1);
14148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
14158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_FREE_ME_SUPPORTED
14168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->free_me & PNG_FREE_PLTE)
14178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_zfree(png_ptr, png_ptr->palette);
14188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->free_me &= ~PNG_FREE_PLTE;
14198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
14208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->flags & PNG_FLAG_FREE_PLTE)
14218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_zfree(png_ptr, png_ptr->palette);
14228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->flags &= ~PNG_FLAG_FREE_PLTE;
14238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
14248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_tRNS_SUPPORTED) || \
14258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
14268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_FREE_ME_SUPPORTED
14278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->free_me & PNG_FREE_TRNS)
14288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free(png_ptr, png_ptr->trans);
14298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->free_me &= ~PNG_FREE_TRNS;
14308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
14318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->flags & PNG_FLAG_FREE_TRNS)
14328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free(png_ptr, png_ptr->trans);
14338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->flags &= ~PNG_FLAG_FREE_TRNS;
14348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
14358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1436c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_hIST_SUPPORTED
14378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_FREE_ME_SUPPORTED
14388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->free_me & PNG_FREE_HIST)
14398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free(png_ptr, png_ptr->hist);
14408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->free_me &= ~PNG_FREE_HIST;
14418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
14428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->flags & PNG_FLAG_FREE_HIST)
14438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free(png_ptr, png_ptr->hist);
14448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->flags &= ~PNG_FLAG_FREE_HIST;
14458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
14468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1447c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_GAMMA_SUPPORTED
14488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->gamma_16_table != NULL)
14498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
14508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int i;
14518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int istop = (1 << (8 - png_ptr->gamma_shift));
14528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (i = 0; i < istop; i++)
14538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
14548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_free(png_ptr, png_ptr->gamma_16_table[i]);
14558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
14568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->gamma_16_table);
14578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
1458c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_BACKGROUND_SUPPORTED
14598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->gamma_16_from_1 != NULL)
14608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
14618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int i;
14628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int istop = (1 << (8 - png_ptr->gamma_shift));
14638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (i = 0; i < istop; i++)
14648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
14658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_free(png_ptr, png_ptr->gamma_16_from_1[i]);
14668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
14678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->gamma_16_from_1);
14688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
14698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->gamma_16_to_1 != NULL)
14708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
14718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int i;
14728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int istop = (1 << (8 - png_ptr->gamma_shift));
14738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (i = 0; i < istop; i++)
14748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
14758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_free(png_ptr, png_ptr->gamma_16_to_1[i]);
14768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
14778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->gamma_16_to_1);
14788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
14798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
14808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1481c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_TIME_RFC1123_SUPPORTED
14828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->time_buffer);
14838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
14848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   inflateEnd(&png_ptr->zstream);
14868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
14878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->save_buffer);
14888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
14898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
14918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_TEXT_SUPPORTED
14928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->current_text);
14938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_TEXT_SUPPORTED */
14948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
14958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* Save the important info out of the png_struct, in case it is
14978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * being used again.
14988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
14998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
1500c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf));
15018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
15028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   error_fn = png_ptr->error_fn;
15048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   warning_fn = png_ptr->warning_fn;
15058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   error_ptr = png_ptr->error_ptr;
15068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
15078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   free_fn = png_ptr->free_fn;
15088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
15098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1510c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_memset(png_ptr, 0, png_sizeof(png_struct));
15118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->error_fn = error_fn;
15138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->warning_fn = warning_fn;
15148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->error_ptr = error_ptr;
15158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
15168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->free_fn = free_fn;
15178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
15188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
1520c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf));
15218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
15228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
15248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
15268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_read_status_fn(png_structp png_ptr, png_read_status_ptr read_row_fn)
15278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1528c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
1529c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
15308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->read_row_fn = read_row_fn;
15318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
15328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1534c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
1535c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_INFO_IMAGE_SUPPORTED
15368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
15378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_read_png(png_structp png_ptr, png_infop info_ptr,
15388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                           int transforms,
15398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                           voidp params)
15408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
15418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   int row;
15428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1543c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
1544c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
1545c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED
1546c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Invert the alpha channel from opacity to transparency
15478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
15488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (transforms & PNG_TRANSFORM_INVERT_ALPHA)
15498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_set_invert_alpha(png_ptr);
15508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
15518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* png_read_info() gives us all of the information from the
15538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * PNG file before the first IDAT (image data chunk).
15548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
15558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_read_info(png_ptr, info_ptr);
15568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (info_ptr->height > PNG_UINT_32_MAX/png_sizeof(png_bytep))
1557c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_error(png_ptr, "Image is too high to process with png_read_png()");
15588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* -------------- image transformations start here ------------------- */
15608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1561c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_16_TO_8_SUPPORTED
1562c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Tell libpng to strip 16 bit/color files down to 8 bits per color.
15638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
15648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (transforms & PNG_TRANSFORM_STRIP_16)
1565c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_set_strip_16(png_ptr);
15668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
15678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1568c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
15698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* Strip alpha bytes from the input data without combining with
15708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * the background (not recommended).
15718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
15728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (transforms & PNG_TRANSFORM_STRIP_ALPHA)
1573c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_set_strip_alpha(png_ptr);
15748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
15758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
15768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_PACK_SUPPORTED) && !defined(PNG_READ_EXPAND_SUPPORTED)
15778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* Extract multiple pixels with bit depths of 1, 2, or 4 from a single
15788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * byte into separate bytes (useful for paletted and grayscale images).
15798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
15808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (transforms & PNG_TRANSFORM_PACKING)
1581c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_set_packing(png_ptr);
15828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
15838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1584c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_PACKSWAP_SUPPORTED
15858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* Change the order of packed pixels to least significant bit first
15868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * (not useful if you are using png_set_packing).
15878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
15888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (transforms & PNG_TRANSFORM_PACKSWAP)
1589c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_set_packswap(png_ptr);
15908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
15918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1592c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_EXPAND_SUPPORTED
15938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* Expand paletted colors into true RGB triplets
15948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * Expand grayscale images to full 8 bits from 1, 2, or 4 bits/pixel
15958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * Expand paletted or RGB images with transparency to full alpha
15968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * channels so the data will be available as RGBA quartets.
15978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
15988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (transforms & PNG_TRANSFORM_EXPAND)
1599c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      if ((png_ptr->bit_depth < 8) ||
1600c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner          (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ||
1601c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner          (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)))
16028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_set_expand(png_ptr);
16038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
16048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
16058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* We don't handle background color or gamma transformation or dithering.
16068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
16078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1608c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_INVERT_SUPPORTED
1609c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Invert monochrome files to have 0 as white and 1 as black
16108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
16118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (transforms & PNG_TRANSFORM_INVERT_MONO)
1612c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_set_invert_mono(png_ptr);
16138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
16148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1615c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_SHIFT_SUPPORTED
16168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* If you want to shift the pixel values from the range [0,255] or
16178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * [0,65535] to the original [0,7] or [0,31], or whatever range the
16188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * colors were originally in:
16198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
16208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if ((transforms & PNG_TRANSFORM_SHIFT)
16218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       && png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT))
16228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
16238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_color_8p sig_bit;
16248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
16258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_get_sBIT(png_ptr, info_ptr, &sig_bit);
16268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_set_shift(png_ptr, sig_bit);
16278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
16288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
16298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1630c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_BGR_SUPPORTED
1631c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Flip the RGB pixels to BGR (or RGBA to BGRA)
16328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
16338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (transforms & PNG_TRANSFORM_BGR)
1634c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_set_bgr(png_ptr);
16358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
16368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1637c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_SWAP_ALPHA_SUPPORTED
1638c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR)
16398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
16408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (transforms & PNG_TRANSFORM_SWAP_ALPHA)
16418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_set_swap_alpha(png_ptr);
16428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
16438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1644c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_SWAP_SUPPORTED
1645c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Swap bytes of 16 bit files to least significant byte first
16468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
16478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (transforms & PNG_TRANSFORM_SWAP_ENDIAN)
1648c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_set_swap(png_ptr);
1649c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#endif
1650c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1651c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner/* Added at libpng-1.2.41 */
1652c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED
1653c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Invert the alpha channel from opacity to transparency
1654c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner    */
1655c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (transforms & PNG_TRANSFORM_INVERT_ALPHA)
1656c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner       png_set_invert_alpha(png_ptr);
1657c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#endif
1658c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
1659c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner/* Added at libpng-1.2.41 */
1660c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
1661c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Expand grayscale image to RGB
1662c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner    */
1663c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (transforms & PNG_TRANSFORM_GRAY_TO_RGB)
1664c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner       png_set_gray_to_rgb(png_ptr);
16658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
16668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
16678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* We don't handle adding filler bytes */
16688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
16698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* Optional call to gamma correct and add the background to the palette
16708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * and update info structure.  REQUIRED if you are expecting libpng to
16718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * update the palette for you (i.e., you selected such a transform above).
16728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
16738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_read_update_info(png_ptr, info_ptr);
16748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
16758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* -------------- image transformations end here ------------------- */
16768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
16778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_FREE_ME_SUPPORTED
16788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0);
16798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1680c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (info_ptr->row_pointers == NULL)
16818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
16828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      info_ptr->row_pointers = (png_bytepp)png_malloc(png_ptr,
16838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         info_ptr->height * png_sizeof(png_bytep));
1684c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      png_memset(info_ptr->row_pointers, 0, info_ptr->height
1685c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner         * png_sizeof(png_bytep));
1686c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
16878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_FREE_ME_SUPPORTED
16888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      info_ptr->free_me |= PNG_FREE_ROWS;
16898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1690c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
16918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (row = 0; row < (int)info_ptr->height; row++)
16928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         info_ptr->row_pointers[row] = (png_bytep)png_malloc(png_ptr,
16938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_get_rowbytes(png_ptr, info_ptr));
16948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
16958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
16968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_read_image(png_ptr, info_ptr->row_pointers);
16978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   info_ptr->valid |= PNG_INFO_IDAT;
16988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1699c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   /* Read rest of file, and get additional chunks in info_ptr - REQUIRED */
17008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_read_end(png_ptr, info_ptr);
17018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1702c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   transforms = transforms; /* Quiet compiler warnings */
17038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   params = params;
17048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
17058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
17068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_INFO_IMAGE_SUPPORTED */
1707c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
17088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_READ_SUPPORTED */
1709