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