18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* pngwrite.c - general routines to write a PNG file 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Last changed in libpng 1.2.15 January 5, 2007 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * For conditions of distribution and use, see copyright notice in png.h 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright (c) 1998-2007 Glenn Randers-Pehrson 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* get internal access to png.h */ 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_INTERNAL 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "png.h" 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Writes all the PNG information. This is the suggested way to use the 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * library. If you have a new chunk to add, make a function to write it, 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * and put it in the correct location here. If you want the chunk written 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * after the image data, put it in png_write_end(). I strongly encourage 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * you to supply a PNG_INFO_ flag, and check info_ptr->valid before writing 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the chunk, as that will keep the code from breaking if you want to just 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * write a plain PNG file. If you have long comments, I suggest writing 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * them in png_write_end(), and compressing them. 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr) 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_write_info_before_PLTE\n"); 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL || info_ptr == NULL) 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_sig(png_ptr); /* write PNG signature */ 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_MNG_FEATURES_SUPPORTED) 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&(png_ptr->mng_features_permitted)) 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr,"MNG features are not allowed in a PNG datastream"); 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mng_features_permitted=0; 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* write IHDR information. */ 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height, 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type, 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->filter_type, 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_INTERLACING_SUPPORTED) 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->interlace_type); 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0); 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* the rest of these check to see if the valid field has the appropriate 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flag set, and if it does, writes the chunk. */ 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_gAMA_SUPPORTED) 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (info_ptr->valid & PNG_INFO_gAMA) 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ifdef PNG_FLOATING_POINT_SUPPORTED 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_gAMA(png_ptr, info_ptr->gamma); 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_FIXED_POINT_SUPPORTED 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_gAMA_fixed(png_ptr, info_ptr->int_gamma); 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_sRGB_SUPPORTED) 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (info_ptr->valid & PNG_INFO_sRGB) 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_sRGB(png_ptr, (int)info_ptr->srgb_intent); 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_iCCP_SUPPORTED) 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (info_ptr->valid & PNG_INFO_iCCP) 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_iCCP(png_ptr, info_ptr->iccp_name, PNG_COMPRESSION_TYPE_BASE, 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->iccp_profile, (int)info_ptr->iccp_proflen); 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_sBIT_SUPPORTED) 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (info_ptr->valid & PNG_INFO_sBIT) 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_sBIT(png_ptr, &(info_ptr->sig_bit), info_ptr->color_type); 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_cHRM_SUPPORTED) 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (info_ptr->valid & PNG_INFO_cHRM) 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_FLOATING_POINT_SUPPORTED 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_cHRM(png_ptr, 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->x_white, info_ptr->y_white, 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->x_red, info_ptr->y_red, 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->x_green, info_ptr->y_green, 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->x_blue, info_ptr->y_blue); 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ifdef PNG_FIXED_POINT_SUPPORTED 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_cHRM_fixed(png_ptr, 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->int_x_white, info_ptr->int_y_white, 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->int_x_red, info_ptr->int_y_red, 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->int_x_green, info_ptr->int_y_green, 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->int_x_blue, info_ptr->int_y_blue); 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (info_ptr->unknown_chunks_num) 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_unknown_chunk *up; 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(5, "writing extra chunks\n"); 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (up = info_ptr->unknown_chunks; 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project up++) 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int keep=png_handle_as_unknown(png_ptr, up->name); 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (keep != PNG_HANDLE_CHUNK_NEVER && 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project up->location && !(up->location & PNG_HAVE_PLTE) && 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project !(up->location & PNG_HAVE_IDAT) && 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_chunk(png_ptr, up->name, up->data, up->size); 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE; 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_write_info(png_structp png_ptr, png_infop info_ptr) 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_write_info\n"); 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL || info_ptr == NULL) 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_info_before_PLTE(png_ptr, info_ptr); 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (info_ptr->valid & PNG_INFO_PLTE) 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_PLTE(png_ptr, info_ptr->palette, 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_uint_32)info_ptr->num_palette); 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Valid palette required for paletted images"); 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_tRNS_SUPPORTED) 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (info_ptr->valid & PNG_INFO_tRNS) 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* invert the alpha channel (in tRNS) */ 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((png_ptr->transformations & PNG_INVERT_ALPHA) && 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int j; 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (j=0; j<(int)info_ptr->num_trans; j++) 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->trans[j] = (png_byte)(255 - info_ptr->trans[j]); 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_tRNS(png_ptr, info_ptr->trans, &(info_ptr->trans_values), 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->num_trans, info_ptr->color_type); 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_bKGD_SUPPORTED) 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (info_ptr->valid & PNG_INFO_bKGD) 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_bKGD(png_ptr, &(info_ptr->background), info_ptr->color_type); 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_hIST_SUPPORTED) 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (info_ptr->valid & PNG_INFO_hIST) 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_hIST(png_ptr, info_ptr->hist, info_ptr->num_palette); 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_oFFs_SUPPORTED) 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (info_ptr->valid & PNG_INFO_oFFs) 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_oFFs(png_ptr, info_ptr->x_offset, info_ptr->y_offset, 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->offset_unit_type); 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_pCAL_SUPPORTED) 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (info_ptr->valid & PNG_INFO_pCAL) 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_pCAL(png_ptr, info_ptr->pcal_purpose, info_ptr->pcal_X0, 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->pcal_X1, info_ptr->pcal_type, info_ptr->pcal_nparams, 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->pcal_units, info_ptr->pcal_params); 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_sCAL_SUPPORTED) 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (info_ptr->valid & PNG_INFO_sCAL) 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO) 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_sCAL(png_ptr, (int)info_ptr->scal_unit, 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->scal_pixel_width, info_ptr->scal_pixel_height); 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_FIXED_POINT_SUPPORTED 1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_sCAL_s(png_ptr, (int)info_ptr->scal_unit, 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->scal_s_width, info_ptr->scal_s_height); 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "png_write_sCAL not supported; sCAL chunk not written."); 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_pHYs_SUPPORTED) 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (info_ptr->valid & PNG_INFO_pHYs) 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_pHYs(png_ptr, info_ptr->x_pixels_per_unit, 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->y_pixels_per_unit, info_ptr->phys_unit_type); 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_tIME_SUPPORTED) 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (info_ptr->valid & PNG_INFO_tIME) 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_tIME(png_ptr, &(info_ptr->mod_time)); 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mode |= PNG_WROTE_tIME; 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_sPLT_SUPPORTED) 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (info_ptr->valid & PNG_INFO_sPLT) 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < (int)info_ptr->splt_palettes_num; i++) 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_sPLT(png_ptr, info_ptr->splt_palettes + i); 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_TEXT_SUPPORTED) 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Check to see if we need to write text chunks */ 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < info_ptr->num_text; i++) 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug2(2, "Writing header text chunk %d, type %d\n", i, 2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->text[i].compression); 2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* an internationalized chunk? */ 2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (info_ptr->text[i].compression > 0) 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_iTXt_SUPPORTED) 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* write international chunk */ 2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_iTXt(png_ptr, 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->text[i].compression, 2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->text[i].key, 2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->text[i].lang, 2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->text[i].lang_key, 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->text[i].text); 2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "Unable to write international text"); 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Mark this chunk as written */ 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* If we want a compressed text chunk */ 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_zTXt) 2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_zTXt_SUPPORTED) 2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* write compressed chunk */ 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_zTXt(png_ptr, info_ptr->text[i].key, 2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->text[i].text, 0, 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->text[i].compression); 2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "Unable to write compressed text"); 2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Mark this chunk as written */ 2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; 2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) 2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_tEXt_SUPPORTED) 2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* write uncompressed chunk */ 2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_tEXt(png_ptr, info_ptr->text[i].key, 2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->text[i].text, 2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0); 2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "Unable to write uncompressed text"); 2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Mark this chunk as written */ 2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; 2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) 2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (info_ptr->unknown_chunks_num) 2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_unknown_chunk *up; 2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(5, "writing extra chunks\n"); 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (up = info_ptr->unknown_chunks; 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project up++) 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int keep=png_handle_as_unknown(png_ptr, up->name); 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (keep != PNG_HANDLE_CHUNK_NEVER && 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project up->location && (up->location & PNG_HAVE_PLTE) && 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project !(up->location & PNG_HAVE_IDAT) && 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_chunk(png_ptr, up->name, up->data, up->size); 2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Writes the end of the PNG file. If you don't want to write comments or 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * time information, you can pass NULL for info. If you already wrote these 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * in png_write_info(), do not write them again here. If you have long 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * comments, I suggest writing them here, and compressing them. 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_write_end(png_structp png_ptr, png_infop info_ptr) 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_write_end\n"); 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL) 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->mode & PNG_HAVE_IDAT)) 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "No IDATs written into file"); 3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* see if user wants us to write information chunks */ 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (info_ptr != NULL) 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_TEXT_SUPPORTED) 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; /* local index variable */ 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_tIME_SUPPORTED) 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* check to see if user has supplied a time chunk */ 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((info_ptr->valid & PNG_INFO_tIME) && 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project !(png_ptr->mode & PNG_WROTE_tIME)) 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_tIME(png_ptr, &(info_ptr->mod_time)); 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_TEXT_SUPPORTED) 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* loop through comment chunks */ 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < info_ptr->num_text; i++) 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug2(2, "Writing trailer text chunk %d, type %d\n", i, 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->text[i].compression); 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* an internationalized chunk? */ 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (info_ptr->text[i].compression > 0) 3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_iTXt_SUPPORTED) 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* write international chunk */ 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_iTXt(png_ptr, 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->text[i].compression, 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->text[i].key, 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->text[i].lang, 3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->text[i].lang_key, 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->text[i].text); 3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "Unable to write international text"); 3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Mark this chunk as written */ 3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (info_ptr->text[i].compression >= PNG_TEXT_COMPRESSION_zTXt) 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_zTXt_SUPPORTED) 3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* write compressed chunk */ 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_zTXt(png_ptr, info_ptr->text[i].key, 3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->text[i].text, 0, 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->text[i].compression); 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "Unable to write compressed text"); 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Mark this chunk as written */ 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; 3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_tEXt_SUPPORTED) 3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* write uncompressed chunk */ 3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_tEXt(png_ptr, info_ptr->text[i].key, 3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->text[i].text, 0); 3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "Unable to write uncompressed text"); 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Mark this chunk as written */ 3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (info_ptr->unknown_chunks_num) 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_unknown_chunk *up; 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(5, "writing extra chunks\n"); 3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (up = info_ptr->unknown_chunks; 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project up++) 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int keep=png_handle_as_unknown(png_ptr, up->name); 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (keep != PNG_HANDLE_CHUNK_NEVER && 3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project up->location && (up->location & PNG_AFTER_IDAT) && 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_chunk(png_ptr, up->name, up->data, up->size); 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->mode |= PNG_AFTER_IDAT; 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* write end of PNG file */ 3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_IEND(png_ptr); 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_tIME_SUPPORTED) 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(_WIN32_WCE) 3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* "time.h" functions are not supported on WindowsCE */ 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_convert_from_struct_tm(png_timep ptime, struct tm FAR * ttime) 4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_convert_from_struct_tm\n"); 4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ptime->year = (png_uint_16)(1900 + ttime->tm_year); 4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ptime->month = (png_byte)(ttime->tm_mon + 1); 4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ptime->day = (png_byte)ttime->tm_mday; 4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ptime->hour = (png_byte)ttime->tm_hour; 4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ptime->minute = (png_byte)ttime->tm_min; 4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ptime->second = (png_byte)ttime->tm_sec; 4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_convert_from_time_t(png_timep ptime, time_t ttime) 4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct tm *tbuf; 4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_convert_from_time_t\n"); 4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tbuf = gmtime(&ttime); 4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_convert_from_struct_tm(ptime, tbuf); 4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Initialize png_ptr structure, and allocate any memory needed */ 4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_structp PNGAPI 4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_create_write_struct(png_const_charp user_png_ver, png_voidp error_ptr, 4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error_ptr error_fn, png_error_ptr warn_fn) 4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (png_create_write_struct_2(user_png_ver, error_ptr, error_fn, 4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project warn_fn, png_voidp_NULL, png_malloc_ptr_NULL, png_free_ptr_NULL)); 4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Alternate initialize png_ptr structure, and allocate any memory needed */ 4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_structp PNGAPI 4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, 4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, 4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_malloc_ptr malloc_fn, png_free_ptr free_fn) 4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_structp png_ptr; 4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef USE_FAR_KEYWORD 4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project jmp_buf jmpbuf; 4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_create_write_struct\n"); 4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG, 4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr); 4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); 4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL) 4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (NULL); 4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(PNG_1_0_X) 4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_ASSEMBLER_CODE_SUPPORTED 4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_MMX_CODE_SUPPORTED 4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_init_mmx_flags(png_ptr); /* 1.2.0 addition */ 4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_1_0_X */ 4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* added at libpng-1.2.6 */ 4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SET_USER_LIMITS_SUPPORTED 4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->user_width_max=PNG_USER_WIDTH_MAX; 4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; 4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef USE_FAR_KEYWORD 4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (setjmp(jmpbuf)) 4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (setjmp(png_ptr->jmpbuf)) 4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, png_ptr->zbuf); 4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zbuf=NULL; 4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_destroy_struct(png_ptr); 4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (NULL); 4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef USE_FAR_KEYWORD 4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy(png_ptr->jmpbuf,jmpbuf,png_sizeof(jmp_buf)); 4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn); 4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_USER_MEM_SUPPORTED */ 4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn); 4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project i=0; 4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do 4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(user_png_ver[i] != png_libpng_ver[i]) 4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; 4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } while (png_libpng_ver[i++]); 4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) 5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so 5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * we must recompile any applications that use any older library version. 5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * For versions after libpng 1.0, we will be compatible, so we need 5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * only check the first digit. 5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] || 5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) || 5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (user_png_ver[0] == '0' && user_png_ver[2] < '9')) 5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) 5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char msg[80]; 5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (user_png_ver) 5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_snprintf(msg, 80, 5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Application was compiled with png.h from libpng-%.20s", 5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project user_png_ver); 5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, msg); 5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_snprintf(msg, 80, 5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Application is running with png.c from libpng-%.20s", 5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_libpng_ver); 5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, msg); 5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_ERROR_NUMBERS_SUPPORTED 5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->flags=0; 5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, 5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Incompatible libpng version in application and library"); 5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* initialize zbuf - compression buffer */ 5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zbuf_size = PNG_ZBUF_SIZE; 5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, 5368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_uint_32)png_ptr->zbuf_size); 5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL, 5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_flush_ptr_NULL); 5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) 5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT, 5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1, png_doublep_NULL, png_doublep_NULL); 5448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Applications that neglect to set up their own setjmp() and then encounter 5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project a png_error() will longjmp here. Since the jmpbuf is then meaningless we 5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project abort instead of returning. */ 5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef USE_FAR_KEYWORD 5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (setjmp(jmpbuf)) 5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_ABORT(); 5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy(png_ptr->jmpbuf,jmpbuf,png_sizeof(jmp_buf)); 5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (setjmp(png_ptr->jmpbuf)) 5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PNG_ABORT(); 5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (png_ptr); 5608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Initialize png_ptr structure, and allocate any memory needed */ 5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_1_0_X) || defined(PNG_1_2_X) 5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Deprecated. */ 5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef png_write_init 5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_write_init(png_structp png_ptr) 5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* We only come here via pre-1.0.7-compiled applications */ 5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_init_2(png_ptr, "1.0.6 or earlier", 0, 0); 5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_write_init_2(png_structp png_ptr, png_const_charp user_png_ver, 5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t png_struct_size, png_size_t png_info_size) 5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* We only come here via pre-1.0.12-compiled applications */ 5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(png_ptr == NULL) return; 5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) 5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(png_sizeof(png_struct) > png_struct_size || 5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_sizeof(png_info) > png_info_size) 5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char msg[80]; 5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->warning_fn=NULL; 5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (user_png_ver) 5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_snprintf(msg, 80, 5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Application was compiled with png.h from libpng-%.20s", 5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project user_png_ver); 5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, msg); 5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_snprintf(msg, 80, 5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Application is running with png.c from libpng-%.20s", 5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_libpng_ver); 5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, msg); 5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(png_sizeof(png_struct) > png_struct_size) 5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->error_fn=NULL; 6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_ERROR_NUMBERS_SUPPORTED 6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->flags=0; 6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, 6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "The png struct allocated by the application for writing is too small."); 6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(png_sizeof(png_info) > png_info_size) 6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->error_fn=NULL; 6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_ERROR_NUMBERS_SUPPORTED 6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->flags=0; 6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, 6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "The info struct allocated by the application for writing is too small."); 6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_init_3(&png_ptr, user_png_ver, png_struct_size); 6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_1_0_X || PNG_1_2_X */ 6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_write_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver, 6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_size_t png_struct_size) 6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_structp png_ptr=*ptr_ptr; 6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project jmp_buf tmp_jmp; /* to save current jump buffer */ 6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i = 0; 6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL) 6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do 6368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (user_png_ver[i] != png_libpng_ver[i]) 6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_LEGACY_SUPPORTED 6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; 6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->warning_fn=NULL; 6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, 6448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Application uses deprecated png_write_init() and should be recompiled."); 6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } while (png_libpng_ver[i++]); 6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_write_init_3\n"); 6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* save jump buffer and error functions */ 6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof (jmp_buf)); 6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_sizeof(png_struct) > png_struct_size) 6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_destroy_struct(png_ptr); 6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); 6618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *ptr_ptr = png_ptr; 6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* reset all variables to 0 */ 6658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memset(png_ptr, 0, png_sizeof (png_struct)); 6668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* added at libpng-1.2.6 */ 6688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SET_USER_LIMITS_SUPPORTED 6698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->user_width_max=PNG_USER_WIDTH_MAX; 6708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; 6718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(PNG_1_0_X) 6748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_ASSEMBLER_CODE_SUPPORTED 6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_MMX_CODE_SUPPORTED 6768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_init_mmx_flags(png_ptr); /* 1.2.0 addition */ 6778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 6788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 6798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_1_0_X */ 6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 6828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* restore jump buffer */ 6838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof (jmp_buf)); 6848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 6858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL, 6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_flush_ptr_NULL); 6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* initialize zbuf - compression buffer */ 6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zbuf_size = PNG_ZBUF_SIZE; 6918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, 6928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_uint_32)png_ptr->zbuf_size); 6938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) 6958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT, 6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1, png_doublep_NULL, png_doublep_NULL); 6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 6988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Write a few rows of image data. If the image is interlaced, 7018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * either you will have to write the 7 sub images, or, if you 7028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * have called png_set_interlace_handling(), you will have to 7038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * "write" the image seven times. 7048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 7058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 7068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_write_rows(png_structp png_ptr, png_bytepp row, 7078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_uint_32 num_rows) 7088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_uint_32 i; /* row counter */ 7108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytepp rp; /* row pointer */ 7118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_write_rows\n"); 7138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL) 7158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 7168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* loop through the rows */ 7188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0, rp = row; i < num_rows; i++, rp++) 7198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_row(png_ptr, *rp); 7218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Write the image. You only need to call this function once, even 7258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * if you are writing an interlaced image. 7268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 7278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 7288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_write_image(png_structp png_ptr, png_bytepp image) 7298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_uint_32 i; /* row index */ 7318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int pass, num_pass; /* pass variables */ 7328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytepp rp; /* points to current row */ 7338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL) 7358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 7368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_write_image\n"); 7388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_INTERLACING_SUPPORTED) 7398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* intialize interlace handling. If image is not interlaced, 7408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project this will set pass to 1 */ 7418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project num_pass = png_set_interlace_handling(png_ptr); 7428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 7438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project num_pass = 1; 7448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 7458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* loop through passes */ 7468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (pass = 0; pass < num_pass; pass++) 7478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* loop through image */ 7498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0, rp = image; i < png_ptr->height; i++, rp++) 7508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_row(png_ptr, *rp); 7528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* called by user to write a row of image data */ 7578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 7588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_write_row(png_structp png_ptr, png_bytep row) 7598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL) 7618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 7628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug2(1, "in png_write_row (row %ld, pass %d)\n", 7638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_number, png_ptr->pass); 7648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* initialize transformations and other stuff if first time */ 7668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->row_number == 0 && png_ptr->pass == 0) 7678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 7688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* make sure we wrote the header info */ 7698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) 7708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, 7718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "png_write_info was never called before png_write_row."); 7728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* check for transforms that have been set but were defined out */ 7748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(PNG_WRITE_INVERT_SUPPORTED) && defined(PNG_READ_INVERT_SUPPORTED) 7758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->transformations & PNG_INVERT_MONO) 7768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "PNG_WRITE_INVERT_SUPPORTED is not defined."); 7778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 7788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(PNG_WRITE_FILLER_SUPPORTED) && defined(PNG_READ_FILLER_SUPPORTED) 7798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->transformations & PNG_FILLER) 7808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "PNG_WRITE_FILLER_SUPPORTED is not defined."); 7818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 7828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(PNG_WRITE_PACKSWAP_SUPPORTED) && defined(PNG_READ_PACKSWAP_SUPPORTED) 7838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->transformations & PNG_PACKSWAP) 7848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "PNG_WRITE_PACKSWAP_SUPPORTED is not defined."); 7858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 7868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(PNG_WRITE_PACK_SUPPORTED) && defined(PNG_READ_PACK_SUPPORTED) 7878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->transformations & PNG_PACK) 7888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "PNG_WRITE_PACK_SUPPORTED is not defined."); 7898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 7908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(PNG_WRITE_SHIFT_SUPPORTED) && defined(PNG_READ_SHIFT_SUPPORTED) 7918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->transformations & PNG_SHIFT) 7928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "PNG_WRITE_SHIFT_SUPPORTED is not defined."); 7938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 7948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(PNG_WRITE_BGR_SUPPORTED) && defined(PNG_READ_BGR_SUPPORTED) 7958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->transformations & PNG_BGR) 7968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "PNG_WRITE_BGR_SUPPORTED is not defined."); 7978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 7988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(PNG_WRITE_SWAP_SUPPORTED) && defined(PNG_READ_SWAP_SUPPORTED) 7998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->transformations & PNG_SWAP_BYTES) 8008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "PNG_WRITE_SWAP_SUPPORTED is not defined."); 8018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 8028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_start_row(png_ptr); 8048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_INTERLACING_SUPPORTED) 8078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* if interlaced and not interested in row, return */ 8088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) 8098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (png_ptr->pass) 8118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 0: 8138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->row_number & 0x07) 8148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_finish_row(png_ptr); 8168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 8178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 8198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 1: 8208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((png_ptr->row_number & 0x07) || png_ptr->width < 5) 8218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_finish_row(png_ptr); 8238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 8248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 8268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 2: 8278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((png_ptr->row_number & 0x07) != 4) 8288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_finish_row(png_ptr); 8308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 8318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 8338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 3: 8348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((png_ptr->row_number & 0x03) || png_ptr->width < 3) 8358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_finish_row(png_ptr); 8378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 8388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 8408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 4: 8418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((png_ptr->row_number & 0x03) != 2) 8428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_finish_row(png_ptr); 8448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 8458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 8478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 5: 8488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((png_ptr->row_number & 0x01) || png_ptr->width < 2) 8498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_finish_row(png_ptr); 8518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 8528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 8548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 6: 8558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->row_number & 0x01)) 8568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_finish_row(png_ptr); 8588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 8598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 8618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 8648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* set up row info for transformations */ 8668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_info.color_type = png_ptr->color_type; 8678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_info.width = png_ptr->usr_width; 8688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_info.channels = png_ptr->usr_channels; 8698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_info.bit_depth = png_ptr->usr_bit_depth; 8708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth * 8718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_info.channels); 8728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, 8748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_info.width); 8758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug1(3, "row_info->color_type = %d\n", png_ptr->row_info.color_type); 8778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug1(3, "row_info->width = %lu\n", png_ptr->row_info.width); 8788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug1(3, "row_info->channels = %d\n", png_ptr->row_info.channels); 8798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug1(3, "row_info->bit_depth = %d\n", png_ptr->row_info.bit_depth); 8808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug1(3, "row_info->pixel_depth = %d\n", png_ptr->row_info.pixel_depth); 8818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug1(3, "row_info->rowbytes = %lu\n", png_ptr->row_info.rowbytes); 8828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Copy user's row into buffer, leaving room for filter byte. */ 8848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy_check(png_ptr, png_ptr->row_buf + 1, row, 8858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_info.rowbytes); 8868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_INTERLACING_SUPPORTED) 8888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* handle interlacing */ 8898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->interlaced && png_ptr->pass < 6 && 8908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_ptr->transformations & PNG_INTERLACE)) 8918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_do_write_interlace(&(png_ptr->row_info), 8938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->row_buf + 1, png_ptr->pass); 8948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* this should always get caught above, but still ... */ 8958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->row_info.width)) 8968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_finish_row(png_ptr); 8988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 8998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 9028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* handle other transformations */ 9048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->transformations) 9058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_do_write_transformations(png_ptr); 9068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_MNG_FEATURES_SUPPORTED) 9088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Write filter_method 64 (intrapixel differencing) only if 9098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and 9108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 2. Libpng did not write a PNG signature (this filter_method is only 9118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * used in PNG datastreams that are embedded in MNG datastreams) and 9128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 3. The application called png_permit_mng_features with a mask that 9138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * included PNG_FLAG_MNG_FILTER_64 and 9148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 4. The filter_method is 64 and 9158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 5. The color_type is RGB or RGBA 9168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 9178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && 9188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING)) 9198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Intrapixel differencing */ 9218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_do_write_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1); 9228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 9248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Find a filter if necessary, filter the row and write it out. */ 9268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_find_filter(png_ptr, &(png_ptr->row_info)); 9278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->write_row_fn != NULL) 9298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (*(png_ptr->write_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass); 9308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_FLUSH_SUPPORTED) 9338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Set the automatic flush interval or 0 to turn flushing off */ 9348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 9358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_flush(png_structp png_ptr, int nrows) 9368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 9378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_set_flush\n"); 9388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL) 9398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 9408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->flush_dist = (nrows < 0 ? 0 : nrows); 9418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* flush the current output buffers now */ 9448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 9458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_write_flush(png_structp png_ptr) 9468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 9478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int wrote_IDAT; 9488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_write_flush\n"); 9508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL) 9518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 9528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* We have already written out all of the data */ 9538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->row_number >= png_ptr->num_rows) 9548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 9558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do 9578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ret; 9598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* compress the data */ 9618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = deflate(&png_ptr->zstream, Z_SYNC_FLUSH); 9628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project wrote_IDAT = 0; 9638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* check for compression errors */ 9658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret != Z_OK) 9668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->zstream.msg != NULL) 9688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, png_ptr->zstream.msg); 9698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 9708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "zlib error"); 9718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!(png_ptr->zstream.avail_out)) 9748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* write the IDAT and reset the zlib output buffer */ 9768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_IDAT(png_ptr, png_ptr->zbuf, 9778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zbuf_size); 9788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.next_out = png_ptr->zbuf; 9798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; 9808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project wrote_IDAT = 1; 9818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } while(wrote_IDAT == 1); 9838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* If there is any data left to be output, write it into a new IDAT */ 9858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->zbuf_size != png_ptr->zstream.avail_out) 9868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* write the IDAT and reset the zlib output buffer */ 9888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_IDAT(png_ptr, png_ptr->zbuf, 9898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zbuf_size - png_ptr->zstream.avail_out); 9908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.next_out = png_ptr->zbuf; 9918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; 9928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->flush_rows = 0; 9948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_flush(png_ptr); 9958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_WRITE_FLUSH_SUPPORTED */ 9978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* free all memory used by the write */ 9998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 10008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr) 10018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 10028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_structp png_ptr = NULL; 10038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_infop info_ptr = NULL; 10048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 10058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free_ptr free_fn = NULL; 10068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_voidp mem_ptr = NULL; 10078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 10088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_destroy_write_struct\n"); 10108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr_ptr != NULL) 10118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr = *png_ptr_ptr; 10138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 10148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project free_fn = png_ptr->free_fn; 10158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project mem_ptr = png_ptr->mem_ptr; 10168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 10178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (info_ptr_ptr != NULL) 10208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project info_ptr = *info_ptr_ptr; 10218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (info_ptr != NULL) 10238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1); 10258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) 10278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->num_chunk_list) 10288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, png_ptr->chunk_list); 10308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->chunk_list=NULL; 10318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->num_chunk_list=0; 10328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 10348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 10368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn, 10378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_voidp)mem_ptr); 10388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 10398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_destroy_struct((png_voidp)info_ptr); 10408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 10418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *info_ptr_ptr = NULL; 10428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr != NULL) 10458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_destroy(png_ptr); 10478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 10488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn, 10498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_voidp)mem_ptr); 10508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 10518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_destroy_struct((png_voidp)png_ptr); 10528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 10538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *png_ptr_ptr = NULL; 10548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 10568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Free any memory used in png_ptr struct (old method) */ 10598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 10608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_write_destroy(png_structp png_ptr) 10618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 10628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 10638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project jmp_buf tmp_jmp; /* save jump buffer */ 10648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 10658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error_ptr error_fn; 10668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error_ptr warning_fn; 10678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_voidp error_ptr; 10688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 10698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free_ptr free_fn; 10708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 10718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_write_destroy\n"); 10738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* free any memory zlib uses */ 10748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project deflateEnd(&png_ptr->zstream); 10758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* free our memory. png_free checks NULL for us. */ 10778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, png_ptr->zbuf); 10788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, png_ptr->row_buf); 10798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, png_ptr->prev_row); 10808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, png_ptr->sub_row); 10818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, png_ptr->up_row); 10828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, png_ptr->avg_row); 10838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, png_ptr->paeth_row); 10848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_TIME_RFC1123_SUPPORTED) 10868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, png_ptr->time_buffer); 10878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 10888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) 10908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, png_ptr->prev_filters); 10918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, png_ptr->filter_weights); 10928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, png_ptr->inv_filter_weights); 10938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, png_ptr->filter_costs); 10948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_free(png_ptr, png_ptr->inv_filter_costs); 10958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 10968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 10988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* reset structure */ 10998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof (jmp_buf)); 11008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 11018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project error_fn = png_ptr->error_fn; 11038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project warning_fn = png_ptr->warning_fn; 11048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project error_ptr = png_ptr->error_ptr; 11058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 11068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project free_fn = png_ptr->free_fn; 11078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 11088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memset(png_ptr, 0, png_sizeof (png_struct)); 11108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->error_fn = error_fn; 11128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->warning_fn = warning_fn; 11138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->error_ptr = error_ptr; 11148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_USER_MEM_SUPPORTED 11158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->free_fn = free_fn; 11168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 11178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED 11198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof (jmp_buf)); 11208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 11218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Allow the application to select one or more row filters to use. */ 11248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 11258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_filter(png_structp png_ptr, int method, int filters) 11268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 11278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_set_filter\n"); 11288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL) 11298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 11308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_MNG_FEATURES_SUPPORTED) 11318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && 11328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (method == PNG_INTRAPIXEL_DIFFERENCING)) 11338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project method = PNG_FILTER_TYPE_BASE; 11348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 11358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (method == PNG_FILTER_TYPE_BASE) 11368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (filters & (PNG_ALL_FILTERS | 0x07)) 11388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef PNG_NO_WRITE_FILTER 11408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 5: 11418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 6: 11428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 7: png_warning(png_ptr, "Unknown row filter for method 0"); 11438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_NO_WRITE_FILTER */ 11448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case PNG_FILTER_VALUE_NONE: 11458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->do_filter=PNG_FILTER_NONE; break; 11468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef PNG_NO_WRITE_FILTER 11478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case PNG_FILTER_VALUE_SUB: 11488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->do_filter=PNG_FILTER_SUB; break; 11498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case PNG_FILTER_VALUE_UP: 11508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->do_filter=PNG_FILTER_UP; break; 11518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case PNG_FILTER_VALUE_AVG: 11528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->do_filter=PNG_FILTER_AVG; break; 11538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case PNG_FILTER_VALUE_PAETH: 11548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->do_filter=PNG_FILTER_PAETH; break; 11558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: png_ptr->do_filter = (png_byte)filters; break; 11568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 11578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: png_warning(png_ptr, "Unknown row filter for method 0"); 11588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_NO_WRITE_FILTER */ 11598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* If we have allocated the row_buf, this means we have already started 11628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * with the image and we should have allocated all of the filter buffers 11638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * that have been selected. If prev_row isn't already allocated, then 11648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * it is too late to start using the filters that need it, since we 11658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * will be missing the data in the previous row. If an application 11668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * wants to start and stop using particular filters during compression, 11678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * it should start out with all of the filters, and then add and 11688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * remove them after the start of compression. 11698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 11708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->row_buf != NULL) 11718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef PNG_NO_WRITE_FILTER 11738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((png_ptr->do_filter & PNG_FILTER_SUB) && png_ptr->sub_row == NULL) 11748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->sub_row = (png_bytep)png_malloc(png_ptr, 11768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_ptr->rowbytes + 1)); 11778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB; 11788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((png_ptr->do_filter & PNG_FILTER_UP) && png_ptr->up_row == NULL) 11818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->prev_row == NULL) 11838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "Can't add Up filter after starting"); 11858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->do_filter &= ~PNG_FILTER_UP; 11868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 11888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->up_row = (png_bytep)png_malloc(png_ptr, 11908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_ptr->rowbytes + 1)); 11918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->up_row[0] = PNG_FILTER_VALUE_UP; 11928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((png_ptr->do_filter & PNG_FILTER_AVG) && png_ptr->avg_row == NULL) 11968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->prev_row == NULL) 11988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "Can't add Average filter after starting"); 12008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->do_filter &= ~PNG_FILTER_AVG; 12018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 12038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->avg_row = (png_bytep)png_malloc(png_ptr, 12058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_ptr->rowbytes + 1)); 12068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG; 12078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((png_ptr->do_filter & PNG_FILTER_PAETH) && 12118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->paeth_row == NULL) 12128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->prev_row == NULL) 12148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "Can't add Paeth filter after starting"); 12168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->do_filter &= (png_byte)(~PNG_FILTER_PAETH); 12178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 12198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->paeth_row = (png_bytep)png_malloc(png_ptr, 12218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_ptr->rowbytes + 1)); 12228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH; 12238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->do_filter == PNG_NO_FILTERS) 12278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_NO_WRITE_FILTER */ 12288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->do_filter = PNG_FILTER_NONE; 12298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 12328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_error(png_ptr, "Unknown custom filter method"); 12338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* This allows us to influence the way in which libpng chooses the "best" 12368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * filter for the current scanline. While the "minimum-sum-of-absolute- 12378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * differences metric is relatively fast and effective, there is some 12388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * question as to whether it can be improved upon by trying to keep the 12398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * filtered data going to zlib more consistent, hopefully resulting in 12408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * better compression. 12418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 12428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) /* GRR 970116 */ 12438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 12448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_filter_heuristics(png_structp png_ptr, int heuristic_method, 12458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int num_weights, png_doublep filter_weights, 12468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_doublep filter_costs) 12478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 12488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 12498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_set_filter_heuristics\n"); 12518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL) 12528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 12538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (heuristic_method >= PNG_FILTER_HEURISTIC_LAST) 12548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "Unknown filter heuristic method"); 12568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 12578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (heuristic_method == PNG_FILTER_HEURISTIC_DEFAULT) 12608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project heuristic_method = PNG_FILTER_HEURISTIC_UNWEIGHTED; 12628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (num_weights < 0 || filter_weights == NULL || 12658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project heuristic_method == PNG_FILTER_HEURISTIC_UNWEIGHTED) 12668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project num_weights = 0; 12688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->num_prev_filters = (png_byte)num_weights; 12718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->heuristic_method = (png_byte)heuristic_method; 12728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (num_weights > 0) 12748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->prev_filters == NULL) 12768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->prev_filters = (png_bytep)png_malloc(png_ptr, 12788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_uint_32)(png_sizeof(png_byte) * num_weights)); 12798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* To make sure that the weighting starts out fairly */ 12818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < num_weights; i++) 12828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->prev_filters[i] = 255; 12848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->filter_weights == NULL) 12888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->filter_weights = (png_uint_16p)png_malloc(png_ptr, 12908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_uint_32)(png_sizeof(png_uint_16) * num_weights)); 12918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->inv_filter_weights = (png_uint_16p)png_malloc(png_ptr, 12938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_uint_32)(png_sizeof(png_uint_16) * num_weights)); 12948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < num_weights; i++) 12958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 12968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->inv_filter_weights[i] = 12978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; 12988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < num_weights; i++) 13028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 13038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (filter_weights[i] < 0.0) 13048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 13058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->inv_filter_weights[i] = 13068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; 13078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 13098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 13108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->inv_filter_weights[i] = 13118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_uint_16)((double)PNG_WEIGHT_FACTOR*filter_weights[i]+0.5); 13128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->filter_weights[i] = 13138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_uint_16)((double)PNG_WEIGHT_FACTOR/filter_weights[i]+0.5); 13148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* If, in the future, there are other filter methods, this would 13198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * need to be based on png_ptr->filter. 13208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 13218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->filter_costs == NULL) 13228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 13238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->filter_costs = (png_uint_16p)png_malloc(png_ptr, 13248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_uint_32)(png_sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST)); 13258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->inv_filter_costs = (png_uint_16p)png_malloc(png_ptr, 13278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_uint_32)(png_sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST)); 13288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) 13308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 13318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->inv_filter_costs[i] = 13328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->filter_costs[i] = PNG_COST_FACTOR; 13338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Here is where we set the relative costs of the different filters. We 13378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * should take the desired compression level into account when setting 13388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the costs, so that Paeth, for instance, has a high relative cost at low 13398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * compression levels, while it has a lower relative cost at higher 13408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * compression settings. The filter types are in order of increasing 13418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * relative cost, so it would be possible to do this with an algorithm. 13428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 13438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) 13448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 13458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (filter_costs == NULL || filter_costs[i] < 0.0) 13468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 13478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->inv_filter_costs[i] = 13488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->filter_costs[i] = PNG_COST_FACTOR; 13498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (filter_costs[i] >= 1.0) 13518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 13528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->inv_filter_costs[i] = 13538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_uint_16)((double)PNG_COST_FACTOR / filter_costs[i] + 0.5); 13548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->filter_costs[i] = 13558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (png_uint_16)((double)PNG_COST_FACTOR * filter_costs[i] + 0.5); 13568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ 13608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 13628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_compression_level(png_structp png_ptr, int level) 13638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_set_compression_level\n"); 13658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL) 13668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 13678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_LEVEL; 13688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zlib_level = level; 13698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 13728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_compression_mem_level(png_structp png_ptr, int mem_level) 13738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_set_compression_mem_level\n"); 13758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL) 13768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 13778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL; 13788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zlib_mem_level = mem_level; 13798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 13828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_compression_strategy(png_structp png_ptr, int strategy) 13838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_set_compression_strategy\n"); 13858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL) 13868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 13878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_STRATEGY; 13888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zlib_strategy = strategy; 13898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 13928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_compression_window_bits(png_structp png_ptr, int window_bits) 13938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL) 13958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 13968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (window_bits > 15) 13978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "Only compression windows <= 32k supported by PNG"); 13988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (window_bits < 8) 13998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "Only compression windows >= 256 supported by PNG"); 14008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef WBITS_8_OK 14018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* avoid libpng bug with 256-byte windows */ 14028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (window_bits == 8) 14038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 14048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "Compression window is being reset to 512"); 14058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project window_bits=9; 14068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 14088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS; 14098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zlib_window_bits = window_bits; 14108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 14118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 14138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_compression_method(png_structp png_ptr, int method) 14148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 14158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_set_compression_method\n"); 14168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL) 14178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 14188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (method != 8) 14198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, "Only compression method 8 is supported by PNG"); 14208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_METHOD; 14218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->zlib_method = method; 14228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 14238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 14258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_write_status_fn(png_structp png_ptr, png_write_status_ptr write_row_fn) 14268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 14278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL) 14288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 14298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->write_row_fn = write_row_fn; 14308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 14318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) 14338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 14348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_write_user_transform_fn(png_structp png_ptr, png_user_transform_ptr 14358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project write_user_transform_fn) 14368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 14378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_set_write_user_transform_fn\n"); 14388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL) 14398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 14408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->transformations |= PNG_USER_TRANSFORM; 14418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->write_user_transform_fn = write_user_transform_fn; 14428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 14438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 14448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_INFO_IMAGE_SUPPORTED) 14478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 14488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_write_png(png_structp png_ptr, png_infop info_ptr, 14498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int transforms, voidp params) 14508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 14518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL || info_ptr == NULL) 14528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 14538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) 14548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* invert the alpha channel from opacity to transparency */ 14558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (transforms & PNG_TRANSFORM_INVERT_ALPHA) 14568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_set_invert_alpha(png_ptr); 14578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 14588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Write the file header information. */ 14608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_info(png_ptr, info_ptr); 14618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* ------ these transformations don't touch the info structure ------- */ 14638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_INVERT_SUPPORTED) 14658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* invert monochrome pixels */ 14668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (transforms & PNG_TRANSFORM_INVERT_MONO) 14678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_set_invert_mono(png_ptr); 14688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 14698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_SHIFT_SUPPORTED) 14718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Shift the pixels up to a legal bit depth and fill in 14728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * as appropriate to correctly scale the image. 14738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 14748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((transforms & PNG_TRANSFORM_SHIFT) 14758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project && (info_ptr->valid & PNG_INFO_sBIT)) 14768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_set_shift(png_ptr, &info_ptr->sig_bit); 14778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 14788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_PACK_SUPPORTED) 14808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* pack pixels into bytes */ 14818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (transforms & PNG_TRANSFORM_PACKING) 14828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_set_packing(png_ptr); 14838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 14848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) 14868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* swap location of alpha bytes from ARGB to RGBA */ 14878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (transforms & PNG_TRANSFORM_SWAP_ALPHA) 14888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_set_swap_alpha(png_ptr); 14898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 14908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_FILLER_SUPPORTED) 14928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Get rid of filler (OR ALPHA) bytes, pack XRGB/RGBX/ARGB/RGBA into 14938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * RGB (4 channels -> 3 channels). The second parameter is not used. 14948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 14958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (transforms & PNG_TRANSFORM_STRIP_FILLER) 14968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); 14978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 14988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_BGR_SUPPORTED) 15008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* flip BGR pixels to RGB */ 15018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (transforms & PNG_TRANSFORM_BGR) 15028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_set_bgr(png_ptr); 15038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 15048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_SWAP_SUPPORTED) 15068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* swap bytes of 16-bit files to most significant byte first */ 15078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (transforms & PNG_TRANSFORM_SWAP_ENDIAN) 15088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_set_swap(png_ptr); 15098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 15108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_PACKSWAP_SUPPORTED) 15128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* swap bits of 1, 2, 4 bit packed pixel formats */ 15138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (transforms & PNG_TRANSFORM_PACKSWAP) 15148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_set_packswap(png_ptr); 15158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 15168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* ----------------------- end of transformations ------------------- */ 15188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* write the bits */ 15208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (info_ptr->valid & PNG_INFO_IDAT) 15218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_image(png_ptr, info_ptr->row_pointers); 15228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* It is REQUIRED to call this to finish writing the rest of the file */ 15248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_write_end(png_ptr, info_ptr); 15258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project transforms = transforms; /* quiet compiler warnings */ 15278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params = params; 15288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 15298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 15308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_WRITE_SUPPORTED */ 1531