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