15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* pngpread.c - read a png file in push mode 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) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_INTERNAL 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_NO_PEDANTIC_WARNINGS 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "png.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_PROGRESSIVE_READ_SUPPORTED 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Push model modes */ 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_READ_SIG_MODE 0 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_READ_CHUNK_MODE 1 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_READ_IDAT_MODE 2 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_SKIP_MODE 3 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_READ_tEXt_MODE 4 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_READ_zTXt_MODE 5 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_READ_DONE_MODE 6 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_READ_iTXt_MODE 7 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_ERROR_MODE 8 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_process_data(png_structp png_ptr, png_infop info_ptr, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytep buffer, png_size_t buffer_size) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL || info_ptr == NULL) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_restore_buffer(png_ptr, buffer, buffer_size); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (png_ptr->buffer_size) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_process_some_data(png_ptr, info_ptr); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* What we do with the incoming data depends on what we were previously 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * doing before we ran out of data... 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_process_some_data(png_structp png_ptr, png_infop info_ptr) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (png_ptr->process_mode) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PNG_READ_SIG_MODE: 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_read_sig(png_ptr, info_ptr); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PNG_READ_CHUNK_MODE: 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_read_chunk(png_ptr, info_ptr); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PNG_READ_IDAT_MODE: 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_read_IDAT(png_ptr); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tEXt_SUPPORTED 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PNG_READ_tEXt_MODE: 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_read_tEXt(png_ptr, info_ptr); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_zTXt_SUPPORTED 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PNG_READ_zTXt_MODE: 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_read_zTXt(png_ptr, info_ptr); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iTXt_SUPPORTED 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PNG_READ_iTXt_MODE: 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_read_iTXt(png_ptr, info_ptr); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PNG_SKIP_MODE: 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_crc_finish(png_ptr); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->buffer_size = 0; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Read any remaining signature bytes from the stream and compare them with 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the correct PNG signature. It is possible that this routine is called 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * with bytes already read from the signature, either because they have been 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * checked by the calling application, or because of multiple calls to this 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * routine. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_read_sig(png_structp png_ptr, png_infop info_ptr) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_size_t num_checked = png_ptr->sig_bytes, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_to_check = 8 - num_checked; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->buffer_size < num_to_check) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_to_check = png_ptr->buffer_size; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_fill_buffer(png_ptr, &(info_ptr->signature[num_checked]), 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_to_check); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes + num_to_check); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check)) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (num_checked < 4 && 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4)) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Not a PNG file"); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "PNG file corrupted by ASCII conversion"); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->sig_bytes >= 8) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->process_mode = PNG_READ_CHUNK_MODE; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_read_chunk(png_structp png_ptr, png_infop info_ptr) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USE_LOCAL_ARRAYS 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_IHDR; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_IDAT; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_IEND; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_PLTE; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_bKGD_SUPPORTED 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_bKGD; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_cHRM_SUPPORTED 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_cHRM; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_gAMA_SUPPORTED 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_gAMA; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_hIST_SUPPORTED 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_hIST; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iCCP_SUPPORTED 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_iCCP; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iTXt_SUPPORTED 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_iTXt; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_oFFs_SUPPORTED 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_oFFs; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_pCAL_SUPPORTED 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_pCAL; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_pHYs_SUPPORTED 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_pHYs; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sBIT_SUPPORTED 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_sBIT; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sCAL_SUPPORTED 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_sCAL; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sRGB_SUPPORTED 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_sRGB; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sPLT_SUPPORTED 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_sPLT; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tEXt_SUPPORTED 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_tEXt; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tIME_SUPPORTED 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_tIME; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tRNS_SUPPORTED 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_tRNS; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_zTXt_SUPPORTED 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_zTXt; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USE_LOCAL_ARRAYS */ 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* First we make sure we have enough data for the 4 byte chunk name 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and the 4 byte chunk length before proceeding with decoding the 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * chunk data. To fully decode each of these chunks, we also make 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * sure we have enough data in the buffer for the 4 byte CRC at the 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * end of every chunk (except IDAT, which is handled separately). 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER)) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_byte chunk_length[4]; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->buffer_size < 8) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_fill_buffer(png_ptr, chunk_length, 4); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_reset_crc(png_ptr); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_crc_read(png_ptr, png_ptr->chunk_name, 4); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_check_chunk_name(png_ptr, png_ptr->chunk_name); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->mode & PNG_AFTER_IDAT) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4)) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->push_length != 13) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Invalid IHDR length"); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->push_length + 4 > png_ptr->buffer_size) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4)) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->push_length + 4 > png_ptr->buffer_size) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->process_mode = PNG_READ_DONE_MODE; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_have_end(png_ptr, info_ptr); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name)) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->push_length + 4 > png_ptr->buffer_size) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->mode |= PNG_HAVE_IDAT; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->mode |= PNG_HAVE_PLTE; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(png_ptr->mode & PNG_HAVE_IHDR)) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Missing IHDR before IDAT"); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !(png_ptr->mode & PNG_HAVE_PLTE)) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Missing PLTE before IDAT"); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->push_length + 4 > png_ptr->buffer_size) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If we reach an IDAT chunk, this means we have read all of the 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * header chunks, and we can start reading the image (or if this 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is called after the image has been read - we have an error). 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(png_ptr->mode & PNG_HAVE_IHDR)) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Missing IHDR before IDAT"); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !(png_ptr->mode & PNG_HAVE_PLTE)) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Missing PLTE before IDAT"); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->mode & PNG_HAVE_IDAT) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->push_length == 0) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->mode & PNG_AFTER_IDAT) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Too many IDAT's found"); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->idat_size = png_ptr->push_length; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->mode |= PNG_HAVE_IDAT; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->process_mode = PNG_READ_IDAT_MODE; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_have_info(png_ptr, info_ptr); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.avail_out = 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (uInt) PNG_ROWBYTES(png_ptr->pixel_depth, 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->iwidth) + 1; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.next_out = png_ptr->row_buf; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_gAMA_SUPPORTED 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4)) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->push_length + 4 > png_ptr->buffer_size) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sBIT_SUPPORTED 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4)) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->push_length + 4 > png_ptr->buffer_size) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_cHRM_SUPPORTED 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4)) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->push_length + 4 > png_ptr->buffer_size) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sRGB_SUPPORTED 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4)) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->push_length + 4 > png_ptr->buffer_size) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iCCP_SUPPORTED 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4)) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->push_length + 4 > png_ptr->buffer_size) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sPLT_SUPPORTED 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4)) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->push_length + 4 > png_ptr->buffer_size) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tRNS_SUPPORTED 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4)) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->push_length + 4 > png_ptr->buffer_size) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_bKGD_SUPPORTED 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4)) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->push_length + 4 > png_ptr->buffer_size) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_hIST_SUPPORTED 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4)) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->push_length + 4 > png_ptr->buffer_size) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_pHYs_SUPPORTED 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4)) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->push_length + 4 > png_ptr->buffer_size) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_oFFs_SUPPORTED 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4)) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->push_length + 4 > png_ptr->buffer_size) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_pCAL_SUPPORTED 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4)) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->push_length + 4 > png_ptr->buffer_size) 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sCAL_SUPPORTED 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4)) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->push_length + 4 > png_ptr->buffer_size) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tIME_SUPPORTED 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4)) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->push_length + 4 > png_ptr->buffer_size) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tEXt_SUPPORTED 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->push_length + 4 > png_ptr->buffer_size) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_zTXt_SUPPORTED 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->push_length + 4 > png_ptr->buffer_size) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iTXt_SUPPORTED 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->push_length + 4 > png_ptr->buffer_size) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->push_length + 4 > png_ptr->buffer_size) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_crc_skip(png_structp png_ptr, png_uint_32 skip) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->process_mode = PNG_SKIP_MODE; 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->skip_length = skip; 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_crc_finish(png_structp png_ptr) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->skip_length && png_ptr->save_buffer_size) 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_size_t save_size; 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->skip_length < (png_uint_32)png_ptr->save_buffer_size) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_size = (png_size_t)png_ptr->skip_length; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_size = png_ptr->save_buffer_size; 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->skip_length -= save_size; 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->buffer_size -= save_size; 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->save_buffer_size -= save_size; 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->save_buffer_ptr += save_size; 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->skip_length && png_ptr->current_buffer_size) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_size_t save_size; 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->skip_length < (png_uint_32)png_ptr->current_buffer_size) 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_size = (png_size_t)png_ptr->skip_length; 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_size = png_ptr->current_buffer_size; 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->skip_length -= save_size; 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->buffer_size -= save_size; 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_buffer_size -= save_size; 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_buffer_ptr += save_size; 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!png_ptr->skip_length) 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->buffer_size < 4) 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_crc_finish(png_ptr, 0); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->process_mode = PNG_READ_CHUNK_MODE; 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytep ptr; 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr = buffer; 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->save_buffer_size) 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_size_t save_size; 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (length < png_ptr->save_buffer_size) 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_size = length; 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_size = png_ptr->save_buffer_size; 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memcpy(ptr, png_ptr->save_buffer_ptr, save_size); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) length -= save_size; 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr += save_size; 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->buffer_size -= save_size; 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->save_buffer_size -= save_size; 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->save_buffer_ptr += save_size; 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (length && png_ptr->current_buffer_size) 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_size_t save_size; 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (length < png_ptr->current_buffer_size) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_size = length; 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_size = png_ptr->current_buffer_size; 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memcpy(ptr, png_ptr->current_buffer_ptr, save_size); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->buffer_size -= save_size; 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_buffer_size -= save_size; 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_buffer_ptr += save_size; 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_save_buffer(png_structp png_ptr) 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->save_buffer_size) 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->save_buffer_ptr != png_ptr->save_buffer) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_size_t i, istop; 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytep sp; 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytep dp; 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) istop = png_ptr->save_buffer_size; 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer; 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i < istop; i++, sp++, dp++) 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dp = *sp; 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->save_buffer_size + png_ptr->current_buffer_size > 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->save_buffer_max) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_size_t new_max; 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytep old_buffer; 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->save_buffer_size > PNG_SIZE_MAX - 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_ptr->current_buffer_size + 256)) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Potential overflow of save_buffer"); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256; 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_buffer = png_ptr->save_buffer; 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->save_buffer = (png_bytep)png_malloc_warn(png_ptr, 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_uint_32)new_max); 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->save_buffer == NULL) 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, old_buffer); 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Insufficient memory for save_buffer"); 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size); 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, old_buffer); 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->save_buffer_max = new_max; 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->current_buffer_size) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size, 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_buffer_ptr, png_ptr->current_buffer_size); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->save_buffer_size += png_ptr->current_buffer_size; 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_buffer_size = 0; 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->save_buffer_ptr = png_ptr->save_buffer; 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->buffer_size = 0; 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_restore_buffer(png_structp png_ptr, png_bytep buffer, 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_size_t buffer_length) 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_buffer = buffer; 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_buffer_size = buffer_length; 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->buffer_size = buffer_length + png_ptr->save_buffer_size; 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_buffer_ptr = png_ptr->current_buffer; 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_read_IDAT(png_structp png_ptr) 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USE_LOCAL_ARRAYS 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST PNG_IDAT; 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER)) 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_byte chunk_length[4]; 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->buffer_size < 8) 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_fill_buffer(png_ptr, chunk_length, 4); 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length); 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_reset_crc(png_ptr); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_crc_read(png_ptr, png_ptr->chunk_name, 4); 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->process_mode = PNG_READ_CHUNK_MODE; 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Not enough compressed data"); 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->idat_size = png_ptr->push_length; 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->idat_size && png_ptr->save_buffer_size) 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_size_t save_size; 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->idat_size < (png_uint_32)png_ptr->save_buffer_size) 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_size = (png_size_t)png_ptr->idat_size; 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Check for overflow */ 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((png_uint_32)save_size != png_ptr->idat_size) 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "save_size overflowed in pngpread"); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_size = png_ptr->save_buffer_size; 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size); 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->idat_size -= save_size; 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->buffer_size -= save_size; 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->save_buffer_size -= save_size; 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->save_buffer_ptr += save_size; 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->idat_size && png_ptr->current_buffer_size) 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_size_t save_size; 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->idat_size < (png_uint_32)png_ptr->current_buffer_size) 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_size = (png_size_t)png_ptr->idat_size; 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Check for overflow */ 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((png_uint_32)save_size != png_ptr->idat_size) 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "save_size overflowed in pngpread"); 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_size = png_ptr->current_buffer_size; 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->idat_size -= save_size; 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->buffer_size -= save_size; 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_buffer_size -= save_size; 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_buffer_ptr += save_size; 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!png_ptr->idat_size) 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->buffer_size < 4) 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_crc_finish(png_ptr, 0); 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->mode |= PNG_AFTER_IDAT; 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_process_IDAT_data(png_structp png_ptr, png_bytep buffer, 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_size_t buffer_length) 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The caller checks for a non-zero buffer length. */ 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(buffer_length > 0) || buffer == NULL) 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "No IDAT data (internal error)"); 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This routine must process all the data it has been given 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * before returning, calling the row callback as required to 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * handle the uncompressed results. 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.next_in = buffer; 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.avail_in = (uInt)buffer_length; 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Keep going until the decompressed data is all processed 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or the stream marked as finished. 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (png_ptr->zstream.avail_in > 0 && 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* We have data for zlib, but we must check that zlib 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * has somewhere to put the results. It doesn't matter 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if we don't expect any results -- it may be the input 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * data is just the LZ end code. 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(png_ptr->zstream.avail_out > 0)) 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.avail_out = 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (uInt) PNG_ROWBYTES(png_ptr->pixel_depth, 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->iwidth) + 1; 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.next_out = png_ptr->row_buf; 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Using Z_SYNC_FLUSH here means that an unterminated 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * LZ stream can still be handled (a stream with a missing 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * end code), otherwise (Z_NO_FLUSH) a future zlib 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * implementation might defer output and, therefore, 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * change the current behavior. (See comments in inflate.c 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * for why this doesn't happen at present with zlib 1.2.5.) 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = inflate(&png_ptr->zstream, Z_SYNC_FLUSH); 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Check for any failure before proceeding. */ 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != Z_OK && ret != Z_STREAM_END) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Terminate the decompression. */ 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This may be a truncated stream (missing or 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * damaged end code). Treat that as a warning. 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->row_number >= png_ptr->num_rows || 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->pass > 6) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, "Truncated compressed data in IDAT"); 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Decompression error in IDAT"); 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Skip the check on unprocessed input */ 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Did inflate output any data? */ 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->zstream.next_out != png_ptr->row_buf) 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Is this unexpected data after the last row? 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If it is, artificially terminate the LZ output 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * here. 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->row_number >= png_ptr->num_rows || 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->pass > 6) 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Extra data. */ 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, "Extra compressed data in IDAT"); 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Do no more processing; skip the unprocessed 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * input check below. 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Do we have a complete row? */ 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->zstream.avail_out == 0) 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_process_row(png_ptr); 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* And check for the end of the stream. */ 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == Z_STREAM_END) 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* All the data should have been processed, if anything 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is left at this point we have bytes of IDAT data 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * after the zlib end code. 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->zstream.avail_in > 0) 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, "Extra compression data"); 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_process_row(png_structp png_ptr) 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->row_info.color_type = png_ptr->color_type; 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->row_info.width = png_ptr->iwidth; 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->row_info.channels = png_ptr->channels; 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->row_info.bit_depth = png_ptr->bit_depth; 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->row_info.pixel_depth = png_ptr->pixel_depth; 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->row_info.width); 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_filter_row(png_ptr, &(png_ptr->row_info), 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->row_buf + 1, png_ptr->prev_row + 1, 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (int)(png_ptr->row_buf[0])); 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf, 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->rowbytes + 1); 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA)) 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_do_read_transformations(png_ptr); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_INTERLACING_SUPPORTED 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Blow up interlaced rows to full size */ 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->pass < 6) 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* old interface (pre-1.0.9): 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_do_read_interlace(&(png_ptr->row_info), 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations); 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_do_read_interlace(png_ptr); 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (png_ptr->pass) 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 0: 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < 8 && png_ptr->pass == 0; i++) 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_have_row(png_ptr, png_ptr->row_buf + 1); 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_push_finish_row(png_ptr); /* Updates png_ptr->pass */ 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->pass == 2) /* Pass 1 might be empty */ 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < 4 && png_ptr->pass == 2; i++) 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_have_row(png_ptr, png_bytep_NULL); 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_push_finish_row(png_ptr); 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->pass == 4 && png_ptr->height <= 4) 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < 2 && png_ptr->pass == 4; i++) 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_have_row(png_ptr, png_bytep_NULL); 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_push_finish_row(png_ptr); 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->pass == 6 && png_ptr->height <= 4) 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_have_row(png_ptr, png_bytep_NULL); 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_push_finish_row(png_ptr); 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 1: 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < 8 && png_ptr->pass == 1; i++) 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_have_row(png_ptr, png_ptr->row_buf + 1); 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_push_finish_row(png_ptr); 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->pass == 2) /* Skip top 4 generated rows */ 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < 4 && png_ptr->pass == 2; i++) 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_have_row(png_ptr, png_bytep_NULL); 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_push_finish_row(png_ptr); 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 2: 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < 4 && png_ptr->pass == 2; i++) 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_have_row(png_ptr, png_ptr->row_buf + 1); 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_push_finish_row(png_ptr); 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < 4 && png_ptr->pass == 2; i++) 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_have_row(png_ptr, png_bytep_NULL); 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_push_finish_row(png_ptr); 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->pass == 4) /* Pass 3 might be empty */ 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < 2 && png_ptr->pass == 4; i++) 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_have_row(png_ptr, png_bytep_NULL); 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_push_finish_row(png_ptr); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 3: 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < 4 && png_ptr->pass == 3; i++) 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_have_row(png_ptr, png_ptr->row_buf + 1); 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_push_finish_row(png_ptr); 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->pass == 4) /* Skip top two generated rows */ 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < 2 && png_ptr->pass == 4; i++) 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_have_row(png_ptr, png_bytep_NULL); 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_push_finish_row(png_ptr); 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 4: 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < 2 && png_ptr->pass == 4; i++) 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_have_row(png_ptr, png_ptr->row_buf + 1); 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_push_finish_row(png_ptr); 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < 2 && png_ptr->pass == 4; i++) 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_have_row(png_ptr, png_bytep_NULL); 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_push_finish_row(png_ptr); 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->pass == 6) /* Pass 5 might be empty */ 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_have_row(png_ptr, png_bytep_NULL); 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_push_finish_row(png_ptr); 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 5: 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < 2 && png_ptr->pass == 5; i++) 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_have_row(png_ptr, png_ptr->row_buf + 1); 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_push_finish_row(png_ptr); 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->pass == 6) /* Skip top generated row */ 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_have_row(png_ptr, png_bytep_NULL); 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_push_finish_row(png_ptr); 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 6: 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_have_row(png_ptr, png_ptr->row_buf + 1); 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_push_finish_row(png_ptr); 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->pass != 6) 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_have_row(png_ptr, png_bytep_NULL); 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_push_finish_row(png_ptr); 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_have_row(png_ptr, png_ptr->row_buf + 1); 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_read_push_finish_row(png_ptr); 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_read_push_finish_row(png_structp png_ptr) 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USE_LOCAL_ARRAYS 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Start of interlace block */ 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Offset to next interlace block */ 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Start of interlace block in the y direction */ 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Offset to next interlace block in the y direction */ 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2}; 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Height of interlace block. This is not currently used - if you need 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * it, uncomment it here and in png.h 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1}; 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->row_number++; 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->row_number < png_ptr->num_rows) 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_INTERLACING_SUPPORTED 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->interlaced) 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->row_number = 0; 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memset_check(png_ptr, png_ptr->prev_row, 0, 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->rowbytes + 1); 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->pass++; 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((png_ptr->pass == 1 && png_ptr->width < 5) || 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_ptr->pass == 3 && png_ptr->width < 3) || 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_ptr->pass == 5 && png_ptr->width < 2)) 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->pass++; 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->pass > 7) 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->pass--; 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->pass >= 7) 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->iwidth = (png_ptr->width + 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_pass_inc[png_ptr->pass] - 1 - 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_pass_start[png_ptr->pass]) / 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_pass_inc[png_ptr->pass]; 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->transformations & PNG_INTERLACE) 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->num_rows = (png_ptr->height + 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_pass_yinc[png_ptr->pass] - 1 - 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_pass_ystart[png_ptr->pass]) / 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_pass_yinc[png_ptr->pass]; 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0); 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_READ_INTERLACING_SUPPORTED */ 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tEXt_SUPPORTED 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) length) 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Out of place tEXt"); 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info_ptr = info_ptr; /* To quiet some compiler warnings */ 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_MAX_MALLOC_64K 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->skip_length = 0; /* This may not be necessary */ 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, "tEXt chunk too large to fit in memory"); 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->skip_length = length - (png_uint_32)65535L; 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) length = (png_uint_32)65535L; 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text = (png_charp)png_malloc(png_ptr, 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_uint_32)(length + 1)); 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text[length] = '\0'; 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text_ptr = png_ptr->current_text; 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text_size = (png_size_t)length; 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text_left = (png_size_t)length; 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->process_mode = PNG_READ_tEXt_MODE; 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr) 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->buffer_size && png_ptr->current_text_left) 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_size_t text_size; 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->buffer_size < png_ptr->current_text_left) 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_size = png_ptr->buffer_size; 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_size = png_ptr->current_text_left; 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text_left -= text_size; 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text_ptr += text_size; 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(png_ptr->current_text_left)) 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_textp text_ptr; 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_charp text; 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_charp key; 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->buffer_size < 4) 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_crc_finish(png_ptr); 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_MAX_MALLOC_64K 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->skip_length) 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key = png_ptr->current_text; 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (text = key; *text; text++) 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Empty loop */ ; 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (text < key + png_ptr->current_text_size) 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text++; 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_ptr = (png_textp)png_malloc(png_ptr, 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_uint_32)png_sizeof(png_text)); 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_ptr->key = key; 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_iTXt_SUPPORTED 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_ptr->lang = NULL; 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_ptr->lang_key = NULL; 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_ptr->text = text; 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, key); 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, text_ptr); 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text = NULL; 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret) 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, "Insufficient memory to store text chunk."); 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_zTXt_SUPPORTED 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) length) 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Out of place zTXt"); 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info_ptr = info_ptr; /* To quiet some compiler warnings */ 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_MAX_MALLOC_64K 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* We can't handle zTXt chunks > 64K, since we don't have enough space 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to be able to store the uncompressed data. Actually, the threshold 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is probably around 32K, but it isn't as definite as 64K is. 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (length > (png_uint_32)65535L) 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, "zTXt chunk too large to fit in memory"); 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_crc_skip(png_ptr, length); 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text = (png_charp)png_malloc(png_ptr, 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_uint_32)(length + 1)); 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text[length] = '\0'; 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text_ptr = png_ptr->current_text; 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text_size = (png_size_t)length; 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text_left = (png_size_t)length; 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->process_mode = PNG_READ_zTXt_MODE; 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr) 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->buffer_size && png_ptr->current_text_left) 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_size_t text_size; 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left) 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_size = png_ptr->buffer_size; 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_size = png_ptr->current_text_left; 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text_left -= text_size; 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text_ptr += text_size; 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(png_ptr->current_text_left)) 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_textp text_ptr; 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_charp text; 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_charp key; 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_size_t text_size, key_size; 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->buffer_size < 4) 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_crc_finish(png_ptr); 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key = png_ptr->current_text; 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (text = key; *text; text++) 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Empty loop */ ; 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* zTXt can't have zero text */ 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (text >= key + png_ptr->current_text_size) 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text = NULL; 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, key); 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text++; 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*text != PNG_TEXT_COMPRESSION_zTXt) /* Check compression byte */ 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text = NULL; 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, key); 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text++; 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.next_in = (png_bytep )text; 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size - 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (text - key)); 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.next_out = png_ptr->zbuf; 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_size = text - key; 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_size = 0; 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text = NULL; 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = Z_STREAM_END; 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (png_ptr->zstream.avail_in) 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != Z_OK && ret != Z_STREAM_END) 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inflateReset(&png_ptr->zstream); 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.avail_in = 0; 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text = NULL; 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, key); 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, text); 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END) 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (text == NULL) 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text = (png_charp)png_malloc(png_ptr, 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_uint_32)(png_ptr->zbuf_size 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) - png_ptr->zstream.avail_out + key_size + 1)); 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memcpy(text + key_size, png_ptr->zbuf, 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zbuf_size - png_ptr->zstream.avail_out); 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memcpy(text, key, key_size); 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_size = key_size + png_ptr->zbuf_size - 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.avail_out; 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *(text + text_size) = '\0'; 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_charp tmp; 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = text; 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text = (png_charp)png_malloc(png_ptr, text_size + 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_uint_32)(png_ptr->zbuf_size 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) - png_ptr->zstream.avail_out + 1)); 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memcpy(text, tmp, text_size); 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, tmp); 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memcpy(text + text_size, png_ptr->zbuf, 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zbuf_size - png_ptr->zstream.avail_out); 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out; 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *(text + text_size) = '\0'; 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != Z_STREAM_END) 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.next_out = png_ptr->zbuf; 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == Z_STREAM_END) 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inflateReset(&png_ptr->zstream); 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->zstream.avail_in = 0; 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != Z_STREAM_END) 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text = NULL; 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, key); 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, text); 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text = NULL; 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, key); 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key = text; 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text += key_size; 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_ptr = (png_textp)png_malloc(png_ptr, 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_uint_32)png_sizeof(png_text)); 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt; 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_ptr->key = key; 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_iTXt_SUPPORTED 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_ptr->lang = NULL; 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_ptr->lang_key = NULL; 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_ptr->text = text; 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, key); 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, text_ptr); 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret) 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, "Insufficient memory to store text chunk."); 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iTXt_SUPPORTED 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) length) 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_error(png_ptr, "Out of place iTXt"); 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info_ptr = info_ptr; /* To quiet some compiler warnings */ 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_MAX_MALLOC_64K 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->skip_length = 0; /* This may not be necessary */ 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, "iTXt chunk too large to fit in memory"); 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->skip_length = length - (png_uint_32)65535L; 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) length = (png_uint_32)65535L; 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text = (png_charp)png_malloc(png_ptr, 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_uint_32)(length + 1)); 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text[length] = '\0'; 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text_ptr = png_ptr->current_text; 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text_size = (png_size_t)length; 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text_left = (png_size_t)length; 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->process_mode = PNG_READ_iTXt_MODE; 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr) 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->buffer_size && png_ptr->current_text_left) 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_size_t text_size; 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->buffer_size < png_ptr->current_text_left) 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_size = png_ptr->buffer_size; 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_size = png_ptr->current_text_left; 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text_left -= text_size; 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text_ptr += text_size; 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(png_ptr->current_text_left)) 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_textp text_ptr; 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_charp key; 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int comp_flag; 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_charp lang; 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_charp lang_key; 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_charp text; 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->buffer_size < 4) 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_save_buffer(png_ptr); 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_crc_finish(png_ptr); 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_MAX_MALLOC_64K 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->skip_length) 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key = png_ptr->current_text; 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (lang = key; *lang; lang++) 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Empty loop */ ; 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lang < key + png_ptr->current_text_size - 3) 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lang++; 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) comp_flag = *lang++; 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lang++; /* Skip comp_type, always zero */ 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (lang_key = lang; *lang_key; lang_key++) 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Empty loop */ ; 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lang_key++; /* Skip NUL separator */ 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text=lang_key; 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lang_key < key + png_ptr->current_text_size - 1) 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (; *text; text++) 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Empty loop */ ; 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (text < key + png_ptr->current_text_size) 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text++; 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_ptr = (png_textp)png_malloc(png_ptr, 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_uint_32)png_sizeof(png_text)); 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_ptr->compression = comp_flag + 2; 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_ptr->key = key; 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_ptr->lang = lang; 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_ptr->lang_key = lang_key; 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_ptr->text = text; 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_ptr->text_length = 0; 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_ptr->itxt_length = png_strlen(text); 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->current_text = NULL; 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, text_ptr); 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret) 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, "Insufficient memory to store iTXt chunk."); 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This function is called when we haven't found a handler for this 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * chunk. If there isn't a problem with the chunk itself (ie a bad chunk 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * name or a critical chunk), the chunk is (currently) silently ignored. 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) length) 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_uint_32 skip = 0; 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(png_ptr->chunk_name[0] & 0x20)) 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_HANDLE_CHUNK_ALWAYS 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_USER_CHUNKS_SUPPORTED 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && png_ptr->read_user_chunk_fn == NULL 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_chunk_error(png_ptr, "unknown critical chunk"); 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info_ptr = info_ptr; /* To quiet some compiler warnings */ 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_MAX_MALLOC_64K 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (length > (png_uint_32)65535L) 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, "unknown chunk too large to fit in memory"); 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) skip = length - (png_uint_32)65535L; 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) length = (png_uint_32)65535L; 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memcpy((png_charp)png_ptr->unknown_chunk.name, 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_charp)png_ptr->chunk_name, 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_sizeof(png_ptr->unknown_chunk.name)); 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name) - 1] 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) = '\0'; 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->unknown_chunk.size = (png_size_t)length; 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (length == 0) 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->unknown_chunk.data = NULL; 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_uint_32)length); 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length); 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_USER_CHUNKS_SUPPORTED 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->read_user_chunk_fn != NULL) 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Callback to user unknown chunk handler */ 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = (*(png_ptr->read_user_chunk_fn)) 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (png_ptr, &png_ptr->unknown_chunk); 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret < 0) 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_chunk_error(png_ptr, "error in user chunk"); 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(png_ptr->chunk_name[0] & 0x20)) 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_HANDLE_CHUNK_ALWAYS) 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_chunk_error(png_ptr, "unknown critical chunk"); 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_set_unknown_chunks(png_ptr, info_ptr, 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &png_ptr->unknown_chunk, 1); 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_free(png_ptr, png_ptr->unknown_chunk.data); 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->unknown_chunk.data = NULL; 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) skip=length; 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_push_crc_skip(png_ptr, skip); 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_have_info(png_structp png_ptr, png_infop info_ptr) 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->info_fn != NULL) 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*(png_ptr->info_fn))(png_ptr, info_ptr); 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_have_end(png_structp png_ptr, png_infop info_ptr) 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->end_fn != NULL) 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*(png_ptr->end_fn))(png_ptr, info_ptr); 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_push_have_row(png_structp png_ptr, png_bytep row) 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->row_fn != NULL) 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*(png_ptr->row_fn))(png_ptr, row, png_ptr->row_number, 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (int)png_ptr->pass); 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_progressive_combine_row (png_structp png_ptr, 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytep old_row, png_bytep new_row) 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USE_LOCAL_ARRAYS 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PNG_CONST int FARDATA png_pass_dsp_mask[7] = 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff}; 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_row != NULL) /* new_row must == png_ptr->row_buf here. */ 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]); 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr, 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_progressive_end_ptr end_fn) 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->info_fn = info_fn; 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->row_fn = row_fn; 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->end_fn = end_fn; 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer); 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp PNGAPI 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_get_progressive_ptr(png_structp png_ptr) 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return png_ptr->io_ptr; 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ 1775