pngpread.c revision 4215dd1533c56e1a89ae6f1d6ea68677fac27fda
1893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 2893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* pngpread.c - read a png file in push mode 3893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 44215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project * Last changed in libpng 1.2.32 [September 18, 2008] 5893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * For conditions of distribution and use, see copyright notice in png.h 6893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * Copyright (c) 1998-2008 Glenn Randers-Pehrson 7893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) 8893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) 9893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 10893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 11893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_INTERNAL 12893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include "png.h" 13893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_PROGRESSIVE_READ_SUPPORTED 14893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 15893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* push model modes */ 16893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_SIG_MODE 0 17893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_CHUNK_MODE 1 18893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_IDAT_MODE 2 19893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_SKIP_MODE 3 20893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_tEXt_MODE 4 21893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_zTXt_MODE 5 22893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_DONE_MODE 6 23893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_iTXt_MODE 7 24893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_ERROR_MODE 8 25893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 26893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 27893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_process_data(png_structp png_ptr, png_infop info_ptr, 28893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep buffer, png_size_t buffer_size) 29893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 304215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_ptr == NULL || info_ptr == NULL) return; 31893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_restore_buffer(png_ptr, buffer, buffer_size); 32893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 33893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project while (png_ptr->buffer_size) 34893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 35893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_process_some_data(png_ptr, info_ptr); 36893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 37893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 38893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 39893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* What we do with the incoming data depends on what we were previously 40893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * doing before we ran out of data... 41893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 42893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 43893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_process_some_data(png_structp png_ptr, png_infop info_ptr) 44893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 454215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_ptr == NULL) return; 46893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project switch (png_ptr->process_mode) 47893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 48893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case PNG_READ_SIG_MODE: 49893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 50893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_read_sig(png_ptr, info_ptr); 51893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 52893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 53893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case PNG_READ_CHUNK_MODE: 54893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 55893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_read_chunk(png_ptr, info_ptr); 56893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 57893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 58893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case PNG_READ_IDAT_MODE: 59893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 60893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_read_IDAT(png_ptr); 61893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 62893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 63893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_tEXt_SUPPORTED) 64893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case PNG_READ_tEXt_MODE: 65893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 66893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_read_tEXt(png_ptr, info_ptr); 67893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 68893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 69893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 70893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_zTXt_SUPPORTED) 71893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case PNG_READ_zTXt_MODE: 72893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 73893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_read_zTXt(png_ptr, info_ptr); 74893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 75893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 76893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 77893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_iTXt_SUPPORTED) 78893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case PNG_READ_iTXt_MODE: 79893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 80893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_read_iTXt(png_ptr, info_ptr); 81893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 82893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 83893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 84893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case PNG_SKIP_MODE: 85893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 86893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_crc_finish(png_ptr); 87893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 88893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 89893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project default: 90893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 91893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->buffer_size = 0; 92893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 93893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 94893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 95893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 96893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 97893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Read any remaining signature bytes from the stream and compare them with 98893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * the correct PNG signature. It is possible that this routine is called 99893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * with bytes already read from the signature, either because they have been 100893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * checked by the calling application, or because of multiple calls to this 101893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * routine. 102893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 103893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_read_sig(png_structp png_ptr, png_infop info_ptr) 105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t num_checked = png_ptr->sig_bytes, 107893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project num_to_check = 8 - num_checked; 108893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 109893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size < num_to_check) 110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 111893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project num_to_check = png_ptr->buffer_size; 112893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 113893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 114893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_fill_buffer(png_ptr, &(info_ptr->signature[num_checked]), 115893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project num_to_check); 1164215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes + num_to_check); 117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check)) 119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 120893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (num_checked < 4 && 121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4)) 122893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Not a PNG file"); 123893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 124893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "PNG file corrupted by ASCII conversion"); 125893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 126893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 127893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->sig_bytes >= 8) 129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 130893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->process_mode = PNG_READ_CHUNK_MODE; 131893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 132893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 133893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 134893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 135893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 136893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_read_chunk(png_structp png_ptr, png_infop info_ptr) 137893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 138893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS 139893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_IHDR; 140893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_IDAT; 141893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_IEND; 142893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_PLTE; 143893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_bKGD_SUPPORTED) 144893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_bKGD; 145893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_cHRM_SUPPORTED) 147893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_cHRM; 148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 149893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_gAMA_SUPPORTED) 150893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_gAMA; 151893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 152893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_hIST_SUPPORTED) 153893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_hIST; 154893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_iCCP_SUPPORTED) 156893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_iCCP; 157893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 158893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_iTXt_SUPPORTED) 159893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_iTXt; 160893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 161893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_oFFs_SUPPORTED) 162893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_oFFs; 163893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 164893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_pCAL_SUPPORTED) 165893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_pCAL; 166893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 167893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_pHYs_SUPPORTED) 168893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_pHYs; 169893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 170893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_sBIT_SUPPORTED) 171893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_sBIT; 172893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 173893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_sCAL_SUPPORTED) 174893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_sCAL; 175893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 176893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_sRGB_SUPPORTED) 177893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_sRGB; 178893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 179893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_sPLT_SUPPORTED) 180893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_sPLT; 181893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 182893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_tEXt_SUPPORTED) 183893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_tEXt; 184893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 185893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_tIME_SUPPORTED) 186893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_tIME; 187893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 188893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_tRNS_SUPPORTED) 189893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_tRNS; 190893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 191893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_zTXt_SUPPORTED) 192893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_zTXt; 193893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 194893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USE_LOCAL_ARRAYS */ 195893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* First we make sure we have enough data for the 4 byte chunk name 196893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * and the 4 byte chunk length before proceeding with decoding the 197893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * chunk data. To fully decode each of these chunks, we also make 198893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * sure we have enough data in the buffer for the 4 byte CRC at the 199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * end of every chunk (except IDAT, which is handled separately). 200893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 201893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER)) 202893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 203893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_byte chunk_length[4]; 204893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 205893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size < 8) 206893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 207893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 208893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 209893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 210893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 211893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_fill_buffer(png_ptr, chunk_length, 4); 2124215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length); 213893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_reset_crc(png_ptr); 214893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_crc_read(png_ptr, png_ptr->chunk_name, 4); 2154215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_check_chunk_name(png_ptr, png_ptr->chunk_name); 216893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; 217893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 2204215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_ptr->mode & PNG_AFTER_IDAT) 221893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; 222893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 223893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4)) 224893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 2254215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_ptr->push_length != 13) 2264215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_error(png_ptr, "Invalid IHDR length"); 227893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 228893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 231893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 232893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length); 233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4)) 235893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 236893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 238893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 239893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 240893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 241893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length); 242893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 243893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->process_mode = PNG_READ_DONE_MODE; 244893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_end(png_ptr, info_ptr); 245893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED 247893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name)) 248893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 249893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 251893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 252893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 253893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 255893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mode |= PNG_HAVE_IDAT; 256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); 257893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) 258893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mode |= PNG_HAVE_PLTE; 259893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 260893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 261893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_IHDR)) 262893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Missing IHDR before IDAT"); 263893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && 264893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project !(png_ptr->mode & PNG_HAVE_PLTE)) 265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Missing PLTE before IDAT"); 266893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 267893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 268893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 269893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) 270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 271893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 272893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 273893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 274893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 275893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 276893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length); 277893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 278893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 279893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 280893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* If we reach an IDAT chunk, this means we have read all of the 281893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * header chunks, and we can start reading the image (or if this 282893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * is called after the image has been read - we have an error). 283893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 284893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_IHDR)) 285893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Missing IHDR before IDAT"); 286893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && 287893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project !(png_ptr->mode & PNG_HAVE_PLTE)) 288893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Missing PLTE before IDAT"); 289893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 290893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->mode & PNG_HAVE_IDAT) 291893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 292893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) 293893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length == 0) 294893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 295893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 296893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->mode & PNG_AFTER_IDAT) 297893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Too many IDAT's found"); 298893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 299893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 300893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->idat_size = png_ptr->push_length; 301893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mode |= PNG_HAVE_IDAT; 302893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->process_mode = PNG_READ_IDAT_MODE; 303893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_info(png_ptr, info_ptr); 304893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes; 305893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.next_out = png_ptr->row_buf; 306893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 307893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 308893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_gAMA_SUPPORTED) 309893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4)) 310893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 311893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 312893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 313893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 314893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 315893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 316893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length); 317893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 318893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 319893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_sBIT_SUPPORTED) 320893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4)) 321893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 322893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 323893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 324893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 325893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 326893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 327893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length); 328893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 329893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 330893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_cHRM_SUPPORTED) 331893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4)) 332893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 333893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 334893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 335893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 336893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 337893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 338893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length); 339893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 340893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_sRGB_SUPPORTED) 342893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4)) 343893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 344893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 345893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 346893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 347893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 348893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 349893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length); 350893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 351893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 352893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_iCCP_SUPPORTED) 353893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4)) 354893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 355893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 356893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 357893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 358893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 359893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 360893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length); 361893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 362893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 363893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_sPLT_SUPPORTED) 364893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4)) 365893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 366893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 367893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 368893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 369893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 371893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length); 372893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 374893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_tRNS_SUPPORTED) 375893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4)) 376893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 377893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 378893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 379893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 380893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 381893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 382893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length); 383893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 384893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_bKGD_SUPPORTED) 386893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4)) 387893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 388893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 391893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 393893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length); 394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 395893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 396893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_hIST_SUPPORTED) 397893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4)) 398893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 399893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 400893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 401893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 403893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 404893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length); 405893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 406893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_pHYs_SUPPORTED) 408893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4)) 409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 413893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 414893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length); 416893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 417893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 418893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_oFFs_SUPPORTED) 419893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4)) 420893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 421893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 422893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 423893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 424893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 425893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 426893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length); 427893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 429893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_pCAL_SUPPORTED) 430893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4)) 431893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 432893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 434893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 435893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length); 438893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 439893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 440893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_sCAL_SUPPORTED) 441893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4)) 442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 443893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 444893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 445893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 446893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 447893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 448893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length); 449893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 450893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 451893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_tIME_SUPPORTED) 452893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4)) 453893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 454893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 455893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 456893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 457893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 458893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 459893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length); 460893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 461893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 462893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_tEXt_SUPPORTED) 463893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) 464893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 465893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 466893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 467893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 468893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 469893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length); 471893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 472893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 473893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_zTXt_SUPPORTED) 474893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) 475893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 476893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 478893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 479893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 480893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 481893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length); 482893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 483893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 484893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_iTXt_SUPPORTED) 485893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) 486893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 487893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 488893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 489893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 490893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 491893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 492893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); 493893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 494893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 495893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 496893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 497893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 498893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 499893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 500893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 502893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); 503893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 504893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 505893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; 506893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 507893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 508893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 509893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_crc_skip(png_structp png_ptr, png_uint_32 skip) 510893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 511893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->process_mode = PNG_SKIP_MODE; 512893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->skip_length = skip; 513893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 514893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 515893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 516893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_crc_finish(png_structp png_ptr) 517893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 518893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->skip_length && png_ptr->save_buffer_size) 519893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 520893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t save_size; 521893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 522893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->skip_length < (png_uint_32)png_ptr->save_buffer_size) 523893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save_size = (png_size_t)png_ptr->skip_length; 524893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 525893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save_size = png_ptr->save_buffer_size; 526893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 527893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); 528893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 529893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->skip_length -= save_size; 530893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->buffer_size -= save_size; 531893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->save_buffer_size -= save_size; 532893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->save_buffer_ptr += save_size; 533893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 534893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->skip_length && png_ptr->current_buffer_size) 535893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 536893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t save_size; 537893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 538893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->skip_length < (png_uint_32)png_ptr->current_buffer_size) 539893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save_size = (png_size_t)png_ptr->skip_length; 540893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 541893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save_size = png_ptr->current_buffer_size; 542893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 543893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); 544893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 545893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->skip_length -= save_size; 546893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->buffer_size -= save_size; 547893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_buffer_size -= save_size; 548893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_buffer_ptr += save_size; 549893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 550893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!png_ptr->skip_length) 551893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 552893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size < 4) 553893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 554893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 555893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 556893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 557893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 558893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_crc_finish(png_ptr, 0); 559893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->process_mode = PNG_READ_CHUNK_MODE; 560893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 561893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 562893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 563893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 564893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) 565893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 566893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep ptr; 567893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 5684215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_ptr == NULL) return; 569893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ptr = buffer; 570893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->save_buffer_size) 571893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 572893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t save_size; 573893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 574893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (length < png_ptr->save_buffer_size) 575893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save_size = length; 576893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 577893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save_size = png_ptr->save_buffer_size; 578893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 579893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy(ptr, png_ptr->save_buffer_ptr, save_size); 580893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project length -= save_size; 581893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ptr += save_size; 582893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->buffer_size -= save_size; 583893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->save_buffer_size -= save_size; 584893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->save_buffer_ptr += save_size; 585893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 586893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (length && png_ptr->current_buffer_size) 587893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 588893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t save_size; 589893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 590893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (length < png_ptr->current_buffer_size) 591893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save_size = length; 592893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 593893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save_size = png_ptr->current_buffer_size; 594893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 595893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy(ptr, png_ptr->current_buffer_ptr, save_size); 596893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->buffer_size -= save_size; 597893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_buffer_size -= save_size; 598893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_buffer_ptr += save_size; 599893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 600893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 601893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 602893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 603893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_save_buffer(png_structp png_ptr) 604893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 605893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->save_buffer_size) 606893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 607893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->save_buffer_ptr != png_ptr->save_buffer) 608893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 6094215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_size_t i, istop; 610893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep sp; 611893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep dp; 612893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 613893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project istop = png_ptr->save_buffer_size; 614893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer; 615893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project i < istop; i++, sp++, dp++) 616893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 617893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *dp = *sp; 618893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 619893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 620893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 621893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->save_buffer_size + png_ptr->current_buffer_size > 622893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->save_buffer_max) 623893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 624893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t new_max; 625893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep old_buffer; 626893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 627893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->save_buffer_size > PNG_SIZE_MAX - 628893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_ptr->current_buffer_size + 256)) 629893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 630893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Potential overflow of save_buffer"); 631893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 632893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256; 633893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project old_buffer = png_ptr->save_buffer; 634893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->save_buffer = (png_bytep)png_malloc(png_ptr, 635893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_32)new_max); 636893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size); 637893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, old_buffer); 638893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->save_buffer_max = new_max; 639893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 640893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->current_buffer_size) 641893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 642893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size, 643893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_buffer_ptr, png_ptr->current_buffer_size); 644893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->save_buffer_size += png_ptr->current_buffer_size; 645893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_buffer_size = 0; 646893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 647893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->save_buffer_ptr = png_ptr->save_buffer; 648893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->buffer_size = 0; 649893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 650893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 651893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 652893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_restore_buffer(png_structp png_ptr, png_bytep buffer, 653893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t buffer_length) 654893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 655893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_buffer = buffer; 656893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_buffer_size = buffer_length; 657893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->buffer_size = buffer_length + png_ptr->save_buffer_size; 658893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_buffer_ptr = png_ptr->current_buffer; 659893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 660893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 661893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 662893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_read_IDAT(png_structp png_ptr) 663893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 664893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS 665893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_IDAT; 666893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 667893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER)) 668893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 669893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_byte chunk_length[4]; 670893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 671893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size < 8) 672893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 673893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 674893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 675893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 676893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 677893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_fill_buffer(png_ptr, chunk_length, 4); 6784215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length); 679893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_reset_crc(png_ptr); 680893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_crc_read(png_ptr, png_ptr->chunk_name, 4); 681893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; 682893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 683893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 684893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 685893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->process_mode = PNG_READ_CHUNK_MODE; 686893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) 687893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Not enough compressed data"); 688893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 689893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 690893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 691893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->idat_size = png_ptr->push_length; 692893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 693893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->idat_size && png_ptr->save_buffer_size) 694893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 695893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t save_size; 696893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 697893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->idat_size < (png_uint_32)png_ptr->save_buffer_size) 698893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 699893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save_size = (png_size_t)png_ptr->idat_size; 700893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* check for overflow */ 7014215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if ((png_uint_32)save_size != png_ptr->idat_size) 702893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "save_size overflowed in pngpread"); 703893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 704893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 705893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save_size = png_ptr->save_buffer_size; 706893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 707893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); 708893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) 709893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size); 710893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->idat_size -= save_size; 711893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->buffer_size -= save_size; 712893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->save_buffer_size -= save_size; 713893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->save_buffer_ptr += save_size; 714893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 715893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->idat_size && png_ptr->current_buffer_size) 716893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 717893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t save_size; 718893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 719893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->idat_size < (png_uint_32)png_ptr->current_buffer_size) 720893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 721893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save_size = (png_size_t)png_ptr->idat_size; 722893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* check for overflow */ 7234215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if ((png_uint_32)save_size != png_ptr->idat_size) 724893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "save_size overflowed in pngpread"); 725893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 726893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 727893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save_size = png_ptr->current_buffer_size; 728893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 729893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); 730893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) 731893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size); 732893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 733893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->idat_size -= save_size; 734893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->buffer_size -= save_size; 735893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_buffer_size -= save_size; 736893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_buffer_ptr += save_size; 737893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 738893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!png_ptr->idat_size) 739893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 740893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size < 4) 741893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 742893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 743893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 744893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 745893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 746893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_crc_finish(png_ptr, 0); 747893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; 748893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mode |= PNG_AFTER_IDAT; 749893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 750893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 751893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 752893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 753893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_process_IDAT_data(png_structp png_ptr, png_bytep buffer, 754893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t buffer_length) 755893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 756893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int ret; 757893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 758893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->flags & PNG_FLAG_ZLIB_FINISHED) && buffer_length) 759893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Extra compression data"); 760893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 761893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.next_in = buffer; 762893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.avail_in = (uInt)buffer_length; 7634215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project for (;;) 764893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 765893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); 766893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret != Z_OK) 767893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 768893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret == Z_STREAM_END) 769893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 770893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->zstream.avail_in) 771893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Extra compressed data"); 772893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->zstream.avail_out)) 773893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 774893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_process_row(png_ptr); 775893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 776893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 777893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mode |= PNG_AFTER_IDAT; 778893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; 779893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 780893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 781893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (ret == Z_BUF_ERROR) 782893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 783893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 784893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Decompression Error"); 785893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 786893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->zstream.avail_out)) 787893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 788893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (( 789893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_INTERLACING_SUPPORTED) 790893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->interlaced && png_ptr->pass > 6) || 791893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (!png_ptr->interlaced && 792893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 793893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_number == png_ptr->num_rows)) 794893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 795893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->zstream.avail_in) 796893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Too much data in IDAT chunks"); 797893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; 798893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 799893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 800893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_process_row(png_ptr); 801893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes; 802893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.next_out = png_ptr->row_buf; 803893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 804893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 805893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 806893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 807893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 808893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 809893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 810893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_process_row(png_structp png_ptr) 811893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 812893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.color_type = png_ptr->color_type; 813893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.width = png_ptr->iwidth; 814893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.channels = png_ptr->channels; 815893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.bit_depth = png_ptr->bit_depth; 816893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.pixel_depth = png_ptr->pixel_depth; 817893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 818893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, 819893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.width); 820893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 821893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_filter_row(png_ptr, &(png_ptr->row_info), 822893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_buf + 1, png_ptr->prev_row + 1, 823893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (int)(png_ptr->row_buf[0])); 824893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 825893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf, 826893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->rowbytes + 1); 827893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 828893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA)) 829893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_do_read_transformations(png_ptr); 830893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 831893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_INTERLACING_SUPPORTED) 832893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* blow up interlaced rows to full size */ 833893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) 834893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 835893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->pass < 6) 836893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* old interface (pre-1.0.9): 837893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_do_read_interlace(&(png_ptr->row_info), 838893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations); 839893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 840893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_do_read_interlace(png_ptr); 841893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 842893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project switch (png_ptr->pass) 843893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 844893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 0: 845893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 846893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int i; 847893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 8 && png_ptr->pass == 0; i++) 848893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 849893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 850893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); /* updates png_ptr->pass */ 851893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 852893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->pass == 2) /* pass 1 might be empty */ 853893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 854893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 4 && png_ptr->pass == 2; i++) 855893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 856893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 857893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 858893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 859893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 860893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->pass == 4 && png_ptr->height <= 4) 861893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 862893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 2 && png_ptr->pass == 4; i++) 863893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 864893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 865893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 866893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 867893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 868893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->pass == 6 && png_ptr->height <= 4) 869893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 870893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 871893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 872893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 873893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 874893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 875893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 1: 876893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 877893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int i; 878893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 8 && png_ptr->pass == 1; i++) 879893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 880893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 881893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 882893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 883893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->pass == 2) /* skip top 4 generated rows */ 884893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 885893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 4 && png_ptr->pass == 2; i++) 886893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 887893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 888893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 889893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 890893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 891893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 892893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 893893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 2: 894893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 895893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int i; 896893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 4 && png_ptr->pass == 2; i++) 897893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 898893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 899893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 900893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 901893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 4 && png_ptr->pass == 2; i++) 902893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 903893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 904893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 905893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 906893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->pass == 4) /* pass 3 might be empty */ 907893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 908893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 2 && png_ptr->pass == 4; i++) 909893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 910893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 911893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 912893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 913893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 914893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 915893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 916893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 3: 917893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 918893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int i; 919893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 4 && png_ptr->pass == 3; i++) 920893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 921893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 922893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 923893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 924893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->pass == 4) /* skip top two generated rows */ 925893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 926893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 2 && png_ptr->pass == 4; i++) 927893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 928893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 929893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 930893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 931893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 932893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 933893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 934893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 4: 935893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 936893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int i; 937893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 2 && png_ptr->pass == 4; i++) 938893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 939893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 940893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 941893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 942893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 2 && png_ptr->pass == 4; i++) 943893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 944893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 945893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 946893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 947893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->pass == 6) /* pass 5 might be empty */ 948893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 949893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 950893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 951893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 952893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 953893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 954893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 5: 955893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 956893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int i; 957893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 2 && png_ptr->pass == 5; i++) 958893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 959893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 960893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 961893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 962893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->pass == 6) /* skip top generated row */ 963893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 964893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 965893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 966893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 967893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 968893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 969893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 6: 970893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 971893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 972893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 973893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->pass != 6) 974893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 975893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 976893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 977893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 978893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 979893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 980893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 981893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 982893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 983893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 984893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 985893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 986893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 987893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 988893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 989893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_read_push_finish_row(png_structp png_ptr) 990893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 991893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS 992893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ 993893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 994893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* start of interlace block */ 995893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; 996893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 997893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* offset to next interlace block */ 998893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; 999893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1000893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* start of interlace block in the y direction */ 1001893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; 1002893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1003893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* offset to next interlace block in the y direction */ 1004893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2}; 1005893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1006893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Height of interlace block. This is not currently used - if you need 1007893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * it, uncomment it here and in png.h 1008893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1}; 1009893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 1010893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1011893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1012893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_number++; 1013893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->row_number < png_ptr->num_rows) 1014893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1015893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1016893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->interlaced) 1017893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1018893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_number = 0; 1019893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memset_check(png_ptr, png_ptr->prev_row, 0, 1020893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->rowbytes + 1); 1021893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project do 1022893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 10234215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->pass++; 10244215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if ((png_ptr->pass == 1 && png_ptr->width < 5) || 10254215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project (png_ptr->pass == 3 && png_ptr->width < 3) || 10264215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project (png_ptr->pass == 5 && png_ptr->width < 2)) 10274215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->pass++; 10284215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project 10294215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_ptr->pass > 7) 10304215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->pass--; 10314215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_ptr->pass >= 7) 10324215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project break; 10334215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project 10344215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->iwidth = (png_ptr->width + 10354215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_pass_inc[png_ptr->pass] - 1 - 10364215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_pass_start[png_ptr->pass]) / 10374215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_pass_inc[png_ptr->pass]; 10384215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project 10394215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->irowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, 10404215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->iwidth) + 1; 10414215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project 10424215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_ptr->transformations & PNG_INTERLACE) 10434215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project break; 10444215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project 10454215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->num_rows = (png_ptr->height + 10464215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_pass_yinc[png_ptr->pass] - 1 - 10474215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_pass_ystart[png_ptr->pass]) / 10484215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_pass_yinc[png_ptr->pass]; 1049893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1050893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0); 1051893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1052893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1053893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1054893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_tEXt_SUPPORTED) 1055893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 1056893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 1057893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project length) 1058893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1059893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) 1060893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1061893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Out of place tEXt"); 1062893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr = info_ptr; /* to quiet some compiler warnings */ 1063893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1064893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1065893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K 1066893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->skip_length = 0; /* This may not be necessary */ 1067893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1068893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ 1069893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1070893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "tEXt chunk too large to fit in memory"); 1071893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->skip_length = length - (png_uint_32)65535L; 1072893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project length = (png_uint_32)65535L; 1073893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1074893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1075893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1076893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text = (png_charp)png_malloc(png_ptr, 10774215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project (png_uint_32)(length + 1)); 1078893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text[length] = '\0'; 1079893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_ptr = png_ptr->current_text; 1080893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_size = (png_size_t)length; 1081893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_left = (png_size_t)length; 1082893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->process_mode = PNG_READ_tEXt_MODE; 1083893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1084893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1085893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 1086893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_read_tEXt(png_structp png_ptr, png_infop info_ptr) 1087893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1088893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size && png_ptr->current_text_left) 1089893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1090893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t text_size; 1091893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1092893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size < png_ptr->current_text_left) 1093893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_size = png_ptr->buffer_size; 1094893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1095893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_size = png_ptr->current_text_left; 1096893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); 1097893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_left -= text_size; 1098893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_ptr += text_size; 1099893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1100893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->current_text_left)) 1101893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1102893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_textp text_ptr; 1103893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_charp text; 1104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_charp key; 1105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int ret; 1106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1107893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size < 4) 1108893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1109893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 1110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1111893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1112893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1113893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_crc_finish(png_ptr); 1114893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1115893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_MAX_MALLOC_64K) 1116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->skip_length) 1117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1120893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project key = png_ptr->current_text; 1121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1122893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (text = key; *text; text++) 1123893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* empty loop */ ; 1124893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1125893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (text < key + png_ptr->current_text_size) 1126893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text++; 1127893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr = (png_textp)png_malloc(png_ptr, 1129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_32)png_sizeof(png_text)); 1130893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; 1131893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->key = key; 1132893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_iTXt_SUPPORTED 1133893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->lang = NULL; 1134893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->lang_key = NULL; 1135893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1136893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->text = text; 1137893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1138893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); 1139893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1140893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, key); 1141893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, text_ptr); 1142893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text = NULL; 1143893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1144893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret) 1145893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Insufficient memory to store text chunk."); 1146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1147893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1149893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1150893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_zTXt_SUPPORTED) 1151893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 1152893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 1153893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project length) 1154893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) 1156893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1157893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Out of place zTXt"); 1158893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr = info_ptr; /* to quiet some compiler warnings */ 1159893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1160893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1161893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K 1162893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* We can't handle zTXt chunks > 64K, since we don't have enough space 1163893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * to be able to store the uncompressed data. Actually, the threshold 1164893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * is probably around 32K, but it isn't as definite as 64K is. 1165893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 1166893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (length > (png_uint_32)65535L) 1167893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1168893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "zTXt chunk too large to fit in memory"); 1169893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_crc_skip(png_ptr, length); 1170893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1171893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1172893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1173893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1174893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text = (png_charp)png_malloc(png_ptr, 11754215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project (png_uint_32)(length + 1)); 1176893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text[length] = '\0'; 1177893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_ptr = png_ptr->current_text; 1178893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_size = (png_size_t)length; 1179893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_left = (png_size_t)length; 1180893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->process_mode = PNG_READ_zTXt_MODE; 1181893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1182893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1183893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 1184893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_read_zTXt(png_structp png_ptr, png_infop info_ptr) 1185893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1186893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size && png_ptr->current_text_left) 1187893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1188893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t text_size; 1189893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1190893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left) 1191893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_size = png_ptr->buffer_size; 1192893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1193893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_size = png_ptr->current_text_left; 1194893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); 1195893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_left -= text_size; 1196893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_ptr += text_size; 1197893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1198893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->current_text_left)) 1199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1200893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_textp text_ptr; 1201893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_charp text; 1202893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_charp key; 1203893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int ret; 1204893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t text_size, key_size; 1205893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1206893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size < 4) 1207893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1208893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 1209893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1210893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1211893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1212893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_crc_finish(png_ptr); 1213893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1214893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project key = png_ptr->current_text; 1215893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1216893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (text = key; *text; text++) 1217893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* empty loop */ ; 1218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* zTXt can't have zero text */ 1220893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (text >= key + png_ptr->current_text_size) 1221893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1222893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text = NULL; 1223893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, key); 1224893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1225893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1226893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1227893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text++; 1228893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (*text != PNG_TEXT_COMPRESSION_zTXt) /* check compression byte */ 1230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1231893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text = NULL; 1232893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, key); 1233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1235893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1236893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text++; 1237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1238893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.next_in = (png_bytep )text; 1239893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size - 1240893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (text - key)); 1241893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.next_out = png_ptr->zbuf; 1242893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; 1243893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1244893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project key_size = text - key; 1245893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_size = 0; 1246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text = NULL; 1247893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ret = Z_STREAM_END; 1248893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1249893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project while (png_ptr->zstream.avail_in) 1250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1251893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); 1252893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret != Z_OK && ret != Z_STREAM_END) 1253893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project inflateReset(&png_ptr->zstream); 1255893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.avail_in = 0; 1256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text = NULL; 1257893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, key); 1258893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, text); 1259893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1260893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1261893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END) 1262893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1263893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (text == NULL) 1264893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text = (png_charp)png_malloc(png_ptr, 12664215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project (png_uint_32)(png_ptr->zbuf_size 12674215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project - png_ptr->zstream.avail_out + key_size + 1)); 1268893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy(text + key_size, png_ptr->zbuf, 1269893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zbuf_size - png_ptr->zstream.avail_out); 1270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy(text, key, key_size); 1271893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_size = key_size + png_ptr->zbuf_size - 1272893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.avail_out; 1273893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(text + text_size) = '\0'; 1274893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1275893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1276893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1277893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_charp tmp; 1278893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1279893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project tmp = text; 1280893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text = (png_charp)png_malloc(png_ptr, text_size + 12814215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project (png_uint_32)(png_ptr->zbuf_size 12824215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project - png_ptr->zstream.avail_out + 1)); 1283893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy(text, tmp, text_size); 1284893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, tmp); 1285893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy(text + text_size, png_ptr->zbuf, 1286893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zbuf_size - png_ptr->zstream.avail_out); 1287893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out; 1288893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(text + text_size) = '\0'; 1289893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1290893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret != Z_STREAM_END) 1291893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1292893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.next_out = png_ptr->zbuf; 1293893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; 1294893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1295893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1296893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1297893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1298893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 1299893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1300893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1301893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret == Z_STREAM_END) 1302893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 1303893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1304893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1305893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project inflateReset(&png_ptr->zstream); 1306893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.avail_in = 0; 1307893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1308893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret != Z_STREAM_END) 1309893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1310893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text = NULL; 1311893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, key); 1312893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, text); 1313893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1314893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1315893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1316893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text = NULL; 1317893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, key); 1318893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project key = text; 1319893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text += key_size; 1320893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1321893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr = (png_textp)png_malloc(png_ptr, 1322893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_32)png_sizeof(png_text)); 1323893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt; 1324893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->key = key; 1325893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_iTXt_SUPPORTED 1326893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->lang = NULL; 1327893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->lang_key = NULL; 1328893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1329893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->text = text; 1330893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1331893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); 1332893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1333893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, key); 1334893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, text_ptr); 1335893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1336893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret) 1337893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Insufficient memory to store text chunk."); 1338893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1339893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1340893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1342893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_iTXt_SUPPORTED) 1343893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 1344893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 1345893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project length) 1346893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1347893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) 1348893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1349893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Out of place iTXt"); 1350893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr = info_ptr; /* to quiet some compiler warnings */ 1351893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1352893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1353893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K 1354893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->skip_length = 0; /* This may not be necessary */ 1355893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1356893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ 1357893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1358893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "iTXt chunk too large to fit in memory"); 1359893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->skip_length = length - (png_uint_32)65535L; 1360893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project length = (png_uint_32)65535L; 1361893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1362893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1363893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1364893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text = (png_charp)png_malloc(png_ptr, 13654215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project (png_uint_32)(length + 1)); 1366893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text[length] = '\0'; 1367893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_ptr = png_ptr->current_text; 1368893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_size = (png_size_t)length; 1369893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_left = (png_size_t)length; 1370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->process_mode = PNG_READ_iTXt_MODE; 1371893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1372893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 1374893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_read_iTXt(png_structp png_ptr, png_infop info_ptr) 1375893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1376893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1377893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size && png_ptr->current_text_left) 1378893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1379893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t text_size; 1380893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1381893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size < png_ptr->current_text_left) 1382893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_size = png_ptr->buffer_size; 1383893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1384893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_size = png_ptr->current_text_left; 1385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); 1386893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_left -= text_size; 1387893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_ptr += text_size; 1388893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->current_text_left)) 1390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1391893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_textp text_ptr; 1392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_charp key; 1393893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int comp_flag; 1394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_charp lang; 1395893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_charp lang_key; 1396893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_charp text; 1397893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int ret; 1398893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1399893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size < 4) 1400893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1401893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 1402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1403893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1404893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1405893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_crc_finish(png_ptr); 1406893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_MAX_MALLOC_64K) 1408893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->skip_length) 1409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project key = png_ptr->current_text; 1413893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1414893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (lang = key; *lang; lang++) 1415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* empty loop */ ; 1416893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1417893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (lang < key + png_ptr->current_text_size - 3) 1418893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project lang++; 1419893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1420893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project comp_flag = *lang++; 1421893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project lang++; /* skip comp_type, always zero */ 1422893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1423893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (lang_key = lang; *lang_key; lang_key++) 1424893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* empty loop */ ; 1425893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project lang_key++; /* skip NUL separator */ 1426893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1427893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text=lang_key; 1428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (lang_key < key + png_ptr->current_text_size - 1) 1429893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1430893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (; *text; text++) 1431893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* empty loop */ ; 1432893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1434893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (text < key + png_ptr->current_text_size) 1435893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text++; 1436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr = (png_textp)png_malloc(png_ptr, 1438893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_32)png_sizeof(png_text)); 1439893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->compression = comp_flag + 2; 1440893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->key = key; 1441893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->lang = lang; 1442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->lang_key = lang_key; 1443893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->text = text; 1444893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->text_length = 0; 1445893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->itxt_length = png_strlen(text); 1446893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1447893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); 1448893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1449893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text = NULL; 1450893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1451893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, text_ptr); 1452893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret) 1453893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Insufficient memory to store iTXt chunk."); 1454893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1455893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1456893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1457893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1458893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* This function is called when we haven't found a handler for this 1459893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * chunk. If there isn't a problem with the chunk itself (ie a bad chunk 1460893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * name or a critical chunk), the chunk is (currently) silently ignored. 1461893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 1462893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 1463893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 1464893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project length) 1465893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 14664215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_uint_32 skip = 0; 1467893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1468893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->chunk_name[0] & 0x20)) 1469893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) 14714215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != 14724215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project PNG_HANDLE_CHUNK_ALWAYS 1473893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_USER_CHUNKS_SUPPORTED) 14744215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project && png_ptr->read_user_chunk_fn == NULL 1475893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 14764215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project ) 1477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 14784215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_chunk_error(png_ptr, "unknown critical chunk"); 1479893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 14804215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project info_ptr = info_ptr; /* to quiet some compiler warnings */ 1481893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1482893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1483893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) 1484893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) 1485893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1486893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K 1487893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (length > (png_uint_32)65535L) 1488893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1489893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "unknown chunk too large to fit in memory"); 1490893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project skip = length - (png_uint_32)65535L; 1491893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project length = (png_uint_32)65535L; 1492893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1493893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1494893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy((png_charp)png_ptr->unknown_chunk.name, 1495893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_charp)png_ptr->chunk_name, 1496893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_sizeof(png_ptr->unknown_chunk.name)); 14974215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name) - 1] 14984215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project = '\0'; 1499893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1500893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->unknown_chunk.size = (png_size_t)length; 1501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (length == 0) 1502893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->unknown_chunk.data = NULL; 1503893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1504893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 15054215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, 15064215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project (png_uint_32)length); 1507893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length); 1508893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1509893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_USER_CHUNKS_SUPPORTED) 15104215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_ptr->read_user_chunk_fn != NULL) 1511893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1512893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* callback to user unknown chunk handler */ 1513893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int ret; 1514893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ret = (*(png_ptr->read_user_chunk_fn)) 1515893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_ptr, &png_ptr->unknown_chunk); 1516893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret < 0) 1517893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_chunk_error(png_ptr, "error in user chunk"); 1518893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret == 0) 1519893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1520893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->chunk_name[0] & 0x20)) 15214215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != 1522893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_HANDLE_CHUNK_ALWAYS) 1523893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_chunk_error(png_ptr, "unknown critical chunk"); 1524893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_unknown_chunks(png_ptr, info_ptr, 1525893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project &png_ptr->unknown_chunk, 1); 1526893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1527893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1528893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1529893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1530893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); 1531893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->unknown_chunk.data); 1532893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->unknown_chunk.data = NULL; 1533893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1534893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1535893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1536893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project skip=length; 1537893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_crc_skip(png_ptr, skip); 1538893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1539893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1540893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 1541893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_have_info(png_structp png_ptr, png_infop info_ptr) 1542893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1543893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->info_fn != NULL) 1544893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (*(png_ptr->info_fn))(png_ptr, info_ptr); 1545893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1546893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1547893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 1548893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_have_end(png_structp png_ptr, png_infop info_ptr) 1549893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1550893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->end_fn != NULL) 1551893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (*(png_ptr->end_fn))(png_ptr, info_ptr); 1552893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1553893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1554893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 1555893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_have_row(png_structp png_ptr, png_bytep row) 1556893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1557893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->row_fn != NULL) 1558893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (*(png_ptr->row_fn))(png_ptr, row, png_ptr->row_number, 1559893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (int)png_ptr->pass); 1560893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1561893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1562893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 1563893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_progressive_combine_row (png_structp png_ptr, 1564893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep old_row, png_bytep new_row) 1565893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1566893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS 1567893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST int FARDATA png_pass_dsp_mask[7] = 1568893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff}; 1569893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 15704215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_ptr == NULL) return; 1571893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (new_row != NULL) /* new_row must == png_ptr->row_buf here. */ 1572893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]); 1573893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1574893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1575893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 1576893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr, 1577893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, 1578893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_progressive_end_ptr end_fn) 1579893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 15804215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_ptr == NULL) return; 1581893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->info_fn = info_fn; 1582893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_fn = row_fn; 1583893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->end_fn = end_fn; 1584893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1585893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer); 1586893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1587893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1588893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_voidp PNGAPI 1589893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_get_progressive_ptr(png_structp png_ptr) 1590893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 15914215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_ptr == NULL) return (NULL); 1592893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return png_ptr->io_ptr; 1593893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1594893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ 1595