18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* pngpread.c - read a png file in push mode 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 4c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * Last changed in libpng 1.2.44 [June 26, 2010] 5c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * Copyright (c) 1998-2010 Glenn Randers-Pehrson 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) 8c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * 9c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * This code is released under the libpng license. 10c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * For conditions of distribution and use, see the disclaimer 11c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * and license in png.h 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_INTERNAL 15c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#define PNG_NO_PEDANTIC_WARNINGS 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "png.h" 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_PROGRESSIVE_READ_SUPPORTED 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner/* Push model modes */ 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_SIG_MODE 0 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_CHUNK_MODE 1 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_IDAT_MODE 2 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_SKIP_MODE 3 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_tEXt_MODE 4 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_zTXt_MODE 5 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_DONE_MODE 6 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_READ_iTXt_MODE 7 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_ERROR_MODE 8 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_process_data(png_structp png_ptr, png_infop info_ptr, 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytep buffer, png_size_t buffer_size) 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 34c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr == NULL || info_ptr == NULL) 35c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner return; 36c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_restore_buffer(png_ptr, buffer, buffer_size); 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (png_ptr->buffer_size) 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_process_some_data(png_ptr, info_ptr); 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* What we do with the incoming data depends on what we were previously 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * doing before we ran out of data... 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_process_some_data(png_structp png_ptr, png_infop info_ptr) 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 51c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr == NULL) 52c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner return; 53c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (png_ptr->process_mode) 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case PNG_READ_SIG_MODE: 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_read_sig(png_ptr, info_ptr); 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 61c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case PNG_READ_CHUNK_MODE: 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_read_chunk(png_ptr, info_ptr); 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 67c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case PNG_READ_IDAT_MODE: 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_read_IDAT(png_ptr); 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 73c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 74c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tEXt_SUPPORTED 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case PNG_READ_tEXt_MODE: 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_read_tEXt(png_ptr, info_ptr); 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 80c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 82c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_zTXt_SUPPORTED 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case PNG_READ_zTXt_MODE: 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_read_zTXt(png_ptr, info_ptr); 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 88c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 90c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_iTXt_SUPPORTED 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case PNG_READ_iTXt_MODE: 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_read_iTXt(png_ptr, info_ptr); 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 96c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case PNG_SKIP_MODE: 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_crc_finish(png_ptr); 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 103c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->buffer_size = 0; 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Read any remaining signature bytes from the stream and compare them with 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the correct PNG signature. It is possible that this routine is called 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * with bytes already read from the signature, either because they have been 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * checked by the calling application, or because of multiple calls to this 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * routine. 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_read_sig(png_structp png_ptr, png_infop info_ptr) 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t num_checked = png_ptr->sig_bytes, 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project num_to_check = 8 - num_checked; 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size < num_to_check) 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project num_to_check = png_ptr->buffer_size; 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_fill_buffer(png_ptr, &(info_ptr->signature[num_checked]), 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project num_to_check); 131c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes + num_to_check); 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check)) 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (num_checked < 4 && 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4)) 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Not a PNG file"); 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "PNG file corrupted by ASCII conversion"); 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->sig_bytes >= 8) 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->process_mode = PNG_READ_CHUNK_MODE; 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_read_chunk(png_structp png_ptr, png_infop info_ptr) 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_IHDR; 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_IDAT; 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_IEND; 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_PLTE; 158c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_bKGD_SUPPORTED 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_bKGD; 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 161c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_cHRM_SUPPORTED 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_cHRM; 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 164c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_gAMA_SUPPORTED 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_gAMA; 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 167c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_hIST_SUPPORTED 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_hIST; 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 170c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_iCCP_SUPPORTED 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_iCCP; 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 173c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_iTXt_SUPPORTED 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_iTXt; 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 176c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_oFFs_SUPPORTED 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_oFFs; 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 179c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_pCAL_SUPPORTED 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_pCAL; 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 182c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_pHYs_SUPPORTED 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_pHYs; 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 185c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sBIT_SUPPORTED 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_sBIT; 1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 188c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sCAL_SUPPORTED 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_sCAL; 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 191c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sRGB_SUPPORTED 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_sRGB; 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 194c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sPLT_SUPPORTED 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_sPLT; 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 197c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tEXt_SUPPORTED 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_tEXt; 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 200c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tIME_SUPPORTED 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_tIME; 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 203c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tRNS_SUPPORTED 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_tRNS; 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 206c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_zTXt_SUPPORTED 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_zTXt; 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USE_LOCAL_ARRAYS */ 210c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* First we make sure we have enough data for the 4 byte chunk name 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * and the 4 byte chunk length before proceeding with decoding the 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * chunk data. To fully decode each of these chunks, we also make 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * sure we have enough data in the buffer for the 4 byte CRC at the 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * end of every chunk (except IDAT, which is handled separately). 2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER)) 2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_byte chunk_length[4]; 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size < 8) 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_fill_buffer(png_ptr, chunk_length, 4); 228c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length); 2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_reset_crc(png_ptr); 2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_crc_read(png_ptr, png_ptr->chunk_name, 4); 231c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_check_chunk_name(png_ptr, png_ptr->chunk_name); 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 235c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 236c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr->mode & PNG_AFTER_IDAT) 2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4)) 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 241c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr->push_length != 13) 242c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_error(png_ptr, "Invalid IHDR length"); 243c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 249c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length); 2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 252c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4)) 2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 260c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length); 2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->process_mode = PNG_READ_DONE_MODE; 2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_end(png_ptr, info_ptr); 2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 266c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED 2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name)) 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 275c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mode |= PNG_HAVE_IDAT; 278c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); 280c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mode |= PNG_HAVE_PLTE; 283c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_IHDR)) 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Missing IHDR before IDAT"); 288c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project !(png_ptr->mode & PNG_HAVE_PLTE)) 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Missing PLTE before IDAT"); 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 294c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length); 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 305c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 306c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* If we reach an IDAT chunk, this means we have read all of the 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * header chunks, and we can start reading the image (or if this 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * is called after the image has been read - we have an error). 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 312c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 313c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (!(png_ptr->mode & PNG_HAVE_IHDR)) 314c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_error(png_ptr, "Missing IHDR before IDAT"); 315c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 316c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && 317c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner !(png_ptr->mode & PNG_HAVE_PLTE)) 318c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_error(png_ptr, "Missing PLTE before IDAT"); 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->mode & PNG_HAVE_IDAT) 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) 323c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr->push_length == 0) 324c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner return; 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->mode & PNG_AFTER_IDAT) 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Too many IDAT's found"); 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->idat_size = png_ptr->push_length; 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mode |= PNG_HAVE_IDAT; 3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->process_mode = PNG_READ_IDAT_MODE; 3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_info(png_ptr, info_ptr); 334c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_ptr->zstream.avail_out = 335c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner (uInt) PNG_ROWBYTES(png_ptr->pixel_depth, 336c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_ptr->iwidth) + 1; 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.next_out = png_ptr->row_buf; 3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 340c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 341c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_gAMA_SUPPORTED 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4)) 3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 349c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length); 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 352c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 354c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sBIT_SUPPORTED 3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4)) 3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 362c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length); 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 365c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 367c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_cHRM_SUPPORTED 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4)) 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 375c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length); 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 378c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 380c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sRGB_SUPPORTED 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4)) 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 388c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length); 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 391c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 393c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_iCCP_SUPPORTED 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4)) 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 401c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length); 4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 404c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 406c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sPLT_SUPPORTED 4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4)) 4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 414c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length); 4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 417c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 419c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tRNS_SUPPORTED 4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4)) 4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 427c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length); 4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 430c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 432c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_bKGD_SUPPORTED 4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4)) 4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 440c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length); 4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 443c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 445c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_hIST_SUPPORTED 4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4)) 4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 453c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length); 4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 456c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 458c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_pHYs_SUPPORTED 4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4)) 4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 466c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length); 4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 469c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 471c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_oFFs_SUPPORTED 4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 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 } 479c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length); 4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 483c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 484c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_pCAL_SUPPORTED 4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4)) 4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 492c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length); 4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 495c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 497c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_sCAL_SUPPORTED 4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4)) 4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 505c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length); 5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 508c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 510c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tIME_SUPPORTED 5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4)) 5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 518c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length); 5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 521c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 523c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tEXt_SUPPORTED 5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) 5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 531c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length); 5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 534c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 536c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_zTXt_SUPPORTED 5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) 5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 544c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length); 5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 547c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 549c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_iTXt_SUPPORTED 5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) 5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 557c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); 5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 560c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); 5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; 5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_crc_skip(png_structp png_ptr, png_uint_32 skip) 5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->process_mode = PNG_SKIP_MODE; 5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->skip_length = skip; 5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_crc_finish(png_structp png_ptr) 5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->skip_length && png_ptr->save_buffer_size) 5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t save_size; 5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->skip_length < (png_uint_32)png_ptr->save_buffer_size) 5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save_size = (png_size_t)png_ptr->skip_length; 5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save_size = png_ptr->save_buffer_size; 5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); 5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->skip_length -= save_size; 5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->buffer_size -= save_size; 5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->save_buffer_size -= save_size; 5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->save_buffer_ptr += save_size; 6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->skip_length && png_ptr->current_buffer_size) 6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t save_size; 6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->skip_length < (png_uint_32)png_ptr->current_buffer_size) 6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save_size = (png_size_t)png_ptr->skip_length; 6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save_size = png_ptr->current_buffer_size; 6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); 6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->skip_length -= save_size; 6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->buffer_size -= save_size; 6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_buffer_size -= save_size; 6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_buffer_ptr += save_size; 6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!png_ptr->skip_length) 6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size < 4) 6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_crc_finish(png_ptr, 0); 6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->process_mode = PNG_READ_CHUNK_MODE; 6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) 6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytep ptr; 6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 635c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr == NULL) 636c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner return; 637c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ptr = buffer; 6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->save_buffer_size) 6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t save_size; 6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (length < png_ptr->save_buffer_size) 6448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save_size = length; 6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save_size = png_ptr->save_buffer_size; 6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy(ptr, png_ptr->save_buffer_ptr, save_size); 6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project length -= save_size; 6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ptr += save_size; 6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->buffer_size -= save_size; 6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->save_buffer_size -= save_size; 6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->save_buffer_ptr += save_size; 6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (length && png_ptr->current_buffer_size) 6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t save_size; 6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (length < png_ptr->current_buffer_size) 6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save_size = length; 661c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 6638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save_size = png_ptr->current_buffer_size; 6648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy(ptr, png_ptr->current_buffer_ptr, save_size); 6668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->buffer_size -= save_size; 6678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_buffer_size -= save_size; 6688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_buffer_ptr += save_size; 6698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_save_buffer(png_structp png_ptr) 6748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->save_buffer_size) 6768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->save_buffer_ptr != png_ptr->save_buffer) 6788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 679c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_size_t i, istop; 6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytep sp; 6818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytep dp; 6828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project istop = png_ptr->save_buffer_size; 6848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer; 6858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project i < istop; i++, sp++, dp++) 6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp = *sp; 6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->save_buffer_size + png_ptr->current_buffer_size > 6928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->save_buffer_max) 6938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t new_max; 6958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytep old_buffer; 6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->save_buffer_size > PNG_SIZE_MAX - 6988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_ptr->current_buffer_size + 256)) 6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Potential overflow of save_buffer"); 7018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 702c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 7038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256; 7048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project old_buffer = png_ptr->save_buffer; 705c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_ptr->save_buffer = (png_bytep)png_malloc_warn(png_ptr, 7068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_uint_32)new_max); 707c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr->save_buffer == NULL) 708c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner { 709c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_free(png_ptr, old_buffer); 710c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_error(png_ptr, "Insufficient memory for save_buffer"); 711c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner } 7128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size); 7138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, old_buffer); 7148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->save_buffer_max = new_max; 7158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->current_buffer_size) 7178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size, 7198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_buffer_ptr, png_ptr->current_buffer_size); 7208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->save_buffer_size += png_ptr->current_buffer_size; 7218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_buffer_size = 0; 7228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->save_buffer_ptr = png_ptr->save_buffer; 7248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->buffer_size = 0; 7258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 7288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_restore_buffer(png_structp png_ptr, png_bytep buffer, 7298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t buffer_length) 7308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_buffer = buffer; 7328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_buffer_size = buffer_length; 7338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->buffer_size = buffer_length + png_ptr->save_buffer_size; 7348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_buffer_ptr = png_ptr->current_buffer; 7358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 7388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_read_IDAT(png_structp png_ptr) 7398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS 7418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST PNG_IDAT; 7428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 7438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER)) 7448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_byte chunk_length[4]; 7468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size < 8) 7488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 7508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 7518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_fill_buffer(png_ptr, chunk_length, 4); 754c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length); 7558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_reset_crc(png_ptr); 7568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_crc_read(png_ptr, png_ptr->chunk_name, 4); 7578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; 7588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 759c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 7608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->process_mode = PNG_READ_CHUNK_MODE; 7628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) 7638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Not enough compressed data"); 7648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 7658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->idat_size = png_ptr->push_length; 7688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->idat_size && png_ptr->save_buffer_size) 7708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t save_size; 7728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->idat_size < (png_uint_32)png_ptr->save_buffer_size) 7748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save_size = (png_size_t)png_ptr->idat_size; 776c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 777c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Check for overflow */ 778c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if ((png_uint_32)save_size != png_ptr->idat_size) 7798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "save_size overflowed in pngpread"); 7808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 7828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save_size = png_ptr->save_buffer_size; 7838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); 785c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 786c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size); 787c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 7888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->idat_size -= save_size; 7898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->buffer_size -= save_size; 7908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->save_buffer_size -= save_size; 7918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->save_buffer_ptr += save_size; 7928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->idat_size && png_ptr->current_buffer_size) 7948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t save_size; 7968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->idat_size < (png_uint_32)png_ptr->current_buffer_size) 7988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save_size = (png_size_t)png_ptr->idat_size; 800c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 801c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Check for overflow */ 802c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if ((png_uint_32)save_size != png_ptr->idat_size) 8038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "save_size overflowed in pngpread"); 8048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 8068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save_size = png_ptr->current_buffer_size; 8078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); 809c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 810c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size); 8118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->idat_size -= save_size; 8138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->buffer_size -= save_size; 8148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_buffer_size -= save_size; 8158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_buffer_ptr += save_size; 8168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!png_ptr->idat_size) 8188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size < 4) 8208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 8228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 8238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_crc_finish(png_ptr, 0); 8268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; 8278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mode |= PNG_AFTER_IDAT; 8288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 8328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_process_IDAT_data(png_structp png_ptr, png_bytep buffer, 8338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t buffer_length) 8348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 835c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* The caller checks for a non-zero buffer length. */ 836c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (!(buffer_length > 0) || buffer == NULL) 837c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_error(png_ptr, "No IDAT data (internal error)"); 8388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 839c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* This routine must process all the data it has been given 840c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * before returning, calling the row callback as required to 841c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * handle the uncompressed results. 842c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner */ 8438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.next_in = buffer; 8448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.avail_in = (uInt)buffer_length; 845c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 846c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Keep going until the decompressed data is all processed 847c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * or the stream marked as finished. 848c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner */ 849c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner while (png_ptr->zstream.avail_in > 0 && 850c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner !(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) 8518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 852c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner int ret; 853c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 854c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* We have data for zlib, but we must check that zlib 855c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * has somewhere to put the results. It doesn't matter 856c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * if we don't expect any results -- it may be the input 857c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * data is just the LZ end code. 858c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner */ 859c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (!(png_ptr->zstream.avail_out > 0)) 8608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 861c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_ptr->zstream.avail_out = 862c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner (uInt) PNG_ROWBYTES(png_ptr->pixel_depth, 863c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_ptr->iwidth) + 1; 864c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_ptr->zstream.next_out = png_ptr->row_buf; 865c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner } 8668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 867c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Using Z_SYNC_FLUSH here means that an unterminated 868c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * LZ stream can still be handled (a stream with a missing 869c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * end code), otherwise (Z_NO_FLUSH) a future zlib 870c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * implementation might defer output and, therefore, 871c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * change the current behavior. (See comments in inflate.c 872c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * for why this doesn't happen at present with zlib 1.2.5.) 873c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner */ 874c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner ret = inflate(&png_ptr->zstream, Z_SYNC_FLUSH); 875c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 876c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Check for any failure before proceeding. */ 877c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (ret != Z_OK && ret != Z_STREAM_END) 878c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner { 879c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Terminate the decompression. */ 880c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; 881c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 882c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* This may be a truncated stream (missing or 883c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * damaged end code). Treat that as a warning. 884c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner */ 885c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr->row_number >= png_ptr->num_rows || 886c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_ptr->pass > 6) 887c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_warning(png_ptr, "Truncated compressed data in IDAT"); 888c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner else 889c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_error(png_ptr, "Decompression error in IDAT"); 890c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 891c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Skip the check on unprocessed input */ 892c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner return; 8938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 894c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 895c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Did inflate output any data? */ 896c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr->zstream.next_out != png_ptr->row_buf) 8978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 898c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Is this unexpected data after the last row? 899c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * If it is, artificially terminate the LZ output 900c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * here. 901c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner */ 902c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr->row_number >= png_ptr->num_rows || 903c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_ptr->pass > 6) 9048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 905c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Extra data. */ 906c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_warning(png_ptr, "Extra compressed data in IDAT"); 907c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; 908c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Do no more processing; skip the unprocessed 909c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * input check below. 910c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner */ 911c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner return; 912c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner } 913c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 914c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Do we have a complete row? */ 915c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr->zstream.avail_out == 0) 916c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_push_process_row(png_ptr); 9178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 918c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 919c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* And check for the end of the stream. */ 920c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (ret == Z_STREAM_END) 921c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; 9228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 923c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 924c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* All the data should have been processed, if anything 925c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * is left at this point we have bytes of IDAT data 926c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * after the zlib end code. 927c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner */ 928c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr->zstream.avail_in > 0) 929c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_warning(png_ptr, "Extra compression data"); 9308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 9338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_process_row(png_structp png_ptr) 9348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 9358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_info.color_type = png_ptr->color_type; 9368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_info.width = png_ptr->iwidth; 9378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_info.channels = png_ptr->channels; 9388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_info.bit_depth = png_ptr->bit_depth; 9398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_info.pixel_depth = png_ptr->pixel_depth; 9408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, 9428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_info.width); 9438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_filter_row(png_ptr, &(png_ptr->row_info), 945c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_ptr->row_buf + 1, png_ptr->prev_row + 1, 946c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner (int)(png_ptr->row_buf[0])); 9478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf, 9498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->rowbytes + 1); 9508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA)) 9528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_do_read_transformations(png_ptr); 9538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 954c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_INTERLACING_SUPPORTED 955c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Blow up interlaced rows to full size */ 9568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) 9578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->pass < 6) 9598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* old interface (pre-1.0.9): 9608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_do_read_interlace(&(png_ptr->row_info), 961c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations); 9628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 9638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_do_read_interlace(png_ptr); 9648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (png_ptr->pass) 9668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 0: 9688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 9708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 8 && png_ptr->pass == 0; i++) 9718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 973c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_read_push_finish_row(png_ptr); /* Updates png_ptr->pass */ 9748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 975c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 976c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr->pass == 2) /* Pass 1 might be empty */ 9778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 4 && png_ptr->pass == 2; i++) 9798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 9818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 9828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 984c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 9858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->pass == 4 && png_ptr->height <= 4) 9868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 2 && png_ptr->pass == 4; i++) 9888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 9908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 9918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 993c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 9948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->pass == 6 && png_ptr->height <= 4) 9958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 996c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_push_have_row(png_ptr, png_bytep_NULL); 9978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 9988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 999c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 10008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 10018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1002c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 10038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 1: 10048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 10068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 8 && png_ptr->pass == 1; i++) 10078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 10098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 10108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1011c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 1012c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr->pass == 2) /* Skip top 4 generated rows */ 10138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 4 && png_ptr->pass == 2; i++) 10158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 10178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 10188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1020c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 10218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 10228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1023c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 10248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 2: 10258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 1027c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 10288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 4 && png_ptr->pass == 2; i++) 10298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 10318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 10328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1033c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 10348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 4 && png_ptr->pass == 2; i++) 10358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1036c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_push_have_row(png_ptr, png_bytep_NULL); 10378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 10388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1039c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 1040c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr->pass == 4) /* Pass 3 might be empty */ 10418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 2 && png_ptr->pass == 4; i++) 10438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 10458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 10468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1048c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 10498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 10508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1051c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 10528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 3: 10538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 1055c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 10568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 4 && png_ptr->pass == 3; i++) 10578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 10598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 10608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1061c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 1062c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr->pass == 4) /* Skip top two generated rows */ 10638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 2 && png_ptr->pass == 4; i++) 10658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 10678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 10688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1070c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 10718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 10728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1073c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 10748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 4: 10758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 1077c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 10788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 2 && png_ptr->pass == 4; i++) 10798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 10818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 10828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1083c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 10848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 2 && png_ptr->pass == 4; i++) 10858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1086c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_push_have_row(png_ptr, png_bytep_NULL); 10878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 10888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1089c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 1090c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr->pass == 6) /* Pass 5 might be empty */ 10918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1092c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_push_have_row(png_ptr, png_bytep_NULL); 10938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 10948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1095c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 10968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 10978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1098c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 10998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 5: 11008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 1102c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 11038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < 2 && png_ptr->pass == 5; i++) 11048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 11068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 11078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1108c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 1109c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr->pass == 6) /* Skip top generated row */ 11108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1111c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_push_have_row(png_ptr, png_bytep_NULL); 11128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 11138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1114c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 11158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 11168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 6: 11188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 11208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 1121c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 11228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->pass != 6) 11238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 1124c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 1125c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_push_have_row(png_ptr, png_bytep_NULL); 11268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 11278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 11318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 11328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 11348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_read_push_finish_row(png_ptr); 11358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 11398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_read_push_finish_row(png_structp png_ptr) 11408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS 1142c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ 11438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1144c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Start of interlace block */ 11458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; 11468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1147c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Offset to next interlace block */ 11488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; 11498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1150c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Start of interlace block in the y direction */ 11518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; 11528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1153c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Offset to next interlace block in the y direction */ 11548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2}; 11558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Height of interlace block. This is not currently used - if you need 11578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * it, uncomment it here and in png.h 11588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1}; 11598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 11608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 11618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_number++; 11638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->row_number < png_ptr->num_rows) 11648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 11658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1166c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_INTERLACING_SUPPORTED 11678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->interlaced) 11688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_number = 0; 11708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memset_check(png_ptr, png_ptr->prev_row, 0, 11718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->rowbytes + 1); 11728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do 11738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->pass++; 11758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((png_ptr->pass == 1 && png_ptr->width < 5) || 11768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_ptr->pass == 3 && png_ptr->width < 3) || 11778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_ptr->pass == 5 && png_ptr->width < 2)) 11788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->pass++; 11798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->pass > 7) 11818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->pass--; 1182c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 11838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->pass >= 7) 11848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 11858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->iwidth = (png_ptr->width + 11878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_pass_inc[png_ptr->pass] - 1 - 11888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_pass_start[png_ptr->pass]) / 11898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_pass_inc[png_ptr->pass]; 11908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->transformations & PNG_INTERLACE) 11928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 11938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->num_rows = (png_ptr->height + 11958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_pass_yinc[png_ptr->pass] - 1 - 11968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_pass_ystart[png_ptr->pass]) / 11978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_pass_yinc[png_ptr->pass]; 11988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0); 12008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1201c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#endif /* PNG_READ_INTERLACING_SUPPORTED */ 12028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1204c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_tEXt_SUPPORTED 12058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 12068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 12078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project length) 12088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 12098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) 12108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Out of place tEXt"); 1212c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner info_ptr = info_ptr; /* To quiet some compiler warnings */ 12138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K 12168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->skip_length = 0; /* This may not be necessary */ 12178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ 12198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "tEXt chunk too large to fit in memory"); 12218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->skip_length = length - (png_uint_32)65535L; 12228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project length = (png_uint_32)65535L; 12238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 12258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text = (png_charp)png_malloc(png_ptr, 1227c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner (png_uint_32)(length + 1)); 12288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text[length] = '\0'; 12298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_ptr = png_ptr->current_text; 12308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_size = (png_size_t)length; 12318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_left = (png_size_t)length; 12328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->process_mode = PNG_READ_tEXt_MODE; 12338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 12368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_read_tEXt(png_structp png_ptr, png_infop info_ptr) 12378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 12388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size && png_ptr->current_text_left) 12398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t text_size; 12418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size < png_ptr->current_text_left) 12438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_size = png_ptr->buffer_size; 1244c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 12458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 12468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_size = png_ptr->current_text_left; 1247c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 12488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); 12498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_left -= text_size; 12508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_ptr += text_size; 12518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->current_text_left)) 12538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_textp text_ptr; 12558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_charp text; 12568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_charp key; 12578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ret; 12588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size < 4) 12608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 12628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 12638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_crc_finish(png_ptr); 12668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1267c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_MAX_MALLOC_64K 12688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->skip_length) 12698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 12708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 12718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project key = png_ptr->current_text; 12738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (text = key; *text; text++) 1275c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Empty loop */ ; 12768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1277c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (text < key + png_ptr->current_text_size) 12788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text++; 12798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr = (png_textp)png_malloc(png_ptr, 12818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_uint_32)png_sizeof(png_text)); 12828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; 12838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->key = key; 12848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_iTXt_SUPPORTED 12858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->lang = NULL; 12868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->lang_key = NULL; 12878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 12888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->text = text; 12898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); 12918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, key); 12938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, text_ptr); 12948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text = NULL; 12958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret) 12978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "Insufficient memory to store text chunk."); 12988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 13018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1302c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_zTXt_SUPPORTED 13038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 13048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 13058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project length) 13068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) 13088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 13098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Out of place zTXt"); 1310c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner info_ptr = info_ptr; /* To quiet some compiler warnings */ 13118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K 13148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* We can't handle zTXt chunks > 64K, since we don't have enough space 13158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * to be able to store the uncompressed data. Actually, the threshold 13168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * is probably around 32K, but it isn't as definite as 64K is. 13178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 13188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (length > (png_uint_32)65535L) 13198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 13208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "zTXt chunk too large to fit in memory"); 13218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_crc_skip(png_ptr, length); 13228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 13238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 13258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text = (png_charp)png_malloc(png_ptr, 1327c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner (png_uint_32)(length + 1)); 13288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text[length] = '\0'; 13298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_ptr = png_ptr->current_text; 13308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_size = (png_size_t)length; 13318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_left = (png_size_t)length; 13328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->process_mode = PNG_READ_zTXt_MODE; 13338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 13368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_read_zTXt(png_structp png_ptr, png_infop info_ptr) 13378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size && png_ptr->current_text_left) 13398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 13408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t text_size; 13418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left) 13438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_size = png_ptr->buffer_size; 1344c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 13458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 13468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_size = png_ptr->current_text_left; 1347c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 13488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); 13498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_left -= text_size; 13508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_ptr += text_size; 13518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->current_text_left)) 13538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 13548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_textp text_ptr; 13558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_charp text; 13568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_charp key; 13578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ret; 13588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t text_size, key_size; 13598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size < 4) 13618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 13628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 13638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 13648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_crc_finish(png_ptr); 13678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project key = png_ptr->current_text; 13698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (text = key; *text; text++) 1371c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Empty loop */ ; 13728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* zTXt can't have zero text */ 1374c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (text >= key + png_ptr->current_text_size) 13758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 13768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text = NULL; 13778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, key); 13788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 13798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text++; 13828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1383c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (*text != PNG_TEXT_COMPRESSION_zTXt) /* Check compression byte */ 13848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 13858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text = NULL; 13868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, key); 13878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 13888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text++; 13918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.next_in = (png_bytep )text; 13938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size - 13948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (text - key)); 13958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.next_out = png_ptr->zbuf; 13968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; 13978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project key_size = text - key; 13998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_size = 0; 14008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text = NULL; 14018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = Z_STREAM_END; 14028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (png_ptr->zstream.avail_in) 14048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 14058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); 14068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret != Z_OK && ret != Z_STREAM_END) 14078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 14088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project inflateReset(&png_ptr->zstream); 14098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.avail_in = 0; 14108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text = NULL; 14118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, key); 14128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, text); 14138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 14148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END) 14168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 14178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (text == NULL) 14188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 14198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text = (png_charp)png_malloc(png_ptr, 1420c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner (png_uint_32)(png_ptr->zbuf_size 1421c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner - png_ptr->zstream.avail_out + key_size + 1)); 1422c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 14238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy(text + key_size, png_ptr->zbuf, 14248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zbuf_size - png_ptr->zstream.avail_out); 1425c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 14268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy(text, key, key_size); 1427c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 14288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_size = key_size + png_ptr->zbuf_size - 14298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.avail_out; 1430c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 14318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(text + text_size) = '\0'; 14328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 14348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 14358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_charp tmp; 14368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tmp = text; 14388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text = (png_charp)png_malloc(png_ptr, text_size + 1439c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner (png_uint_32)(png_ptr->zbuf_size 1440c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner - png_ptr->zstream.avail_out + 1)); 1441c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 14428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy(text, tmp, text_size); 14438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, tmp); 1444c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 14458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy(text + text_size, png_ptr->zbuf, 14468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zbuf_size - png_ptr->zstream.avail_out); 1447c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 14488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out; 14498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(text + text_size) = '\0'; 14508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret != Z_STREAM_END) 14528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 14538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.next_out = png_ptr->zbuf; 14548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; 14558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 14588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 14598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 14608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret == Z_STREAM_END) 14638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 14648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project inflateReset(&png_ptr->zstream); 14678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.avail_in = 0; 14688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret != Z_STREAM_END) 14708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 14718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text = NULL; 14728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, key); 14738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, text); 14748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 14758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text = NULL; 14788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, key); 14798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project key = text; 14808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text += key_size; 14818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr = (png_textp)png_malloc(png_ptr, 14838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_uint_32)png_sizeof(png_text)); 14848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt; 14858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->key = key; 14868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_iTXt_SUPPORTED 14878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->lang = NULL; 14888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->lang_key = NULL; 14898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 14908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->text = text; 14918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); 14938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, key); 14958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, text_ptr); 14968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret) 14988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "Insufficient memory to store text chunk."); 14998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 15018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 15028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1503c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_iTXt_SUPPORTED 15048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 15058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 15068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project length) 15078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 15088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) 15098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 15108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Out of place iTXt"); 1511c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner info_ptr = info_ptr; /* To quiet some compiler warnings */ 15128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K 15158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->skip_length = 0; /* This may not be necessary */ 15168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ 15188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 15198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "iTXt chunk too large to fit in memory"); 15208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->skip_length = length - (png_uint_32)65535L; 15218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project length = (png_uint_32)65535L; 15228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 15248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text = (png_charp)png_malloc(png_ptr, 1526c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner (png_uint_32)(length + 1)); 15278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text[length] = '\0'; 15288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_ptr = png_ptr->current_text; 15298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_size = (png_size_t)length; 15308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_left = (png_size_t)length; 15318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->process_mode = PNG_READ_iTXt_MODE; 15328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 15338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 15358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_read_iTXt(png_structp png_ptr, png_infop info_ptr) 15368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 15378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size && png_ptr->current_text_left) 15398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 15408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t text_size; 15418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size < png_ptr->current_text_left) 15438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_size = png_ptr->buffer_size; 1544c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 15458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 15468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_size = png_ptr->current_text_left; 1547c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 15488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); 15498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_left -= text_size; 15508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text_ptr += text_size; 15518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->current_text_left)) 15538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 15548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_textp text_ptr; 15558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_charp key; 15568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int comp_flag; 15578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_charp lang; 15588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_charp lang_key; 15598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_charp text; 15608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ret; 15618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->buffer_size < 4) 15638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 15648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_save_buffer(png_ptr); 15658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 15668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_crc_finish(png_ptr); 15698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1570c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_MAX_MALLOC_64K 15718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->skip_length) 15728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 15738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 15748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project key = png_ptr->current_text; 15768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (lang = key; *lang; lang++) 1578c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Empty loop */ ; 15798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1580c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (lang < key + png_ptr->current_text_size - 3) 15818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project lang++; 15828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project comp_flag = *lang++; 1584c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner lang++; /* Skip comp_type, always zero */ 15858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (lang_key = lang; *lang_key; lang_key++) 1587c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Empty loop */ ; 15888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1589c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner lang_key++; /* Skip NUL separator */ 15908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1591c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner text=lang_key; 1592c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 1593c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (lang_key < key + png_ptr->current_text_size - 1) 1594c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner { 1595c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner for (; *text; text++) 1596c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Empty loop */ ; 1597c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner } 1598c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 1599c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (text < key + png_ptr->current_text_size) 16008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text++; 16018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr = (png_textp)png_malloc(png_ptr, 16038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_uint_32)png_sizeof(png_text)); 1604c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 16058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->compression = comp_flag + 2; 16068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->key = key; 16078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->lang = lang; 16088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->lang_key = lang_key; 16098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->text = text; 16108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->text_length = 0; 16118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project text_ptr->itxt_length = png_strlen(text); 16128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); 16148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->current_text = NULL; 16168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, text_ptr); 16188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret) 1619c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_warning(png_ptr, "Insufficient memory to store iTXt chunk."); 16208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 16238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* This function is called when we haven't found a handler for this 16258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * chunk. If there isn't a problem with the chunk itself (ie a bad chunk 16268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * name or a critical chunk), the chunk is (currently) silently ignored. 16278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 16288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 16298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 16308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project length) 16318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1632c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_uint_32 skip = 0; 16338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->chunk_name[0] & 0x20)) 16358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1636c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED 1637c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != 1638c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner PNG_HANDLE_CHUNK_ALWAYS 1639c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_USER_CHUNKS_SUPPORTED 1640c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner && png_ptr->read_user_chunk_fn == NULL 16418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 16428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ) 16438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 16448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_chunk_error(png_ptr, "unknown critical chunk"); 16458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1646c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner info_ptr = info_ptr; /* To quiet some compiler warnings */ 16478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1649c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED 16508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) 16518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 16528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K 1653c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (length > (png_uint_32)65535L) 1654c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner { 1655c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_warning(png_ptr, "unknown chunk too large to fit in memory"); 1656c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner skip = length - (png_uint_32)65535L; 1657c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner length = (png_uint_32)65535L; 1658c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner } 16598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1660c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_memcpy((png_charp)png_ptr->unknown_chunk.name, 1661c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner (png_charp)png_ptr->chunk_name, 1662c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_sizeof(png_ptr->unknown_chunk.name)); 1663c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name) - 1] 1664c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner = '\0'; 1665c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 1666c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_ptr->unknown_chunk.size = (png_size_t)length; 1667c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 1668c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (length == 0) 1669c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_ptr->unknown_chunk.data = NULL; 1670c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 1671c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner else 1672c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner { 1673c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, 1674c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner (png_uint_32)length); 1675c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length); 1676c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner } 1677c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 1678c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_READ_USER_CHUNKS_SUPPORTED 1679c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr->read_user_chunk_fn != NULL) 1680c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner { 1681c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner /* Callback to user unknown chunk handler */ 1682c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner int ret; 1683c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner ret = (*(png_ptr->read_user_chunk_fn)) 1684c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner (png_ptr, &png_ptr->unknown_chunk); 1685c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 1686c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (ret < 0) 1687c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_chunk_error(png_ptr, "error in user chunk"); 1688c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 1689c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (ret == 0) 1690c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner { 1691c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (!(png_ptr->chunk_name[0] & 0x20)) 1692c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != 1693c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner PNG_HANDLE_CHUNK_ALWAYS) 1694c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_chunk_error(png_ptr, "unknown critical chunk"); 1695c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_set_unknown_chunks(png_ptr, info_ptr, 1696c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner &png_ptr->unknown_chunk, 1); 1697c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner } 1698c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner } 1699c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 1700c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner else 17018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1702c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); 1703c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_free(png_ptr, png_ptr->unknown_chunk.data); 1704c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner png_ptr->unknown_chunk.data = NULL; 17058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1706c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 17078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 17088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 17098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skip=length; 17108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_push_crc_skip(png_ptr, skip); 17118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 17128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 17148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_have_info(png_structp png_ptr, png_infop info_ptr) 17158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 17168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->info_fn != NULL) 17178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (*(png_ptr->info_fn))(png_ptr, info_ptr); 17188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 17198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 17218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_have_end(png_structp png_ptr, png_infop info_ptr) 17228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 17238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->end_fn != NULL) 17248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (*(png_ptr->end_fn))(png_ptr, info_ptr); 17258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 17268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 17288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_push_have_row(png_structp png_ptr, png_bytep row) 17298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 17308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->row_fn != NULL) 17318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (*(png_ptr->row_fn))(png_ptr, row, png_ptr->row_number, 17328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (int)png_ptr->pass); 17338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 17348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 17368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_progressive_combine_row (png_structp png_ptr, 17378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytep old_row, png_bytep new_row) 17388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 17398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS 17408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_CONST int FARDATA png_pass_dsp_mask[7] = 17418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff}; 17428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1743c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 1744c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr == NULL) 1745c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner return; 1746c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 17478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (new_row != NULL) /* new_row must == png_ptr->row_buf here. */ 17488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]); 17498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 17508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 17528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr, 17538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, 17548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_progressive_end_ptr end_fn) 17558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1756c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr == NULL) 1757c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner return; 1758c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 17598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->info_fn = info_fn; 17608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_fn = row_fn; 17618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->end_fn = end_fn; 17628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer); 17648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 17658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp PNGAPI 17678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_get_progressive_ptr(png_structp png_ptr) 17688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1769c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner if (png_ptr == NULL) 1770c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner return (NULL); 1771c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner 17728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return png_ptr->io_ptr; 17738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 17748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ 1775