1893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 2893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* pngwrite.c - general routines to write a PNG file 3893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 466dce0da6a5db51ee0c2875517d3a6ca6cbbe53dEric Vannier * Last changed in libpng 1.2.45 [July 7, 2011] 566dce0da6a5db51ee0c2875517d3a6ca6cbbe53dEric Vannier * Copyright (c) 1998-2011 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 14a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Get internal access to png.h */ 15893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_INTERNAL 165f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#define PNG_NO_PEDANTIC_WARNINGS 17893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include "png.h" 18893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED 19893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 20893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Writes all the PNG information. This is the suggested way to use the 21893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * library. If you have a new chunk to add, make a function to write it, 22893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * and put it in the correct location here. If you want the chunk written 23893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * after the image data, put it in png_write_end(). I strongly encourage 24893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * you to supply a PNG_INFO_ flag, and check info_ptr->valid before writing 25893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * the chunk, as that will keep the code from breaking if you want to just 26893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * write a plain PNG file. If you have long comments, I suggest writing 27893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * them in png_write_end(), and compressing them. 28893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 29893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 30893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr) 31893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 324215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_write_info_before_PLTE"); 335f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 34893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL || info_ptr == NULL) 35893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 36893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) 37893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 385f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott /* Write PNG signature */ 395f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_write_sig(png_ptr); 405f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_MNG_FEATURES_SUPPORTED 415f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott if ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) && \ 425f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott (png_ptr->mng_features_permitted)) 43893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 444215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_warning(png_ptr, "MNG features are not allowed in a PNG datastream"); 455f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->mng_features_permitted = 0; 46893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 47893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 48a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Write IHDR information. */ 49893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height, 50893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type, 51893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->filter_type, 525f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_INTERLACING_SUPPORTED 53893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->interlace_type); 54893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 55893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0); 56893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 57a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* The rest of these check to see if the valid field has the appropriate 58a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * flag set, and if it does, writes the chunk. 59a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott */ 605f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_gAMA_SUPPORTED 61893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_gAMA) 62893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 63893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# ifdef PNG_FLOATING_POINT_SUPPORTED 64893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_gAMA(png_ptr, info_ptr->gamma); 65893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 66893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_FIXED_POINT_SUPPORTED 67893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_gAMA_fixed(png_ptr, info_ptr->int_gamma); 68893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# endif 69893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 70893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 71893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 725f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_sRGB_SUPPORTED 73893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_sRGB) 74893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_sRGB(png_ptr, (int)info_ptr->srgb_intent); 75893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 765f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_iCCP_SUPPORTED 77893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_iCCP) 78893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_iCCP(png_ptr, info_ptr->iccp_name, PNG_COMPRESSION_TYPE_BASE, 79893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->iccp_profile, (int)info_ptr->iccp_proflen); 80893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 815f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_sBIT_SUPPORTED 82893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_sBIT) 83893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_sBIT(png_ptr, &(info_ptr->sig_bit), info_ptr->color_type); 84893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 855f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_cHRM_SUPPORTED 86893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_cHRM) 87893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 88893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_FLOATING_POINT_SUPPORTED 89893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_cHRM(png_ptr, 90893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->x_white, info_ptr->y_white, 91893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->x_red, info_ptr->y_red, 92893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->x_green, info_ptr->y_green, 93893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->x_blue, info_ptr->y_blue); 94893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 95893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# ifdef PNG_FIXED_POINT_SUPPORTED 96893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_cHRM_fixed(png_ptr, 97893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->int_x_white, info_ptr->int_y_white, 98893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->int_x_red, info_ptr->int_y_red, 99893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->int_x_green, info_ptr->int_y_green, 100893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->int_x_blue, info_ptr->int_y_blue); 101893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# endif 102893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 103893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1055f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED 106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->unknown_chunks_num) 107893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 108a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott png_unknown_chunk *up; 109893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 110a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott png_debug(5, "writing extra chunks"); 111893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 112a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott for (up = info_ptr->unknown_chunks; 113a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; 114a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott up++) 115a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott { 1165f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott int keep = png_handle_as_unknown(png_ptr, up->name); 117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (keep != PNG_HANDLE_CHUNK_NEVER && 118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project up->location && !(up->location & PNG_HAVE_PLTE) && 119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project !(up->location & PNG_HAVE_IDAT) && 120893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || 121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) 122893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 123893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (up->size == 0) 124893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Writing zero-length unknown chunk"); 125893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_chunk(png_ptr, up->name, up->data, up->size); 126893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 127a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott } 128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 130893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE; 131893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 132893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 133893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 134893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 135893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_write_info(png_structp png_ptr, png_infop info_ptr) 136893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 137893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) 138893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int i; 139893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 140893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1414215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_write_info"); 142893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 143893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL || info_ptr == NULL) 144893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 145893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_info_before_PLTE(png_ptr, info_ptr); 147893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_PLTE) 149893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_PLTE(png_ptr, info_ptr->palette, 150893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_32)info_ptr->num_palette); 151893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) 152893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Valid palette required for paletted images"); 153893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1545f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_tRNS_SUPPORTED 155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_tRNS) 156a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott { 1575f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED 158a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Invert the alpha channel (in tRNS) */ 159a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if ((png_ptr->transformations & PNG_INVERT_ALPHA) && 160a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) 161a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott { 162a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott int j; 1635f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott for (j = 0; j<(int)info_ptr->num_trans; j++) 164a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott info_ptr->trans[j] = (png_byte)(255 - info_ptr->trans[j]); 165a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott } 166893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 167893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_tRNS(png_ptr, info_ptr->trans, &(info_ptr->trans_values), 168893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->num_trans, info_ptr->color_type); 169a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott } 170893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1715f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_bKGD_SUPPORTED 172893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_bKGD) 173893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_bKGD(png_ptr, &(info_ptr->background), info_ptr->color_type); 174893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1755f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_hIST_SUPPORTED 176893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_hIST) 177893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_hIST(png_ptr, info_ptr->hist, info_ptr->num_palette); 178893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1795f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_oFFs_SUPPORTED 180893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_oFFs) 181893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_oFFs(png_ptr, info_ptr->x_offset, info_ptr->y_offset, 182893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->offset_unit_type); 183893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1845f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_pCAL_SUPPORTED 185893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_pCAL) 186893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_pCAL(png_ptr, info_ptr->pcal_purpose, info_ptr->pcal_X0, 187893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->pcal_X1, info_ptr->pcal_type, info_ptr->pcal_nparams, 188893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->pcal_units, info_ptr->pcal_params); 189893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 190a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 1915f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_sCAL_SUPPORTED 192893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_sCAL) 1935f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_sCAL_SUPPORTED 1945f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#if defined(PNG_FLOATING_POINT_SUPPORTED) && defined(PNG_STDIO_SUPPORTED) 195893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_sCAL(png_ptr, (int)info_ptr->scal_unit, 196893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->scal_pixel_width, info_ptr->scal_pixel_height); 197a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott#else /* !FLOATING_POINT */ 198893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_FIXED_POINT_SUPPORTED 199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_sCAL_s(png_ptr, (int)info_ptr->scal_unit, 200893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->scal_s_width, info_ptr->scal_s_height); 201a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott#endif /* FIXED_POINT */ 202a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott#endif /* FLOATING_POINT */ 203a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott#else /* !WRITE_sCAL */ 204893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, 205893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "png_write_sCAL not supported; sCAL chunk not written."); 206a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott#endif /* WRITE_sCAL */ 207a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott#endif /* sCAL */ 208a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 2095f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_pHYs_SUPPORTED 210893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_pHYs) 211893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_pHYs(png_ptr, info_ptr->x_pixels_per_unit, 212893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->y_pixels_per_unit, info_ptr->phys_unit_type); 213a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott#endif /* pHYs */ 214a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 2155f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_tIME_SUPPORTED 216893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_tIME) 217893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_tIME(png_ptr, &(info_ptr->mod_time)); 219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mode |= PNG_WROTE_tIME; 220893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 221a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott#endif /* tIME */ 222a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 2235f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_sPLT_SUPPORTED 224893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_sPLT) 225893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < (int)info_ptr->splt_palettes_num; i++) 226893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_sPLT(png_ptr, info_ptr->splt_palettes + i); 227a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott#endif /* sPLT */ 228a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 2295f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_TEXT_SUPPORTED 230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Check to see if we need to write text chunks */ 231893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < info_ptr->num_text; i++) 232893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 2334215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug2(2, "Writing header text chunk %d, type %d", i, 234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].compression); 235a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* An internationalized chunk? */ 236893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->text[i].compression > 0) 237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 2385f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_iTXt_SUPPORTED 239a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Write international chunk */ 240893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_iTXt(png_ptr, 241893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].compression, 242893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].key, 243893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].lang, 244893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].lang_key, 245893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].text); 246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 247893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Unable to write international text"); 248893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 249893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Mark this chunk as written */ 250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; 251893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 252893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* If we want a compressed text chunk */ 253893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_zTXt) 254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 2555f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_zTXt_SUPPORTED 256a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Write compressed chunk */ 257893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_zTXt(png_ptr, info_ptr->text[i].key, 258893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].text, 0, 259893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].compression); 260893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 261893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Unable to write compressed text"); 262893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 263893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Mark this chunk as written */ 264893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; 265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 266893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) 267893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 2685f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_tEXt_SUPPORTED 269a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Write uncompressed chunk */ 270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_tEXt(png_ptr, info_ptr->text[i].key, 271893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].text, 272893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0); 273a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Mark this chunk as written */ 274a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; 275893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 276a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Can't get here */ 277893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Unable to write uncompressed text"); 278893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 279893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 280893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 281a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott#endif /* tEXt */ 282a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott 2835f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED 284893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->unknown_chunks_num) 285893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 2865f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_unknown_chunk *up; 287893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 2885f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_debug(5, "writing extra chunks"); 289893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 2905f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott for (up = info_ptr->unknown_chunks; 2915f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; 2925f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott up++) 2935f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott { 2945f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott int keep = png_handle_as_unknown(png_ptr, up->name); 295893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (keep != PNG_HANDLE_CHUNK_NEVER && 296893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project up->location && (up->location & PNG_HAVE_PLTE) && 297893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project !(up->location & PNG_HAVE_IDAT) && 29866dce0da6a5db51ee0c2875517d3a6ca6cbbe53dEric Vannier !(up->location & PNG_AFTER_IDAT) && 299893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || 300893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) 301893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 302893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_chunk(png_ptr, up->name, up->data, up->size); 303893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 3045f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott } 305893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 306893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 307893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 308893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 309893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Writes the end of the PNG file. If you don't want to write comments or 310893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * time information, you can pass NULL for info. If you already wrote these 311893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * in png_write_info(), do not write them again here. If you have long 312893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * comments, I suggest writing them here, and compressing them. 313893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 314893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 315893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_write_end(png_structp png_ptr, png_infop info_ptr) 316893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 3174215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_write_end"); 3185f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 319893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 320893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 321893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_IDAT)) 322893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "No IDATs written into file"); 323893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 324a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* See if user wants us to write information chunks */ 325893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr != NULL) 326893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 3275f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_TEXT_SUPPORTED 3285f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott int i; /* local index variable */ 329893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 3305f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_tIME_SUPPORTED 331a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Check to see if user has supplied a time chunk */ 332893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((info_ptr->valid & PNG_INFO_tIME) && 333893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project !(png_ptr->mode & PNG_WROTE_tIME)) 334893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_tIME(png_ptr, &(info_ptr->mod_time)); 335893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 3365f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_TEXT_SUPPORTED 337a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Loop through comment chunks */ 338893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < info_ptr->num_text; i++) 339893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 3404215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug2(2, "Writing trailer text chunk %d, type %d", i, 341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].compression); 342a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* An internationalized chunk? */ 343893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->text[i].compression > 0) 344893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 3455f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_iTXt_SUPPORTED 3465f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott /* Write international chunk */ 3475f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_write_iTXt(png_ptr, 3485f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott info_ptr->text[i].compression, 3495f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott info_ptr->text[i].key, 3505f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott info_ptr->text[i].lang, 3515f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott info_ptr->text[i].lang_key, 3525f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott info_ptr->text[i].text); 353893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 3545f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_warning(png_ptr, "Unable to write international text"); 355893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 3565f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott /* Mark this chunk as written */ 3575f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; 358893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 359893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (info_ptr->text[i].compression >= PNG_TEXT_COMPRESSION_zTXt) 360893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 3615f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_zTXt_SUPPORTED 362a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Write compressed chunk */ 363893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_zTXt(png_ptr, info_ptr->text[i].key, 364893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].text, 0, 365893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].compression); 366893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 367893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Unable to write compressed text"); 368893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 369893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Mark this chunk as written */ 370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; 371893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 372893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) 373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 3745f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_tEXt_SUPPORTED 375a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Write uncompressed chunk */ 376893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_tEXt(png_ptr, info_ptr->text[i].key, 377893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].text, 0); 378893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 379893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Unable to write uncompressed text"); 380893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 381893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 382893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Mark this chunk as written */ 383893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; 384893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 386893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 3875f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED 388893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->unknown_chunks_num) 389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 3905f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_unknown_chunk *up; 391893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 3925f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_debug(5, "writing extra chunks"); 393893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 3945f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott for (up = info_ptr->unknown_chunks; 3955f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; 3965f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott up++) 3975f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott { 3985f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott int keep = png_handle_as_unknown(png_ptr, up->name); 399893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (keep != PNG_HANDLE_CHUNK_NEVER && 400893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project up->location && (up->location & PNG_AFTER_IDAT) && 401893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || 402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) 403893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 404893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_chunk(png_ptr, up->name, up->data, up->size); 405893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 4065f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott } 407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 408893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mode |= PNG_AFTER_IDAT; 412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 413a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Write end of PNG file */ 414893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_IEND(png_ptr); 4154215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project /* This flush, added in libpng-1.0.8, removed from libpng-1.0.9beta03, 4164215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project * and restored again in libpng-1.2.30, may cause some applications that 4174215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project * do not set png_ptr->output_flush_fn to crash. If your application 4184215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project * experiences a problem, please try building libpng with 4194215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project * PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED defined, and report the event to 4205f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * png-mng-implement at lists.sf.net . 4214215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project */ 4225f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_FLUSH_SUPPORTED 4235f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott# ifdef PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED 4244215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_flush(png_ptr); 4255f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott# endif 4264215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project#endif 427893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 4295f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_CONVERT_tIME_SUPPORTED 4305f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott/* "tm" structure is not supported on WindowsCE */ 431893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 432893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_convert_from_struct_tm(png_timep ptime, struct tm FAR * ttime) 433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 4344215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_convert_from_struct_tm"); 4355f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ptime->year = (png_uint_16)(1900 + ttime->tm_year); 437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ptime->month = (png_byte)(ttime->tm_mon + 1); 438893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ptime->day = (png_byte)ttime->tm_mday; 439893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ptime->hour = (png_byte)ttime->tm_hour; 440893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ptime->minute = (png_byte)ttime->tm_min; 441893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ptime->second = (png_byte)ttime->tm_sec; 442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 443893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 444893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 445893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_convert_from_time_t(png_timep ptime, time_t ttime) 446893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 447893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project struct tm *tbuf; 448893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 4494215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_convert_from_time_t"); 4505f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 451893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project tbuf = gmtime(&ttime); 452893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_convert_from_struct_tm(ptime, tbuf); 453893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 454893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 455893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 456893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Initialize png_ptr structure, and allocate any memory needed */ 457893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_structp PNGAPI 458893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_create_write_struct(png_const_charp user_png_ver, png_voidp error_ptr, 459893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error_ptr error_fn, png_error_ptr warn_fn) 460893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 461893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 462893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (png_create_write_struct_2(user_png_ver, error_ptr, error_fn, 463893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project warn_fn, png_voidp_NULL, png_malloc_ptr_NULL, png_free_ptr_NULL)); 464893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 465893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 466893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Alternate initialize png_ptr structure, and allocate any memory needed */ 467893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_structp PNGAPI 468893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, 469893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, 470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_malloc_ptr malloc_fn, png_free_ptr free_fn) 471893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 472893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 4734215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 4745f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott volatile 4754215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project#endif 4765f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_structp png_ptr; 477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 478893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef USE_FAR_KEYWORD 479893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project jmp_buf jmpbuf; 480893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 481893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 482893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int i; 4835f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 4844215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_create_write_struct"); 4855f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 486893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 487893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG, 488893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr); 489893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 490893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); 491893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 492893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 493893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (NULL); 494893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 495a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Added at libpng-1.2.6 */ 496893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SET_USER_LIMITS_SUPPORTED 4975f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->user_width_max = PNG_USER_WIDTH_MAX; 4985f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->user_height_max = PNG_USER_HEIGHT_MAX; 499893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 500893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 502893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef USE_FAR_KEYWORD 503893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (setjmp(jmpbuf)) 504893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 505893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (setjmp(png_ptr->jmpbuf)) 506893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 507893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 508893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->zbuf); 5095f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->zbuf = NULL; 5105f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_USER_MEM_SUPPORTED 5115f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_destroy_struct_2((png_voidp)png_ptr, 5125f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott (png_free_ptr)free_fn, (png_voidp)mem_ptr); 5135f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#else 5145f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_destroy_struct((png_voidp)png_ptr); 5155f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#endif 516893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (NULL); 517893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 518893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef USE_FAR_KEYWORD 5194215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf)); 520893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 521893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 522893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 523893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 524893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn); 525893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 526893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn); 527893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 5284215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (user_png_ver) 529893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 5305f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott i = 0; 5315f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott do 5325f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott { 5335f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott if (user_png_ver[i] != png_libpng_ver[i]) 5345f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; 5355f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott } while (png_libpng_ver[i++]); 536893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 537893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 538893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) 539893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 540893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so 541893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * we must recompile any applications that use any older library version. 542893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * For versions after libpng 1.0, we will be compatible, so we need 543893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * only check the first digit. 544893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 545893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] || 546893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) || 547893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (user_png_ver[0] == '0' && user_png_ver[2] < '9')) 548893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 5495f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#if defined(PNG_STDIO_SUPPORTED) && !defined(_WIN32_WCE) 550893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project char msg[80]; 551893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (user_png_ver) 552893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 5535f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_snprintf(msg, 80, 5545f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott "Application was compiled with png.h from libpng-%.20s", 5555f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott user_png_ver); 5565f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_warning(png_ptr, msg); 557893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 558893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_snprintf(msg, 80, 559893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "Application is running with png.c from libpng-%.20s", 560893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_libpng_ver); 561893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, msg); 562893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 563893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_ERROR_NUMBERS_SUPPORTED 5645f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->flags = 0; 565893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 566893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, 567893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "Incompatible libpng version in application and library"); 568893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 569893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 570893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 571a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Initialize zbuf - compression buffer */ 572893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zbuf_size = PNG_ZBUF_SIZE; 573893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, 5745f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott (png_uint_32)png_ptr->zbuf_size); 575893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 576893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL, 577893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_flush_ptr_NULL); 578893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 5795f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED 580893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT, 581893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1, png_doublep_NULL, png_doublep_NULL); 582893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 583893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 584893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 5855f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott /* Applications that neglect to set up their own setjmp() and then 5865f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * encounter a png_error() will longjmp here. Since the jmpbuf is 5875f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott * then meaningless we abort instead of returning. 5885f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott */ 589893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef USE_FAR_KEYWORD 590893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (setjmp(jmpbuf)) 591893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_ABORT(); 5924215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf)); 593893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 594893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (setjmp(png_ptr->jmpbuf)) 595893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_ABORT(); 596893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 597893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 598893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (png_ptr); 599893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 600893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 601893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Initialize png_ptr structure, and allocate any memory needed */ 602893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_1_0_X) || defined(PNG_1_2_X) 603893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Deprecated. */ 604893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#undef png_write_init 605893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 606893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_write_init(png_structp png_ptr) 607893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 608893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* We only come here via pre-1.0.7-compiled applications */ 609893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_init_2(png_ptr, "1.0.6 or earlier", 0, 0); 610893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 611893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 612893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 613893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_write_init_2(png_structp png_ptr, png_const_charp user_png_ver, 614893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t png_struct_size, png_size_t png_info_size) 615893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 616893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* We only come here via pre-1.0.12-compiled applications */ 6174215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_ptr == NULL) return; 6185f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#if defined(PNG_STDIO_SUPPORTED) && !defined(_WIN32_WCE) 6194215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_sizeof(png_struct) > png_struct_size || 620893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_sizeof(png_info) > png_info_size) 621893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 622893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project char msg[80]; 6235f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->warning_fn = NULL; 624893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (user_png_ver) 625893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 6265f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_snprintf(msg, 80, 6275f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott "Application was compiled with png.h from libpng-%.20s", 6285f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott user_png_ver); 6295f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_warning(png_ptr, msg); 630893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 631893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_snprintf(msg, 80, 632893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "Application is running with png.c from libpng-%.20s", 633893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_libpng_ver); 634893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, msg); 635893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 636893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 6374215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_sizeof(png_struct) > png_struct_size) 6385f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott { 6395f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->error_fn = NULL; 640893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_ERROR_NUMBERS_SUPPORTED 6415f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->flags = 0; 642893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 6435f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_error(png_ptr, 6445f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott "The png struct allocated by the application for writing is" 6455f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott " too small."); 6465f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott } 6474215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if (png_sizeof(png_info) > png_info_size) 6485f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott { 6495f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->error_fn = NULL; 650893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_ERROR_NUMBERS_SUPPORTED 6515f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->flags = 0; 652893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 6535f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_error(png_ptr, 6545f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott "The info struct allocated by the application for writing is" 6555f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott " too small."); 6565f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott } 657893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_init_3(&png_ptr, user_png_ver, png_struct_size); 658893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 659893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_1_0_X || PNG_1_2_X */ 660893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 661893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 662893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 663893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_write_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver, 664893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t png_struct_size) 665893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 6665f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_structp png_ptr = *ptr_ptr; 667893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 6685f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott jmp_buf tmp_jmp; /* to save current jump buffer */ 669893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 670893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 671893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int i = 0; 672893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 673893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 674893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 675893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 676893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project do 677893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 6785f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott if (user_png_ver[i] != png_libpng_ver[i]) 6795f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott { 680893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_LEGACY_SUPPORTED 6815f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; 682893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 6835f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->warning_fn = NULL; 6845f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_warning(png_ptr, 6854215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project "Application uses deprecated png_write_init() and should be recompiled."); 686893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 6875f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott } 688893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } while (png_libpng_ver[i++]); 689893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 6904215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_write_init_3"); 691893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 692893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 693a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Save jump buffer and error functions */ 6944215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf)); 695893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 696893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 697893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_sizeof(png_struct) > png_struct_size) 6985f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott { 6995f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_destroy_struct(png_ptr); 7005f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); 7015f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott *ptr_ptr = png_ptr; 7025f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott } 703893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 704a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Reset all variables to 0 */ 7054215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_memset(png_ptr, 0, png_sizeof(png_struct)); 706893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 707a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Added at libpng-1.2.6 */ 708893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SET_USER_LIMITS_SUPPORTED 7095f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->user_width_max = PNG_USER_WIDTH_MAX; 7105f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->user_height_max = PNG_USER_HEIGHT_MAX; 711893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 712893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 713893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 714a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Restore jump buffer */ 7154215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf)); 716893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 717893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 718893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL, 719893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_flush_ptr_NULL); 720893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 721a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Initialize zbuf - compression buffer */ 722893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zbuf_size = PNG_ZBUF_SIZE; 723893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, 7245f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott (png_uint_32)png_ptr->zbuf_size); 7255f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED 726893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT, 727893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1, png_doublep_NULL, png_doublep_NULL); 728893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 729893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 730893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 731893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Write a few rows of image data. If the image is interlaced, 732893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * either you will have to write the 7 sub images, or, if you 733893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * have called png_set_interlace_handling(), you will have to 734893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * "write" the image seven times. 735893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 736893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 737893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_write_rows(png_structp png_ptr, png_bytepp row, 738893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 num_rows) 739893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 7405f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_uint_32 i; /* row counter */ 7415f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_bytepp rp; /* row pointer */ 742893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 7434215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_write_rows"); 744893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 745893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 746893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 747893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 748a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Loop through the rows */ 749893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0, rp = row; i < num_rows; i++, rp++) 750893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 751893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_row(png_ptr, *rp); 752893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 753893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 754893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 755893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Write the image. You only need to call this function once, even 756893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * if you are writing an interlaced image. 757893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 758893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 759893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_write_image(png_structp png_ptr, png_bytepp image) 760893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 7615f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_uint_32 i; /* row index */ 7625f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott int pass, num_pass; /* pass variables */ 7635f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_bytepp rp; /* points to current row */ 764893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 765893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 766893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 767893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 7684215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_write_image"); 7695f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 7705f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_INTERLACING_SUPPORTED 771a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Initialize interlace handling. If image is not interlaced, 772a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * this will set pass to 1 773a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott */ 774893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project num_pass = png_set_interlace_handling(png_ptr); 775893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 776893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project num_pass = 1; 777893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 778a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Loop through passes */ 779893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (pass = 0; pass < num_pass; pass++) 780893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 781a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Loop through image */ 782893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0, rp = image; i < png_ptr->height; i++, rp++) 783893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 784893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_row(png_ptr, *rp); 785893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 786893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 787893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 788893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 789a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Called by user to write a row of image data */ 790893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 791893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_write_row(png_structp png_ptr, png_bytep row) 792893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 793893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 794893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 7955f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 7964215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug2(1, "in png_write_row (row %ld, pass %d)", 797893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_number, png_ptr->pass); 798893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 799a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Initialize transformations and other stuff if first time */ 800893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->row_number == 0 && png_ptr->pass == 0) 801893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 802a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Make sure we wrote the header info */ 803a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) 804a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott png_error(png_ptr, 805a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott "png_write_info was never called before png_write_row."); 806893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 807a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Check for transforms that have been set but were defined out */ 808893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if !defined(PNG_WRITE_INVERT_SUPPORTED) && defined(PNG_READ_INVERT_SUPPORTED) 809a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr->transformations & PNG_INVERT_MONO) 8105f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_warning(png_ptr, 8115f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott "PNG_WRITE_INVERT_SUPPORTED is not defined."); 812893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 813893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if !defined(PNG_WRITE_FILLER_SUPPORTED) && defined(PNG_READ_FILLER_SUPPORTED) 814a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr->transformations & PNG_FILLER) 8155f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_warning(png_ptr, 8165f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott "PNG_WRITE_FILLER_SUPPORTED is not defined."); 817893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 8185f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#if !defined(PNG_WRITE_PACKSWAP_SUPPORTED) && \ 8195f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott defined(PNG_READ_PACKSWAP_SUPPORTED) 820a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr->transformations & PNG_PACKSWAP) 8215f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_warning(png_ptr, 8225f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott "PNG_WRITE_PACKSWAP_SUPPORTED is not defined."); 823893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 824893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if !defined(PNG_WRITE_PACK_SUPPORTED) && defined(PNG_READ_PACK_SUPPORTED) 825a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr->transformations & PNG_PACK) 826a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott png_warning(png_ptr, "PNG_WRITE_PACK_SUPPORTED is not defined."); 827893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 828893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if !defined(PNG_WRITE_SHIFT_SUPPORTED) && defined(PNG_READ_SHIFT_SUPPORTED) 829a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr->transformations & PNG_SHIFT) 830a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott png_warning(png_ptr, "PNG_WRITE_SHIFT_SUPPORTED is not defined."); 831893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 832893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if !defined(PNG_WRITE_BGR_SUPPORTED) && defined(PNG_READ_BGR_SUPPORTED) 833a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr->transformations & PNG_BGR) 834a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott png_warning(png_ptr, "PNG_WRITE_BGR_SUPPORTED is not defined."); 835893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 836893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if !defined(PNG_WRITE_SWAP_SUPPORTED) && defined(PNG_READ_SWAP_SUPPORTED) 837a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr->transformations & PNG_SWAP_BYTES) 838a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott png_warning(png_ptr, "PNG_WRITE_SWAP_SUPPORTED is not defined."); 839893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 840893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 841893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_start_row(png_ptr); 842893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 843893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 8445f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_INTERLACING_SUPPORTED 845a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* If interlaced and not interested in row, return */ 846893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) 847893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 848893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project switch (png_ptr->pass) 849893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 850893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 0: 851893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->row_number & 0x07) 852893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 853893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_finish_row(png_ptr); 854893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 855893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 856893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 857893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 1: 858893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->row_number & 0x07) || png_ptr->width < 5) 859893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 860893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_finish_row(png_ptr); 861893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 862893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 863893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 864893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 2: 865893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->row_number & 0x07) != 4) 866893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 867893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_finish_row(png_ptr); 868893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 869893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 870893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 871893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 3: 872893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->row_number & 0x03) || png_ptr->width < 3) 873893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 874893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_finish_row(png_ptr); 875893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 876893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 877893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 878893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 4: 879893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->row_number & 0x03) != 2) 880893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 881893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_finish_row(png_ptr); 882893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 883893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 884893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 885893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 5: 886893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->row_number & 0x01) || png_ptr->width < 2) 887893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 888893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_finish_row(png_ptr); 889893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 890893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 891893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 892893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 6: 893893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->row_number & 0x01)) 894893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 895893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_finish_row(png_ptr); 896893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 897893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 898893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 899893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 900893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 901893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 902893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 903a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Set up row info for transformations */ 904893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.color_type = png_ptr->color_type; 905893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.width = png_ptr->usr_width; 906893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.channels = png_ptr->usr_channels; 907893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.bit_depth = png_ptr->usr_bit_depth; 908893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth * 909893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.channels); 910893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 911893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, 912893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.width); 913893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 9144215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug1(3, "row_info->color_type = %d", png_ptr->row_info.color_type); 9154215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug1(3, "row_info->width = %lu", png_ptr->row_info.width); 9164215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug1(3, "row_info->channels = %d", png_ptr->row_info.channels); 9174215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug1(3, "row_info->bit_depth = %d", png_ptr->row_info.bit_depth); 9184215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug1(3, "row_info->pixel_depth = %d", png_ptr->row_info.pixel_depth); 9194215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug1(3, "row_info->rowbytes = %lu", png_ptr->row_info.rowbytes); 920893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 921893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Copy user's row into buffer, leaving room for filter byte. */ 922893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy_check(png_ptr, png_ptr->row_buf + 1, row, 923893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.rowbytes); 924893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 9255f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_INTERLACING_SUPPORTED 926a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Handle interlacing */ 927893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->interlaced && png_ptr->pass < 6 && 928893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_ptr->transformations & PNG_INTERLACE)) 929893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 930893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_do_write_interlace(&(png_ptr->row_info), 931893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_buf + 1, png_ptr->pass); 932a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* This should always get caught above, but still ... */ 933893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->row_info.width)) 934893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 935893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_finish_row(png_ptr); 936893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 937893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 938893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 939893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 940893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 941a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Handle other transformations */ 942893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->transformations) 943893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_do_write_transformations(png_ptr); 944893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 9455f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_MNG_FEATURES_SUPPORTED 946893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Write filter_method 64 (intrapixel differencing) only if 947893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and 948893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 2. Libpng did not write a PNG signature (this filter_method is only 949893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * used in PNG datastreams that are embedded in MNG datastreams) and 950893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 3. The application called png_permit_mng_features with a mask that 951893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * included PNG_FLAG_MNG_FILTER_64 and 952893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 4. The filter_method is 64 and 953893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 5. The color_type is RGB or RGBA 954893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 9554215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && 956893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING)) 957893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 958893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Intrapixel differencing */ 959893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_do_write_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1); 960893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 961893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 962893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 963893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Find a filter if necessary, filter the row and write it out. */ 964893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_find_filter(png_ptr, &(png_ptr->row_info)); 965893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 966893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->write_row_fn != NULL) 967893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (*(png_ptr->write_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass); 968893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 969893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 9705f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_FLUSH_SUPPORTED 971893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Set the automatic flush interval or 0 to turn flushing off */ 972893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 973893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_flush(png_structp png_ptr, int nrows) 974893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 9754215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_set_flush"); 9765f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 977893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 978893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 979893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->flush_dist = (nrows < 0 ? 0 : nrows); 980893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 981893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 982a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Flush the current output buffers now */ 983893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 984893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_write_flush(png_structp png_ptr) 985893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 986893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int wrote_IDAT; 987893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 9884215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_write_flush"); 9895f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 990893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 991893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 992893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* We have already written out all of the data */ 993893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->row_number >= png_ptr->num_rows) 994a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott return; 995893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 996893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project do 997893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 998893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int ret; 999893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1000a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Compress the data */ 1001893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ret = deflate(&png_ptr->zstream, Z_SYNC_FLUSH); 1002893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wrote_IDAT = 0; 1003893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1004a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Check for compression errors */ 1005893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret != Z_OK) 1006893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1007893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->zstream.msg != NULL) 1008893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, png_ptr->zstream.msg); 1009893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1010893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "zlib error"); 1011893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1012893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1013893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->zstream.avail_out)) 1014893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1015a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Write the IDAT and reset the zlib output buffer */ 1016893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_IDAT(png_ptr, png_ptr->zbuf, 1017893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zbuf_size); 1018893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.next_out = png_ptr->zbuf; 1019893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; 1020893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wrote_IDAT = 1; 1021893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1022893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } while(wrote_IDAT == 1); 1023893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1024893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* If there is any data left to be output, write it into a new IDAT */ 1025893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->zbuf_size != png_ptr->zstream.avail_out) 1026893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1027a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Write the IDAT and reset the zlib output buffer */ 1028893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_IDAT(png_ptr, png_ptr->zbuf, 1029893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zbuf_size - png_ptr->zstream.avail_out); 1030893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.next_out = png_ptr->zbuf; 1031893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; 1032893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1033893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->flush_rows = 0; 1034893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_flush(png_ptr); 1035893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1036893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_WRITE_FLUSH_SUPPORTED */ 1037893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1038a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Free all memory used by the write */ 1039893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 1040893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr) 1041893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1042893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_structp png_ptr = NULL; 1043893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_infop info_ptr = NULL; 1044893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 1045893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free_ptr free_fn = NULL; 1046893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_voidp mem_ptr = NULL; 1047893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1048893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 10494215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_destroy_write_struct"); 10505f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 1051893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr_ptr != NULL) 1052893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1053893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr = *png_ptr_ptr; 1054893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 1055893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project free_fn = png_ptr->free_fn; 1056893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project mem_ptr = png_ptr->mem_ptr; 1057893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1058893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1059893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1060893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 1061893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr != NULL) 1062893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1063893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project free_fn = png_ptr->free_fn; 1064893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project mem_ptr = png_ptr->mem_ptr; 1065893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1066893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1067893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1068893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr_ptr != NULL) 1069893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr = *info_ptr_ptr; 1070893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1071893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr != NULL) 1072893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1073893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr != NULL) 1074893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1075893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1); 1076893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 10775f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED 1078893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->num_chunk_list) 1079893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1080893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->chunk_list); 10815f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->chunk_list = NULL; 10824215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_ptr->num_chunk_list = 0; 1083893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1084893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1085893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1086893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1087893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 1088893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn, 1089893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_voidp)mem_ptr); 1090893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 1091893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_destroy_struct((png_voidp)info_ptr); 1092893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1093893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *info_ptr_ptr = NULL; 1094893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1095893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1096893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr != NULL) 1097893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1098893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_destroy(png_ptr); 1099893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 1100893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn, 1101893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_voidp)mem_ptr); 1102893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 1103893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_destroy_struct((png_voidp)png_ptr); 1104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *png_ptr_ptr = NULL; 1106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1107893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1108893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1109893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Free any memory used in png_ptr struct (old method) */ 1111893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 1112893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_write_destroy(png_structp png_ptr) 1113893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1114893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 1115a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott jmp_buf tmp_jmp; /* Save jump buffer */ 1116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error_ptr error_fn; 1118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error_ptr warning_fn; 1119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_voidp error_ptr; 1120893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 1121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free_ptr free_fn; 1122893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1123893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 11244215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_write_destroy"); 11255f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 1126a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Free any memory zlib uses */ 1127893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project deflateEnd(&png_ptr->zstream); 1128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1129a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Free our memory. png_free checks NULL for us. */ 1130893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->zbuf); 1131893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->row_buf); 11325f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_FILTER_SUPPORTED 1133893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->prev_row); 1134893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->sub_row); 1135893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->up_row); 1136893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->avg_row); 1137893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->paeth_row); 1138893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1139893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 11405f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_TIME_RFC1123_SUPPORTED 1141893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->time_buffer); 1142893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1143893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 11445f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED 1145893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->prev_filters); 1146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->filter_weights); 1147893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->inv_filter_weights); 1148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->filter_costs); 1149893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->inv_filter_costs); 1150893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1151893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1152893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 1153a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Reset structure */ 11544215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf)); 1155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1156893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1157893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project error_fn = png_ptr->error_fn; 1158893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project warning_fn = png_ptr->warning_fn; 1159893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project error_ptr = png_ptr->error_ptr; 1160893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 1161893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project free_fn = png_ptr->free_fn; 1162893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1163893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 11644215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_memset(png_ptr, 0, png_sizeof(png_struct)); 1165893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1166893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->error_fn = error_fn; 1167893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->warning_fn = warning_fn; 1168893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->error_ptr = error_ptr; 1169893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 1170893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->free_fn = free_fn; 1171893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1172893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1173893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 11744215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf)); 1175893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1176893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1177893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1178893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Allow the application to select one or more row filters to use. */ 1179893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 1180893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_filter(png_structp png_ptr, int method, int filters) 1181893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 11824215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_set_filter"); 11835f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 1184893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 1185893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 11865f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_MNG_FEATURES_SUPPORTED 11874215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && 1188893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (method == PNG_INTRAPIXEL_DIFFERENCING)) 1189893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project method = PNG_FILTER_TYPE_BASE; 1190893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1191893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (method == PNG_FILTER_TYPE_BASE) 1192893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1193893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project switch (filters & (PNG_ALL_FILTERS | 0x07)) 1194893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 11955f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_FILTER_SUPPORTED 1196893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 5: 1197893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 6: 1198893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 7: png_warning(png_ptr, "Unknown row filter for method 0"); 11995f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#endif /* PNG_WRITE_FILTER_SUPPORTED */ 1200893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case PNG_FILTER_VALUE_NONE: 12015f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->do_filter = PNG_FILTER_NONE; break; 12025f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_FILTER_SUPPORTED 1203893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case PNG_FILTER_VALUE_SUB: 12045f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->do_filter = PNG_FILTER_SUB; break; 1205893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case PNG_FILTER_VALUE_UP: 12065f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->do_filter = PNG_FILTER_UP; break; 1207893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case PNG_FILTER_VALUE_AVG: 12085f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->do_filter = PNG_FILTER_AVG; break; 1209893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case PNG_FILTER_VALUE_PAETH: 12105f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_ptr->do_filter = PNG_FILTER_PAETH; break; 1211893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project default: png_ptr->do_filter = (png_byte)filters; break; 1212893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 1213893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project default: png_warning(png_ptr, "Unknown row filter for method 0"); 12145f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#endif /* PNG_WRITE_FILTER_SUPPORTED */ 1215893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1216893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1217893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* If we have allocated the row_buf, this means we have already started 1218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * with the image and we should have allocated all of the filter buffers 1219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * that have been selected. If prev_row isn't already allocated, then 1220893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * it is too late to start using the filters that need it, since we 1221893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * will be missing the data in the previous row. If an application 1222893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * wants to start and stop using particular filters during compression, 1223893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * it should start out with all of the filters, and then add and 1224893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * remove them after the start of compression. 1225893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 1226893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->row_buf != NULL) 1227893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 12285f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_FILTER_SUPPORTED 1229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->do_filter & PNG_FILTER_SUB) && png_ptr->sub_row == NULL) 1230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1231893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->sub_row = (png_bytep)png_malloc(png_ptr, 1232893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_ptr->rowbytes + 1)); 1233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB; 1234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1235893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1236893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->do_filter & PNG_FILTER_UP) && png_ptr->up_row == NULL) 1237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1238893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->prev_row == NULL) 1239893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1240893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Can't add Up filter after starting"); 1241893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->do_filter &= ~PNG_FILTER_UP; 1242893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1243893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1244893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1245893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->up_row = (png_bytep)png_malloc(png_ptr, 1246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_ptr->rowbytes + 1)); 1247893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->up_row[0] = PNG_FILTER_VALUE_UP; 1248893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1249893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1251893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->do_filter & PNG_FILTER_AVG) && png_ptr->avg_row == NULL) 1252893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1253893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->prev_row == NULL) 1254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1255893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Can't add Average filter after starting"); 1256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->do_filter &= ~PNG_FILTER_AVG; 1257893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1258893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1259893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1260893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->avg_row = (png_bytep)png_malloc(png_ptr, 1261893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_ptr->rowbytes + 1)); 1262893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG; 1263893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1264893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1266893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->do_filter & PNG_FILTER_PAETH) && 1267893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->paeth_row == NULL) 1268893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1269893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->prev_row == NULL) 1270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1271893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Can't add Paeth filter after starting"); 1272893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->do_filter &= (png_byte)(~PNG_FILTER_PAETH); 1273893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1274893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1275893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1276893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->paeth_row = (png_bytep)png_malloc(png_ptr, 1277893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_ptr->rowbytes + 1)); 1278893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH; 1279893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1280893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1281893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1282893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->do_filter == PNG_NO_FILTERS) 12835f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#endif /* PNG_WRITE_FILTER_SUPPORTED */ 1284893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->do_filter = PNG_FILTER_NONE; 1285893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1286893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1287893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1288893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Unknown custom filter method"); 1289893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1290893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1291893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* This allows us to influence the way in which libpng chooses the "best" 1292893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * filter for the current scanline. While the "minimum-sum-of-absolute- 1293893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * differences metric is relatively fast and effective, there is some 1294893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * question as to whether it can be improved upon by trying to keep the 1295893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * filtered data going to zlib more consistent, hopefully resulting in 1296893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * better compression. 1297893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 12985f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* GRR 970116 */ 1299893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 1300893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_filter_heuristics(png_structp png_ptr, int heuristic_method, 1301893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int num_weights, png_doublep filter_weights, 1302893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_doublep filter_costs) 1303893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1304893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int i; 1305893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 13064215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_set_filter_heuristics"); 13075f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 1308893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 1309893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1310893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (heuristic_method >= PNG_FILTER_HEURISTIC_LAST) 1311893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1312893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Unknown filter heuristic method"); 1313893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1314893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1315893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1316893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (heuristic_method == PNG_FILTER_HEURISTIC_DEFAULT) 1317893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1318893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project heuristic_method = PNG_FILTER_HEURISTIC_UNWEIGHTED; 1319893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1320893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1321893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (num_weights < 0 || filter_weights == NULL || 1322893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project heuristic_method == PNG_FILTER_HEURISTIC_UNWEIGHTED) 1323893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1324893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project num_weights = 0; 1325893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1326893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1327893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->num_prev_filters = (png_byte)num_weights; 1328893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->heuristic_method = (png_byte)heuristic_method; 1329893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1330893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (num_weights > 0) 1331893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1332893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->prev_filters == NULL) 1333893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1334893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->prev_filters = (png_bytep)png_malloc(png_ptr, 1335893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_32)(png_sizeof(png_byte) * num_weights)); 1336893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1337893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* To make sure that the weighting starts out fairly */ 1338893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < num_weights; i++) 1339893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1340893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->prev_filters[i] = 255; 1341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1342893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1343893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1344893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->filter_weights == NULL) 1345893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1346893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->filter_weights = (png_uint_16p)png_malloc(png_ptr, 1347893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_32)(png_sizeof(png_uint_16) * num_weights)); 1348893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1349893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->inv_filter_weights = (png_uint_16p)png_malloc(png_ptr, 1350893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_32)(png_sizeof(png_uint_16) * num_weights)); 1351893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < num_weights; i++) 1352893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1353893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->inv_filter_weights[i] = 1354893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; 1355893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1356893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1357893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1358893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < num_weights; i++) 1359893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1360893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (filter_weights[i] < 0.0) 1361893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1362893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->inv_filter_weights[i] = 1363893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; 1364893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1365893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1366893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1367893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->inv_filter_weights[i] = 1368893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_16)((double)PNG_WEIGHT_FACTOR*filter_weights[i]+0.5); 1369893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->filter_weights[i] = 1370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_16)((double)PNG_WEIGHT_FACTOR/filter_weights[i]+0.5); 1371893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1372893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1374893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1375893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* If, in the future, there are other filter methods, this would 1376893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * need to be based on png_ptr->filter. 1377893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 1378893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->filter_costs == NULL) 1379893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1380893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->filter_costs = (png_uint_16p)png_malloc(png_ptr, 1381893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_32)(png_sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST)); 1382893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1383893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->inv_filter_costs = (png_uint_16p)png_malloc(png_ptr, 1384893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_32)(png_sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST)); 1385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1386893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) 1387893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1388893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->inv_filter_costs[i] = 1389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->filter_costs[i] = PNG_COST_FACTOR; 1390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1391893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1393893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Here is where we set the relative costs of the different filters. We 1394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * should take the desired compression level into account when setting 1395893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * the costs, so that Paeth, for instance, has a high relative cost at low 1396893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * compression levels, while it has a lower relative cost at higher 1397893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * compression settings. The filter types are in order of increasing 1398893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * relative cost, so it would be possible to do this with an algorithm. 1399893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 1400893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) 1401893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (filter_costs == NULL || filter_costs[i] < 0.0) 1403893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1404893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->inv_filter_costs[i] = 1405893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->filter_costs[i] = PNG_COST_FACTOR; 1406893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (filter_costs[i] >= 1.0) 1408893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->inv_filter_costs[i] = 1410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_16)((double)PNG_COST_FACTOR / filter_costs[i] + 0.5); 1411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->filter_costs[i] = 1412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_16)((double)PNG_COST_FACTOR * filter_costs[i] + 0.5); 1413893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1414893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1416893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ 1417893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1418893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 1419893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_compression_level(png_structp png_ptr, int level) 1420893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 14214215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_set_compression_level"); 14225f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 1423893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 1424893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1425893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_LEVEL; 1426893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zlib_level = level; 1427893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1429893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 1430893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_compression_mem_level(png_structp png_ptr, int mem_level) 1431893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 14324215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_set_compression_mem_level"); 14335f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 1434893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 1435893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL; 1437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zlib_mem_level = mem_level; 1438893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1439893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1440893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 1441893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_compression_strategy(png_structp png_ptr, int strategy) 1442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 14434215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_set_compression_strategy"); 14445f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 1445893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 1446893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1447893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_STRATEGY; 1448893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zlib_strategy = strategy; 1449893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1450893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1451893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 1452893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_compression_window_bits(png_structp png_ptr, int window_bits) 1453893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1454893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 1455893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1456893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (window_bits > 15) 1457893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Only compression windows <= 32k supported by PNG"); 1458893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (window_bits < 8) 1459893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Only compression windows >= 256 supported by PNG"); 1460893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef WBITS_8_OK 1461a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Avoid libpng bug with 256-byte windows */ 1462893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (window_bits == 8) 1463893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1464893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Compression window is being reset to 512"); 14655f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott window_bits = 9; 1466893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1467893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1468893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS; 1469893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zlib_window_bits = window_bits; 1470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1471893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1472893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 1473893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_compression_method(png_structp png_ptr, int method) 1474893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 14754215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_set_compression_method"); 14765f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 1477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 1478893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1479893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (method != 8) 1480893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Only compression method 8 is supported by PNG"); 1481893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_METHOD; 1482893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zlib_method = method; 1483893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1484893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1485893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 1486893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_write_status_fn(png_structp png_ptr, png_write_status_ptr write_row_fn) 1487893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1488893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 1489893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1490893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->write_row_fn = write_row_fn; 1491893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1492893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 14935f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED 1494893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 1495893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_write_user_transform_fn(png_structp png_ptr, png_user_transform_ptr 1496893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project write_user_transform_fn) 1497893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 14984215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_set_write_user_transform_fn"); 14995f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 1500893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 1501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1502893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->transformations |= PNG_USER_TRANSFORM; 1503893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->write_user_transform_fn = write_user_transform_fn; 1504893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1505893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1506893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1507893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 15085f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_INFO_IMAGE_SUPPORTED 1509893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 1510893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_write_png(png_structp png_ptr, png_infop info_ptr, 1511893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int transforms, voidp params) 1512893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1513893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL || info_ptr == NULL) 1514893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1515893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1516893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Write the file header information. */ 1517893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_info(png_ptr, info_ptr); 1518893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1519893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* ------ these transformations don't touch the info structure ------- */ 1520893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 15215f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_INVERT_SUPPORTED 1522a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Invert monochrome pixels */ 1523893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (transforms & PNG_TRANSFORM_INVERT_MONO) 1524a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott png_set_invert_mono(png_ptr); 1525893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1526893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 15275f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_SHIFT_SUPPORTED 1528893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Shift the pixels up to a legal bit depth and fill in 1529893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * as appropriate to correctly scale the image. 1530893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 1531893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((transforms & PNG_TRANSFORM_SHIFT) 1532893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project && (info_ptr->valid & PNG_INFO_sBIT)) 1533a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott png_set_shift(png_ptr, &info_ptr->sig_bit); 1534893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1535893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 15365f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_PACK_SUPPORTED 1537a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Pack pixels into bytes */ 1538893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (transforms & PNG_TRANSFORM_PACKING) 1539893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_packing(png_ptr); 1540893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1541893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 15425f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED 1543a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Swap location of alpha bytes from ARGB to RGBA */ 1544893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (transforms & PNG_TRANSFORM_SWAP_ALPHA) 1545a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott png_set_swap_alpha(png_ptr); 1546893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1547893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 15485f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_FILLER_SUPPORTED 15494215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project /* Pack XRGB/RGBX/ARGB/RGBA into * RGB (4 channels -> 3 channels) */ 1550a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (transforms & PNG_TRANSFORM_STRIP_FILLER_AFTER) 15514215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_set_filler(png_ptr, 0, PNG_FILLER_AFTER); 1552a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott else if (transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE) 15534215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); 1554893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1555893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 15565f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_BGR_SUPPORTED 1557a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Flip BGR pixels to RGB */ 1558893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (transforms & PNG_TRANSFORM_BGR) 1559a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott png_set_bgr(png_ptr); 1560893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1561893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 15625f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_SWAP_SUPPORTED 1563a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Swap bytes of 16-bit files to most significant byte first */ 1564893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (transforms & PNG_TRANSFORM_SWAP_ENDIAN) 1565a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott png_set_swap(png_ptr); 1566893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1567893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 15685f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_PACKSWAP_SUPPORTED 1569a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Swap bits of 1, 2, 4 bit packed pixel formats */ 1570893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (transforms & PNG_TRANSFORM_PACKSWAP) 1571a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott png_set_packswap(png_ptr); 1572893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1573893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 15745f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED 15755f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott /* Invert the alpha channel from opacity to transparency */ 15765f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott if (transforms & PNG_TRANSFORM_INVERT_ALPHA) 15775f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott png_set_invert_alpha(png_ptr); 15785f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#endif 15795f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 1580893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* ----------------------- end of transformations ------------------- */ 1581893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1582a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Write the bits */ 1583893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_IDAT) 1584893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_image(png_ptr, info_ptr->row_pointers); 1585893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1586893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* It is REQUIRED to call this to finish writing the rest of the file */ 1587893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_end(png_ptr, info_ptr); 1588893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1589a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott transforms = transforms; /* Quiet compiler warnings */ 1590893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project params = params; 1591893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1592893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1593893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_WRITE_SUPPORTED */ 1594