pngread.c revision 8b23a6c7e1aee255004dd19098d4c2462b61b849
18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* pngread.c - read a PNG file
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Last changed in libpng 1.2.19 August 18, 2007
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * For conditions of distribution and use, see copyright notice in png.h
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright (c) 1998-2007 Glenn Randers-Pehrson
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * This file contains routines that an application calls directly to
118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * read a PNG file or stream.
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_INTERNAL
158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "png.h"
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_SUPPORTED)
188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Create a PNG structure for reading, and allocate any memory needed. */
208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_structp PNGAPI
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_create_read_struct(png_const_charp user_png_ver, png_voidp error_ptr,
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_error_ptr error_fn, png_error_ptr warn_fn)
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   return (png_create_read_struct_2(user_png_ver, error_ptr, error_fn,
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      warn_fn, png_voidp_NULL, png_malloc_ptr_NULL, png_free_ptr_NULL));
288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Alternate create PNG structure for reading, and allocate any memory needed. */
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_structp PNGAPI
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_malloc_ptr malloc_fn, png_free_ptr free_fn)
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_structp png_ptr;
398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef USE_FAR_KEYWORD
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   jmp_buf jmpbuf;
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   int i;
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_debug(1, "in png_create_read_struct\n");
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG,
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr);
528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG);
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr == NULL)
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return (NULL);
578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(PNG_1_0_X)
598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_MMX_CODE_SUPPORTED
608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_init_mmx_flags(png_ptr);   /* 1.2.0 addition */
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_1_0_X */
638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* added at libpng-1.2.6 */
658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SET_USER_LIMITS_SUPPORTED
668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->user_width_max=PNG_USER_WIDTH_MAX;
678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->user_height_max=PNG_USER_HEIGHT_MAX;
688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef USE_FAR_KEYWORD
728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (setjmp(jmpbuf))
738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (setjmp(png_ptr->jmpbuf))
758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free(png_ptr, png_ptr->zbuf);
788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->zbuf=NULL;
798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_destroy_struct_2((png_voidp)png_ptr,
818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         (png_free_ptr)free_fn, (png_voidp)mem_ptr);
828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_destroy_struct((png_voidp)png_ptr);
848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return (NULL);
868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef USE_FAR_KEYWORD
888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_memcpy(png_ptr->jmpbuf,jmpbuf,png_sizeof(jmp_buf));
898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn);
948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn);
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   i=0;
998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   do
1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     if(user_png_ver[i] != png_libpng_ver[i])
1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   } while (png_libpng_ver[i++]);
1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH)
1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so
1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      * we must recompile any applications that use any older library version.
1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      * For versions after libpng 1.0, we will be compatible, so we need
1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      * only check the first digit.
1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      */
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] ||
1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) ||
1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         (user_png_ver[0] == '0' && user_png_ver[2] < '9'))
1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     {
1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE)
1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        char msg[80];
1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (user_png_ver)
1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        {
1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          png_snprintf(msg, 80,
1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project             "Application was compiled with png.h from libpng-%.20s",
1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project             user_png_ver);
1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          png_warning(png_ptr, msg);
1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        png_snprintf(msg, 80,
1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project             "Application  is  running with png.c from libpng-%.20s",
1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           png_libpng_ver);
1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        png_warning(png_ptr, msg);
1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_ERROR_NUMBERS_SUPPORTED
1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        png_ptr->flags=0;
1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        png_error(png_ptr,
1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           "Incompatible libpng version in application and library");
1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     }
1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* initialize zbuf - compression buffer */
1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zbuf_size = PNG_ZBUF_SIZE;
1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zbuf = (png_bytep)png_malloc(png_ptr,
1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     (png_uint_32)png_ptr->zbuf_size);
1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.zalloc = png_zalloc;
1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.zfree = png_zfree;
1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.opaque = (voidpf)png_ptr;
1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   switch (inflateInit(&png_ptr->zstream))
1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     case Z_OK: /* Do nothing */ break;
1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     case Z_MEM_ERROR:
1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory error"); break;
1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     case Z_VERSION_ERROR: png_error(png_ptr, "zlib version error"); break;
1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     default: png_error(png_ptr, "Unknown zlib error");
1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.next_out = png_ptr->zbuf;
1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL);
1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Applications that neglect to set up their own setjmp() and then encounter
1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   a png_error() will longjmp here.  Since the jmpbuf is then meaningless we
1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   abort instead of returning. */
1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef USE_FAR_KEYWORD
1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (setjmp(jmpbuf))
1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_ABORT();
1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_memcpy(png_ptr->jmpbuf,jmpbuf,png_sizeof(jmp_buf));
1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (setjmp(png_ptr->jmpbuf))
1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_ABORT();
1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   return (png_ptr);
1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_1_0_X) || defined(PNG_1_2_X)
1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Initialize PNG structure for reading, and allocate any memory needed.
1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   This interface is deprecated in favour of the png_create_read_struct(),
1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   and it will disappear as of libpng-1.3.0. */
1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef png_read_init
1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_read_init(png_structp png_ptr)
1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* We only come here via pre-1.0.7-compiled applications */
1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_read_init_2(png_ptr, "1.0.6 or earlier", 0, 0);
1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_read_init_2(png_structp png_ptr, png_const_charp user_png_ver,
1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_size_t png_struct_size, png_size_t png_info_size)
1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* We only come here via pre-1.0.12-compiled applications */
1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr == NULL) return;
1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE)
1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_sizeof(png_struct) > png_struct_size ||
1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_sizeof(png_info) > png_info_size)
1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      char msg[80];
1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->warning_fn=NULL;
2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (user_png_ver)
2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        png_snprintf(msg, 80,
2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           "Application was compiled with png.h from libpng-%.20s",
2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           user_png_ver);
2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        png_warning(png_ptr, msg);
2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_snprintf(msg, 80,
2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         "Application  is  running with png.c from libpng-%.20s",
2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_libpng_ver);
2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr, msg);
2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_sizeof(png_struct) > png_struct_size)
2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     {
2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_ptr->error_fn=NULL;
2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_ERROR_NUMBERS_SUPPORTED
2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_ptr->flags=0;
2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_error(png_ptr,
2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       "The png struct allocated by the application for reading is too small.");
2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     }
2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_sizeof(png_info) > png_info_size)
2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     {
2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_ptr->error_fn=NULL;
2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_ERROR_NUMBERS_SUPPORTED
2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_ptr->flags=0;
2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_error(png_ptr,
2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         "The info struct allocated by application for reading is too small.");
2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     }
2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_read_init_3(&png_ptr, user_png_ver, png_struct_size);
2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_1_0_X || PNG_1_2_X */
2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_read_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver,
2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_size_t png_struct_size)
2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   jmp_buf tmp_jmp;  /* to save current jump buffer */
2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   int i=0;
2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_structp png_ptr=*ptr_ptr;
2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr == NULL) return;
2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   do
2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     if(user_png_ver[i] != png_libpng_ver[i])
2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     {
2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_LEGACY_SUPPORTED
2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_ptr->warning_fn=NULL;
2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_warning(png_ptr,
2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        "Application uses deprecated png_read_init() and should be recompiled.");
2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       break;
2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     }
2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   } while (png_libpng_ver[i++]);
2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_debug(1, "in png_read_init_3\n");
2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* save jump buffer and error functions */
2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof (jmp_buf));
2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_sizeof(png_struct) > png_struct_size)
2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     {
2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_destroy_struct(png_ptr);
2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       *ptr_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG);
2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_ptr = *ptr_ptr;
2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     }
2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* reset all variables to 0 */
2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_memset(png_ptr, 0, png_sizeof (png_struct));
2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* restore jump buffer */
2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof (jmp_buf));
2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* added at libpng-1.2.6 */
2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SET_USER_LIMITS_SUPPORTED
2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->user_width_max=PNG_USER_WIDTH_MAX;
2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->user_height_max=PNG_USER_HEIGHT_MAX;
2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* initialize zbuf - compression buffer */
2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zbuf_size = PNG_ZBUF_SIZE;
2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zbuf = (png_bytep)png_malloc(png_ptr,
2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     (png_uint_32)png_ptr->zbuf_size);
2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.zalloc = png_zalloc;
2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.zfree = png_zfree;
2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.opaque = (voidpf)png_ptr;
2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   switch (inflateInit(&png_ptr->zstream))
3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     case Z_OK: /* Do nothing */ break;
3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     case Z_MEM_ERROR:
3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory"); break;
3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     case Z_VERSION_ERROR: png_error(png_ptr, "zlib version"); break;
3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     default: png_error(png_ptr, "Unknown zlib error");
3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.next_out = png_ptr->zbuf;
3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL);
3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Read the information before the actual image data.  This has been
3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * changed in v0.90 to allow reading a file that already has the magic
3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * bytes read from the stream.  You can tell libpng how many bytes have
3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * been read from the beginning of the stream (up to the maximum of 8)
3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * via png_set_sig_bytes(), and we will only check the remaining bytes
3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * here.  The application can then have access to the signature bytes we
3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * read if it is determined that this isn't a valid PNG file.
3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_read_info(png_structp png_ptr, png_infop info_ptr)
3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr == NULL) return;
3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_debug(1, "in png_read_info\n");
3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* If we haven't checked all of the PNG signature bytes, do so now. */
3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->sig_bytes < 8)
3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_size_t num_checked = png_ptr->sig_bytes,
3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                 num_to_check = 8 - num_checked;
3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_read_data(png_ptr, &(info_ptr->signature[num_checked]), num_to_check);
3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->sig_bytes = 8;
3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check))
3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (num_checked < 4 &&
3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project             png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4))
3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "Not a PNG file");
3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         else
3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "PNG file corrupted by ASCII conversion");
3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (num_checked < 3)
3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE;
3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   for(;;)
3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS
3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_IHDR;
3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_IDAT;
3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_IEND;
3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_PLTE;
3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_bKGD_SUPPORTED)
3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_bKGD;
3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_cHRM_SUPPORTED)
3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_cHRM;
3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_gAMA_SUPPORTED)
3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_gAMA;
3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_hIST_SUPPORTED)
3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_hIST;
3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_iCCP_SUPPORTED)
3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_iCCP;
3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_iTXt_SUPPORTED)
3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_iTXt;
3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_oFFs_SUPPORTED)
3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_oFFs;
3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_pCAL_SUPPORTED)
3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_pCAL;
3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_pHYs_SUPPORTED)
3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_pHYs;
3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sBIT_SUPPORTED)
3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_sBIT;
3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sCAL_SUPPORTED)
3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_sCAL;
3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sPLT_SUPPORTED)
3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_sPLT;
3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sRGB_SUPPORTED)
3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_sRGB;
3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tEXt_SUPPORTED)
3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_tEXt;
3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tIME_SUPPORTED)
4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_tIME;
4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tRNS_SUPPORTED)
4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_tRNS;
4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_zTXt_SUPPORTED)
4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_zTXt;
4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USE_LOCAL_ARRAYS */
4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_byte chunk_length[4];
4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_uint_32 length;
4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_read_data(png_ptr, chunk_length, 4);
4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      length = png_get_uint_31(png_ptr,chunk_length);
4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_reset_crc(png_ptr);
4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_crc_read(png_ptr, png_ptr->chunk_name, 4);
4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_debug2(0, "Reading %s chunk, length=%lu.\n", png_ptr->chunk_name,
4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         length);
4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      /* This should be a binary subdivision search or a hash for
4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       * matching the chunk name rather than a linear search.
4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       */
4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (!png_memcmp(png_ptr->chunk_name, (png_bytep)png_IDAT, 4))
4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if(png_ptr->mode & PNG_AFTER_IDAT)
4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4))
4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_IHDR(png_ptr, info_ptr, length);
4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4))
4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_IEND(png_ptr, info_ptr, length);
4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name))
4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->mode |= PNG_HAVE_IDAT;
4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_unknown(png_ptr, info_ptr, length);
4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->mode |= PNG_HAVE_PLTE;
4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (!(png_ptr->mode & PNG_HAVE_IHDR))
4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_error(png_ptr, "Missing IHDR before IDAT");
4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                     !(png_ptr->mode & PNG_HAVE_PLTE))
4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_error(png_ptr, "Missing PLTE before IDAT");
4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_PLTE(png_ptr, info_ptr, length);
4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (!(png_ptr->mode & PNG_HAVE_IHDR))
4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "Missing IHDR before IDAT");
4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  !(png_ptr->mode & PNG_HAVE_PLTE))
4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "Missing PLTE before IDAT");
4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->idat_size = length;
4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->mode |= PNG_HAVE_IDAT;
4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         break;
4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_bKGD_SUPPORTED)
4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4))
4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_bKGD(png_ptr, info_ptr, length);
4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_cHRM_SUPPORTED)
4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4))
4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_cHRM(png_ptr, info_ptr, length);
4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_gAMA_SUPPORTED)
4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4))
4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_gAMA(png_ptr, info_ptr, length);
4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_hIST_SUPPORTED)
4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4))
4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_hIST(png_ptr, info_ptr, length);
4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_oFFs_SUPPORTED)
4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4))
4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_oFFs(png_ptr, info_ptr, length);
4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_pCAL_SUPPORTED)
4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4))
4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_pCAL(png_ptr, info_ptr, length);
4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sCAL_SUPPORTED)
4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4))
4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_sCAL(png_ptr, info_ptr, length);
4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_pHYs_SUPPORTED)
4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4))
4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_pHYs(png_ptr, info_ptr, length);
4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sBIT_SUPPORTED)
4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4))
4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_sBIT(png_ptr, info_ptr, length);
5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sRGB_SUPPORTED)
5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4))
5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_sRGB(png_ptr, info_ptr, length);
5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_iCCP_SUPPORTED)
5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4))
5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_iCCP(png_ptr, info_ptr, length);
5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sPLT_SUPPORTED)
5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4))
5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_sPLT(png_ptr, info_ptr, length);
5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tEXt_SUPPORTED)
5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4))
5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_tEXt(png_ptr, info_ptr, length);
5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tIME_SUPPORTED)
5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4))
5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_tIME(png_ptr, info_ptr, length);
5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tRNS_SUPPORTED)
5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4))
5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_tRNS(png_ptr, info_ptr, length);
5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_zTXt_SUPPORTED)
5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4))
5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_zTXt(png_ptr, info_ptr, length);
5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_iTXt_SUPPORTED)
5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4))
5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_iTXt(png_ptr, info_ptr, length);
5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_unknown(png_ptr, info_ptr, length);
5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
5368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */
5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* optional call to update the users info_ptr structure */
5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_read_update_info(png_structp png_ptr, png_infop info_ptr)
5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_debug(1, "in png_read_update_info\n");
5448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr == NULL) return;
5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_read_start_row(png_ptr);
5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else
5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr,
5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      "Ignoring extra png_read_update_info() call; row buffer not reallocated");
5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_read_transform_info(png_ptr, info_ptr);
5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Initialize palette, background, etc, after transformations
5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * are set, but before any reading takes place.  This allows
5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the user to obtain a gamma-corrected palette, for example.
5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * If the user doesn't call this, we will do it ourselves.
5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
5608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_start_read_image(png_structp png_ptr)
5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_debug(1, "in png_start_read_image\n");
5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr == NULL) return;
5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_read_start_row(png_ptr);
5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */
5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS
5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   PNG_CONST PNG_IDAT;
5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   PNG_CONST int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55,
5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     0xff};
5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   PNG_CONST int png_pass_mask[7] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff};
5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   int ret;
5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr == NULL) return;
5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_debug2(1, "in png_read_row (row %lu, pass %d)\n",
5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->row_number, png_ptr->pass);
5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_read_start_row(png_ptr);
5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->row_number == 0 && png_ptr->pass == 0)
5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* check for transforms that have been set but were defined out */
5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_INVERT_SUPPORTED) && !defined(PNG_READ_INVERT_SUPPORTED)
5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->transformations & PNG_INVERT_MONO)
5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr, "PNG_READ_INVERT_SUPPORTED is not defined.");
5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_FILLER_SUPPORTED) && !defined(PNG_READ_FILLER_SUPPORTED)
5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->transformations & PNG_FILLER)
5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr, "PNG_READ_FILLER_SUPPORTED is not defined.");
5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_PACKSWAP_SUPPORTED) && !defined(PNG_READ_PACKSWAP_SUPPORTED)
5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->transformations & PNG_PACKSWAP)
5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr, "PNG_READ_PACKSWAP_SUPPORTED is not defined.");
5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_PACK_SUPPORTED) && !defined(PNG_READ_PACK_SUPPORTED)
6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->transformations & PNG_PACK)
6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr, "PNG_READ_PACK_SUPPORTED is not defined.");
6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_SHIFT_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED)
6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->transformations & PNG_SHIFT)
6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr, "PNG_READ_SHIFT_SUPPORTED is not defined.");
6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_BGR_SUPPORTED) && !defined(PNG_READ_BGR_SUPPORTED)
6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->transformations & PNG_BGR)
6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr, "PNG_READ_BGR_SUPPORTED is not defined.");
6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_SWAP_SUPPORTED) && !defined(PNG_READ_SWAP_SUPPORTED)
6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->transformations & PNG_SWAP_BYTES)
6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr, "PNG_READ_SWAP_SUPPORTED is not defined.");
6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_INTERLACING_SUPPORTED)
6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* if interlaced and we do not need a new row, combine row and return */
6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      switch (png_ptr->pass)
6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 0:
6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (png_ptr->row_number & 0x07)
6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               if (dsp_row != NULL)
6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_combine_row(png_ptr, dsp_row,
6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                     png_pass_dsp_mask[png_ptr->pass]);
6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_finish_row(png_ptr);
6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               return;
6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 1:
6358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if ((png_ptr->row_number & 0x07) || png_ptr->width < 5)
6368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               if (dsp_row != NULL)
6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_combine_row(png_ptr, dsp_row,
6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                     png_pass_dsp_mask[png_ptr->pass]);
6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_finish_row(png_ptr);
6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               return;
6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
6448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 2:
6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if ((png_ptr->row_number & 0x07) != 4)
6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               if (dsp_row != NULL && (png_ptr->row_number & 4))
6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_combine_row(png_ptr, dsp_row,
6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                     png_pass_dsp_mask[png_ptr->pass]);
6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_finish_row(png_ptr);
6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               return;
6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 3:
6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if ((png_ptr->row_number & 3) || png_ptr->width < 3)
6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               if (dsp_row != NULL)
6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_combine_row(png_ptr, dsp_row,
6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                     png_pass_dsp_mask[png_ptr->pass]);
6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_finish_row(png_ptr);
6618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               return;
6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
6638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
6648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         case 4:
6658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if ((png_ptr->row_number & 3) != 2)
6668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
6678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               if (dsp_row != NULL && (png_ptr->row_number & 2))
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 5:
6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if ((png_ptr->row_number & 1) || png_ptr->width < 2)
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 6:
6858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (!(png_ptr->row_number & 1))
6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_read_finish_row(png_ptr);
6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               return;
6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
6918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
6928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
6938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
6948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (!(png_ptr->mode & PNG_HAVE_IDAT))
6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_error(png_ptr, "Invalid attempt to read row data");
6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.next_out = png_ptr->row_buf;
6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes;
7008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   do
7018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
7028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (!(png_ptr->zstream.avail_in))
7038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
7048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         while (!png_ptr->idat_size)
7058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
7068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_byte chunk_length[4];
7078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_crc_finish(png_ptr, 0);
7098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_read_data(png_ptr, chunk_length, 4);
7118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->idat_size = png_get_uint_31(png_ptr,chunk_length);
7128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_reset_crc(png_ptr);
7148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_crc_read(png_ptr, png_ptr->chunk_name, 4);
7158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
7168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_error(png_ptr, "Not enough image data");
7178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
7188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size;
7198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->zstream.next_in = png_ptr->zbuf;
7208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (png_ptr->zbuf_size > png_ptr->idat_size)
7218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size;
7228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_crc_read(png_ptr, png_ptr->zbuf,
7238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            (png_size_t)png_ptr->zstream.avail_in);
7248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->idat_size -= png_ptr->zstream.avail_in;
7258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
7268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
7278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (ret == Z_STREAM_END)
7288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
7298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (png_ptr->zstream.avail_out || png_ptr->zstream.avail_in ||
7308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->idat_size)
7318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "Extra compressed data");
7328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->mode |= PNG_AFTER_IDAT;
7338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
7348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         break;
7358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
7368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (ret != Z_OK)
7378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg :
7388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   "Decompression error");
7398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   } while (png_ptr->zstream.avail_out);
7418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_info.color_type = png_ptr->color_type;
7438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_info.width = png_ptr->iwidth;
7448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_info.channels = png_ptr->channels;
7458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_info.bit_depth = png_ptr->bit_depth;
7468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_info.pixel_depth = png_ptr->pixel_depth;
7478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,
7488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_ptr->row_info.width);
7498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr->row_buf[0])
7518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_read_filter_row(png_ptr, &(png_ptr->row_info),
7528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->row_buf + 1, png_ptr->prev_row + 1,
7538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      (int)(png_ptr->row_buf[0]));
7548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf,
7568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->rowbytes + 1);
7578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_MNG_FEATURES_SUPPORTED)
7598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
7608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING))
7618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
7628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      /* Intrapixel differencing */
7638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_do_read_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1);
7648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
7658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
7668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA))
7698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_do_read_transformations(png_ptr);
7708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_INTERLACING_SUPPORTED)
7728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* blow up interlaced rows to full size */
7738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->interlaced &&
7748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      (png_ptr->transformations & PNG_INTERLACE))
7758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
7768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (png_ptr->pass < 6)
7778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*       old interface (pre-1.0.9):
7788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_do_read_interlace(&(png_ptr->row_info),
7798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations);
7808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
7818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_do_read_interlace(png_ptr);
7828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (dsp_row != NULL)
7848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_combine_row(png_ptr, dsp_row,
7858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_pass_dsp_mask[png_ptr->pass]);
7868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (row != NULL)
7878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_combine_row(png_ptr, row,
7888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_pass_mask[png_ptr->pass]);
7898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
7908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else
7918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
7928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
7938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (row != NULL)
7948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_combine_row(png_ptr, row, 0xff);
7958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (dsp_row != NULL)
7968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_combine_row(png_ptr, dsp_row, 0xff);
7978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
7988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_read_finish_row(png_ptr);
7998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->read_row_fn != NULL)
8018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      (*(png_ptr->read_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass);
8028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
8038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */
8048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
8068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Read one or more rows of image data.  If the image is interlaced,
8078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * and png_set_interlace_handling() has been called, the rows need to
8088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * contain the contents of the rows from the previous pass.  If the
8098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * image has alpha or transparency, and png_handle_alpha()[*] has been
8108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * called, the rows contents must be initialized to the contents of the
8118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * screen.
8128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
8138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * "row" holds the actual image, and pixels are placed in it
8148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * as they arrive.  If the image is displayed after each pass, it will
8158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * appear to "sparkle" in.  "display_row" can be used to display a
8168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * "chunky" progressive image, with finer detail added as it becomes
8178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * available.  If you do not want this "chunky" display, you may pass
8188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * NULL for display_row.  If you do not want the sparkle display, and
8198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * you have not called png_handle_alpha(), you may pass NULL for rows.
8208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * If you have called png_handle_alpha(), and the image has either an
8218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * alpha channel or a transparency chunk, you must provide a buffer for
8228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * rows.  In this case, you do not have to provide a display_row buffer
8238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * also, but you may.  If the image is not interlaced, or if you have
8248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * not called png_set_interlace_handling(), the display_row buffer will
8258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * be ignored, so pass NULL to it.
8268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
8278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * [*] png_handle_alpha() does not exist yet, as of this version of libpng
8288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
8298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
8318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_read_rows(png_structp png_ptr, png_bytepp row,
8328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_bytepp display_row, png_uint_32 num_rows)
8338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
8348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_uint_32 i;
8358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_bytepp rp;
8368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_bytepp dp;
8378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_debug(1, "in png_read_rows\n");
8398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr == NULL) return;
8408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   rp = row;
8418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   dp = display_row;
8428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (rp != NULL && dp != NULL)
8438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (i = 0; i < num_rows; i++)
8448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
8458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_bytep rptr = *rp++;
8468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_bytep dptr = *dp++;
8478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_read_row(png_ptr, rptr, dptr);
8498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
8508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if(rp != NULL)
8518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (i = 0; i < num_rows; i++)
8528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
8538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_bytep rptr = *rp;
8548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_read_row(png_ptr, rptr, png_bytep_NULL);
8558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         rp++;
8568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
8578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if(dp != NULL)
8588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (i = 0; i < num_rows; i++)
8598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
8608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_bytep dptr = *dp;
8618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_read_row(png_ptr, png_bytep_NULL, dptr);
8628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         dp++;
8638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
8648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
8658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */
8668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
8688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Read the entire image.  If the image has an alpha channel or a tRNS
8698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * chunk, and you have called png_handle_alpha()[*], you will need to
8708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * initialize the image to the current image that PNG will be overlaying.
8718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * We set the num_rows again here, in case it was incorrectly set in
8728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * png_read_start_row() by a call to png_read_update_info() or
8738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * png_start_read_image() if png_set_interlace_handling() wasn't called
8748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * prior to either of these functions like it should have been.  You can
8758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * only call this function once.  If you desire to have an image for
8768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * each pass of a interlaced image, use png_read_rows() instead.
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 Projectvoid PNGAPI
8818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_read_image(png_structp png_ptr, png_bytepp image)
8828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
8838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_uint_32 i,image_height;
8848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   int pass, j;
8858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_bytepp rp;
8868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_debug(1, "in png_read_image\n");
8888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr == NULL) return;
8898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_READ_INTERLACING_SUPPORTED
8918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   pass = png_set_interlace_handling(png_ptr);
8928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
8938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->interlaced)
8948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_error(png_ptr,
8958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        "Cannot read interlaced image -- interlace handler disabled.");
8968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   pass = 1;
8978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
8988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   image_height=png_ptr->height;
9018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->num_rows = image_height; /* Make sure this is set correctly */
9028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   for (j = 0; j < pass; j++)
9048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
9058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      rp = image;
9068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (i = 0; i < image_height; i++)
9078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
9088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_read_row(png_ptr, *rp, png_bytep_NULL);
9098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         rp++;
9108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
9118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
9128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
9138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */
9148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
9168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Read the end of the PNG file.  Will not read past the end of the
9178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * file, will verify the end is accurate, and will read any comments
9188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * or time information at the end of the file, if info is not NULL.
9198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
9208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
9218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_read_end(png_structp png_ptr, png_infop info_ptr)
9228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
9238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_byte chunk_length[4];
9248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_uint_32 length;
9258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_debug(1, "in png_read_end\n");
9278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr == NULL) return;
9288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_crc_finish(png_ptr, 0); /* Finish off CRC from last IDAT chunk */
9298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   do
9318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
9328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS
9338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_IHDR;
9348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_IDAT;
9358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_IEND;
9368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_PLTE;
9378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_bKGD_SUPPORTED)
9388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_bKGD;
9398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
9408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_cHRM_SUPPORTED)
9418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_cHRM;
9428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
9438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_gAMA_SUPPORTED)
9448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_gAMA;
9458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
9468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_hIST_SUPPORTED)
9478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_hIST;
9488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
9498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_iCCP_SUPPORTED)
9508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_iCCP;
9518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
9528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_iTXt_SUPPORTED)
9538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_iTXt;
9548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
9558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_oFFs_SUPPORTED)
9568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_oFFs;
9578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
9588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_pCAL_SUPPORTED)
9598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_pCAL;
9608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
9618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_pHYs_SUPPORTED)
9628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_pHYs;
9638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
9648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sBIT_SUPPORTED)
9658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_sBIT;
9668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
9678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sCAL_SUPPORTED)
9688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_sCAL;
9698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
9708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sPLT_SUPPORTED)
9718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_sPLT;
9728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
9738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sRGB_SUPPORTED)
9748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_sRGB;
9758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
9768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tEXt_SUPPORTED)
9778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_tEXt;
9788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
9798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tIME_SUPPORTED)
9808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_tIME;
9818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
9828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tRNS_SUPPORTED)
9838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_tRNS;
9848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
9858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_zTXt_SUPPORTED)
9868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      PNG_CONST PNG_zTXt;
9878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
9888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USE_LOCAL_ARRAYS */
9898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_read_data(png_ptr, chunk_length, 4);
9918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      length = png_get_uint_31(png_ptr,chunk_length);
9928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_reset_crc(png_ptr);
9948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_crc_read(png_ptr, png_ptr->chunk_name, 4);
9958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_debug1(0, "Reading %s chunk.\n", png_ptr->chunk_name);
9978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4))
9998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_IHDR(png_ptr, info_ptr, length);
10008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4))
10018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_IEND(png_ptr, info_ptr, length);
10028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
10038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name))
10048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
10058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
10068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
10078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT))
10088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_error(png_ptr, "Too many IDAT's found");
10098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
10108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_unknown(png_ptr, info_ptr, length);
10118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
10128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_ptr->mode |= PNG_HAVE_PLTE;
10138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
10148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
10158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
10168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
10178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         /* Zero length IDATs are legal after the last IDAT has been
10188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          * read, but not after other chunks have been read.
10198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          */
10208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT))
10218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_error(png_ptr, "Too many IDAT's found");
10228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_crc_finish(png_ptr, length);
10238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
10248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
10258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_PLTE(png_ptr, info_ptr, length);
10268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_bKGD_SUPPORTED)
10278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4))
10288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_bKGD(png_ptr, info_ptr, length);
10298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
10308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_cHRM_SUPPORTED)
10318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4))
10328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_cHRM(png_ptr, info_ptr, length);
10338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
10348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_gAMA_SUPPORTED)
10358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4))
10368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_gAMA(png_ptr, info_ptr, length);
10378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
10388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_hIST_SUPPORTED)
10398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4))
10408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_hIST(png_ptr, info_ptr, length);
10418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
10428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_oFFs_SUPPORTED)
10438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4))
10448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_oFFs(png_ptr, info_ptr, length);
10458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
10468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_pCAL_SUPPORTED)
10478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4))
10488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_pCAL(png_ptr, info_ptr, length);
10498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
10508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sCAL_SUPPORTED)
10518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4))
10528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_sCAL(png_ptr, info_ptr, length);
10538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
10548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_pHYs_SUPPORTED)
10558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4))
10568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_pHYs(png_ptr, info_ptr, length);
10578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
10588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sBIT_SUPPORTED)
10598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4))
10608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_sBIT(png_ptr, info_ptr, length);
10618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
10628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sRGB_SUPPORTED)
10638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4))
10648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_sRGB(png_ptr, info_ptr, length);
10658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
10668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_iCCP_SUPPORTED)
10678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4))
10688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_iCCP(png_ptr, info_ptr, length);
10698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
10708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sPLT_SUPPORTED)
10718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4))
10728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_sPLT(png_ptr, info_ptr, length);
10738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
10748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tEXt_SUPPORTED)
10758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4))
10768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_tEXt(png_ptr, info_ptr, length);
10778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
10788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tIME_SUPPORTED)
10798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4))
10808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_tIME(png_ptr, info_ptr, length);
10818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
10828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tRNS_SUPPORTED)
10838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4))
10848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_tRNS(png_ptr, info_ptr, length);
10858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
10868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_zTXt_SUPPORTED)
10878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4))
10888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_zTXt(png_ptr, info_ptr, length);
10898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
10908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_iTXt_SUPPORTED)
10918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4))
10928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_iTXt(png_ptr, info_ptr, length);
10938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
10948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
10958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_handle_unknown(png_ptr, info_ptr, length);
10968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   } while (!(png_ptr->mode & PNG_HAVE_IEND));
10978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
10988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */
10998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* free all memory used by the read */
11018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
11028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr,
11038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_infopp end_info_ptr_ptr)
11048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
11058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_structp png_ptr = NULL;
11068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_infop info_ptr = NULL, end_info_ptr = NULL;
11078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
11088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free_ptr free_fn;
11098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_voidp mem_ptr;
11108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
11118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_debug(1, "in png_destroy_read_struct\n");
11138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr_ptr != NULL)
11148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr = *png_ptr_ptr;
11158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (info_ptr_ptr != NULL)
11178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      info_ptr = *info_ptr_ptr;
11188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (end_info_ptr_ptr != NULL)
11208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      end_info_ptr = *end_info_ptr_ptr;
11218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
11238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   free_fn = png_ptr->free_fn;
11248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   mem_ptr = png_ptr->mem_ptr;
11258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
11268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_read_destroy(png_ptr, info_ptr, end_info_ptr);
11288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (info_ptr != NULL)
11308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
11318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_TEXT_SUPPORTED)
11328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, -1);
11338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
11348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
11368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn,
11378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          (png_voidp)mem_ptr);
11388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
11398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_destroy_struct((png_voidp)info_ptr);
11408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
11418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      *info_ptr_ptr = NULL;
11428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
11438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (end_info_ptr != NULL)
11458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
11468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_TEXT_SUPPORTED)
11478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free_data(png_ptr, end_info_ptr, PNG_FREE_TEXT, -1);
11488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
11498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
11508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_destroy_struct_2((png_voidp)end_info_ptr, (png_free_ptr)free_fn,
11518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         (png_voidp)mem_ptr);
11528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
11538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_destroy_struct((png_voidp)end_info_ptr);
11548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
11558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      *end_info_ptr_ptr = NULL;
11568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
11578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr != NULL)
11598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
11608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
11618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn,
11628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          (png_voidp)mem_ptr);
11638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
11648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_destroy_struct((png_voidp)png_ptr);
11658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
11668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      *png_ptr_ptr = NULL;
11678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
11688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
11698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* free all memory used by the read (old method) */
11718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
11728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr)
11738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
11748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
11758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   jmp_buf tmp_jmp;
11768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
11778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_error_ptr error_fn;
11788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_error_ptr warning_fn;
11798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_voidp error_ptr;
11808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
11818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free_ptr free_fn;
11828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
11838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_debug(1, "in png_read_destroy\n");
11858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (info_ptr != NULL)
11868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_info_destroy(png_ptr, info_ptr);
11878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (end_info_ptr != NULL)
11898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_info_destroy(png_ptr, end_info_ptr);
11908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->zbuf);
11928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->big_row_buf);
11938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->prev_row);
11948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_DITHER_SUPPORTED)
11958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->palette_lookup);
11968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->dither_index);
11978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
11988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_GAMMA_SUPPORTED)
11998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->gamma_table);
12008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
12018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_BACKGROUND_SUPPORTED)
12028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->gamma_from_1);
12038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->gamma_to_1);
12048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
12058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_FREE_ME_SUPPORTED
12068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->free_me & PNG_FREE_PLTE)
12078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_zfree(png_ptr, png_ptr->palette);
12088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->free_me &= ~PNG_FREE_PLTE;
12098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
12108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->flags & PNG_FLAG_FREE_PLTE)
12118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_zfree(png_ptr, png_ptr->palette);
12128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->flags &= ~PNG_FLAG_FREE_PLTE;
12138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
12148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_tRNS_SUPPORTED) || \
12158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
12168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_FREE_ME_SUPPORTED
12178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->free_me & PNG_FREE_TRNS)
12188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free(png_ptr, png_ptr->trans);
12198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->free_me &= ~PNG_FREE_TRNS;
12208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
12218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->flags & PNG_FLAG_FREE_TRNS)
12228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free(png_ptr, png_ptr->trans);
12238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->flags &= ~PNG_FLAG_FREE_TRNS;
12248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
12258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
12268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_hIST_SUPPORTED)
12278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_FREE_ME_SUPPORTED
12288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->free_me & PNG_FREE_HIST)
12298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free(png_ptr, png_ptr->hist);
12308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->free_me &= ~PNG_FREE_HIST;
12318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
12328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->flags & PNG_FLAG_FREE_HIST)
12338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_free(png_ptr, png_ptr->hist);
12348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->flags &= ~PNG_FLAG_FREE_HIST;
12358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
12368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
12378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_GAMMA_SUPPORTED)
12388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->gamma_16_table != NULL)
12398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
12408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int i;
12418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int istop = (1 << (8 - png_ptr->gamma_shift));
12428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (i = 0; i < istop; i++)
12438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
12448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_free(png_ptr, png_ptr->gamma_16_table[i]);
12458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
12468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->gamma_16_table);
12478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
12488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_BACKGROUND_SUPPORTED)
12498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->gamma_16_from_1 != NULL)
12508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
12518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int i;
12528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int istop = (1 << (8 - png_ptr->gamma_shift));
12538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (i = 0; i < istop; i++)
12548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
12558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_free(png_ptr, png_ptr->gamma_16_from_1[i]);
12568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
12578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->gamma_16_from_1);
12588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
12598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->gamma_16_to_1 != NULL)
12608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
12618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int i;
12628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      int istop = (1 << (8 - png_ptr->gamma_shift));
12638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (i = 0; i < istop; i++)
12648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
12658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_free(png_ptr, png_ptr->gamma_16_to_1[i]);
12668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
12678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->gamma_16_to_1);
12688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
12698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
12708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
12718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_TIME_RFC1123_SUPPORTED)
12728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->time_buffer);
12738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
12748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   inflateEnd(&png_ptr->zstream);
12768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
12778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->save_buffer);
12788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
12798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
12818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_TEXT_SUPPORTED
12828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free(png_ptr, png_ptr->current_text);
12838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_TEXT_SUPPORTED */
12848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
12858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* Save the important info out of the png_struct, in case it is
12878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * being used again.
12888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
12898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
12908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof (jmp_buf));
12918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
12928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
12938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   error_fn = png_ptr->error_fn;
12948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   warning_fn = png_ptr->warning_fn;
12958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   error_ptr = png_ptr->error_ptr;
12968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
12978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   free_fn = png_ptr->free_fn;
12988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
12998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_memset(png_ptr, 0, png_sizeof (png_struct));
13018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->error_fn = error_fn;
13038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->warning_fn = warning_fn;
13048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->error_ptr = error_ptr;
13058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED
13068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->free_fn = free_fn;
13078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
13088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
13108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof (jmp_buf));
13118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
13128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
13148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
13168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_read_status_fn(png_structp png_ptr, png_read_status_ptr read_row_fn)
13178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
13188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr == NULL) return;
13198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->read_row_fn = read_row_fn;
13208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
13218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
13248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_INFO_IMAGE_SUPPORTED)
13258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
13268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_read_png(png_structp png_ptr, png_infop info_ptr,
13278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                           int transforms,
13288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                           voidp params)
13298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
13308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   int row;
13318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr == NULL) return;
13338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED)
13348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* invert the alpha channel from opacity to transparency
13358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
13368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (transforms & PNG_TRANSFORM_INVERT_ALPHA)
13378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_set_invert_alpha(png_ptr);
13388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
13398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* png_read_info() gives us all of the information from the
13418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * PNG file before the first IDAT (image data chunk).
13428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
13438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_read_info(png_ptr, info_ptr);
13448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (info_ptr->height > PNG_UINT_32_MAX/png_sizeof(png_bytep))
13458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_error(png_ptr,"Image is too high to process with png_read_png()");
13468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* -------------- image transformations start here ------------------- */
13488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_16_TO_8_SUPPORTED)
13508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* tell libpng to strip 16 bit/color files down to 8 bits per color
13518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
13528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (transforms & PNG_TRANSFORM_STRIP_16)
13538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_set_strip_16(png_ptr);
13548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
13558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
13578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* Strip alpha bytes from the input data without combining with
13588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * the background (not recommended).
13598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
13608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (transforms & PNG_TRANSFORM_STRIP_ALPHA)
13618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_set_strip_alpha(png_ptr);
13628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
13638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_PACK_SUPPORTED) && !defined(PNG_READ_EXPAND_SUPPORTED)
13658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* Extract multiple pixels with bit depths of 1, 2, or 4 from a single
13668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * byte into separate bytes (useful for paletted and grayscale images).
13678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
13688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (transforms & PNG_TRANSFORM_PACKING)
13698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_set_packing(png_ptr);
13708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
13718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_PACKSWAP_SUPPORTED)
13738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* Change the order of packed pixels to least significant bit first
13748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * (not useful if you are using png_set_packing).
13758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
13768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (transforms & PNG_TRANSFORM_PACKSWAP)
13778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_set_packswap(png_ptr);
13788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
13798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_EXPAND_SUPPORTED)
13818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* Expand paletted colors into true RGB triplets
13828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * Expand grayscale images to full 8 bits from 1, 2, or 4 bits/pixel
13838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * Expand paletted or RGB images with transparency to full alpha
13848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * channels so the data will be available as RGBA quartets.
13858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
13868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (transforms & PNG_TRANSFORM_EXPAND)
13878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       if ((png_ptr->bit_depth < 8) ||
13888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ||
13898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)))
13908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_set_expand(png_ptr);
13918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
13928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* We don't handle background color or gamma transformation or dithering.
13948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
13958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
13968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_INVERT_SUPPORTED)
13978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* invert monochrome files to have 0 as white and 1 as black
13988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
13998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (transforms & PNG_TRANSFORM_INVERT_MONO)
14008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_set_invert_mono(png_ptr);
14018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
14028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_SHIFT_SUPPORTED)
14048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* If you want to shift the pixel values from the range [0,255] or
14058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * [0,65535] to the original [0,7] or [0,31], or whatever range the
14068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * colors were originally in:
14078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
14088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if ((transforms & PNG_TRANSFORM_SHIFT)
14098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       && png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT))
14108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
14118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_color_8p sig_bit;
14128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_get_sBIT(png_ptr, info_ptr, &sig_bit);
14148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_set_shift(png_ptr, sig_bit);
14158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
14168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
14178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_BGR_SUPPORTED)
14198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* flip the RGB pixels to BGR (or RGBA to BGRA)
14208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
14218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (transforms & PNG_TRANSFORM_BGR)
14228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_set_bgr(png_ptr);
14238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
14248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED)
14268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR)
14278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
14288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (transforms & PNG_TRANSFORM_SWAP_ALPHA)
14298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_set_swap_alpha(png_ptr);
14308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
14318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_SWAP_SUPPORTED)
14338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* swap bytes of 16 bit files to least significant byte first
14348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
14358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (transforms & PNG_TRANSFORM_SWAP_ENDIAN)
14368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       png_set_swap(png_ptr);
14378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
14388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* We don't handle adding filler bytes */
14408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* Optional call to gamma correct and add the background to the palette
14428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * and update info structure.  REQUIRED if you are expecting libpng to
14438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * update the palette for you (i.e., you selected such a transform above).
14448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
14458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_read_update_info(png_ptr, info_ptr);
14468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* -------------- image transformations end here ------------------- */
14488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_FREE_ME_SUPPORTED
14508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0);
14518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
14528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(info_ptr->row_pointers == NULL)
14538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
14548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      info_ptr->row_pointers = (png_bytepp)png_malloc(png_ptr,
14558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         info_ptr->height * png_sizeof(png_bytep));
14568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_FREE_ME_SUPPORTED
14578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      info_ptr->free_me |= PNG_FREE_ROWS;
14588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
14598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (row = 0; row < (int)info_ptr->height; row++)
14608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
14618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         info_ptr->row_pointers[row] = (png_bytep)png_malloc(png_ptr,
14628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_get_rowbytes(png_ptr, info_ptr));
14638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
14648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
14658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_read_image(png_ptr, info_ptr->row_pointers);
14678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   info_ptr->valid |= PNG_INFO_IDAT;
14688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* read rest of file, and get additional chunks in info_ptr - REQUIRED */
14708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_read_end(png_ptr, info_ptr);
14718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   transforms = transforms; /* quiet compiler warnings */
14738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   params = params;
14748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
14758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
14768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_INFO_IMAGE_SUPPORTED */
14778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */
14788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_READ_SUPPORTED */
1479