15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* pngread.c - read a PNG file 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Last changed in libpng 1.2.44 [June 26, 2010] 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 1998-2010 Glenn Randers-Pehrson 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This code is released under the libpng license. 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * For conditions of distribution and use, see the disclaimer 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and license in png.h 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This file contains routines that an application calls directly to 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * read a PNG file or stream. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_INTERNAL 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_NO_PEDANTIC_WARNINGS 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "png.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_SUPPORTED 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Create a PNG structure for reading, and allocate any memory needed. */ 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_structp PNGAPI 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_create_read_struct(png_const_charp user_png_ver, png_voidp error_ptr, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error_ptr error_fn, png_error_ptr warn_fn) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (png_create_read_struct_2(user_png_ver, error_ptr, error_fn, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) warn_fn, png_voidp_NULL, png_malloc_ptr_NULL, png_free_ptr_NULL)); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Alternate create PNG structure for reading, and allocate any memory 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * needed. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_structp PNGAPI 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_malloc_ptr malloc_fn, png_free_ptr free_fn) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */ 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SETJMP_SUPPORTED 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_structp png_ptr; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SETJMP_SUPPORTED 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef USE_FAR_KEYWORD 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jmp_buf jmpbuf; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_create_read_struct"); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Added at libpng-1.2.6 */ 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_LIMITS_SUPPORTED 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->user_width_max = PNG_USER_WIDTH_MAX; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->user_height_max = PNG_USER_HEIGHT_MAX; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef PNG_USER_CHUNK_CACHE_MAX 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Added at libpng-1.2.43 and 1.4.0 */ 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->user_chunk_cache_max = PNG_USER_CHUNK_CACHE_MAX; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef PNG_SET_USER_CHUNK_MALLOC_MAX 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Added at libpng-1.2.43 and 1.4.1 */ 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->user_chunk_malloc_max = PNG_USER_CHUNK_MALLOC_MAX; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SETJMP_SUPPORTED 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef USE_FAR_KEYWORD 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (setjmp(jmpbuf)) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (setjmp(png_ptr->jmpbuf)) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, png_ptr->zbuf); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zbuf = NULL; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_destroy_struct_2((png_voidp)png_ptr, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_free_ptr)free_fn, (png_voidp)mem_ptr); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_destroy_struct((png_voidp)png_ptr); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef USE_FAR_KEYWORD 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf)); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_SETJMP_SUPPORTED */ 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_png_ver) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i = 0; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_png_ver[i] != png_libpng_ver[i]) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (png_libpng_ver[i++]); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * we must recompile any applications that use any older library version. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * For versions after libpng 1.0, we will be compatible, so we need 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * only check the first digit. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] || 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) || 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (user_png_ver[0] == '0' && user_png_ver[2] < '9')) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_STDIO_SUPPORTED) && !defined(_WIN32_WCE) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char msg[80]; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_png_ver) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_snprintf(msg, 80, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Application was compiled with png.h from libpng-%.20s", 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_png_ver); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, msg); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_snprintf(msg, 80, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Application is running with png.c from libpng-%.20s", 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_libpng_ver); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, msg); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_ERROR_NUMBERS_SUPPORTED 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->flags = 0; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Incompatible libpng version in application and library"); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Initialize zbuf - compression buffer */ 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zbuf_size = PNG_ZBUF_SIZE; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_uint_32)png_ptr->zbuf_size); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.zalloc = png_zalloc; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.zfree = png_zfree; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.opaque = (voidpf)png_ptr; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (inflateInit(&png_ptr->zstream)) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case Z_OK: /* Do nothing */ break; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case Z_MEM_ERROR: 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory error"); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case Z_VERSION_ERROR: png_error(png_ptr, "zlib version error"); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: png_error(png_ptr, "Unknown zlib error"); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.next_out = png_ptr->zbuf; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SETJMP_SUPPORTED 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Applications that neglect to set up their own setjmp() and then 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encounter a png_error() will longjmp here. Since the jmpbuf is 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) then meaningless we abort instead of returning. */ 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef USE_FAR_KEYWORD 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (setjmp(jmpbuf)) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_ABORT(); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf)); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (setjmp(png_ptr->jmpbuf)) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_ABORT(); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_SETJMP_SUPPORTED */ 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (png_ptr); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_1_0_X) || defined(PNG_1_2_X) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Initialize PNG structure for reading, and allocate any memory needed. 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This interface is deprecated in favour of the png_create_read_struct(), 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and it will disappear as of libpng-1.3.0. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef png_read_init 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_read_init(png_structp png_ptr) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* We only come here via pre-1.0.7-compiled applications */ 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_init_2(png_ptr, "1.0.6 or earlier", 0, 0); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_read_init_2(png_structp png_ptr, png_const_charp user_png_ver, 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_size_t png_struct_size, png_size_t png_info_size) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* We only come here via pre-1.0.12-compiled applications */ 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_STDIO_SUPPORTED) && !defined(_WIN32_WCE) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_sizeof(png_struct) > png_struct_size || 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_sizeof(png_info) > png_info_size) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char msg[80]; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->warning_fn = NULL; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_png_ver) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_snprintf(msg, 80, 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Application was compiled with png.h from libpng-%.20s", 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_png_ver); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, msg); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_snprintf(msg, 80, 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Application is running with png.c from libpng-%.20s", 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_libpng_ver); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, msg); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_sizeof(png_struct) > png_struct_size) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->error_fn = NULL; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_ERROR_NUMBERS_SUPPORTED 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->flags = 0; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "The png struct allocated by the application for reading is" 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " too small."); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_sizeof(png_info) > png_info_size) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->error_fn = NULL; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_ERROR_NUMBERS_SUPPORTED 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->flags = 0; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "The info struct allocated by application for reading is" 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " too small."); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_init_3(&png_ptr, user_png_ver, png_struct_size); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_1_0_X || PNG_1_2_X */ 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_read_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_size_t png_struct_size) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SETJMP_SUPPORTED 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jmp_buf tmp_jmp; /* to save current jump buffer */ 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i = 0; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_structp png_ptr=*ptr_ptr; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_png_ver[i] != png_libpng_ver[i]) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_LEGACY_SUPPORTED 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->warning_fn = NULL; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Application uses deprecated png_read_init() and should be" 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " recompiled."); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (png_libpng_ver[i++]); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_read_init_3"); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SETJMP_SUPPORTED 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Save jump buffer and error functions */ 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf)); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_sizeof(png_struct) > png_struct_size) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_destroy_struct(png_ptr); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *ptr_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr = *ptr_ptr; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Reset all variables to 0 */ 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memset(png_ptr, 0, png_sizeof(png_struct)); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SETJMP_SUPPORTED 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Restore jump buffer */ 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf)); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Added at libpng-1.2.6 */ 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SET_USER_LIMITS_SUPPORTED 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->user_width_max = PNG_USER_WIDTH_MAX; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->user_height_max = PNG_USER_HEIGHT_MAX; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Initialize zbuf - compression buffer */ 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zbuf_size = PNG_ZBUF_SIZE; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.zalloc = png_zalloc; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_uint_32)png_ptr->zbuf_size); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.zalloc = png_zalloc; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.zfree = png_zfree; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.opaque = (voidpf)png_ptr; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (inflateInit(&png_ptr->zstream)) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case Z_OK: /* Do nothing */ break; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory error"); break; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case Z_VERSION_ERROR: png_error(png_ptr, "zlib version error"); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: png_error(png_ptr, "Unknown zlib error"); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.next_out = png_ptr->zbuf; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SEQUENTIAL_READ_SUPPORTED 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Read the information before the actual image data. This has been 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * changed in v0.90 to allow reading a file that already has the magic 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * bytes read from the stream. You can tell libpng how many bytes have 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * been read from the beginning of the stream (up to the maximum of 8) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * via png_set_sig_bytes(), and we will only check the remaining bytes 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * here. The application can then have access to the signature bytes we 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * read if it is determined that this isn't a valid PNG file. 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_read_info(png_structp png_ptr, png_infop info_ptr) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_read_info"); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL || info_ptr == NULL) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If we haven't checked all of the PNG signature bytes, do so now. */ 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->sig_bytes < 8) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_size_t num_checked = png_ptr->sig_bytes, 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_to_check = 8 - num_checked; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_data(png_ptr, &(info_ptr->signature[num_checked]), num_to_check); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->sig_bytes = 8; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check)) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (num_checked < 4 && 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4)) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Not a PNG file"); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "PNG file corrupted by ASCII conversion"); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (num_checked < 3) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (;;) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USE_LOCAL_ARRAYS 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_IHDR; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_IDAT; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_IEND; 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_PLTE; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_bKGD_SUPPORTED 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_bKGD; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_cHRM_SUPPORTED 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_cHRM; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_gAMA_SUPPORTED 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_gAMA; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_hIST_SUPPORTED 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_hIST; 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iCCP_SUPPORTED 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_iCCP; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iTXt_SUPPORTED 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_iTXt; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_oFFs_SUPPORTED 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_oFFs; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_pCAL_SUPPORTED 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_pCAL; 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_pHYs_SUPPORTED 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_pHYs; 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sBIT_SUPPORTED 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_sBIT; 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sCAL_SUPPORTED 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_sCAL; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sPLT_SUPPORTED 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_sPLT; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sRGB_SUPPORTED 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_sRGB; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tEXt_SUPPORTED 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_tEXt; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tIME_SUPPORTED 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_tIME; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tRNS_SUPPORTED 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_tRNS; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_zTXt_SUPPORTED 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_zTXt; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USE_LOCAL_ARRAYS */ 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_uint_32 length = png_read_chunk_header(png_ptr); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST png_bytep chunk_name = png_ptr->chunk_name; 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This should be a binary subdivision search or a hash for 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * matching the chunk name rather than a linear search. 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!png_memcmp(chunk_name, png_IDAT, 4)) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->mode & PNG_AFTER_IDAT) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!png_memcmp(chunk_name, png_IHDR, 4)) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_IHDR(png_ptr, info_ptr, length); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_IEND, 4)) 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_IEND(png_ptr, info_ptr, length); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (png_handle_as_unknown(png_ptr, chunk_name)) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!png_memcmp(chunk_name, png_IDAT, 4)) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->mode |= PNG_HAVE_IDAT; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_unknown(png_ptr, info_ptr, length); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!png_memcmp(chunk_name, png_PLTE, 4)) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->mode |= PNG_HAVE_PLTE; 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_IDAT, 4)) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(png_ptr->mode & PNG_HAVE_IHDR)) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Missing IHDR before IDAT"); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !(png_ptr->mode & PNG_HAVE_PLTE)) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Missing PLTE before IDAT"); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_PLTE, 4)) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_PLTE(png_ptr, info_ptr, length); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_IDAT, 4)) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(png_ptr->mode & PNG_HAVE_IHDR)) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Missing IHDR before IDAT"); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !(png_ptr->mode & PNG_HAVE_PLTE)) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Missing PLTE before IDAT"); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->idat_size = length; 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->mode |= PNG_HAVE_IDAT; 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_bKGD_SUPPORTED 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_bKGD, 4)) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_bKGD(png_ptr, info_ptr, length); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_cHRM_SUPPORTED 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_cHRM, 4)) 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_cHRM(png_ptr, info_ptr, length); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_gAMA_SUPPORTED 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_gAMA, 4)) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_gAMA(png_ptr, info_ptr, length); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_hIST_SUPPORTED 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_hIST, 4)) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_hIST(png_ptr, info_ptr, length); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_oFFs_SUPPORTED 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_oFFs, 4)) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_oFFs(png_ptr, info_ptr, length); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_pCAL_SUPPORTED 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_pCAL, 4)) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_pCAL(png_ptr, info_ptr, length); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sCAL_SUPPORTED 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_sCAL, 4)) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_sCAL(png_ptr, info_ptr, length); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_pHYs_SUPPORTED 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_pHYs, 4)) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_pHYs(png_ptr, info_ptr, length); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sBIT_SUPPORTED 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_sBIT, 4)) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_sBIT(png_ptr, info_ptr, length); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sRGB_SUPPORTED 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_sRGB, 4)) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_sRGB(png_ptr, info_ptr, length); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iCCP_SUPPORTED 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_iCCP, 4)) 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_iCCP(png_ptr, info_ptr, length); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sPLT_SUPPORTED 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_sPLT, 4)) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_sPLT(png_ptr, info_ptr, length); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tEXt_SUPPORTED 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_tEXt, 4)) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_tEXt(png_ptr, info_ptr, length); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tIME_SUPPORTED 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_tIME, 4)) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_tIME(png_ptr, info_ptr, length); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tRNS_SUPPORTED 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_tRNS, 4)) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_tRNS(png_ptr, info_ptr, length); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_zTXt_SUPPORTED 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_zTXt, 4)) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_zTXt(png_ptr, info_ptr, length); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iTXt_SUPPORTED 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_iTXt, 4)) 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_iTXt(png_ptr, info_ptr, length); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_unknown(png_ptr, info_ptr, length); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Optional call to update the users info_ptr structure */ 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_read_update_info(png_structp png_ptr, png_infop info_ptr) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_read_update_info"); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_start_row(png_ptr); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Ignoring extra png_read_update_info() call; row buffer not reallocated"); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_transform_info(png_ptr, info_ptr); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SEQUENTIAL_READ_SUPPORTED 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Initialize palette, background, etc, after transformations 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * are set, but before any reading takes place. This allows 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the user to obtain a gamma-corrected palette, for example. 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If the user doesn't call this, we will do it ourselves. 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_start_read_image(png_structp png_ptr) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_start_read_image"); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_start_row(png_ptr); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SEQUENTIAL_READ_SUPPORTED 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_IDAT; 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0xff}; 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST int png_pass_mask[7] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff}; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug2(1, "in png_read_row (row %lu, pass %d)", 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->row_number, png_ptr->pass); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_start_row(png_ptr); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->row_number == 0 && png_ptr->pass == 0) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Check for transforms that have been set but were defined out */ 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_WRITE_INVERT_SUPPORTED) && !defined(PNG_READ_INVERT_SUPPORTED) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->transformations & PNG_INVERT_MONO) 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, "PNG_READ_INVERT_SUPPORTED is not defined."); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_WRITE_FILLER_SUPPORTED) && !defined(PNG_READ_FILLER_SUPPORTED) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->transformations & PNG_FILLER) 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, "PNG_READ_FILLER_SUPPORTED is not defined."); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_WRITE_PACKSWAP_SUPPORTED) && \ 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !defined(PNG_READ_PACKSWAP_SUPPORTED) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->transformations & PNG_PACKSWAP) 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, "PNG_READ_PACKSWAP_SUPPORTED is not defined."); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_WRITE_PACK_SUPPORTED) && !defined(PNG_READ_PACK_SUPPORTED) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->transformations & PNG_PACK) 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, "PNG_READ_PACK_SUPPORTED is not defined."); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_WRITE_SHIFT_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED) 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->transformations & PNG_SHIFT) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, "PNG_READ_SHIFT_SUPPORTED is not defined."); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_WRITE_BGR_SUPPORTED) && !defined(PNG_READ_BGR_SUPPORTED) 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->transformations & PNG_BGR) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, "PNG_READ_BGR_SUPPORTED is not defined."); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_WRITE_SWAP_SUPPORTED) && !defined(PNG_READ_SWAP_SUPPORTED) 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->transformations & PNG_SWAP_BYTES) 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, "PNG_READ_SWAP_SUPPORTED is not defined."); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_INTERLACING_SUPPORTED 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If interlaced and we do not need a new row, combine row and return */ 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (png_ptr->pass) 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 0: 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->row_number & 0x07) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dsp_row != NULL) 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_combine_row(png_ptr, dsp_row, 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_pass_dsp_mask[png_ptr->pass]); 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_finish_row(png_ptr); 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 1: 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((png_ptr->row_number & 0x07) || png_ptr->width < 5) 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dsp_row != NULL) 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_combine_row(png_ptr, dsp_row, 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_pass_dsp_mask[png_ptr->pass]); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_finish_row(png_ptr); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 2: 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((png_ptr->row_number & 0x07) != 4) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dsp_row != NULL && (png_ptr->row_number & 4)) 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_combine_row(png_ptr, dsp_row, 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_pass_dsp_mask[png_ptr->pass]); 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_finish_row(png_ptr); 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 3: 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((png_ptr->row_number & 3) || png_ptr->width < 3) 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dsp_row != NULL) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_combine_row(png_ptr, dsp_row, 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_pass_dsp_mask[png_ptr->pass]); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_finish_row(png_ptr); 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 4: 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((png_ptr->row_number & 3) != 2) 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dsp_row != NULL && (png_ptr->row_number & 2)) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_combine_row(png_ptr, dsp_row, 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_pass_dsp_mask[png_ptr->pass]); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_finish_row(png_ptr); 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 5: 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((png_ptr->row_number & 1) || png_ptr->width < 2) 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dsp_row != NULL) 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_combine_row(png_ptr, dsp_row, 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_pass_dsp_mask[png_ptr->pass]); 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_finish_row(png_ptr); 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 6: 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(png_ptr->row_number & 1)) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_finish_row(png_ptr); 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(png_ptr->mode & PNG_HAVE_IDAT)) 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Invalid attempt to read row data"); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.next_out = png_ptr->row_buf; 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.avail_out = 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (uInt)(PNG_ROWBYTES(png_ptr->pixel_depth, 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->iwidth) + 1); 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(png_ptr->zstream.avail_in)) 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (!png_ptr->idat_size) 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_crc_finish(png_ptr, 0); 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->idat_size = png_read_chunk_header(png_ptr); 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Not enough image data"); 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size; 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.next_in = png_ptr->zbuf; 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->zbuf_size > png_ptr->idat_size) 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size; 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_crc_read(png_ptr, png_ptr->zbuf, 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_size_t)png_ptr->zstream.avail_in); 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->idat_size -= png_ptr->zstream.avail_in; 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == Z_STREAM_END) 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->zstream.avail_out || png_ptr->zstream.avail_in || 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->idat_size) 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Extra compressed data"); 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->mode |= PNG_AFTER_IDAT; 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != Z_OK) 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg : 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Decompression error"); 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (png_ptr->zstream.avail_out); 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->row_info.color_type = png_ptr->color_type; 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->row_info.width = png_ptr->iwidth; 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->row_info.channels = png_ptr->channels; 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->row_info.bit_depth = png_ptr->bit_depth; 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->row_info.pixel_depth = png_ptr->pixel_depth; 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->row_info.width); 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->row_buf[0]) 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_filter_row(png_ptr, &(png_ptr->row_info), 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->row_buf + 1, png_ptr->prev_row + 1, 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (int)(png_ptr->row_buf[0])); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf, 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->rowbytes + 1); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_MNG_FEATURES_SUPPORTED 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING)) 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Intrapixel differencing */ 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_do_read_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA)) 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_do_read_transformations(png_ptr); 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_INTERLACING_SUPPORTED 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Blow up interlaced rows to full size */ 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->interlaced && 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_ptr->transformations & PNG_INTERLACE)) 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->pass < 6) 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Old interface (pre-1.0.9): 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * png_do_read_interlace(&(png_ptr->row_info), 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations); 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_do_read_interlace(png_ptr); 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dsp_row != NULL) 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_combine_row(png_ptr, dsp_row, 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_pass_dsp_mask[png_ptr->pass]); 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row != NULL) 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_combine_row(png_ptr, row, 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_pass_mask[png_ptr->pass]); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row != NULL) 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_combine_row(png_ptr, row, 0xff); 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dsp_row != NULL) 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_combine_row(png_ptr, dsp_row, 0xff); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_finish_row(png_ptr); 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->read_row_fn != NULL) 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*(png_ptr->read_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SEQUENTIAL_READ_SUPPORTED 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Read one or more rows of image data. If the image is interlaced, 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and png_set_interlace_handling() has been called, the rows need to 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * contain the contents of the rows from the previous pass. If the 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * image has alpha or transparency, and png_handle_alpha()[*] has been 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * called, the rows contents must be initialized to the contents of the 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * screen. 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "row" holds the actual image, and pixels are placed in it 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * as they arrive. If the image is displayed after each pass, it will 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * appear to "sparkle" in. "display_row" can be used to display a 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "chunky" progressive image, with finer detail added as it becomes 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * available. If you do not want this "chunky" display, you may pass 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NULL for display_row. If you do not want the sparkle display, and 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * you have not called png_handle_alpha(), you may pass NULL for rows. 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If you have called png_handle_alpha(), and the image has either an 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * alpha channel or a transparency chunk, you must provide a buffer for 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * rows. In this case, you do not have to provide a display_row buffer 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * also, but you may. If the image is not interlaced, or if you have 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * not called png_set_interlace_handling(), the display_row buffer will 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * be ignored, so pass NULL to it. 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * [*] png_handle_alpha() does not exist yet, as of this version of libpng 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_read_rows(png_structp png_ptr, png_bytepp row, 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytepp display_row, png_uint_32 num_rows) 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_uint_32 i; 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytepp rp; 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytepp dp; 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_read_rows"); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rp = row; 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dp = display_row; 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rp != NULL && dp != NULL) 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < num_rows; i++) 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytep rptr = *rp++; 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytep dptr = *dp++; 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_row(png_ptr, rptr, dptr); 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (rp != NULL) 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < num_rows; i++) 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytep rptr = *rp; 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_row(png_ptr, rptr, png_bytep_NULL); 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rp++; 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (dp != NULL) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < num_rows; i++) 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytep dptr = *dp; 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_row(png_ptr, png_bytep_NULL, dptr); 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dp++; 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SEQUENTIAL_READ_SUPPORTED 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Read the entire image. If the image has an alpha channel or a tRNS 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * chunk, and you have called png_handle_alpha()[*], you will need to 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * initialize the image to the current image that PNG will be overlaying. 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * We set the num_rows again here, in case it was incorrectly set in 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * png_read_start_row() by a call to png_read_update_info() or 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * png_start_read_image() if png_set_interlace_handling() wasn't called 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * prior to either of these functions like it should have been. You can 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * only call this function once. If you desire to have an image for 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * each pass of a interlaced image, use png_read_rows() instead. 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * [*] png_handle_alpha() does not exist yet, as of this version of libpng 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_read_image(png_structp png_ptr, png_bytepp image) 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_uint_32 i, image_height; 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pass, j; 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytepp rp; 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_read_image"); 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_INTERLACING_SUPPORTED 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pass = png_set_interlace_handling(png_ptr); 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->interlaced) 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Cannot read interlaced image -- interlace handler disabled."); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pass = 1; 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image_height=png_ptr->height; 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->num_rows = image_height; /* Make sure this is set correctly */ 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (j = 0; j < pass; j++) 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rp = image; 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < image_height; i++) 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_row(png_ptr, *rp, png_bytep_NULL); 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rp++; 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SEQUENTIAL_READ_SUPPORTED 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Read the end of the PNG file. Will not read past the end of the 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * file, will verify the end is accurate, and will read any comments 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or time information at the end of the file, if info is not NULL. 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_read_end(png_structp png_ptr, png_infop info_ptr) 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_read_end"); 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_crc_finish(png_ptr, 0); /* Finish off CRC from last IDAT chunk */ 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USE_LOCAL_ARRAYS 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_IHDR; 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_IDAT; 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_IEND; 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_PLTE; 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_bKGD_SUPPORTED 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_bKGD; 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_cHRM_SUPPORTED 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_cHRM; 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_gAMA_SUPPORTED 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_gAMA; 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_hIST_SUPPORTED 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_hIST; 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iCCP_SUPPORTED 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_iCCP; 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iTXt_SUPPORTED 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_iTXt; 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_oFFs_SUPPORTED 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_oFFs; 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_pCAL_SUPPORTED 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_pCAL; 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_pHYs_SUPPORTED 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_pHYs; 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sBIT_SUPPORTED 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_sBIT; 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sCAL_SUPPORTED 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_sCAL; 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sPLT_SUPPORTED 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_sPLT; 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sRGB_SUPPORTED 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_sRGB; 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tEXt_SUPPORTED 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_tEXt; 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tIME_SUPPORTED 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_tIME; 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tRNS_SUPPORTED 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_tRNS; 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_zTXt_SUPPORTED 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_zTXt; 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USE_LOCAL_ARRAYS */ 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_uint_32 length = png_read_chunk_header(png_ptr); 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST png_bytep chunk_name = png_ptr->chunk_name; 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!png_memcmp(chunk_name, png_IHDR, 4)) 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_IHDR(png_ptr, info_ptr, length); 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_IEND, 4)) 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_IEND(png_ptr, info_ptr, length); 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (png_handle_as_unknown(png_ptr, chunk_name)) 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!png_memcmp(chunk_name, png_IDAT, 4)) 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Too many IDAT's found"); 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_unknown(png_ptr, info_ptr, length); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!png_memcmp(chunk_name, png_PLTE, 4)) 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->mode |= PNG_HAVE_PLTE; 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_IDAT, 4)) 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Zero length IDATs are legal after the last IDAT has been 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * read, but not after other chunks have been read. 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Too many IDAT's found"); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_crc_finish(png_ptr, length); 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_PLTE, 4)) 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_PLTE(png_ptr, info_ptr, length); 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_bKGD_SUPPORTED 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_bKGD, 4)) 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_bKGD(png_ptr, info_ptr, length); 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_cHRM_SUPPORTED 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_cHRM, 4)) 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_cHRM(png_ptr, info_ptr, length); 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_gAMA_SUPPORTED 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_gAMA, 4)) 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_gAMA(png_ptr, info_ptr, length); 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_hIST_SUPPORTED 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_hIST, 4)) 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_hIST(png_ptr, info_ptr, length); 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_oFFs_SUPPORTED 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_oFFs, 4)) 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_oFFs(png_ptr, info_ptr, length); 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_pCAL_SUPPORTED 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_pCAL, 4)) 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_pCAL(png_ptr, info_ptr, length); 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sCAL_SUPPORTED 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_sCAL, 4)) 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_sCAL(png_ptr, info_ptr, length); 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_pHYs_SUPPORTED 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_pHYs, 4)) 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_pHYs(png_ptr, info_ptr, length); 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sBIT_SUPPORTED 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_sBIT, 4)) 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_sBIT(png_ptr, info_ptr, length); 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sRGB_SUPPORTED 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_sRGB, 4)) 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_sRGB(png_ptr, info_ptr, length); 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iCCP_SUPPORTED 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_iCCP, 4)) 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_iCCP(png_ptr, info_ptr, length); 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sPLT_SUPPORTED 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_sPLT, 4)) 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_sPLT(png_ptr, info_ptr, length); 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tEXt_SUPPORTED 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_tEXt, 4)) 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_tEXt(png_ptr, info_ptr, length); 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tIME_SUPPORTED 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_tIME, 4)) 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_tIME(png_ptr, info_ptr, length); 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tRNS_SUPPORTED 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_tRNS, 4)) 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_tRNS(png_ptr, info_ptr, length); 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_zTXt_SUPPORTED 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_zTXt, 4)) 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_zTXt(png_ptr, info_ptr, length); 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iTXt_SUPPORTED 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(chunk_name, png_iTXt, 4)) 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_iTXt(png_ptr, info_ptr, length); 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_unknown(png_ptr, info_ptr, length); 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (!(png_ptr->mode & PNG_HAVE_IEND)); 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Free all memory used by the read */ 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr, 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_infopp end_info_ptr_ptr) 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_structp png_ptr = NULL; 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_infop info_ptr = NULL, end_info_ptr = NULL; 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free_ptr free_fn = NULL; 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_voidp mem_ptr = NULL; 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_destroy_read_struct"); 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr_ptr != NULL) 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr = *png_ptr_ptr; 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) free_fn = png_ptr->free_fn; 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem_ptr = png_ptr->mem_ptr; 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (info_ptr_ptr != NULL) 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info_ptr = *info_ptr_ptr; 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (end_info_ptr_ptr != NULL) 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end_info_ptr = *end_info_ptr_ptr; 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_destroy(png_ptr, info_ptr, end_info_ptr); 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (info_ptr != NULL) 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_TEXT_SUPPORTED 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, -1); 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn, 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_voidp)mem_ptr); 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_destroy_struct((png_voidp)info_ptr); 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *info_ptr_ptr = NULL; 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (end_info_ptr != NULL) 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_TEXT_SUPPORTED 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free_data(png_ptr, end_info_ptr, PNG_FREE_TEXT, -1); 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_destroy_struct_2((png_voidp)end_info_ptr, (png_free_ptr)free_fn, 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_voidp)mem_ptr); 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_destroy_struct((png_voidp)end_info_ptr); 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_info_ptr_ptr = NULL; 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr != NULL) 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn, 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_voidp)mem_ptr); 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_destroy_struct((png_voidp)png_ptr); 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *png_ptr_ptr = NULL; 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Free all memory used by the read (old method) */ 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_read_destroy(png_structp png_ptr, png_infop info_ptr, 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_infop end_info_ptr) 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SETJMP_SUPPORTED 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jmp_buf tmp_jmp; 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error_ptr error_fn; 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error_ptr warning_fn; 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_voidp error_ptr; 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free_ptr free_fn; 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_read_destroy"); 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (info_ptr != NULL) 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_info_destroy(png_ptr, info_ptr); 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (end_info_ptr != NULL) 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_info_destroy(png_ptr, end_info_ptr); 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, png_ptr->zbuf); 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, png_ptr->big_row_buf); 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, png_ptr->prev_row); 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, png_ptr->chunkdata); 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_DITHER_SUPPORTED 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, png_ptr->palette_lookup); 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, png_ptr->dither_index); 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_GAMMA_SUPPORTED 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, png_ptr->gamma_table); 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_BACKGROUND_SUPPORTED 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, png_ptr->gamma_from_1); 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, png_ptr->gamma_to_1); 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_FREE_ME_SUPPORTED 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->free_me & PNG_FREE_PLTE) 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_zfree(png_ptr, png_ptr->palette); 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->free_me &= ~PNG_FREE_PLTE; 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->flags & PNG_FLAG_FREE_PLTE) 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_zfree(png_ptr, png_ptr->palette); 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->flags &= ~PNG_FLAG_FREE_PLTE; 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_tRNS_SUPPORTED) || \ 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_FREE_ME_SUPPORTED 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->free_me & PNG_FREE_TRNS) 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, png_ptr->trans); 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->free_me &= ~PNG_FREE_TRNS; 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->flags & PNG_FLAG_FREE_TRNS) 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, png_ptr->trans); 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->flags &= ~PNG_FLAG_FREE_TRNS; 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_hIST_SUPPORTED 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_FREE_ME_SUPPORTED 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->free_me & PNG_FREE_HIST) 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, png_ptr->hist); 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->free_me &= ~PNG_FREE_HIST; 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->flags & PNG_FLAG_FREE_HIST) 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, png_ptr->hist); 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->flags &= ~PNG_FLAG_FREE_HIST; 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_GAMMA_SUPPORTED 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->gamma_16_table != NULL) 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int istop = (1 << (8 - png_ptr->gamma_shift)); 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < istop; i++) 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, png_ptr->gamma_16_table[i]); 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, png_ptr->gamma_16_table); 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_BACKGROUND_SUPPORTED 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->gamma_16_from_1 != NULL) 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int istop = (1 << (8 - png_ptr->gamma_shift)); 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < istop; i++) 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, png_ptr->gamma_16_from_1[i]); 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, png_ptr->gamma_16_from_1); 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->gamma_16_to_1 != NULL) 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int istop = (1 << (8 - png_ptr->gamma_shift)); 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < istop; i++) 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, png_ptr->gamma_16_to_1[i]); 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, png_ptr->gamma_16_to_1); 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_TIME_RFC1123_SUPPORTED 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, png_ptr->time_buffer); 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inflateEnd(&png_ptr->zstream); 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_PROGRESSIVE_READ_SUPPORTED 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, png_ptr->save_buffer); 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_PROGRESSIVE_READ_SUPPORTED 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_TEXT_SUPPORTED 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, png_ptr->current_text); 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_TEXT_SUPPORTED */ 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Save the important info out of the png_struct, in case it is 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * being used again. 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SETJMP_SUPPORTED 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf)); 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_fn = png_ptr->error_fn; 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) warning_fn = png_ptr->warning_fn; 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_ptr = png_ptr->error_ptr; 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) free_fn = png_ptr->free_fn; 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memset(png_ptr, 0, png_sizeof(png_struct)); 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->error_fn = error_fn; 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->warning_fn = warning_fn; 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->error_ptr = error_ptr; 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->free_fn = free_fn; 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SETJMP_SUPPORTED 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf)); 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_read_status_fn(png_structp png_ptr, png_read_status_ptr read_row_fn) 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->read_row_fn = read_row_fn; 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SEQUENTIAL_READ_SUPPORTED 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_INFO_IMAGE_SUPPORTED 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_read_png(png_structp png_ptr, png_infop info_ptr, 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int transforms, 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) voidp params) 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int row; 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Invert the alpha channel from opacity to transparency 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (transforms & PNG_TRANSFORM_INVERT_ALPHA) 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_set_invert_alpha(png_ptr); 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* png_read_info() gives us all of the information from the 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PNG file before the first IDAT (image data chunk). 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_info(png_ptr, info_ptr); 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (info_ptr->height > PNG_UINT_32_MAX/png_sizeof(png_bytep)) 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Image is too high to process with png_read_png()"); 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* -------------- image transformations start here ------------------- */ 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_16_TO_8_SUPPORTED 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Tell libpng to strip 16 bit/color files down to 8 bits per color. 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (transforms & PNG_TRANSFORM_STRIP_16) 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_set_strip_16(png_ptr); 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Strip alpha bytes from the input data without combining with 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the background (not recommended). 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (transforms & PNG_TRANSFORM_STRIP_ALPHA) 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_set_strip_alpha(png_ptr); 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_PACK_SUPPORTED) && !defined(PNG_READ_EXPAND_SUPPORTED) 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Extract multiple pixels with bit depths of 1, 2, or 4 from a single 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * byte into separate bytes (useful for paletted and grayscale images). 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (transforms & PNG_TRANSFORM_PACKING) 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_set_packing(png_ptr); 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_PACKSWAP_SUPPORTED 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Change the order of packed pixels to least significant bit first 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (not useful if you are using png_set_packing). 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (transforms & PNG_TRANSFORM_PACKSWAP) 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_set_packswap(png_ptr); 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_EXPAND_SUPPORTED 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Expand paletted colors into true RGB triplets 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Expand grayscale images to full 8 bits from 1, 2, or 4 bits/pixel 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Expand paletted or RGB images with transparency to full alpha 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * channels so the data will be available as RGBA quartets. 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (transforms & PNG_TRANSFORM_EXPAND) 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((png_ptr->bit_depth < 8) || 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) || 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))) 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_set_expand(png_ptr); 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* We don't handle background color or gamma transformation or dithering. 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_INVERT_SUPPORTED 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Invert monochrome files to have 0 as white and 1 as black 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (transforms & PNG_TRANSFORM_INVERT_MONO) 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_set_invert_mono(png_ptr); 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_SHIFT_SUPPORTED 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If you want to shift the pixel values from the range [0,255] or 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * [0,65535] to the original [0,7] or [0,31], or whatever range the 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * colors were originally in: 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((transforms & PNG_TRANSFORM_SHIFT) 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT)) 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_color_8p sig_bit; 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_get_sBIT(png_ptr, info_ptr, &sig_bit); 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_set_shift(png_ptr, sig_bit); 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_BGR_SUPPORTED 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Flip the RGB pixels to BGR (or RGBA to BGRA) 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (transforms & PNG_TRANSFORM_BGR) 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_set_bgr(png_ptr); 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_SWAP_ALPHA_SUPPORTED 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR) 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (transforms & PNG_TRANSFORM_SWAP_ALPHA) 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_set_swap_alpha(png_ptr); 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_SWAP_SUPPORTED 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Swap bytes of 16 bit files to least significant byte first 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (transforms & PNG_TRANSFORM_SWAP_ENDIAN) 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_set_swap(png_ptr); 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Added at libpng-1.2.41 */ 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Invert the alpha channel from opacity to transparency 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (transforms & PNG_TRANSFORM_INVERT_ALPHA) 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_set_invert_alpha(png_ptr); 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Added at libpng-1.2.41 */ 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Expand grayscale image to RGB 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (transforms & PNG_TRANSFORM_GRAY_TO_RGB) 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_set_gray_to_rgb(png_ptr); 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* We don't handle adding filler bytes */ 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Optional call to gamma correct and add the background to the palette 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and update info structure. REQUIRED if you are expecting libpng to 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * update the palette for you (i.e., you selected such a transform above). 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_update_info(png_ptr, info_ptr); 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* -------------- image transformations end here ------------------- */ 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_FREE_ME_SUPPORTED 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0); 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (info_ptr->row_pointers == NULL) 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info_ptr->row_pointers = (png_bytepp)png_malloc(png_ptr, 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info_ptr->height * png_sizeof(png_bytep)); 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memset(info_ptr->row_pointers, 0, info_ptr->height 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * png_sizeof(png_bytep)); 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_FREE_ME_SUPPORTED 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info_ptr->free_me |= PNG_FREE_ROWS; 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (row = 0; row < (int)info_ptr->height; row++) 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info_ptr->row_pointers[row] = (png_bytep)png_malloc(png_ptr, 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_get_rowbytes(png_ptr, info_ptr)); 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_image(png_ptr, info_ptr->row_pointers); 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info_ptr->valid |= PNG_INFO_IDAT; 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Read rest of file, and get additional chunks in info_ptr - REQUIRED */ 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_end(png_ptr, info_ptr); 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transforms = transforms; /* Quiet compiler warnings */ 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params = params; 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_INFO_IMAGE_SUPPORTED */ 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_READ_SUPPORTED */ 1529