1893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 2893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* pngpread.c - read a png file in push mode 3893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 45f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * Last changed in libpng 1.2.44 [June 26, 2010] 55f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * Copyright (c) 1998-2010 Glenn Randers-Pehrson 6893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) 7893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) 8a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * 9a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * This code is released under the libpng license. 10a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * For conditions of distribution and use, see the disclaimer 11a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * and license in png.h 12893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 13893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 14893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_INTERNAL 155f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#define PNG_NO_PEDANTIC_WARNINGS 16893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include "png.h" 17893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_PROGRESSIVE_READ_SUPPORTED 18893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 19a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Push model modes */ 20893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_SIG_MODE 0 21893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_CHUNK_MODE 1 22893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_IDAT_MODE 2 23893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_SKIP_MODE 3 24893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_tEXt_MODE 4 25893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_zTXt_MODE 5 26893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_DONE_MODE 6 27893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_READ_iTXt_MODE 7 28893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_ERROR_MODE 8 29893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 30893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 31893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_process_data(png_structp png_ptr, png_infop info_ptr, 32893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep buffer, png_size_t buffer_size) 33893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 34a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr == NULL || info_ptr == NULL) 35a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott return; 36a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 37893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_restore_buffer(png_ptr, buffer, buffer_size); 38893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 39893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project while (png_ptr->buffer_size) 40893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 41893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_process_some_data(png_ptr, info_ptr); 42893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 43893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 44893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 45893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* What we do with the incoming data depends on what we were previously 46893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * doing before we ran out of data... 47893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 48893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 49893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_process_some_data(png_structp png_ptr, png_infop info_ptr) 50893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 51a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr == NULL) 52a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott return; 53a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 54893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project switch (png_ptr->process_mode) 55893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 56893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case PNG_READ_SIG_MODE: 57893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 58893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_read_sig(png_ptr, info_ptr); 59893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 60893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 61a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 62893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case PNG_READ_CHUNK_MODE: 63893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 64893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_read_chunk(png_ptr, info_ptr); 65893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 66893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 67a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 68893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case PNG_READ_IDAT_MODE: 69893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 70893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_read_IDAT(png_ptr); 71893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 72893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 73a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 745f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tEXt_SUPPORTED 75893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case PNG_READ_tEXt_MODE: 76893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 77893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_read_tEXt(png_ptr, info_ptr); 78893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 79893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 80a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 81893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 825f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_zTXt_SUPPORTED 83893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case PNG_READ_zTXt_MODE: 84893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 85893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_read_zTXt(png_ptr, info_ptr); 86893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 87893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 88a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 89893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 905f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_iTXt_SUPPORTED 91893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case PNG_READ_iTXt_MODE: 92893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 93893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_read_iTXt(png_ptr, info_ptr); 94893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 95893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 96a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 97893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 98893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case PNG_SKIP_MODE: 99893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 100893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_crc_finish(png_ptr); 101893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 102893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 103a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project default: 105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->buffer_size = 0; 107893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 108893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 109893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 111893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 112893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Read any remaining signature bytes from the stream and compare them with 113893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * the correct PNG signature. It is possible that this routine is called 114893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * with bytes already read from the signature, either because they have been 115893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * checked by the calling application, or because of multiple calls to this 116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * routine. 117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_read_sig(png_structp png_ptr, png_infop info_ptr) 120893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t num_checked = png_ptr->sig_bytes, 122893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project num_to_check = 8 - num_checked; 123893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 124893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size < num_to_check) 125893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 126893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project num_to_check = png_ptr->buffer_size; 127893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_fill_buffer(png_ptr, &(info_ptr->signature[num_checked]), 130893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project num_to_check); 1314215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes + num_to_check); 132893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 133893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check)) 134893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 135893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (num_checked < 4 && 136893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4)) 137893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Not a PNG file"); 138893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 139893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "PNG file corrupted by ASCII conversion"); 140893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 141893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 142893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 143893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->sig_bytes >= 8) 144893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 145893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->process_mode = PNG_READ_CHUNK_MODE; 146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 147893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 149893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 150893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 151893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_read_chunk(png_structp png_ptr, png_infop info_ptr) 152893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 153893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS 154893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_IHDR; 155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_IDAT; 156893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_IEND; 157893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_PLTE; 1585f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_bKGD_SUPPORTED 159893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_bKGD; 160893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1615f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_cHRM_SUPPORTED 162893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_cHRM; 163893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1645f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_gAMA_SUPPORTED 165893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_gAMA; 166893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1675f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_hIST_SUPPORTED 168893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_hIST; 169893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1705f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_iCCP_SUPPORTED 171893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_iCCP; 172893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1735f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_iTXt_SUPPORTED 174893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_iTXt; 175893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1765f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_oFFs_SUPPORTED 177893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_oFFs; 178893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1795f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_pCAL_SUPPORTED 180893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_pCAL; 181893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1825f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_pHYs_SUPPORTED 183893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_pHYs; 184893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1855f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sBIT_SUPPORTED 186893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_sBIT; 187893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1885f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sCAL_SUPPORTED 189893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_sCAL; 190893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1915f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sRGB_SUPPORTED 192893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_sRGB; 193893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1945f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sPLT_SUPPORTED 195893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_sPLT; 196893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1975f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tEXt_SUPPORTED 198893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_tEXt; 199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 2005f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tIME_SUPPORTED 201893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_tIME; 202893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 2035f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tRNS_SUPPORTED 204893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_tRNS; 205893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 2065f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_zTXt_SUPPORTED 207893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_zTXt; 208893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 209893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USE_LOCAL_ARRAYS */ 2105f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 211893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* First we make sure we have enough data for the 4 byte chunk name 212893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * and the 4 byte chunk length before proceeding with decoding the 213893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * chunk data. To fully decode each of these chunks, we also make 214893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * sure we have enough data in the buffer for the 4 byte CRC at the 215893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * end of every chunk (except IDAT, which is handled separately). 216893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 217893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER)) 218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_byte chunk_length[4]; 220893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 221893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size < 8) 222893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 223893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 224893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 225893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 226893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 227893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_fill_buffer(png_ptr, chunk_length, 4); 2284215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length); 229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_reset_crc(png_ptr); 230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_crc_read(png_ptr, png_ptr->chunk_name, 4); 2314215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_check_chunk_name(png_ptr, png_ptr->chunk_name); 232893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; 233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 235893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 2364215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_ptr->mode & PNG_AFTER_IDAT) 237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; 238893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 239893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4)) 240893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 2414215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_ptr->push_length != 13) 2424215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_error(png_ptr, "Invalid IHDR length"); 243a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 244893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 245893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 247893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 248893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 249a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length); 251893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 252a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 253893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4)) 254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 255893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 257893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 258893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 259893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 260a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 261893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length); 262893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 263893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->process_mode = PNG_READ_DONE_MODE; 264893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_end(png_ptr, info_ptr); 265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 266a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 267893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED 268893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name)) 269893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 271893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 272893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 273893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 274893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 275a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 276893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 277893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mode |= PNG_HAVE_IDAT; 278a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 279893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); 280a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 281893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) 282893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mode |= PNG_HAVE_PLTE; 283a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 284893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 285893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 286893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_IHDR)) 287893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Missing IHDR before IDAT"); 288a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 289893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && 290893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project !(png_ptr->mode & PNG_HAVE_PLTE)) 291893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Missing PLTE before IDAT"); 292893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 293893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 294a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 295893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 296893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) 297893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 298893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 299893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 300893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 301893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 302893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 303893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length); 304893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 305a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 306893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 307893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 308893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* If we reach an IDAT chunk, this means we have read all of the 309893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * header chunks, and we can start reading the image (or if this 310893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * is called after the image has been read - we have an error). 311893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 312a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 313a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (!(png_ptr->mode & PNG_HAVE_IHDR)) 314a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott png_error(png_ptr, "Missing IHDR before IDAT"); 315a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 316a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && 317a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott !(png_ptr->mode & PNG_HAVE_PLTE)) 318a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott png_error(png_ptr, "Missing PLTE before IDAT"); 319893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 320893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->mode & PNG_HAVE_IDAT) 321893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 322893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) 323a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr->push_length == 0) 324a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott return; 325893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 326893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->mode & PNG_AFTER_IDAT) 327893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Too many IDAT's found"); 328893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 329893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 330893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->idat_size = png_ptr->push_length; 331893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mode |= PNG_HAVE_IDAT; 332893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->process_mode = PNG_READ_IDAT_MODE; 333893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_info(png_ptr, info_ptr); 3345f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->zstream.avail_out = 3355f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott (uInt) PNG_ROWBYTES(png_ptr->pixel_depth, 3365f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->iwidth) + 1; 337893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.next_out = png_ptr->row_buf; 338893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 339893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 340a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 3415f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_gAMA_SUPPORTED 342893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 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 } 349a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 350893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length); 351893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 352a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 353893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 3545f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sBIT_SUPPORTED 355893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4)) 356893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 357893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 358893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 359893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 360893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 361893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 362a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 363893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length); 364893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 365a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 366893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 3675f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_cHRM_SUPPORTED 368893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4)) 369893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 371893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 372893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 374893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 375a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 376893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length); 377893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 378a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 379893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 3805f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sRGB_SUPPORTED 381893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4)) 382893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 383893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 384893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 386893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 387893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 388a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length); 390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 391a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 3935f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_iCCP_SUPPORTED 394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4)) 395893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 396893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 397893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 398893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 399893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 400893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 401a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length); 403893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 404a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 405893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 4065f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sPLT_SUPPORTED 407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4)) 408893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 413893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 414a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length); 416893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 417a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 418893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 4195f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tRNS_SUPPORTED 420893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4)) 421893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 422893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 423893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 424893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 425893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 426893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 427a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length); 429893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 430a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 431893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 4325f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_bKGD_SUPPORTED 433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4)) 434893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 435893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 438893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 439893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 440a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 441893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length); 442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 443a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 444893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 4455f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_hIST_SUPPORTED 446893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4)) 447893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 448893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 449893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 450893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 451893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 452893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 453a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 454893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length); 455893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 456a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 457893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 4585f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_pHYs_SUPPORTED 459893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4)) 460893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 461893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 462893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 463893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 464893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 465893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 466a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 467893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length); 468893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 469a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 4715f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_oFFs_SUPPORTED 472893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4)) 473893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 474893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 475893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 476893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 478893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 479a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 480893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length); 481893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 482893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 483a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 4845f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_pCAL_SUPPORTED 485893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 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 } 492a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 493893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length); 494893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 495a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 496893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 4975f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_sCAL_SUPPORTED 498893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4)) 499893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 500893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 502893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 503893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 504893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 505a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 506893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length); 507893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 508a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 509893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 5105f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tIME_SUPPORTED 511893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4)) 512893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 513893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 514893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 515893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 516893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 517893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 518a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 519893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length); 520893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 521a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 522893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 5235f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tEXt_SUPPORTED 524893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) 525893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 526893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 527893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 528893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 529893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 530893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 531a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 532893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length); 533893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 534a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 535893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 5365f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_zTXt_SUPPORTED 537893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) 538893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 539893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 540893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 541893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 542893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 543893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 544a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 545893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length); 546893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 547a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 548893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 5495f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_iTXt_SUPPORTED 550893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) 551893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 552893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 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 } 557a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 558893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); 559893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 560a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 561893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 562893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 563893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 564893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->push_length + 4 > png_ptr->buffer_size) 565893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 566893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 567893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 568893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 569893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); 570893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 571893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 572893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; 573893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 574893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 575893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 576893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_crc_skip(png_structp png_ptr, png_uint_32 skip) 577893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 578893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->process_mode = PNG_SKIP_MODE; 579893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->skip_length = skip; 580893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 581893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 582893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 583893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_crc_finish(png_structp png_ptr) 584893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 585893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->skip_length && png_ptr->save_buffer_size) 586893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 587893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t save_size; 588893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 589893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->skip_length < (png_uint_32)png_ptr->save_buffer_size) 590893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save_size = (png_size_t)png_ptr->skip_length; 591893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 592893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save_size = png_ptr->save_buffer_size; 593893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 594893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); 595893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 596893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->skip_length -= save_size; 597893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->buffer_size -= save_size; 598893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->save_buffer_size -= save_size; 599893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->save_buffer_ptr += save_size; 600893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 601893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->skip_length && png_ptr->current_buffer_size) 602893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 603893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t save_size; 604893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 605893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->skip_length < (png_uint_32)png_ptr->current_buffer_size) 606893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save_size = (png_size_t)png_ptr->skip_length; 607893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 608893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save_size = png_ptr->current_buffer_size; 609893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 610893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); 611893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 612893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->skip_length -= save_size; 613893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->buffer_size -= save_size; 614893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_buffer_size -= save_size; 615893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_buffer_ptr += save_size; 616893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 617893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!png_ptr->skip_length) 618893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 619893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size < 4) 620893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 621893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 622893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 623893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 624893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 625893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_crc_finish(png_ptr, 0); 626893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->process_mode = PNG_READ_CHUNK_MODE; 627893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 628893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 629893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 630893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 631893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) 632893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 633893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep ptr; 634893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 635a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr == NULL) 636a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott return; 637a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 638893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ptr = buffer; 639893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->save_buffer_size) 640893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 641893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t save_size; 642893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 643893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (length < png_ptr->save_buffer_size) 644893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save_size = length; 645893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 646893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save_size = png_ptr->save_buffer_size; 647893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 648893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy(ptr, png_ptr->save_buffer_ptr, save_size); 649893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project length -= save_size; 650893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ptr += save_size; 651893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->buffer_size -= save_size; 652893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->save_buffer_size -= save_size; 653893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->save_buffer_ptr += save_size; 654893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 655893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (length && png_ptr->current_buffer_size) 656893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 657893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t save_size; 658893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 659893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (length < png_ptr->current_buffer_size) 660893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save_size = length; 661a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 662893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 663893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save_size = png_ptr->current_buffer_size; 664893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 665893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy(ptr, png_ptr->current_buffer_ptr, save_size); 666893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->buffer_size -= save_size; 667893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_buffer_size -= save_size; 668893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_buffer_ptr += save_size; 669893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 670893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 671893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 672893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 673893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_save_buffer(png_structp png_ptr) 674893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 675893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->save_buffer_size) 676893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 677893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->save_buffer_ptr != png_ptr->save_buffer) 678893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 6794215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_size_t i, istop; 680893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep sp; 681893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep dp; 682893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 683893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project istop = png_ptr->save_buffer_size; 684893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer; 685893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project i < istop; i++, sp++, dp++) 686893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 687893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *dp = *sp; 688893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 689893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 690893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 691893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->save_buffer_size + png_ptr->current_buffer_size > 692893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->save_buffer_max) 693893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 694893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t new_max; 695893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep old_buffer; 696893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 697893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->save_buffer_size > PNG_SIZE_MAX - 698893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_ptr->current_buffer_size + 256)) 699893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 700893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Potential overflow of save_buffer"); 701893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 702a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 703893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256; 704893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project old_buffer = png_ptr->save_buffer; 7055f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->save_buffer = (png_bytep)png_malloc_warn(png_ptr, 706893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_32)new_max); 7075f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott if (png_ptr->save_buffer == NULL) 7085f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott { 7095f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_free(png_ptr, old_buffer); 7105f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_error(png_ptr, "Insufficient memory for save_buffer"); 7115f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott } 712893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size); 713893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, old_buffer); 714893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->save_buffer_max = new_max; 715893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 716893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->current_buffer_size) 717893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 718893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size, 719893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_buffer_ptr, png_ptr->current_buffer_size); 720893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->save_buffer_size += png_ptr->current_buffer_size; 721893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_buffer_size = 0; 722893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 723893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->save_buffer_ptr = png_ptr->save_buffer; 724893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->buffer_size = 0; 725893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 726893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 727893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 728893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_restore_buffer(png_structp png_ptr, png_bytep buffer, 729893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t buffer_length) 730893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 731893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_buffer = buffer; 732893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_buffer_size = buffer_length; 733893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->buffer_size = buffer_length + png_ptr->save_buffer_size; 734893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_buffer_ptr = png_ptr->current_buffer; 735893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 736893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 737893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 738893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_read_IDAT(png_structp png_ptr) 739893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 740893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS 741893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST PNG_IDAT; 742893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 743893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER)) 744893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 745893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_byte chunk_length[4]; 746893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 747893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size < 8) 748893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 749893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 750893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 751893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 752893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 753893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_fill_buffer(png_ptr, chunk_length, 4); 7544215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length); 755893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_reset_crc(png_ptr); 756893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_crc_read(png_ptr, png_ptr->chunk_name, 4); 757893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; 758893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 759893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 760893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 761893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->process_mode = PNG_READ_CHUNK_MODE; 762893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) 763893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Not enough compressed data"); 764893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 765893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 766893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 767893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->idat_size = png_ptr->push_length; 768893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 769893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->idat_size && png_ptr->save_buffer_size) 770893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 771893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t save_size; 772893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 773893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->idat_size < (png_uint_32)png_ptr->save_buffer_size) 774893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 775893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save_size = (png_size_t)png_ptr->idat_size; 776a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 777a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Check for overflow */ 7784215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if ((png_uint_32)save_size != png_ptr->idat_size) 779893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "save_size overflowed in pngpread"); 780893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 781893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 782893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save_size = png_ptr->save_buffer_size; 783893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 784893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); 785a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 7865f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size); 787a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 788893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->idat_size -= save_size; 789893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->buffer_size -= save_size; 790893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->save_buffer_size -= save_size; 791893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->save_buffer_ptr += save_size; 792893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 793893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->idat_size && png_ptr->current_buffer_size) 794893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 795893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t save_size; 796893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 797893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->idat_size < (png_uint_32)png_ptr->current_buffer_size) 798893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 799893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save_size = (png_size_t)png_ptr->idat_size; 800a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 801a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Check for overflow */ 8024215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if ((png_uint_32)save_size != png_ptr->idat_size) 803893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "save_size overflowed in pngpread"); 804893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 805893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 806893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save_size = png_ptr->current_buffer_size; 807893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 808893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); 8095f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 8105f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size); 811893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 812893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->idat_size -= save_size; 813893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->buffer_size -= save_size; 814893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_buffer_size -= save_size; 815893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_buffer_ptr += save_size; 816893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 817893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!png_ptr->idat_size) 818893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 819893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size < 4) 820893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 821893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 822893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 823893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 824893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 825893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_crc_finish(png_ptr, 0); 826893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; 827893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mode |= PNG_AFTER_IDAT; 828893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 829893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 830893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 831893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 832893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_process_IDAT_data(png_structp png_ptr, png_bytep buffer, 833893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t buffer_length) 834893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 8355f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott /* The caller checks for a non-zero buffer length. */ 8365f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott if (!(buffer_length > 0) || buffer == NULL) 8375f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_error(png_ptr, "No IDAT data (internal error)"); 838893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 8395f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott /* This routine must process all the data it has been given 8405f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * before returning, calling the row callback as required to 8415f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * handle the uncompressed results. 8425f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott */ 843893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.next_in = buffer; 844893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.avail_in = (uInt)buffer_length; 8455f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 8465f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott /* Keep going until the decompressed data is all processed 8475f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * or the stream marked as finished. 8485f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott */ 8495f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott while (png_ptr->zstream.avail_in > 0 && 8505f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott !(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) 851893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 8525f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott int ret; 853a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 8545f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott /* We have data for zlib, but we must check that zlib 8555f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * has somewhere to put the results. It doesn't matter 8565f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * if we don't expect any results -- it may be the input 8575f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * data is just the LZ end code. 8585f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott */ 8595f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott if (!(png_ptr->zstream.avail_out > 0)) 8605f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott { 8615f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->zstream.avail_out = 8625f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott (uInt) PNG_ROWBYTES(png_ptr->pixel_depth, 8635f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->iwidth) + 1; 8645f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->zstream.next_out = png_ptr->row_buf; 8655f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott } 866893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 8675f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott /* Using Z_SYNC_FLUSH here means that an unterminated 8685f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * LZ stream can still be handled (a stream with a missing 8695f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * end code), otherwise (Z_NO_FLUSH) a future zlib 8705f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * implementation might defer output and, therefore, 8715f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * change the current behavior. (See comments in inflate.c 8725f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * for why this doesn't happen at present with zlib 1.2.5.) 8735f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott */ 8745f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott ret = inflate(&png_ptr->zstream, Z_SYNC_FLUSH); 875a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 8765f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott /* Check for any failure before proceeding. */ 8775f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott if (ret != Z_OK && ret != Z_STREAM_END) 8785f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott { 8795f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott /* Terminate the decompression. */ 8805f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; 8815f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 8825f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott /* This may be a truncated stream (missing or 8835f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * damaged end code). Treat that as a warning. 8845f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott */ 8855f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott if (png_ptr->row_number >= png_ptr->num_rows || 8865f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->pass > 6) 8875f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_warning(png_ptr, "Truncated compressed data in IDAT"); 8885f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott else 8895f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_error(png_ptr, "Decompression error in IDAT"); 8905f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 8915f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott /* Skip the check on unprocessed input */ 8925f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott return; 893893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 8945f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 8955f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott /* Did inflate output any data? */ 8965f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott if (png_ptr->zstream.next_out != png_ptr->row_buf) 897893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 8985f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott /* Is this unexpected data after the last row? 8995f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * If it is, artificially terminate the LZ output 9005f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * here. 9015f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott */ 9025f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott if (png_ptr->row_number >= png_ptr->num_rows || 9035f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->pass > 6) 904893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 9055f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott /* Extra data. */ 9065f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_warning(png_ptr, "Extra compressed data in IDAT"); 9075f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; 9085f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott /* Do no more processing; skip the unprocessed 9095f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * input check below. 9105f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott */ 9115f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott return; 9125f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott } 9135f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 9145f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott /* Do we have a complete row? */ 9155f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott if (png_ptr->zstream.avail_out == 0) 9165f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_push_process_row(png_ptr); 917893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 918a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 9195f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott /* And check for the end of the stream. */ 9205f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott if (ret == Z_STREAM_END) 9215f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; 922893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 9235f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 9245f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott /* All the data should have been processed, if anything 9255f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * is left at this point we have bytes of IDAT data 9265f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * after the zlib end code. 9275f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott */ 9285f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott if (png_ptr->zstream.avail_in > 0) 9295f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_warning(png_ptr, "Extra compression data"); 930893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 931893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 932893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 933893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_process_row(png_structp png_ptr) 934893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 935893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.color_type = png_ptr->color_type; 936893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.width = png_ptr->iwidth; 937893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.channels = png_ptr->channels; 938893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.bit_depth = png_ptr->bit_depth; 939893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.pixel_depth = png_ptr->pixel_depth; 940893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 941893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, 942893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.width); 943893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 944893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_filter_row(png_ptr, &(png_ptr->row_info), 9455f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->row_buf + 1, png_ptr->prev_row + 1, 9465f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott (int)(png_ptr->row_buf[0])); 947893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 948893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf, 949893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->rowbytes + 1); 950893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 951893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA)) 952893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_do_read_transformations(png_ptr); 953893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 9545f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_INTERLACING_SUPPORTED 955a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Blow up interlaced rows to full size */ 956893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) 957893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 958893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->pass < 6) 959893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* old interface (pre-1.0.9): 960893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_do_read_interlace(&(png_ptr->row_info), 9615f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations); 962893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 963893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_do_read_interlace(png_ptr); 964893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 965893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project switch (png_ptr->pass) 966893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 967893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 0: 968893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 969893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int i; 970893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 8 && png_ptr->pass == 0; i++) 971893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 972893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 973a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott png_read_push_finish_row(png_ptr); /* Updates png_ptr->pass */ 974893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 975a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 976a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr->pass == 2) /* Pass 1 might be empty */ 977893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 978893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 4 && png_ptr->pass == 2; i++) 979893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 980893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 981893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 982893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 983893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 984a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 985893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->pass == 4 && png_ptr->height <= 4) 986893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 987893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 2 && png_ptr->pass == 4; i++) 988893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 989893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 990893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 991893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 992893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 993a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 994893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->pass == 6 && png_ptr->height <= 4) 995893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 9965f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_push_have_row(png_ptr, png_bytep_NULL); 997893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 998893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 999a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1000893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 1001893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1002a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1003893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 1: 1004893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1005893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int i; 1006893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 8 && png_ptr->pass == 1; i++) 1007893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1008893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 1009893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 1010893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1011a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1012a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr->pass == 2) /* Skip top 4 generated rows */ 1013893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1014893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 4 && png_ptr->pass == 2; i++) 1015893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1016893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 1017893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 1018893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1019893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1020a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1021893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 1022893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1023a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1024893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 2: 1025893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1026893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int i; 1027a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1028893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 4 && png_ptr->pass == 2; i++) 1029893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1030893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 1031893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 1032893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1033a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1034893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 4 && png_ptr->pass == 2; i++) 1035893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 10365f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_push_have_row(png_ptr, png_bytep_NULL); 1037893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 1038893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1039a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1040a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr->pass == 4) /* Pass 3 might be empty */ 1041893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1042893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 2 && png_ptr->pass == 4; i++) 1043893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1044893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 1045893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 1046893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1047893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1048a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1049893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 1050893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1051a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1052893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 3: 1053893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1054893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int i; 1055a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1056893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 4 && png_ptr->pass == 3; i++) 1057893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1058893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 1059893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 1060893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1061a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1062a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr->pass == 4) /* Skip top two generated rows */ 1063893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1064893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 2 && png_ptr->pass == 4; i++) 1065893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1066893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_bytep_NULL); 1067893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 1068893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1069893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1070a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1071893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 1072893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1073a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1074893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 4: 1075893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1076893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int i; 1077a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1078893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 2 && png_ptr->pass == 4; i++) 1079893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1080893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 1081893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 1082893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1083a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1084893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 2 && png_ptr->pass == 4; i++) 1085893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 10865f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_push_have_row(png_ptr, png_bytep_NULL); 1087893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 1088893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1089a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1090a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr->pass == 6) /* Pass 5 might be empty */ 1091893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 10925f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_push_have_row(png_ptr, png_bytep_NULL); 1093893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 1094893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1095a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1096893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 1097893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1098a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1099893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 5: 1100893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1101893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int i; 1102a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1103893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < 2 && png_ptr->pass == 5; i++) 1104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 1106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 1107893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1108a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1109a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr->pass == 6) /* Skip top generated row */ 1110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 11115f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_push_have_row(png_ptr, png_bytep_NULL); 1112893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 1113893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1114a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1115893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 1116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 6: 1118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 1120893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 1121a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1122893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->pass != 6) 1123893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 1124a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 11255f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_push_have_row(png_ptr, png_bytep_NULL); 1126893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 1127893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1130893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1131893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1132893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1133893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_have_row(png_ptr, png_ptr->row_buf + 1); 1134893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_read_push_finish_row(png_ptr); 1135893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1136893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1137893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1138893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 1139893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_read_push_finish_row(png_structp png_ptr) 1140893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1141893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS 1142a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ 1143893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1144a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Start of interlace block */ 1145893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; 1146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1147a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Offset to next interlace block */ 1148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; 1149893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1150a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Start of interlace block in the y direction */ 1151893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; 1152893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1153a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Offset to next interlace block in the y direction */ 1154893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2}; 1155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1156893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Height of interlace block. This is not currently used - if you need 1157893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * it, uncomment it here and in png.h 1158893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1}; 1159893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 1160893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1161893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1162893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_number++; 1163893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->row_number < png_ptr->num_rows) 1164893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1165893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 11665f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_INTERLACING_SUPPORTED 1167893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->interlaced) 1168893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1169893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_number = 0; 1170893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memset_check(png_ptr, png_ptr->prev_row, 0, 1171893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->rowbytes + 1); 1172893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project do 1173893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 11744215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->pass++; 11754215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if ((png_ptr->pass == 1 && png_ptr->width < 5) || 11764215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project (png_ptr->pass == 3 && png_ptr->width < 3) || 11774215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project (png_ptr->pass == 5 && png_ptr->width < 2)) 11784215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->pass++; 11794215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project 11804215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_ptr->pass > 7) 11814215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->pass--; 1182a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 11834215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_ptr->pass >= 7) 11844215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project break; 11854215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project 11864215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->iwidth = (png_ptr->width + 11874215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_pass_inc[png_ptr->pass] - 1 - 11884215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_pass_start[png_ptr->pass]) / 11894215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_pass_inc[png_ptr->pass]; 11904215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project 11914215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_ptr->transformations & PNG_INTERLACE) 11924215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project break; 11934215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project 11944215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->num_rows = (png_ptr->height + 11954215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_pass_yinc[png_ptr->pass] - 1 - 11964215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_pass_ystart[png_ptr->pass]) / 11974215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_pass_yinc[png_ptr->pass]; 1198893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0); 1200893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1201a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott#endif /* PNG_READ_INTERLACING_SUPPORTED */ 1202893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1203893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 12045f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_tEXt_SUPPORTED 1205893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 1206893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 1207893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project length) 1208893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1209893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) 1210893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1211893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Out of place tEXt"); 1212a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott info_ptr = info_ptr; /* To quiet some compiler warnings */ 1213893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1214893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1215893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K 1216893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->skip_length = 0; /* This may not be necessary */ 1217893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ 1219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1220893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "tEXt chunk too large to fit in memory"); 1221893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->skip_length = length - (png_uint_32)65535L; 1222893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project length = (png_uint_32)65535L; 1223893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1224893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1225893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1226893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text = (png_charp)png_malloc(png_ptr, 12274215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project (png_uint_32)(length + 1)); 1228893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text[length] = '\0'; 1229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_ptr = png_ptr->current_text; 1230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_size = (png_size_t)length; 1231893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_left = (png_size_t)length; 1232893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->process_mode = PNG_READ_tEXt_MODE; 1233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1235893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 1236893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_read_tEXt(png_structp png_ptr, png_infop info_ptr) 1237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1238893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size && png_ptr->current_text_left) 1239893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1240893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t text_size; 1241893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1242893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size < png_ptr->current_text_left) 1243893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_size = png_ptr->buffer_size; 1244a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1245893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_size = png_ptr->current_text_left; 1247a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1248893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); 1249893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_left -= text_size; 1250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_ptr += text_size; 1251893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1252893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->current_text_left)) 1253893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_textp text_ptr; 1255893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_charp text; 1256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_charp key; 1257893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int ret; 1258893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1259893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size < 4) 1260893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1261893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 1262893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1263893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1264893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_crc_finish(png_ptr); 1266893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 12675f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_MAX_MALLOC_64K 1268893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->skip_length) 1269893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1271893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1272893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project key = png_ptr->current_text; 1273893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1274893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (text = key; *text; text++) 1275a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Empty loop */ ; 1276893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1277893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (text < key + png_ptr->current_text_size) 1278893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text++; 1279893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1280893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr = (png_textp)png_malloc(png_ptr, 1281893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_32)png_sizeof(png_text)); 1282893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; 1283893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->key = key; 1284893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_iTXt_SUPPORTED 1285893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->lang = NULL; 1286893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->lang_key = NULL; 1287893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1288893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->text = text; 1289893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1290893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); 1291893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1292893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, key); 1293893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, text_ptr); 1294893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text = NULL; 1295893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1296893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret) 1297893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Insufficient memory to store text chunk."); 1298893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1299893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1300893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1301893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 13025f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_zTXt_SUPPORTED 1303893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 1304893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 1305893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project length) 1306893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1307893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) 1308893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1309893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Out of place zTXt"); 1310a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott info_ptr = info_ptr; /* To quiet some compiler warnings */ 1311893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1312893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1313893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K 1314893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* We can't handle zTXt chunks > 64K, since we don't have enough space 1315893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * to be able to store the uncompressed data. Actually, the threshold 1316893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * is probably around 32K, but it isn't as definite as 64K is. 1317893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 1318893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (length > (png_uint_32)65535L) 1319893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1320893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "zTXt chunk too large to fit in memory"); 1321893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_crc_skip(png_ptr, length); 1322893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1323893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1324893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1325893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1326893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text = (png_charp)png_malloc(png_ptr, 13274215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project (png_uint_32)(length + 1)); 1328893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text[length] = '\0'; 1329893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_ptr = png_ptr->current_text; 1330893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_size = (png_size_t)length; 1331893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_left = (png_size_t)length; 1332893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->process_mode = PNG_READ_zTXt_MODE; 1333893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1334893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1335893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 1336893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_read_zTXt(png_structp png_ptr, png_infop info_ptr) 1337893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1338893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size && png_ptr->current_text_left) 1339893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1340893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t text_size; 1341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1342893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left) 1343893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_size = png_ptr->buffer_size; 1344a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1345893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1346893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_size = png_ptr->current_text_left; 1347a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1348893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); 1349893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_left -= text_size; 1350893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_ptr += text_size; 1351893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1352893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->current_text_left)) 1353893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1354893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_textp text_ptr; 1355893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_charp text; 1356893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_charp key; 1357893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int ret; 1358893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t text_size, key_size; 1359893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1360893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size < 4) 1361893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1362893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 1363893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1364893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1365893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1366893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_crc_finish(png_ptr); 1367893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1368893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project key = png_ptr->current_text; 1369893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (text = key; *text; text++) 1371a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Empty loop */ ; 1372893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* zTXt can't have zero text */ 1374893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (text >= key + png_ptr->current_text_size) 1375893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1376893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text = NULL; 1377893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, key); 1378893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1379893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1380893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1381893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text++; 1382893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1383a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (*text != PNG_TEXT_COMPRESSION_zTXt) /* Check compression byte */ 1384893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text = NULL; 1386893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, key); 1387893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1388893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text++; 1391893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.next_in = (png_bytep )text; 1393893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size - 1394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (text - key)); 1395893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.next_out = png_ptr->zbuf; 1396893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; 1397893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1398893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project key_size = text - key; 1399893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_size = 0; 1400893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text = NULL; 1401893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ret = Z_STREAM_END; 1402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1403893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project while (png_ptr->zstream.avail_in) 1404893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1405893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); 1406893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret != Z_OK && ret != Z_STREAM_END) 1407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1408893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project inflateReset(&png_ptr->zstream); 1409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.avail_in = 0; 1410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text = NULL; 1411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, key); 1412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, text); 1413893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1414893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END) 1416893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1417893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (text == NULL) 1418893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1419893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text = (png_charp)png_malloc(png_ptr, 14204215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project (png_uint_32)(png_ptr->zbuf_size 14214215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project - png_ptr->zstream.avail_out + key_size + 1)); 1422a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1423893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy(text + key_size, png_ptr->zbuf, 1424893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zbuf_size - png_ptr->zstream.avail_out); 1425a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1426893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy(text, key, key_size); 1427a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_size = key_size + png_ptr->zbuf_size - 1429893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.avail_out; 1430a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1431893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(text + text_size) = '\0'; 1432893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1434893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1435893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_charp tmp; 1436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project tmp = text; 1438893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text = (png_charp)png_malloc(png_ptr, text_size + 14394215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project (png_uint_32)(png_ptr->zbuf_size 14404215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project - png_ptr->zstream.avail_out + 1)); 1441a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy(text, tmp, text_size); 1443893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, tmp); 1444a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1445893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy(text + text_size, png_ptr->zbuf, 1446893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zbuf_size - png_ptr->zstream.avail_out); 1447a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1448893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out; 1449893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(text + text_size) = '\0'; 1450893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1451893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret != Z_STREAM_END) 1452893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1453893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.next_out = png_ptr->zbuf; 1454893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; 1455893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1456893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1457893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1458893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1459893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 1460893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1461893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1462893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret == Z_STREAM_END) 1463893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 1464893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1465893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1466893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project inflateReset(&png_ptr->zstream); 1467893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.avail_in = 0; 1468893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1469893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret != Z_STREAM_END) 1470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1471893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text = NULL; 1472893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, key); 1473893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, text); 1474893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1475893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1476893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text = NULL; 1478893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, key); 1479893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project key = text; 1480893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text += key_size; 1481893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1482893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr = (png_textp)png_malloc(png_ptr, 1483893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_32)png_sizeof(png_text)); 1484893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt; 1485893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->key = key; 1486893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_iTXt_SUPPORTED 1487893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->lang = NULL; 1488893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->lang_key = NULL; 1489893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1490893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->text = text; 1491893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1492893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); 1493893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1494893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, key); 1495893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, text_ptr); 1496893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1497893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret) 1498893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Insufficient memory to store text chunk."); 1499893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1500893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1502893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 15035f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_iTXt_SUPPORTED 1504893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 1505893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 1506893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project length) 1507893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1508893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) 1509893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1510893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Out of place iTXt"); 1511a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott info_ptr = info_ptr; /* To quiet some compiler warnings */ 1512893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1513893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1514893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K 1515893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->skip_length = 0; /* This may not be necessary */ 1516893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1517893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ 1518893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1519893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "iTXt chunk too large to fit in memory"); 1520893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->skip_length = length - (png_uint_32)65535L; 1521893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project length = (png_uint_32)65535L; 1522893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1523893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1524893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1525893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text = (png_charp)png_malloc(png_ptr, 15264215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project (png_uint_32)(length + 1)); 1527893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text[length] = '\0'; 1528893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_ptr = png_ptr->current_text; 1529893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_size = (png_size_t)length; 1530893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_left = (png_size_t)length; 1531893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->process_mode = PNG_READ_iTXt_MODE; 1532893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1533893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1534893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 1535893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_read_iTXt(png_structp png_ptr, png_infop info_ptr) 1536893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1537893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1538893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size && png_ptr->current_text_left) 1539893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1540893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t text_size; 1541893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1542893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size < png_ptr->current_text_left) 1543893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_size = png_ptr->buffer_size; 1544a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1545893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1546893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_size = png_ptr->current_text_left; 1547a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1548893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); 1549893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_left -= text_size; 1550893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text_ptr += text_size; 1551893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1552893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->current_text_left)) 1553893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1554893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_textp text_ptr; 1555893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_charp key; 1556893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int comp_flag; 1557893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_charp lang; 1558893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_charp lang_key; 1559893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_charp text; 1560893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int ret; 1561893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1562893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->buffer_size < 4) 1563893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1564893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_save_buffer(png_ptr); 1565893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1566893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1567893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1568893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_crc_finish(png_ptr); 1569893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 15705f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_MAX_MALLOC_64K 1571893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->skip_length) 1572893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1573893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1574893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1575893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project key = png_ptr->current_text; 1576893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1577893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (lang = key; *lang; lang++) 1578a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Empty loop */ ; 1579893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1580893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (lang < key + png_ptr->current_text_size - 3) 1581893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project lang++; 1582893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1583893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project comp_flag = *lang++; 1584a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott lang++; /* Skip comp_type, always zero */ 1585893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1586893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (lang_key = lang; *lang_key; lang_key++) 1587a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Empty loop */ ; 1588a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1589a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott lang_key++; /* Skip NUL separator */ 1590893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1591893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text=lang_key; 1592a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1593893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (lang_key < key + png_ptr->current_text_size - 1) 1594893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1595893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (; *text; text++) 1596a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Empty loop */ ; 1597893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1598893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1599893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (text < key + png_ptr->current_text_size) 1600893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text++; 1601893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1602893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr = (png_textp)png_malloc(png_ptr, 1603893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_32)png_sizeof(png_text)); 1604a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1605893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->compression = comp_flag + 2; 1606893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->key = key; 1607893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->lang = lang; 1608893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->lang_key = lang_key; 1609893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->text = text; 1610893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->text_length = 0; 1611893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project text_ptr->itxt_length = png_strlen(text); 1612893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1613893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); 1614893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1615893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->current_text = NULL; 1616893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1617893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, text_ptr); 1618893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret) 16195f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_warning(png_ptr, "Insufficient memory to store iTXt chunk."); 1620893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1621893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1622893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1623893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1624893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* This function is called when we haven't found a handler for this 1625893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * chunk. If there isn't a problem with the chunk itself (ie a bad chunk 1626893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * name or a critical chunk), the chunk is (currently) silently ignored. 1627893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 1628893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 1629893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 1630893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project length) 1631893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 16324215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_uint_32 skip = 0; 1633893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1634893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->chunk_name[0] & 0x20)) 1635893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 16365f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED 16374215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != 16384215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project PNG_HANDLE_CHUNK_ALWAYS 16395f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_USER_CHUNKS_SUPPORTED 16404215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project && png_ptr->read_user_chunk_fn == NULL 1641893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 16424215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project ) 1643893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 16444215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_chunk_error(png_ptr, "unknown critical chunk"); 1645893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1646a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott info_ptr = info_ptr; /* To quiet some compiler warnings */ 1647893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1648893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 16495f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED 1650893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) 1651893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1652893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_MAX_MALLOC_64K 1653893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (length > (png_uint_32)65535L) 1654893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1655893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "unknown chunk too large to fit in memory"); 1656893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project skip = length - (png_uint_32)65535L; 1657893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project length = (png_uint_32)65535L; 1658893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1659893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1660893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy((png_charp)png_ptr->unknown_chunk.name, 1661893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_charp)png_ptr->chunk_name, 1662893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_sizeof(png_ptr->unknown_chunk.name)); 16634215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name) - 1] 16644215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project = '\0'; 1665893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1666893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->unknown_chunk.size = (png_size_t)length; 1667a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1668893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (length == 0) 1669893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->unknown_chunk.data = NULL; 1670a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1671893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1672893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 16734215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, 16745f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott (png_uint_32)length); 1675893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length); 1676893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1677a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 16785f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_USER_CHUNKS_SUPPORTED 16794215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_ptr->read_user_chunk_fn != NULL) 1680893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1681a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Callback to user unknown chunk handler */ 1682893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int ret; 1683893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ret = (*(png_ptr->read_user_chunk_fn)) 1684893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_ptr, &png_ptr->unknown_chunk); 1685a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1686893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret < 0) 1687893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_chunk_error(png_ptr, "error in user chunk"); 1688a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1689893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret == 0) 1690893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1691893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->chunk_name[0] & 0x20)) 16924215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != 1693893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_HANDLE_CHUNK_ALWAYS) 1694893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_chunk_error(png_ptr, "unknown critical chunk"); 1695893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_unknown_chunks(png_ptr, info_ptr, 1696893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project &png_ptr->unknown_chunk, 1); 1697893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1698893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1699a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1700893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1701893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1702893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); 1703893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->unknown_chunk.data); 1704893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->unknown_chunk.data = NULL; 1705893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1706a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1707893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1708893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1709893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project skip=length; 1710893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_push_crc_skip(png_ptr, skip); 1711893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1712893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1713893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 1714893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_have_info(png_structp png_ptr, png_infop info_ptr) 1715893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1716893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->info_fn != NULL) 1717893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (*(png_ptr->info_fn))(png_ptr, info_ptr); 1718893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1719893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1720893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 1721893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_have_end(png_structp png_ptr, png_infop info_ptr) 1722893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1723893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->end_fn != NULL) 1724893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (*(png_ptr->end_fn))(png_ptr, info_ptr); 1725893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1726893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1727893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 1728893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_push_have_row(png_structp png_ptr, png_bytep row) 1729893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1730893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->row_fn != NULL) 1731893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (*(png_ptr->row_fn))(png_ptr, row, png_ptr->row_number, 1732893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (int)png_ptr->pass); 1733893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1734893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1735893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 1736893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_progressive_combine_row (png_structp png_ptr, 1737893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep old_row, png_bytep new_row) 1738893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1739893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USE_LOCAL_ARRAYS 1740893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_CONST int FARDATA png_pass_dsp_mask[7] = 1741893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff}; 1742893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 17435f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 1744a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr == NULL) 1745a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott return; 1746a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1747893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (new_row != NULL) /* new_row must == png_ptr->row_buf here. */ 1748893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]); 1749893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1750893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1751893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 1752893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr, 1753893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, 1754893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_progressive_end_ptr end_fn) 1755893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1756a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr == NULL) 1757a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott return; 1758a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1759893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->info_fn = info_fn; 1760893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_fn = row_fn; 1761893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->end_fn = end_fn; 1762893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1763893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer); 1764893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1765893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1766893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_voidp PNGAPI 1767893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_get_progressive_ptr(png_structp png_ptr) 1768893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1769a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr == NULL) 1770a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott return (NULL); 1771a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1772893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return png_ptr->io_ptr; 1773893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1774893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ 1775