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