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