18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* pngpread.c - read a png file in push mode 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Last changed in libpng 1.2.19 August 18, 2007 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * For conditions of distribution and use, see copyright notice in png.h 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright (c) 1998-2007 Glenn Randers-Pehrson 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_INTERNAL 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "png.h" 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_PROGRESSIVE_READ_SUPPORTED 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* push model modes */ 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_SIG_MODE 0 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_CHUNK_MODE 1 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_IDAT_MODE 2 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_SKIP_MODE 3 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_tEXt_MODE 4 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_zTXt_MODE 5 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_DONE_MODE 6 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_iTXt_MODE 7 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_ERROR_MODE 8 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_process_data(png_structp png_ptr, png_infop info_ptr, 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytep buffer, png_size_t buffer_size) 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(png_ptr == NULL) return; 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_restore_buffer(png_ptr, buffer, buffer_size); 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (png_ptr->buffer_size) 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_process_some_data(png_ptr, info_ptr); 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* What we do with the incoming data depends on what we were previously 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * doing before we ran out of data... 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_process_some_data(png_structp png_ptr, png_infop info_ptr) 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(png_ptr == NULL) return; 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (png_ptr->process_mode) 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case PNG_READ_SIG_MODE: 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_read_sig(png_ptr, info_ptr); 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case PNG_READ_CHUNK_MODE: 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_read_chunk(png_ptr, info_ptr); 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case PNG_READ_IDAT_MODE: 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_read_IDAT(png_ptr); 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tEXt_SUPPORTED) 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case PNG_READ_tEXt_MODE: 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_read_tEXt(png_ptr, info_ptr); 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_zTXt_SUPPORTED) 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case PNG_READ_zTXt_MODE: 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_read_zTXt(png_ptr, info_ptr); 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_iTXt_SUPPORTED) 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case PNG_READ_iTXt_MODE: 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_read_iTXt(png_ptr, info_ptr); 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case PNG_SKIP_MODE: 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_crc_finish(png_ptr); 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->buffer_size = 0; 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Read any remaining signature bytes from the stream and compare them with 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the correct PNG signature. It is possible that this routine is called 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * with bytes already read from the signature, either because they have been 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * checked by the calling application, or because of multiple calls to this 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * routine. 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_read_sig(png_structp png_ptr, png_infop info_ptr) 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t num_checked = png_ptr->sig_bytes, 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project num_to_check = 8 - num_checked; 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size < num_to_check) 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project num_to_check = png_ptr->buffer_size; 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_fill_buffer(png_ptr, &(info_ptr->signature[num_checked]), 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project num_to_check); 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes+num_to_check); 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check)) 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (num_checked < 4 && 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4)) 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Not a PNG file"); 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "PNG file corrupted by ASCII conversion"); 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->sig_bytes >= 8) 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->process_mode = PNG_READ_CHUNK_MODE; 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_read_chunk(png_structp png_ptr, png_infop info_ptr) 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_IHDR; 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_IDAT; 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_IEND; 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_PLTE; 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_bKGD_SUPPORTED) 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_bKGD; 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_cHRM_SUPPORTED) 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_cHRM; 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_gAMA_SUPPORTED) 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_gAMA; 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_hIST_SUPPORTED) 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_hIST; 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_iCCP_SUPPORTED) 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_iCCP; 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_iTXt_SUPPORTED) 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_iTXt; 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_oFFs_SUPPORTED) 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_oFFs; 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_pCAL_SUPPORTED) 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_pCAL; 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_pHYs_SUPPORTED) 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_pHYs; 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sBIT_SUPPORTED) 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_sBIT; 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sCAL_SUPPORTED) 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_sCAL; 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sRGB_SUPPORTED) 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_sRGB; 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sPLT_SUPPORTED) 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_sPLT; 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tEXt_SUPPORTED) 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_tEXt; 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tIME_SUPPORTED) 1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_tIME; 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tRNS_SUPPORTED) 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_tRNS; 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_zTXt_SUPPORTED) 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_zTXt; 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USE_LOCAL_ARRAYS */ 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* First we make sure we have enough data for the 4 byte chunk name 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * and the 4 byte chunk length before proceeding with decoding the 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * chunk data. To fully decode each of these chunks, we also make 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * sure we have enough data in the buffer for the 4 byte CRC at the 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * end of every chunk (except IDAT, which is handled separately). 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER)) 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_byte chunk_length[4]; 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size < 8) 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_fill_buffer(png_ptr, chunk_length, 4); 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->push_length = png_get_uint_31(png_ptr,chunk_length); 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_reset_crc(png_ptr); 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_crc_read(png_ptr, png_ptr->chunk_name, 4); 2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; 2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!png_memcmp(png_ptr->chunk_name, (png_bytep)png_IDAT, 4)) 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(png_ptr->mode & PNG_AFTER_IDAT) 2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4)) 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length); 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4)) 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length); 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->process_mode = PNG_READ_DONE_MODE; 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_end(png_ptr, info_ptr); 2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED 2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name)) 2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mode |= PNG_HAVE_IDAT; 2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); 2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) 2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mode |= PNG_HAVE_PLTE; 2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_IHDR)) 2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Missing IHDR before IDAT"); 2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && 2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project !(png_ptr->mode & PNG_HAVE_PLTE)) 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Missing PLTE before IDAT"); 2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) 2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length); 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, (png_bytep)png_IDAT, 4)) 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* If we reach an IDAT chunk, this means we have read all of the 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * header chunks, and we can start reading the image (or if this 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * is called after the image has been read - we have an error). 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_IHDR)) 2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Missing IHDR before IDAT"); 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project !(png_ptr->mode & PNG_HAVE_PLTE)) 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Missing PLTE before IDAT"); 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->mode & PNG_HAVE_IDAT) 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length == 0) 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->mode & PNG_AFTER_IDAT) 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Too many IDAT's found"); 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->idat_size = png_ptr->push_length; 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mode |= PNG_HAVE_IDAT; 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->process_mode = PNG_READ_IDAT_MODE; 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_info(png_ptr, info_ptr); 3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes; 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.next_out = png_ptr->row_buf; 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_gAMA_SUPPORTED) 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4)) 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length); 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sBIT_SUPPORTED) 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4)) 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length); 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_cHRM_SUPPORTED) 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4)) 3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length); 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sRGB_SUPPORTED) 3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4)) 3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length); 3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_iCCP_SUPPORTED) 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4)) 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length); 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sPLT_SUPPORTED) 3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4)) 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length); 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tRNS_SUPPORTED) 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4)) 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length); 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_bKGD_SUPPORTED) 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4)) 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length); 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_hIST_SUPPORTED) 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4)) 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length); 4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_pHYs_SUPPORTED) 4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4)) 4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length); 4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_oFFs_SUPPORTED) 4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4)) 4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length); 4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_pCAL_SUPPORTED) 4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4)) 4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length); 4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_sCAL_SUPPORTED) 4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4)) 4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length); 4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tIME_SUPPORTED) 4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4)) 4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length); 4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tEXt_SUPPORTED) 4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) 4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length); 4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_zTXt_SUPPORTED) 4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) 4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length); 4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_iTXt_SUPPORTED) 4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) 4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); 4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); 5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; 5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_crc_skip(png_structp png_ptr, png_uint_32 skip) 5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->process_mode = PNG_SKIP_MODE; 5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->skip_length = skip; 5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_crc_finish(png_structp png_ptr) 5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->skip_length && png_ptr->save_buffer_size) 5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t save_size; 5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->skip_length < (png_uint_32)png_ptr->save_buffer_size) 5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save_size = (png_size_t)png_ptr->skip_length; 5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save_size = png_ptr->save_buffer_size; 5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); 5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->skip_length -= save_size; 5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->buffer_size -= save_size; 5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->save_buffer_size -= save_size; 5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->save_buffer_ptr += save_size; 5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->skip_length && png_ptr->current_buffer_size) 5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t save_size; 5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->skip_length < (png_uint_32)png_ptr->current_buffer_size) 5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save_size = (png_size_t)png_ptr->skip_length; 5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save_size = png_ptr->current_buffer_size; 5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); 5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->skip_length -= save_size; 5448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->buffer_size -= save_size; 5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_buffer_size -= save_size; 5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_buffer_ptr += save_size; 5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!png_ptr->skip_length) 5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size < 4) 5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_crc_finish(png_ptr, 0); 5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->process_mode = PNG_READ_CHUNK_MODE; 5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) 5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytep ptr; 5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(png_ptr == NULL) return; 5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ptr = buffer; 5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->save_buffer_size) 5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t save_size; 5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (length < png_ptr->save_buffer_size) 5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save_size = length; 5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save_size = png_ptr->save_buffer_size; 5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy(ptr, png_ptr->save_buffer_ptr, save_size); 5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project length -= save_size; 5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ptr += save_size; 5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->buffer_size -= save_size; 5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->save_buffer_size -= save_size; 5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->save_buffer_ptr += save_size; 5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (length && png_ptr->current_buffer_size) 5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t save_size; 5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (length < png_ptr->current_buffer_size) 5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save_size = length; 5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save_size = png_ptr->current_buffer_size; 5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy(ptr, png_ptr->current_buffer_ptr, save_size); 5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->buffer_size -= save_size; 5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_buffer_size -= save_size; 5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_buffer_ptr += save_size; 5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_save_buffer(png_structp png_ptr) 6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->save_buffer_size) 6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->save_buffer_ptr != png_ptr->save_buffer) 6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t i,istop; 6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytep sp; 6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytep dp; 6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project istop = png_ptr->save_buffer_size; 6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer; 6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project i < istop; i++, sp++, dp++) 6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp = *sp; 6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->save_buffer_size + png_ptr->current_buffer_size > 6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->save_buffer_max) 6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t new_max; 6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytep old_buffer; 6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->save_buffer_size > PNG_SIZE_MAX - 6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_ptr->current_buffer_size + 256)) 6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Potential overflow of save_buffer"); 6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256; 6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project old_buffer = png_ptr->save_buffer; 6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->save_buffer = (png_bytep)png_malloc(png_ptr, 6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_uint_32)new_max); 6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size); 6358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, old_buffer); 6368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->save_buffer_max = new_max; 6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->current_buffer_size) 6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size, 6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_buffer_ptr, png_ptr->current_buffer_size); 6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->save_buffer_size += png_ptr->current_buffer_size; 6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_buffer_size = 0; 6448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->save_buffer_ptr = png_ptr->save_buffer; 6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->buffer_size = 0; 6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_restore_buffer(png_structp png_ptr, png_bytep buffer, 6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t buffer_length) 6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_buffer = buffer; 6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_buffer_size = buffer_length; 6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->buffer_size = buffer_length + png_ptr->save_buffer_size; 6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_buffer_ptr = png_ptr->current_buffer; 6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_read_IDAT(png_structp png_ptr) 6618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS 6638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_IDAT; 6648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 6658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER)) 6668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_byte chunk_length[4]; 6688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size < 8) 6708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_fill_buffer(png_ptr, chunk_length, 4); 6768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->push_length = png_get_uint_31(png_ptr,chunk_length); 6778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_reset_crc(png_ptr); 6788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_crc_read(png_ptr, png_ptr->chunk_name, 4); 6798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; 6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_memcmp(png_ptr->chunk_name, (png_bytep)png_IDAT, 4)) 6828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->process_mode = PNG_READ_CHUNK_MODE; 6848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) 6858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Not enough compressed data"); 6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->idat_size = png_ptr->push_length; 6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->idat_size && png_ptr->save_buffer_size) 6928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t save_size; 6948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->idat_size < (png_uint_32)png_ptr->save_buffer_size) 6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save_size = (png_size_t)png_ptr->idat_size; 6988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* check for overflow */ 6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if((png_uint_32)save_size != png_ptr->idat_size) 7008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "save_size overflowed in pngpread"); 7018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 7038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save_size = png_ptr->save_buffer_size; 7048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); 7068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) 7078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size); 7088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->idat_size -= save_size; 7098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->buffer_size -= save_size; 7108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->save_buffer_size -= save_size; 7118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->save_buffer_ptr += save_size; 7128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->idat_size && png_ptr->current_buffer_size) 7148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t save_size; 7168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->idat_size < (png_uint_32)png_ptr->current_buffer_size) 7188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save_size = (png_size_t)png_ptr->idat_size; 7208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* check for overflow */ 7218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if((png_uint_32)save_size != png_ptr->idat_size) 7228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "save_size overflowed in pngpread"); 7238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 7258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save_size = png_ptr->current_buffer_size; 7268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); 7288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) 7298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size); 7308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->idat_size -= save_size; 7328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->buffer_size -= save_size; 7338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_buffer_size -= save_size; 7348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_buffer_ptr += save_size; 7358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!png_ptr->idat_size) 7378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size < 4) 7398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 7418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 7428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_crc_finish(png_ptr, 0); 7458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; 7468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mode |= PNG_AFTER_IDAT; 7478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 7518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_process_IDAT_data(png_structp png_ptr, png_bytep buffer, 7528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t buffer_length) 7538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ret; 7558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((png_ptr->flags & PNG_FLAG_ZLIB_FINISHED) && buffer_length) 7578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Extra compression data"); 7588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.next_in = buffer; 7608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.avail_in = (uInt)buffer_length; 7618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for(;;) 7628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); 7648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret != Z_OK) 7658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret == Z_STREAM_END) 7678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->zstream.avail_in) 7698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Extra compressed data"); 7708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->zstream.avail_out)) 7718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_process_row(png_ptr); 7738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mode |= PNG_AFTER_IDAT; 7768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; 7778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 7788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (ret == Z_BUF_ERROR) 7808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 7818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 7828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Decompression Error"); 7838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->zstream.avail_out)) 7858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (( 7878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_INTERLACING_SUPPORTED) 7888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->interlaced && png_ptr->pass > 6) || 7898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (!png_ptr->interlaced && 7908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 7918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_number == png_ptr->num_rows)) 7928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->zstream.avail_in) 7948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "Too much data in IDAT chunks"); 7958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; 7968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 7978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_process_row(png_ptr); 7998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes; 8008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.next_out = png_ptr->row_buf; 8018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 8038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 8048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 8088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_process_row(png_structp png_ptr) 8098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_info.color_type = png_ptr->color_type; 8118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_info.width = png_ptr->iwidth; 8128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_info.channels = png_ptr->channels; 8138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_info.bit_depth = png_ptr->bit_depth; 8148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_info.pixel_depth = png_ptr->pixel_depth; 8158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, 8178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_info.width); 8188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_filter_row(png_ptr, &(png_ptr->row_info), 8208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_buf + 1, png_ptr->prev_row + 1, 8218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (int)(png_ptr->row_buf[0])); 8228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf, 8248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->rowbytes + 1); 8258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA)) 8278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_do_read_transformations(png_ptr); 8288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_INTERLACING_SUPPORTED) 8308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* blow up interlaced rows to full size */ 8318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) 8328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->pass < 6) 8348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* old interface (pre-1.0.9): 8358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_do_read_interlace(&(png_ptr->row_info), 8368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations); 8378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 8388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_do_read_interlace(png_ptr); 8398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (png_ptr->pass) 8418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 0: 8438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 8458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 8 && png_ptr->pass == 0; i++) 8468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 8488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); /* updates png_ptr->pass */ 8498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->pass == 2) /* pass 1 might be empty */ 8518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 4 && png_ptr->pass == 2; i++) 8538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 8558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 8568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->pass == 4 && png_ptr->height <= 4) 8598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 2 && png_ptr->pass == 4; i++) 8618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 8638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 8648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->pass == 6 && png_ptr->height <= 4) 8678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 8698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 8708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 8728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 1: 8748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 8768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 8 && png_ptr->pass == 1; i++) 8778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 8798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 8808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->pass == 2) /* skip top 4 generated rows */ 8828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 4 && png_ptr->pass == 2; i++) 8848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 8868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 8878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 8908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 2: 8928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 8948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 4 && png_ptr->pass == 2; i++) 8958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 8978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 8988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 4 && png_ptr->pass == 2; i++) 9008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 9028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 9038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->pass == 4) /* pass 3 might be empty */ 9058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 2 && png_ptr->pass == 4; i++) 9078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 9098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 9108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 9138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 3: 9158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 9178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 4 && png_ptr->pass == 3; i++) 9188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 9208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 9218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->pass == 4) /* skip top two generated rows */ 9238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 2 && png_ptr->pass == 4; i++) 9258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 9278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 9288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 9318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 4: 9338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 9358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 2 && png_ptr->pass == 4; i++) 9368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 9388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 9398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 2 && png_ptr->pass == 4; i++) 9418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 9438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 9448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->pass == 6) /* pass 5 might be empty */ 9468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 9488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 9498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 9518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 5: 9538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 9558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 2 && png_ptr->pass == 5; i++) 9568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 9588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 9598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->pass == 6) /* skip top generated row */ 9618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 9638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 9648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 9668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 6: 9688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 9708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 9718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->pass != 6) 9728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 9738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 9748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 9758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 9798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 9808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 9828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 9838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 9878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_read_push_finish_row(png_structp png_ptr) 9888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 9898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS 9908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ 9918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* start of interlace block */ 9938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; 9948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* offset to next interlace block */ 9968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; 9978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* start of interlace block in the y direction */ 9998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; 10008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* offset to next interlace block in the y direction */ 10028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2}; 10038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Width of interlace block. This is not currently used - if you need 10058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * it, uncomment it here and in png.h 10068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST int FARDATA png_pass_width[] = {8, 4, 4, 2, 2, 1, 1}; 10078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 10088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Height of interlace block. This is not currently used - if you need 10108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * it, uncomment it here and in png.h 10118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1}; 10128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 10138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 10148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_number++; 10168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->row_number < png_ptr->num_rows) 10178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 10188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->interlaced) 10208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_number = 0; 10228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memset_check(png_ptr, png_ptr->prev_row, 0, 10238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->rowbytes + 1); 10248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do 10258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->pass++; 10278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((png_ptr->pass == 1 && png_ptr->width < 5) || 10288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_ptr->pass == 3 && png_ptr->width < 3) || 10298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_ptr->pass == 5 && png_ptr->width < 2)) 10308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->pass++; 10318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->pass > 7) 10338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->pass--; 10348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->pass >= 7) 10358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 10368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->iwidth = (png_ptr->width + 10388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_pass_inc[png_ptr->pass] - 1 - 10398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_pass_start[png_ptr->pass]) / 10408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_pass_inc[png_ptr->pass]; 10418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->irowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, 10438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->iwidth) + 1; 10448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->transformations & PNG_INTERLACE) 10468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 10478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->num_rows = (png_ptr->height + 10498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_pass_yinc[png_ptr->pass] - 1 - 10508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_pass_ystart[png_ptr->pass]) / 10518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_pass_yinc[png_ptr->pass]; 10528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0); 10548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 10568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_tEXt_SUPPORTED) 10588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 10598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 10608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project length) 10618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 10628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) 10638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Out of place tEXt"); 10658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr = info_ptr; /* to quiet some compiler warnings */ 10668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K 10698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->skip_length = 0; /* This may not be necessary */ 10708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ 10728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "tEXt chunk too large to fit in memory"); 10748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->skip_length = length - (png_uint_32)65535L; 10758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project length = (png_uint_32)65535L; 10768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 10788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text = (png_charp)png_malloc(png_ptr, 10808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_uint_32)(length+1)); 10818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text[length] = '\0'; 10828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_ptr = png_ptr->current_text; 10838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_size = (png_size_t)length; 10848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_left = (png_size_t)length; 10858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->process_mode = PNG_READ_tEXt_MODE; 10868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 10878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 10898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_read_tEXt(png_structp png_ptr, png_infop info_ptr) 10908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 10918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size && png_ptr->current_text_left) 10928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t text_size; 10948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size < png_ptr->current_text_left) 10968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_size = png_ptr->buffer_size; 10978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 10988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_size = png_ptr->current_text_left; 10998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); 11008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_left -= text_size; 11018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_ptr += text_size; 11028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->current_text_left)) 11048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_textp text_ptr; 11068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_charp text; 11078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_charp key; 11088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ret; 11098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size < 4) 11118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 11138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 11148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_crc_finish(png_ptr); 11178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_MAX_MALLOC_64K) 11198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->skip_length) 11208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 11218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 11228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project key = png_ptr->current_text; 11248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (text = key; *text; text++) 11268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* empty loop */ ; 11278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (text != key + png_ptr->current_text_size) 11298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text++; 11308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr = (png_textp)png_malloc(png_ptr, 11328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_uint_32)png_sizeof(png_text)); 11338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; 11348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->key = key; 11358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_iTXt_SUPPORTED 11368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->lang = NULL; 11378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->lang_key = NULL; 11388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 11398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->text = text; 11408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); 11428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, key); 11448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, text_ptr); 11458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text = NULL; 11468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret) 11488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "Insufficient memory to store text chunk."); 11498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 11528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_zTXt_SUPPORTED) 11548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 11558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 11568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project length) 11578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) 11598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Out of place zTXt"); 11618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr = info_ptr; /* to quiet some compiler warnings */ 11628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K 11658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* We can't handle zTXt chunks > 64K, since we don't have enough space 11668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * to be able to store the uncompressed data. Actually, the threshold 11678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * is probably around 32K, but it isn't as definite as 64K is. 11688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 11698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (length > (png_uint_32)65535L) 11708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "zTXt chunk too large to fit in memory"); 11728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_crc_skip(png_ptr, length); 11738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 11748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 11768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text = (png_charp)png_malloc(png_ptr, 11788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_uint_32)(length+1)); 11798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text[length] = '\0'; 11808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_ptr = png_ptr->current_text; 11818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_size = (png_size_t)length; 11828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_left = (png_size_t)length; 11838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->process_mode = PNG_READ_zTXt_MODE; 11848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 11878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_read_zTXt(png_structp png_ptr, png_infop info_ptr) 11888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size && png_ptr->current_text_left) 11908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t text_size; 11928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left) 11948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_size = png_ptr->buffer_size; 11958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 11968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_size = png_ptr->current_text_left; 11978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); 11988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_left -= text_size; 11998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_ptr += text_size; 12008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->current_text_left)) 12028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_textp text_ptr; 12048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_charp text; 12058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_charp key; 12068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ret; 12078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t text_size, key_size; 12088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size < 4) 12108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 12128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 12138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_crc_finish(png_ptr); 12168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project key = png_ptr->current_text; 12188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (text = key; *text; text++) 12208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* empty loop */ ; 12218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* zTXt can't have zero text */ 12238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (text == key + png_ptr->current_text_size) 12248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text = NULL; 12268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, key); 12278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 12288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text++; 12318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (*text != PNG_TEXT_COMPRESSION_zTXt) /* check compression byte */ 12338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text = NULL; 12358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, key); 12368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 12378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text++; 12408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.next_in = (png_bytep )text; 12428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size - 12438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (text - key)); 12448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.next_out = png_ptr->zbuf; 12458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; 12468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project key_size = text - key; 12488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_size = 0; 12498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text = NULL; 12508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = Z_STREAM_END; 12518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (png_ptr->zstream.avail_in) 12538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); 12558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret != Z_OK && ret != Z_STREAM_END) 12568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project inflateReset(&png_ptr->zstream); 12588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.avail_in = 0; 12598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text = NULL; 12608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, key); 12618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, text); 12628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 12638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END) 12658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (text == NULL) 12678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text = (png_charp)png_malloc(png_ptr, 12698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_uint_32)(png_ptr->zbuf_size - png_ptr->zstream.avail_out 12708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project + key_size + 1)); 12718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy(text + key_size, png_ptr->zbuf, 12728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zbuf_size - png_ptr->zstream.avail_out); 12738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy(text, key, key_size); 12748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_size = key_size + png_ptr->zbuf_size - 12758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.avail_out; 12768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(text + text_size) = '\0'; 12778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 12798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_charp tmp; 12818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tmp = text; 12838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text = (png_charp)png_malloc(png_ptr, text_size + 12848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_uint_32)(png_ptr->zbuf_size - png_ptr->zstream.avail_out 12858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project + 1)); 12868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy(text, tmp, text_size); 12878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, tmp); 12888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy(text + text_size, png_ptr->zbuf, 12898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zbuf_size - png_ptr->zstream.avail_out); 12908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out; 12918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(text + text_size) = '\0'; 12928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret != Z_STREAM_END) 12948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.next_out = png_ptr->zbuf; 12968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; 12978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 13008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 13018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 13028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret == Z_STREAM_END) 13058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 13068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project inflateReset(&png_ptr->zstream); 13098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.avail_in = 0; 13108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret != Z_STREAM_END) 13128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 13138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text = NULL; 13148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, key); 13158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, text); 13168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 13178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text = NULL; 13208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, key); 13218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project key = text; 13228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text += key_size; 13238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr = (png_textp)png_malloc(png_ptr, 13258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_uint_32)png_sizeof(png_text)); 13268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt; 13278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->key = key; 13288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_iTXt_SUPPORTED 13298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->lang = NULL; 13308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->lang_key = NULL; 13318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 13328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->text = text; 13338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); 13358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, key); 13378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, text_ptr); 13388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret) 13408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "Insufficient memory to store text chunk."); 13418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 13448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_iTXt_SUPPORTED) 13468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 13478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 13488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project length) 13498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) 13518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 13528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Out of place iTXt"); 13538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr = info_ptr; /* to quiet some compiler warnings */ 13548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K 13578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->skip_length = 0; /* This may not be necessary */ 13588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ 13608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 13618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "iTXt chunk too large to fit in memory"); 13628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->skip_length = length - (png_uint_32)65535L; 13638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project length = (png_uint_32)65535L; 13648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 13668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text = (png_charp)png_malloc(png_ptr, 13688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_uint_32)(length+1)); 13698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text[length] = '\0'; 13708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_ptr = png_ptr->current_text; 13718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_size = (png_size_t)length; 13728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_left = (png_size_t)length; 13738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->process_mode = PNG_READ_iTXt_MODE; 13748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 13778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_read_iTXt(png_structp png_ptr, png_infop info_ptr) 13788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size && png_ptr->current_text_left) 13818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 13828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t text_size; 13838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size < png_ptr->current_text_left) 13858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_size = png_ptr->buffer_size; 13868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 13878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_size = png_ptr->current_text_left; 13888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); 13898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_left -= text_size; 13908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_ptr += text_size; 13918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->current_text_left)) 13938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 13948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_textp text_ptr; 13958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_charp key; 13968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int comp_flag; 13978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_charp lang; 13988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_charp lang_key; 13998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_charp text; 14008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ret; 14018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size < 4) 14038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 14048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 14058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 14068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_crc_finish(png_ptr); 14098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_MAX_MALLOC_64K) 14118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->skip_length) 14128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 14138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 14148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project key = png_ptr->current_text; 14168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (lang = key; *lang; lang++) 14188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* empty loop */ ; 14198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (lang != key + png_ptr->current_text_size) 14218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project lang++; 14228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project comp_flag = *lang++; 14248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project lang++; /* skip comp_type, always zero */ 14258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (lang_key = lang; *lang_key; lang_key++) 14278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* empty loop */ ; 14288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project lang_key++; /* skip NUL separator */ 14298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (text = lang_key; *text; text++) 14318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* empty loop */ ; 14328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (text != key + png_ptr->current_text_size) 14348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text++; 14358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr = (png_textp)png_malloc(png_ptr, 14378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_uint_32)png_sizeof(png_text)); 14388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->compression = comp_flag + 2; 14398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->key = key; 14408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->lang = lang; 14418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->lang_key = lang_key; 14428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->text = text; 14438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->text_length = 0; 14448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->itxt_length = png_strlen(text); 14458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); 14478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text = NULL; 14498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, text_ptr); 14518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret) 14528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "Insufficient memory to store iTXt chunk."); 14538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 14558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 14568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* This function is called when we haven't found a handler for this 14588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * chunk. If there isn't a problem with the chunk itself (ie a bad chunk 14598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * name or a critical chunk), the chunk is (currently) silently ignored. 14608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 14618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 14628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 14638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project length) 14648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 14658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_uint_32 skip=0; 14668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_check_chunk_name(png_ptr, png_ptr->chunk_name); 14678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->chunk_name[0] & 0x20)) 14698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 14708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) 14718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != 14728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_HANDLE_CHUNK_ALWAYS 14738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_USER_CHUNKS_SUPPORTED) 14748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project && png_ptr->read_user_chunk_fn == NULL 14758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 14768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ) 14778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 14788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_chunk_error(png_ptr, "unknown critical chunk"); 14798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr = info_ptr; /* to quiet some compiler warnings */ 14818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) 14848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) 14858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 14868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K 14878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (length > (png_uint_32)65535L) 14888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 14898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "unknown chunk too large to fit in memory"); 14908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skip = length - (png_uint_32)65535L; 14918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project length = (png_uint_32)65535L; 14928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 14948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_strncpy((png_charp)png_ptr->unknown_chunk.name, 14958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_charp)png_ptr->chunk_name, 14968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_sizeof((png_charp)png_ptr->chunk_name)); 14978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, length); 14988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->unknown_chunk.size = (png_size_t)length; 14998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length); 15008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_USER_CHUNKS_SUPPORTED) 15018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(png_ptr->read_user_chunk_fn != NULL) 15028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 15038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* callback to user unknown chunk handler */ 15048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ret; 15058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = (*(png_ptr->read_user_chunk_fn)) 15068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_ptr, &png_ptr->unknown_chunk); 15078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret < 0) 15088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_chunk_error(png_ptr, "error in user chunk"); 15098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret == 0) 15108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 15118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->chunk_name[0] & 0x20)) 15128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != 15138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_HANDLE_CHUNK_ALWAYS) 15148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_chunk_error(png_ptr, "unknown critical chunk"); 15158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_set_unknown_chunks(png_ptr, info_ptr, 15168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project &png_ptr->unknown_chunk, 1); 15178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 15208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); 15218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 15228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, png_ptr->unknown_chunk.data); 15238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->unknown_chunk.data = NULL; 15248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 15268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 15278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skip=length; 15288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_crc_skip(png_ptr, skip); 15298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 15308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 15328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_have_info(png_structp png_ptr, png_infop info_ptr) 15338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 15348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->info_fn != NULL) 15358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (*(png_ptr->info_fn))(png_ptr, info_ptr); 15368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 15378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 15398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_have_end(png_structp png_ptr, png_infop info_ptr) 15408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 15418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->end_fn != NULL) 15428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (*(png_ptr->end_fn))(png_ptr, info_ptr); 15438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 15448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 15468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_have_row(png_structp png_ptr, png_bytep row) 15478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 15488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->row_fn != NULL) 15498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (*(png_ptr->row_fn))(png_ptr, row, png_ptr->row_number, 15508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (int)png_ptr->pass); 15518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 15528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 15548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_progressive_combine_row (png_structp png_ptr, 15558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytep old_row, png_bytep new_row) 15568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 15578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS 15588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST int FARDATA png_pass_dsp_mask[7] = 15598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff}; 15608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 15618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(png_ptr == NULL) return; 15628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (new_row != NULL) /* new_row must == png_ptr->row_buf here. */ 15638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]); 15648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 15658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 15678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr, 15688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, 15698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_progressive_end_ptr end_fn) 15708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 15718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(png_ptr == NULL) return; 15728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->info_fn = info_fn; 15738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_fn = row_fn; 15748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->end_fn = end_fn; 15758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer); 15778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 15788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp PNGAPI 15808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_get_progressive_ptr(png_structp png_ptr) 15818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 15828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(png_ptr == NULL) return (NULL); 15838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return png_ptr->io_ptr; 15848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 15858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ 1586