pngwrite.c revision 893912bfc2683463dc3e2c445336752d012563d3
1893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 2893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* pngwrite.c - general routines to write a PNG file 3893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 4893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * Last changed in libpng 1.2.27 [April 29, 2008] 5893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * For conditions of distribution and use, see copyright notice in png.h 6893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * Copyright (c) 1998-2008 Glenn Randers-Pehrson 7893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) 8893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) 9893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 10893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 11893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* get internal access to png.h */ 12893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_INTERNAL 13893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include "png.h" 14893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED 15893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 16893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Writes all the PNG information. This is the suggested way to use the 17893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * library. If you have a new chunk to add, make a function to write it, 18893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * and put it in the correct location here. If you want the chunk written 19893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * after the image data, put it in png_write_end(). I strongly encourage 20893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * you to supply a PNG_INFO_ flag, and check info_ptr->valid before writing 21893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * the chunk, as that will keep the code from breaking if you want to just 22893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * write a plain PNG file. If you have long comments, I suggest writing 23893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * them in png_write_end(), and compressing them. 24893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 25893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 26893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr) 27893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 28893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug(1, "in png_write_info_before_PLTE\n"); 29893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL || info_ptr == NULL) 30893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 31893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) 32893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 33893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_sig(png_ptr); /* write PNG signature */ 34893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_MNG_FEATURES_SUPPORTED) 35893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&(png_ptr->mng_features_permitted)) 36893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 37893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr,"MNG features are not allowed in a PNG datastream"); 38893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mng_features_permitted=0; 39893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 40893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 41893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* write IHDR information. */ 42893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height, 43893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type, 44893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->filter_type, 45893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_INTERLACING_SUPPORTED) 46893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->interlace_type); 47893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 48893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0); 49893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 50893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* the rest of these check to see if the valid field has the appropriate 51893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project flag set, and if it does, writes the chunk. */ 52893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_gAMA_SUPPORTED) 53893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_gAMA) 54893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 55893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# ifdef PNG_FLOATING_POINT_SUPPORTED 56893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_gAMA(png_ptr, info_ptr->gamma); 57893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 58893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_FIXED_POINT_SUPPORTED 59893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_gAMA_fixed(png_ptr, info_ptr->int_gamma); 60893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# endif 61893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 62893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 63893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 64893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_sRGB_SUPPORTED) 65893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_sRGB) 66893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_sRGB(png_ptr, (int)info_ptr->srgb_intent); 67893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 68893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_iCCP_SUPPORTED) 69893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_iCCP) 70893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_iCCP(png_ptr, info_ptr->iccp_name, PNG_COMPRESSION_TYPE_BASE, 71893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->iccp_profile, (int)info_ptr->iccp_proflen); 72893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 73893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_sBIT_SUPPORTED) 74893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_sBIT) 75893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_sBIT(png_ptr, &(info_ptr->sig_bit), info_ptr->color_type); 76893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 77893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_cHRM_SUPPORTED) 78893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_cHRM) 79893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 80893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_FLOATING_POINT_SUPPORTED 81893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_cHRM(png_ptr, 82893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->x_white, info_ptr->y_white, 83893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->x_red, info_ptr->y_red, 84893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->x_green, info_ptr->y_green, 85893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->x_blue, info_ptr->y_blue); 86893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 87893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# ifdef PNG_FIXED_POINT_SUPPORTED 88893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_cHRM_fixed(png_ptr, 89893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->int_x_white, info_ptr->int_y_white, 90893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->int_x_red, info_ptr->int_y_red, 91893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->int_x_green, info_ptr->int_y_green, 92893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->int_x_blue, info_ptr->int_y_blue); 93893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project# endif 94893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 95893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 96893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 97893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) 98893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->unknown_chunks_num) 99893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 100893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_unknown_chunk *up; 101893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 102893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug(5, "writing extra chunks\n"); 103893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (up = info_ptr->unknown_chunks; 105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; 106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project up++) 107893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 108893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int keep=png_handle_as_unknown(png_ptr, up->name); 109893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (keep != PNG_HANDLE_CHUNK_NEVER && 110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project up->location && !(up->location & PNG_HAVE_PLTE) && 111893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project !(up->location & PNG_HAVE_IDAT) && 112893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || 113893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) 114893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 115893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (up->size == 0) 116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Writing zero-length unknown chunk"); 117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_chunk(png_ptr, up->name, up->data, up->size); 118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 120893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 122893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE; 123893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 124893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 125893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 126893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 127893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_write_info(png_structp png_ptr, png_infop info_ptr) 128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) 130893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int i; 131893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 132893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 133893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug(1, "in png_write_info\n"); 134893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 135893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL || info_ptr == NULL) 136893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 137893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 138893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_info_before_PLTE(png_ptr, info_ptr); 139893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 140893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_PLTE) 141893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_PLTE(png_ptr, info_ptr->palette, 142893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_32)info_ptr->num_palette); 143893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) 144893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Valid palette required for paletted images"); 145893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_tRNS_SUPPORTED) 147893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_tRNS) 148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 149893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) 150893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* invert the alpha channel (in tRNS) */ 151893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->transformations & PNG_INVERT_ALPHA) && 152893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) 153893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 154893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int j; 155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (j=0; j<(int)info_ptr->num_trans; j++) 156893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->trans[j] = (png_byte)(255 - info_ptr->trans[j]); 157893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 158893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 159893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_tRNS(png_ptr, info_ptr->trans, &(info_ptr->trans_values), 160893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->num_trans, info_ptr->color_type); 161893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 162893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 163893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_bKGD_SUPPORTED) 164893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_bKGD) 165893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_bKGD(png_ptr, &(info_ptr->background), info_ptr->color_type); 166893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 167893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_hIST_SUPPORTED) 168893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_hIST) 169893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_hIST(png_ptr, info_ptr->hist, info_ptr->num_palette); 170893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 171893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_oFFs_SUPPORTED) 172893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_oFFs) 173893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_oFFs(png_ptr, info_ptr->x_offset, info_ptr->y_offset, 174893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->offset_unit_type); 175893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 176893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_pCAL_SUPPORTED) 177893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_pCAL) 178893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_pCAL(png_ptr, info_ptr->pcal_purpose, info_ptr->pcal_X0, 179893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->pcal_X1, info_ptr->pcal_type, info_ptr->pcal_nparams, 180893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->pcal_units, info_ptr->pcal_params); 181893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 182893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_sCAL_SUPPORTED) 183893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_sCAL) 184893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO) 185893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_sCAL(png_ptr, (int)info_ptr->scal_unit, 186893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->scal_pixel_width, info_ptr->scal_pixel_height); 187893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 188893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_FIXED_POINT_SUPPORTED 189893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_sCAL_s(png_ptr, (int)info_ptr->scal_unit, 190893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->scal_s_width, info_ptr->scal_s_height); 191893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 192893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, 193893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "png_write_sCAL not supported; sCAL chunk not written."); 194893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 195893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 196893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 197893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_pHYs_SUPPORTED) 198893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_pHYs) 199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_pHYs(png_ptr, info_ptr->x_pixels_per_unit, 200893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->y_pixels_per_unit, info_ptr->phys_unit_type); 201893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 202893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_tIME_SUPPORTED) 203893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_tIME) 204893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 205893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_tIME(png_ptr, &(info_ptr->mod_time)); 206893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mode |= PNG_WROTE_tIME; 207893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 208893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 209893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_sPLT_SUPPORTED) 210893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_sPLT) 211893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < (int)info_ptr->splt_palettes_num; i++) 212893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_sPLT(png_ptr, info_ptr->splt_palettes + i); 213893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 214893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_TEXT_SUPPORTED) 215893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Check to see if we need to write text chunks */ 216893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < info_ptr->num_text; i++) 217893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug2(2, "Writing header text chunk %d, type %d\n", i, 219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].compression); 220893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* an internationalized chunk? */ 221893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->text[i].compression > 0) 222893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 223893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_iTXt_SUPPORTED) 224893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* write international chunk */ 225893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_iTXt(png_ptr, 226893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].compression, 227893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].key, 228893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].lang, 229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].lang_key, 230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].text); 231893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 232893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Unable to write international text"); 233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Mark this chunk as written */ 235893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; 236893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* If we want a compressed text chunk */ 238893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_zTXt) 239893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 240893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_zTXt_SUPPORTED) 241893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* write compressed chunk */ 242893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_zTXt(png_ptr, info_ptr->text[i].key, 243893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].text, 0, 244893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].compression); 245893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Unable to write compressed text"); 247893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 248893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Mark this chunk as written */ 249893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; 250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 251893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) 252893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 253893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_tEXt_SUPPORTED) 254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* write uncompressed chunk */ 255893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_tEXt(png_ptr, info_ptr->text[i].key, 256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].text, 257893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0); 258893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 259893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Unable to write uncompressed text"); 260893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 261893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Mark this chunk as written */ 262893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; 263893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 264893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 266893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) 267893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->unknown_chunks_num) 268893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 269893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_unknown_chunk *up; 270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 271893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug(5, "writing extra chunks\n"); 272893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 273893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (up = info_ptr->unknown_chunks; 274893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; 275893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project up++) 276893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 277893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int keep=png_handle_as_unknown(png_ptr, up->name); 278893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (keep != PNG_HANDLE_CHUNK_NEVER && 279893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project up->location && (up->location & PNG_HAVE_PLTE) && 280893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project !(up->location & PNG_HAVE_IDAT) && 281893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || 282893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) 283893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 284893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_chunk(png_ptr, up->name, up->data, up->size); 285893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 286893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 287893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 288893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 289893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 290893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 291893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Writes the end of the PNG file. If you don't want to write comments or 292893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * time information, you can pass NULL for info. If you already wrote these 293893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * in png_write_info(), do not write them again here. If you have long 294893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * comments, I suggest writing them here, and compressing them. 295893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 296893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 297893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_write_end(png_structp png_ptr, png_infop info_ptr) 298893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 299893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug(1, "in png_write_end\n"); 300893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 301893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 302893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_IDAT)) 303893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "No IDATs written into file"); 304893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 305893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* see if user wants us to write information chunks */ 306893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr != NULL) 307893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 308893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_TEXT_SUPPORTED) 309893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int i; /* local index variable */ 310893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 311893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_tIME_SUPPORTED) 312893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* check to see if user has supplied a time chunk */ 313893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((info_ptr->valid & PNG_INFO_tIME) && 314893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project !(png_ptr->mode & PNG_WROTE_tIME)) 315893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_tIME(png_ptr, &(info_ptr->mod_time)); 316893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 317893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_TEXT_SUPPORTED) 318893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* loop through comment chunks */ 319893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < info_ptr->num_text; i++) 320893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 321893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug2(2, "Writing trailer text chunk %d, type %d\n", i, 322893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].compression); 323893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* an internationalized chunk? */ 324893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->text[i].compression > 0) 325893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 326893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_iTXt_SUPPORTED) 327893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* write international chunk */ 328893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_iTXt(png_ptr, 329893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].compression, 330893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].key, 331893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].lang, 332893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].lang_key, 333893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].text); 334893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 335893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Unable to write international text"); 336893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 337893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Mark this chunk as written */ 338893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; 339893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 340893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (info_ptr->text[i].compression >= PNG_TEXT_COMPRESSION_zTXt) 341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 342893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_zTXt_SUPPORTED) 343893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* write compressed chunk */ 344893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_zTXt(png_ptr, info_ptr->text[i].key, 345893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].text, 0, 346893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].compression); 347893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 348893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Unable to write compressed text"); 349893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 350893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Mark this chunk as written */ 351893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; 352893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 353893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) 354893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 355893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_tEXt_SUPPORTED) 356893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* write uncompressed chunk */ 357893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_tEXt(png_ptr, info_ptr->text[i].key, 358893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].text, 0); 359893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 360893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Unable to write uncompressed text"); 361893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 362893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 363893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Mark this chunk as written */ 364893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; 365893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 366893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 367893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 368893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) 369893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->unknown_chunks_num) 370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 371893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_unknown_chunk *up; 372893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug(5, "writing extra chunks\n"); 374893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 375893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (up = info_ptr->unknown_chunks; 376893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; 377893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project up++) 378893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 379893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int keep=png_handle_as_unknown(png_ptr, up->name); 380893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (keep != PNG_HANDLE_CHUNK_NEVER && 381893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project up->location && (up->location & PNG_AFTER_IDAT) && 382893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || 383893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) 384893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_chunk(png_ptr, up->name, up->data, up->size); 386893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 387893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 388893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 391893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->mode |= PNG_AFTER_IDAT; 393893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* write end of PNG file */ 395893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_IEND(png_ptr); 396893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 397893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 398893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_tIME_SUPPORTED) 399893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if !defined(_WIN32_WCE) 400893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* "time.h" functions are not supported on WindowsCE */ 401893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_convert_from_struct_tm(png_timep ptime, struct tm FAR * ttime) 403893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 404893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug(1, "in png_convert_from_struct_tm\n"); 405893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ptime->year = (png_uint_16)(1900 + ttime->tm_year); 406893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ptime->month = (png_byte)(ttime->tm_mon + 1); 407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ptime->day = (png_byte)ttime->tm_mday; 408893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ptime->hour = (png_byte)ttime->tm_hour; 409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ptime->minute = (png_byte)ttime->tm_min; 410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ptime->second = (png_byte)ttime->tm_sec; 411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 413893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 414893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_convert_from_time_t(png_timep ptime, time_t ttime) 415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 416893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project struct tm *tbuf; 417893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 418893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug(1, "in png_convert_from_time_t\n"); 419893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project tbuf = gmtime(&ttime); 420893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_convert_from_struct_tm(ptime, tbuf); 421893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 422893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 423893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 424893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 425893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Initialize png_ptr structure, and allocate any memory needed */ 426893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_structp PNGAPI 427893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_create_write_struct(png_const_charp user_png_ver, png_voidp error_ptr, 428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error_ptr error_fn, png_error_ptr warn_fn) 429893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 430893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 431893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (png_create_write_struct_2(user_png_ver, error_ptr, error_fn, 432893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project warn_fn, png_voidp_NULL, png_malloc_ptr_NULL, png_free_ptr_NULL)); 433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 434893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 435893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Alternate initialize png_ptr structure, and allocate any memory needed */ 436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_structp PNGAPI 437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, 438893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, 439893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_malloc_ptr malloc_fn, png_free_ptr free_fn) 440893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 441893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_structp png_ptr; 443893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 444893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef USE_FAR_KEYWORD 445893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project jmp_buf jmpbuf; 446893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 447893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 448893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int i; 449893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug(1, "in png_create_write_struct\n"); 450893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 451893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG, 452893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr); 453893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 454893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); 455893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 456893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 457893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (NULL); 458893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 459893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* added at libpng-1.2.6 */ 460893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SET_USER_LIMITS_SUPPORTED 461893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->user_width_max=PNG_USER_WIDTH_MAX; 462893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; 463893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 464893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 465893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 466893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef USE_FAR_KEYWORD 467893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (setjmp(jmpbuf)) 468893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 469893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (setjmp(png_ptr->jmpbuf)) 470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 471893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 472893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->zbuf); 473893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zbuf=NULL; 474893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_destroy_struct(png_ptr); 475893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (NULL); 476893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef USE_FAR_KEYWORD 478893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy(png_ptr->jmpbuf,jmpbuf,png_sizeof(jmp_buf)); 479893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 480893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 481893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 482893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 483893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn); 484893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 485893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn); 486893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 487893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if(user_png_ver) 488893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 489893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project i=0; 490893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project do 491893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 492893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if(user_png_ver[i] != png_libpng_ver[i]) 493893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; 494893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } while (png_libpng_ver[i++]); 495893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 496893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 497893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) 498893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 499893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so 500893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * we must recompile any applications that use any older library version. 501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * For versions after libpng 1.0, we will be compatible, so we need 502893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * only check the first digit. 503893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 504893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] || 505893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) || 506893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (user_png_ver[0] == '0' && user_png_ver[2] < '9')) 507893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 508893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) 509893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project char msg[80]; 510893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (user_png_ver) 511893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 512893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_snprintf(msg, 80, 513893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "Application was compiled with png.h from libpng-%.20s", 514893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project user_png_ver); 515893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, msg); 516893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 517893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_snprintf(msg, 80, 518893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "Application is running with png.c from libpng-%.20s", 519893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_libpng_ver); 520893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, msg); 521893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 522893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_ERROR_NUMBERS_SUPPORTED 523893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->flags=0; 524893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 525893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, 526893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "Incompatible libpng version in application and library"); 527893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 528893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 529893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 530893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* initialize zbuf - compression buffer */ 531893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zbuf_size = PNG_ZBUF_SIZE; 532893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, 533893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_32)png_ptr->zbuf_size); 534893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 535893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL, 536893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_flush_ptr_NULL); 537893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 538893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) 539893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT, 540893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1, png_doublep_NULL, png_doublep_NULL); 541893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 542893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 543893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 544893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Applications that neglect to set up their own setjmp() and then encounter 545893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project a png_error() will longjmp here. Since the jmpbuf is then meaningless we 546893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project abort instead of returning. */ 547893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef USE_FAR_KEYWORD 548893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (setjmp(jmpbuf)) 549893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_ABORT(); 550893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy(png_ptr->jmpbuf,jmpbuf,png_sizeof(jmp_buf)); 551893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 552893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (setjmp(png_ptr->jmpbuf)) 553893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project PNG_ABORT(); 554893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 555893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 556893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (png_ptr); 557893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 558893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 559893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Initialize png_ptr structure, and allocate any memory needed */ 560893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_1_0_X) || defined(PNG_1_2_X) 561893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Deprecated. */ 562893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#undef png_write_init 563893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 564893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_write_init(png_structp png_ptr) 565893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 566893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* We only come here via pre-1.0.7-compiled applications */ 567893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_init_2(png_ptr, "1.0.6 or earlier", 0, 0); 568893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 569893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 570893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 571893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_write_init_2(png_structp png_ptr, png_const_charp user_png_ver, 572893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t png_struct_size, png_size_t png_info_size) 573893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 574893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* We only come here via pre-1.0.12-compiled applications */ 575893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if(png_ptr == NULL) return; 576893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) 577893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if(png_sizeof(png_struct) > png_struct_size || 578893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_sizeof(png_info) > png_info_size) 579893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 580893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project char msg[80]; 581893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->warning_fn=NULL; 582893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (user_png_ver) 583893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 584893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_snprintf(msg, 80, 585893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "Application was compiled with png.h from libpng-%.20s", 586893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project user_png_ver); 587893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, msg); 588893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 589893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_snprintf(msg, 80, 590893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "Application is running with png.c from libpng-%.20s", 591893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_libpng_ver); 592893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, msg); 593893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 594893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 595893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if(png_sizeof(png_struct) > png_struct_size) 596893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 597893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->error_fn=NULL; 598893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_ERROR_NUMBERS_SUPPORTED 599893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->flags=0; 600893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 601893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, 602893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "The png struct allocated by the application for writing is too small."); 603893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 604893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if(png_sizeof(png_info) > png_info_size) 605893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 606893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->error_fn=NULL; 607893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_ERROR_NUMBERS_SUPPORTED 608893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->flags=0; 609893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 610893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, 611893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "The info struct allocated by the application for writing is too small."); 612893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 613893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_init_3(&png_ptr, user_png_ver, png_struct_size); 614893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 615893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_1_0_X || PNG_1_2_X */ 616893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 617893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 618893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 619893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_write_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver, 620893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_size_t png_struct_size) 621893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 622893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_structp png_ptr=*ptr_ptr; 623893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 624893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project jmp_buf tmp_jmp; /* to save current jump buffer */ 625893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 626893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 627893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int i = 0; 628893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 629893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 630893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 631893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 632893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project do 633893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 634893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (user_png_ver[i] != png_libpng_ver[i]) 635893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 636893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_LEGACY_SUPPORTED 637893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; 638893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 639893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->warning_fn=NULL; 640893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, 641893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "Application uses deprecated png_write_init() and should be recompiled."); 642893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 643893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 644893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 645893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } while (png_libpng_ver[i++]); 646893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 647893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug(1, "in png_write_init_3\n"); 648893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 649893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 650893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* save jump buffer and error functions */ 651893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof (jmp_buf)); 652893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 653893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 654893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_sizeof(png_struct) > png_struct_size) 655893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 656893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_destroy_struct(png_ptr); 657893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); 658893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *ptr_ptr = png_ptr; 659893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 660893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 661893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* reset all variables to 0 */ 662893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memset(png_ptr, 0, png_sizeof (png_struct)); 663893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 664893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* added at libpng-1.2.6 */ 665893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SET_USER_LIMITS_SUPPORTED 666893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->user_width_max=PNG_USER_WIDTH_MAX; 667893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; 668893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 669893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 670893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 671893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* restore jump buffer */ 672893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof (jmp_buf)); 673893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 674893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 675893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL, 676893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_flush_ptr_NULL); 677893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 678893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* initialize zbuf - compression buffer */ 679893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zbuf_size = PNG_ZBUF_SIZE; 680893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, 681893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_32)png_ptr->zbuf_size); 682893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 683893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) 684893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT, 685893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1, png_doublep_NULL, png_doublep_NULL); 686893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 687893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 688893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 689893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Write a few rows of image data. If the image is interlaced, 690893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * either you will have to write the 7 sub images, or, if you 691893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * have called png_set_interlace_handling(), you will have to 692893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * "write" the image seven times. 693893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 694893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 695893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_write_rows(png_structp png_ptr, png_bytepp row, 696893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 num_rows) 697893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 698893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 i; /* row counter */ 699893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytepp rp; /* row pointer */ 700893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 701893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug(1, "in png_write_rows\n"); 702893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 703893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 704893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 705893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 706893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* loop through the rows */ 707893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0, rp = row; i < num_rows; i++, rp++) 708893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 709893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_row(png_ptr, *rp); 710893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 711893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 712893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 713893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Write the image. You only need to call this function once, even 714893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * if you are writing an interlaced image. 715893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 716893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 717893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_write_image(png_structp png_ptr, png_bytepp image) 718893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 719893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 i; /* row index */ 720893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int pass, num_pass; /* pass variables */ 721893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytepp rp; /* points to current row */ 722893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 723893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 724893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 725893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 726893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug(1, "in png_write_image\n"); 727893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_INTERLACING_SUPPORTED) 728893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* intialize interlace handling. If image is not interlaced, 729893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project this will set pass to 1 */ 730893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project num_pass = png_set_interlace_handling(png_ptr); 731893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 732893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project num_pass = 1; 733893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 734893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* loop through passes */ 735893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (pass = 0; pass < num_pass; pass++) 736893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 737893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* loop through image */ 738893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0, rp = image; i < png_ptr->height; i++, rp++) 739893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 740893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_row(png_ptr, *rp); 741893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 742893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 743893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 744893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 745893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* called by user to write a row of image data */ 746893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 747893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_write_row(png_structp png_ptr, png_bytep row) 748893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 749893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 750893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 751893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug2(1, "in png_write_row (row %ld, pass %d)\n", 752893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_number, png_ptr->pass); 753893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 754893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* initialize transformations and other stuff if first time */ 755893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->row_number == 0 && png_ptr->pass == 0) 756893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 757893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* make sure we wrote the header info */ 758893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) 759893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, 760893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project "png_write_info was never called before png_write_row."); 761893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 762893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* check for transforms that have been set but were defined out */ 763893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if !defined(PNG_WRITE_INVERT_SUPPORTED) && defined(PNG_READ_INVERT_SUPPORTED) 764893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->transformations & PNG_INVERT_MONO) 765893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "PNG_WRITE_INVERT_SUPPORTED is not defined."); 766893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 767893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if !defined(PNG_WRITE_FILLER_SUPPORTED) && defined(PNG_READ_FILLER_SUPPORTED) 768893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->transformations & PNG_FILLER) 769893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "PNG_WRITE_FILLER_SUPPORTED is not defined."); 770893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 771893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if !defined(PNG_WRITE_PACKSWAP_SUPPORTED) && defined(PNG_READ_PACKSWAP_SUPPORTED) 772893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->transformations & PNG_PACKSWAP) 773893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "PNG_WRITE_PACKSWAP_SUPPORTED is not defined."); 774893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 775893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if !defined(PNG_WRITE_PACK_SUPPORTED) && defined(PNG_READ_PACK_SUPPORTED) 776893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->transformations & PNG_PACK) 777893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "PNG_WRITE_PACK_SUPPORTED is not defined."); 778893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 779893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if !defined(PNG_WRITE_SHIFT_SUPPORTED) && defined(PNG_READ_SHIFT_SUPPORTED) 780893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->transformations & PNG_SHIFT) 781893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "PNG_WRITE_SHIFT_SUPPORTED is not defined."); 782893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 783893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if !defined(PNG_WRITE_BGR_SUPPORTED) && defined(PNG_READ_BGR_SUPPORTED) 784893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->transformations & PNG_BGR) 785893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "PNG_WRITE_BGR_SUPPORTED is not defined."); 786893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 787893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if !defined(PNG_WRITE_SWAP_SUPPORTED) && defined(PNG_READ_SWAP_SUPPORTED) 788893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->transformations & PNG_SWAP_BYTES) 789893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "PNG_WRITE_SWAP_SUPPORTED is not defined."); 790893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 791893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 792893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_start_row(png_ptr); 793893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 794893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 795893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_INTERLACING_SUPPORTED) 796893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* if interlaced and not interested in row, return */ 797893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) 798893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 799893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project switch (png_ptr->pass) 800893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 801893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 0: 802893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->row_number & 0x07) 803893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 804893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_finish_row(png_ptr); 805893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 806893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 807893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 808893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 1: 809893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->row_number & 0x07) || png_ptr->width < 5) 810893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 811893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_finish_row(png_ptr); 812893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 813893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 814893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 815893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 2: 816893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->row_number & 0x07) != 4) 817893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 818893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_finish_row(png_ptr); 819893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 820893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 821893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 822893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 3: 823893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->row_number & 0x03) || png_ptr->width < 3) 824893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 825893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_finish_row(png_ptr); 826893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 827893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 828893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 829893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 4: 830893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->row_number & 0x03) != 2) 831893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 832893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_finish_row(png_ptr); 833893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 834893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 835893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 836893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 5: 837893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->row_number & 0x01) || png_ptr->width < 2) 838893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 839893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_finish_row(png_ptr); 840893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 841893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 842893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 843893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 6: 844893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->row_number & 0x01)) 845893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 846893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_finish_row(png_ptr); 847893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 848893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 849893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 850893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 851893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 852893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 853893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 854893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* set up row info for transformations */ 855893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.color_type = png_ptr->color_type; 856893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.width = png_ptr->usr_width; 857893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.channels = png_ptr->usr_channels; 858893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.bit_depth = png_ptr->usr_bit_depth; 859893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth * 860893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.channels); 861893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 862893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, 863893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.width); 864893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 865893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug1(3, "row_info->color_type = %d\n", png_ptr->row_info.color_type); 866893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug1(3, "row_info->width = %lu\n", png_ptr->row_info.width); 867893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug1(3, "row_info->channels = %d\n", png_ptr->row_info.channels); 868893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug1(3, "row_info->bit_depth = %d\n", png_ptr->row_info.bit_depth); 869893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug1(3, "row_info->pixel_depth = %d\n", png_ptr->row_info.pixel_depth); 870893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug1(3, "row_info->rowbytes = %lu\n", png_ptr->row_info.rowbytes); 871893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 872893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Copy user's row into buffer, leaving room for filter byte. */ 873893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy_check(png_ptr, png_ptr->row_buf + 1, row, 874893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_info.rowbytes); 875893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 876893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_INTERLACING_SUPPORTED) 877893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* handle interlacing */ 878893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->interlaced && png_ptr->pass < 6 && 879893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_ptr->transformations & PNG_INTERLACE)) 880893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 881893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_do_write_interlace(&(png_ptr->row_info), 882893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->row_buf + 1, png_ptr->pass); 883893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* this should always get caught above, but still ... */ 884893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->row_info.width)) 885893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 886893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_finish_row(png_ptr); 887893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 888893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 889893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 890893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 891893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 892893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* handle other transformations */ 893893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->transformations) 894893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_do_write_transformations(png_ptr); 895893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 896893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_MNG_FEATURES_SUPPORTED) 897893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Write filter_method 64 (intrapixel differencing) only if 898893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and 899893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 2. Libpng did not write a PNG signature (this filter_method is only 900893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * used in PNG datastreams that are embedded in MNG datastreams) and 901893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 3. The application called png_permit_mng_features with a mask that 902893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * included PNG_FLAG_MNG_FILTER_64 and 903893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 4. The filter_method is 64 and 904893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 5. The color_type is RGB or RGBA 905893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 906893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && 907893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING)) 908893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 909893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Intrapixel differencing */ 910893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_do_write_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1); 911893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 912893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 913893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 914893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Find a filter if necessary, filter the row and write it out. */ 915893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_find_filter(png_ptr, &(png_ptr->row_info)); 916893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 917893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->write_row_fn != NULL) 918893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (*(png_ptr->write_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass); 919893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 920893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 921893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_FLUSH_SUPPORTED) 922893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Set the automatic flush interval or 0 to turn flushing off */ 923893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 924893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_flush(png_structp png_ptr, int nrows) 925893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 926893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug(1, "in png_set_flush\n"); 927893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 928893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 929893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->flush_dist = (nrows < 0 ? 0 : nrows); 930893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 931893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 932893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* flush the current output buffers now */ 933893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 934893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_write_flush(png_structp png_ptr) 935893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 936893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int wrote_IDAT; 937893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 938893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug(1, "in png_write_flush\n"); 939893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 940893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 941893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* We have already written out all of the data */ 942893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->row_number >= png_ptr->num_rows) 943893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 944893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 945893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project do 946893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 947893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int ret; 948893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 949893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* compress the data */ 950893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project ret = deflate(&png_ptr->zstream, Z_SYNC_FLUSH); 951893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wrote_IDAT = 0; 952893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 953893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* check for compression errors */ 954893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (ret != Z_OK) 955893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 956893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->zstream.msg != NULL) 957893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, png_ptr->zstream.msg); 958893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 959893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "zlib error"); 960893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 961893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 962893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (!(png_ptr->zstream.avail_out)) 963893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 964893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* write the IDAT and reset the zlib output buffer */ 965893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_IDAT(png_ptr, png_ptr->zbuf, 966893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zbuf_size); 967893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.next_out = png_ptr->zbuf; 968893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; 969893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project wrote_IDAT = 1; 970893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 971893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } while(wrote_IDAT == 1); 972893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 973893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* If there is any data left to be output, write it into a new IDAT */ 974893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->zbuf_size != png_ptr->zstream.avail_out) 975893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 976893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* write the IDAT and reset the zlib output buffer */ 977893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_IDAT(png_ptr, png_ptr->zbuf, 978893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zbuf_size - png_ptr->zstream.avail_out); 979893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.next_out = png_ptr->zbuf; 980893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; 981893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 982893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->flush_rows = 0; 983893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_flush(png_ptr); 984893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 985893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_WRITE_FLUSH_SUPPORTED */ 986893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 987893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* free all memory used by the write */ 988893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 989893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr) 990893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 991893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_structp png_ptr = NULL; 992893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_infop info_ptr = NULL; 993893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 994893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free_ptr free_fn = NULL; 995893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_voidp mem_ptr = NULL; 996893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 997893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 998893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug(1, "in png_destroy_write_struct\n"); 999893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr_ptr != NULL) 1000893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1001893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr = *png_ptr_ptr; 1002893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 1003893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project free_fn = png_ptr->free_fn; 1004893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project mem_ptr = png_ptr->mem_ptr; 1005893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1006893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1007893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1008893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 1009893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr != NULL) 1010893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1011893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project free_fn = png_ptr->free_fn; 1012893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project mem_ptr = png_ptr->mem_ptr; 1013893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1014893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1015893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1016893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr_ptr != NULL) 1017893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project info_ptr = *info_ptr_ptr; 1018893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1019893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr != NULL) 1020893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1021893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr != NULL) 1022893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1023893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1); 1024893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1025893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) 1026893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->num_chunk_list) 1027893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1028893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->chunk_list); 1029893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->chunk_list=NULL; 1030893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->num_chunk_list=0; 1031893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1032893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1033893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1034893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1035893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 1036893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn, 1037893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_voidp)mem_ptr); 1038893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 1039893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_destroy_struct((png_voidp)info_ptr); 1040893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1041893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *info_ptr_ptr = NULL; 1042893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1043893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1044893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr != NULL) 1045893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1046893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_destroy(png_ptr); 1047893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 1048893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn, 1049893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_voidp)mem_ptr); 1050893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 1051893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_destroy_struct((png_voidp)png_ptr); 1052893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1053893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *png_ptr_ptr = NULL; 1054893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1055893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1056893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1057893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1058893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Free any memory used in png_ptr struct (old method) */ 1059893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 1060893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_write_destroy(png_structp png_ptr) 1061893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1062893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 1063893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project jmp_buf tmp_jmp; /* save jump buffer */ 1064893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1065893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error_ptr error_fn; 1066893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error_ptr warning_fn; 1067893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_voidp error_ptr; 1068893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 1069893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free_ptr free_fn; 1070893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1071893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1072893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug(1, "in png_write_destroy\n"); 1073893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* free any memory zlib uses */ 1074893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project deflateEnd(&png_ptr->zstream); 1075893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1076893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* free our memory. png_free checks NULL for us. */ 1077893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->zbuf); 1078893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->row_buf); 1079893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef PNG_NO_WRITE_FILTERING 1080893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->prev_row); 1081893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->sub_row); 1082893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->up_row); 1083893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->avg_row); 1084893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->paeth_row); 1085893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1086893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1087893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_TIME_RFC1123_SUPPORTED) 1088893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->time_buffer); 1089893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1090893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1091893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) 1092893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->prev_filters); 1093893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->filter_weights); 1094893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->inv_filter_weights); 1095893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->filter_costs); 1096893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_free(png_ptr, png_ptr->inv_filter_costs); 1097893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1098893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1099893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 1100893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* reset structure */ 1101893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof (jmp_buf)); 1102893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1103893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project error_fn = png_ptr->error_fn; 1105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project warning_fn = png_ptr->warning_fn; 1106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project error_ptr = png_ptr->error_ptr; 1107893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 1108893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project free_fn = png_ptr->free_fn; 1109893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1111893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memset(png_ptr, 0, png_sizeof (png_struct)); 1112893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1113893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->error_fn = error_fn; 1114893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->warning_fn = warning_fn; 1115893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->error_ptr = error_ptr; 1116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 1117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->free_fn = free_fn; 1118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1120893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 1121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof (jmp_buf)); 1122893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1123893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1124893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1125893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Allow the application to select one or more row filters to use. */ 1126893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 1127893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_filter(png_structp png_ptr, int method, int filters) 1128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug(1, "in png_set_filter\n"); 1130893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 1131893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1132893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_MNG_FEATURES_SUPPORTED) 1133893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && 1134893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (method == PNG_INTRAPIXEL_DIFFERENCING)) 1135893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project method = PNG_FILTER_TYPE_BASE; 1136893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1137893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (method == PNG_FILTER_TYPE_BASE) 1138893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1139893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project switch (filters & (PNG_ALL_FILTERS | 0x07)) 1140893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1141893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef PNG_NO_WRITE_FILTER 1142893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 5: 1143893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 6: 1144893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 7: png_warning(png_ptr, "Unknown row filter for method 0"); 1145893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_NO_WRITE_FILTER */ 1146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case PNG_FILTER_VALUE_NONE: 1147893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->do_filter=PNG_FILTER_NONE; break; 1148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef PNG_NO_WRITE_FILTER 1149893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case PNG_FILTER_VALUE_SUB: 1150893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->do_filter=PNG_FILTER_SUB; break; 1151893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case PNG_FILTER_VALUE_UP: 1152893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->do_filter=PNG_FILTER_UP; break; 1153893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case PNG_FILTER_VALUE_AVG: 1154893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->do_filter=PNG_FILTER_AVG; break; 1155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case PNG_FILTER_VALUE_PAETH: 1156893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->do_filter=PNG_FILTER_PAETH; break; 1157893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project default: png_ptr->do_filter = (png_byte)filters; break; 1158893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else 1159893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project default: png_warning(png_ptr, "Unknown row filter for method 0"); 1160893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_NO_WRITE_FILTER */ 1161893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1162893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1163893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* If we have allocated the row_buf, this means we have already started 1164893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * with the image and we should have allocated all of the filter buffers 1165893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * that have been selected. If prev_row isn't already allocated, then 1166893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * it is too late to start using the filters that need it, since we 1167893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * will be missing the data in the previous row. If an application 1168893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * wants to start and stop using particular filters during compression, 1169893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * it should start out with all of the filters, and then add and 1170893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * remove them after the start of compression. 1171893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 1172893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->row_buf != NULL) 1173893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1174893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef PNG_NO_WRITE_FILTER 1175893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->do_filter & PNG_FILTER_SUB) && png_ptr->sub_row == NULL) 1176893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1177893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->sub_row = (png_bytep)png_malloc(png_ptr, 1178893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_ptr->rowbytes + 1)); 1179893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB; 1180893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1181893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1182893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->do_filter & PNG_FILTER_UP) && png_ptr->up_row == NULL) 1183893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1184893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->prev_row == NULL) 1185893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1186893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Can't add Up filter after starting"); 1187893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->do_filter &= ~PNG_FILTER_UP; 1188893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1189893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1190893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1191893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->up_row = (png_bytep)png_malloc(png_ptr, 1192893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_ptr->rowbytes + 1)); 1193893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->up_row[0] = PNG_FILTER_VALUE_UP; 1194893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1195893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1196893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1197893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->do_filter & PNG_FILTER_AVG) && png_ptr->avg_row == NULL) 1198893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->prev_row == NULL) 1200893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1201893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Can't add Average filter after starting"); 1202893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->do_filter &= ~PNG_FILTER_AVG; 1203893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1204893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1205893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1206893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->avg_row = (png_bytep)png_malloc(png_ptr, 1207893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_ptr->rowbytes + 1)); 1208893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG; 1209893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1210893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1211893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1212893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((png_ptr->do_filter & PNG_FILTER_PAETH) && 1213893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->paeth_row == NULL) 1214893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1215893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->prev_row == NULL) 1216893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1217893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Can't add Paeth filter after starting"); 1218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->do_filter &= (png_byte)(~PNG_FILTER_PAETH); 1219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1220893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1221893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1222893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->paeth_row = (png_bytep)png_malloc(png_ptr, 1223893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_ptr->rowbytes + 1)); 1224893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH; 1225893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1226893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1227893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1228893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->do_filter == PNG_NO_FILTERS) 1229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_NO_WRITE_FILTER */ 1230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->do_filter = PNG_FILTER_NONE; 1231893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1232893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_error(png_ptr, "Unknown custom filter method"); 1235893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1236893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* This allows us to influence the way in which libpng chooses the "best" 1238893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * filter for the current scanline. While the "minimum-sum-of-absolute- 1239893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * differences metric is relatively fast and effective, there is some 1240893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * question as to whether it can be improved upon by trying to keep the 1241893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * filtered data going to zlib more consistent, hopefully resulting in 1242893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * better compression. 1243893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 1244893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) /* GRR 970116 */ 1245893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 1246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_filter_heuristics(png_structp png_ptr, int heuristic_method, 1247893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int num_weights, png_doublep filter_weights, 1248893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_doublep filter_costs) 1249893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int i; 1251893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1252893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug(1, "in png_set_filter_heuristics\n"); 1253893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 1254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1255893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (heuristic_method >= PNG_FILTER_HEURISTIC_LAST) 1256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1257893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Unknown filter heuristic method"); 1258893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1259893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1260893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1261893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (heuristic_method == PNG_FILTER_HEURISTIC_DEFAULT) 1262893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1263893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project heuristic_method = PNG_FILTER_HEURISTIC_UNWEIGHTED; 1264893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1266893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (num_weights < 0 || filter_weights == NULL || 1267893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project heuristic_method == PNG_FILTER_HEURISTIC_UNWEIGHTED) 1268893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1269893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project num_weights = 0; 1270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1271893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1272893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->num_prev_filters = (png_byte)num_weights; 1273893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->heuristic_method = (png_byte)heuristic_method; 1274893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1275893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (num_weights > 0) 1276893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1277893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->prev_filters == NULL) 1278893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1279893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->prev_filters = (png_bytep)png_malloc(png_ptr, 1280893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_32)(png_sizeof(png_byte) * num_weights)); 1281893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1282893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* To make sure that the weighting starts out fairly */ 1283893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < num_weights; i++) 1284893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1285893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->prev_filters[i] = 255; 1286893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1287893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1288893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1289893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->filter_weights == NULL) 1290893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1291893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->filter_weights = (png_uint_16p)png_malloc(png_ptr, 1292893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_32)(png_sizeof(png_uint_16) * num_weights)); 1293893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1294893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->inv_filter_weights = (png_uint_16p)png_malloc(png_ptr, 1295893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_32)(png_sizeof(png_uint_16) * num_weights)); 1296893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < num_weights; i++) 1297893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1298893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->inv_filter_weights[i] = 1299893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; 1300893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1301893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1302893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1303893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < num_weights; i++) 1304893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1305893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (filter_weights[i] < 0.0) 1306893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1307893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->inv_filter_weights[i] = 1308893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; 1309893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1310893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 1311893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1312893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->inv_filter_weights[i] = 1313893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_16)((double)PNG_WEIGHT_FACTOR*filter_weights[i]+0.5); 1314893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->filter_weights[i] = 1315893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_16)((double)PNG_WEIGHT_FACTOR/filter_weights[i]+0.5); 1316893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1317893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1318893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1319893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1320893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* If, in the future, there are other filter methods, this would 1321893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * need to be based on png_ptr->filter. 1322893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 1323893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->filter_costs == NULL) 1324893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1325893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->filter_costs = (png_uint_16p)png_malloc(png_ptr, 1326893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_32)(png_sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST)); 1327893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1328893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->inv_filter_costs = (png_uint_16p)png_malloc(png_ptr, 1329893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_32)(png_sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST)); 1330893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1331893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) 1332893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1333893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->inv_filter_costs[i] = 1334893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->filter_costs[i] = PNG_COST_FACTOR; 1335893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1336893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1337893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1338893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Here is where we set the relative costs of the different filters. We 1339893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * should take the desired compression level into account when setting 1340893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * the costs, so that Paeth, for instance, has a high relative cost at low 1341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * compression levels, while it has a lower relative cost at higher 1342893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * compression settings. The filter types are in order of increasing 1343893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * relative cost, so it would be possible to do this with an algorithm. 1344893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 1345893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) 1346893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1347893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (filter_costs == NULL || filter_costs[i] < 0.0) 1348893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1349893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->inv_filter_costs[i] = 1350893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->filter_costs[i] = PNG_COST_FACTOR; 1351893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1352893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (filter_costs[i] >= 1.0) 1353893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1354893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->inv_filter_costs[i] = 1355893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_16)((double)PNG_COST_FACTOR / filter_costs[i] + 0.5); 1356893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->filter_costs[i] = 1357893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project (png_uint_16)((double)PNG_COST_FACTOR * filter_costs[i] + 0.5); 1358893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1359893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1360893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1361893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ 1362893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1363893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 1364893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_compression_level(png_structp png_ptr, int level) 1365893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1366893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug(1, "in png_set_compression_level\n"); 1367893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 1368893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1369893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_LEVEL; 1370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zlib_level = level; 1371893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1372893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 1374893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_compression_mem_level(png_structp png_ptr, int mem_level) 1375893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1376893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug(1, "in png_set_compression_mem_level\n"); 1377893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 1378893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1379893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL; 1380893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zlib_mem_level = mem_level; 1381893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1382893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1383893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 1384893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_compression_strategy(png_structp png_ptr, int strategy) 1385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1386893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug(1, "in png_set_compression_strategy\n"); 1387893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 1388893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_STRATEGY; 1390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zlib_strategy = strategy; 1391893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1393893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 1394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_compression_window_bits(png_structp png_ptr, int window_bits) 1395893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1396893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 1397893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1398893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (window_bits > 15) 1399893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Only compression windows <= 32k supported by PNG"); 1400893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (window_bits < 8) 1401893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Only compression windows >= 256 supported by PNG"); 1402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef WBITS_8_OK 1403893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* avoid libpng bug with 256-byte windows */ 1404893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (window_bits == 8) 1405893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 1406893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Compression window is being reset to 512"); 1407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project window_bits=9; 1408893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 1409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS; 1411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zlib_window_bits = window_bits; 1412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1413893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1414893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 1415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_compression_method(png_structp png_ptr, int method) 1416893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1417893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug(1, "in png_set_compression_method\n"); 1418893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 1419893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1420893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (method != 8) 1421893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_warning(png_ptr, "Only compression method 8 is supported by PNG"); 1422893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_METHOD; 1423893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->zlib_method = method; 1424893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1425893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1426893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 1427893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_write_status_fn(png_structp png_ptr, png_write_status_ptr write_row_fn) 1428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1429893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 1430893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1431893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->write_row_fn = write_row_fn; 1432893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1434893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) 1435893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 1436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_write_user_transform_fn(png_structp png_ptr, png_user_transform_ptr 1437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project write_user_transform_fn) 1438893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1439893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_debug(1, "in png_set_write_user_transform_fn\n"); 1440893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL) 1441893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->transformations |= PNG_USER_TRANSFORM; 1443893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->write_user_transform_fn = write_user_transform_fn; 1444893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1445893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1446893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1447893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1448893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_INFO_IMAGE_SUPPORTED) 1449893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 1450893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_write_png(png_structp png_ptr, png_infop info_ptr, 1451893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int transforms, voidp params) 1452893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1453893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr == NULL || info_ptr == NULL) 1454893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 1455893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) 1456893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* invert the alpha channel from opacity to transparency */ 1457893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (transforms & PNG_TRANSFORM_INVERT_ALPHA) 1458893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_invert_alpha(png_ptr); 1459893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1460893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1461893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Write the file header information. */ 1462893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_info(png_ptr, info_ptr); 1463893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1464893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* ------ these transformations don't touch the info structure ------- */ 1465893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1466893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_INVERT_SUPPORTED) 1467893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* invert monochrome pixels */ 1468893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (transforms & PNG_TRANSFORM_INVERT_MONO) 1469893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_invert_mono(png_ptr); 1470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1471893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1472893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_SHIFT_SUPPORTED) 1473893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Shift the pixels up to a legal bit depth and fill in 1474893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * as appropriate to correctly scale the image. 1475893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 1476893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if ((transforms & PNG_TRANSFORM_SHIFT) 1477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project && (info_ptr->valid & PNG_INFO_sBIT)) 1478893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_shift(png_ptr, &info_ptr->sig_bit); 1479893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1480893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1481893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_PACK_SUPPORTED) 1482893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* pack pixels into bytes */ 1483893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (transforms & PNG_TRANSFORM_PACKING) 1484893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_packing(png_ptr); 1485893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1486893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1487893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) 1488893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* swap location of alpha bytes from ARGB to RGBA */ 1489893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (transforms & PNG_TRANSFORM_SWAP_ALPHA) 1490893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_swap_alpha(png_ptr); 1491893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1492893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1493893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_FILLER_SUPPORTED) 1494893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* Get rid of filler (OR ALPHA) bytes, pack XRGB/RGBX/ARGB/RGBA into 1495893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * RGB (4 channels -> 3 channels). The second parameter is not used. 1496893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 1497893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (transforms & PNG_TRANSFORM_STRIP_FILLER) 1498893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); 1499893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1500893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_BGR_SUPPORTED) 1502893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* flip BGR pixels to RGB */ 1503893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (transforms & PNG_TRANSFORM_BGR) 1504893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_bgr(png_ptr); 1505893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1506893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1507893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_SWAP_SUPPORTED) 1508893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* swap bytes of 16-bit files to most significant byte first */ 1509893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (transforms & PNG_TRANSFORM_SWAP_ENDIAN) 1510893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_swap(png_ptr); 1511893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1512893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1513893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_PACKSWAP_SUPPORTED) 1514893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* swap bits of 1, 2, 4 bit packed pixel formats */ 1515893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (transforms & PNG_TRANSFORM_PACKSWAP) 1516893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_packswap(png_ptr); 1517893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1518893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1519893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* ----------------------- end of transformations ------------------- */ 1520893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1521893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* write the bits */ 1522893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (info_ptr->valid & PNG_INFO_IDAT) 1523893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_image(png_ptr, info_ptr->row_pointers); 1524893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1525893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* It is REQUIRED to call this to finish writing the rest of the file */ 1526893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_write_end(png_ptr, info_ptr); 1527893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1528893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project transforms = transforms; /* quiet compiler warnings */ 1529893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project params = params; 1530893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 1531893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 1532893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_WRITE_SUPPORTED */ 1533