14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann/* pngset.c - storage of image information into info struct
34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *
44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * Last changed in libpng 1.6.21 [January 15, 2016]
54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * Copyright (c) 1998-2015 Glenn Randers-Pehrson
64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * This code is released under the libpng license.
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * For conditions of distribution and use, see the disclaimer
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * and license in png.h
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * The functions here are used during reads to store data from the file
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * into the info struct, and during writes to store application data
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * into the info struct for writing into the file.  This abstracts the
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * info struct and allows us to change the structure in the future.
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann */
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "pngpriv.h"
204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_bKGD_SUPPORTED
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_bKGD(png_const_structrp png_ptr, png_inforp info_ptr,
264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_const_color_16p background)
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug1(1, "in %s storage function", "bKGD");
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL || info_ptr == NULL || background == NULL)
314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->background = *background;
344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->valid |= PNG_INFO_bKGD;
354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif
374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_cHRM_SUPPORTED
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGFAPI
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_cHRM_fixed(png_const_structrp png_ptr, png_inforp info_ptr,
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x,
424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y,
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_fixed_point blue_x, png_fixed_point blue_y)
444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_xy xy;
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug1(1, "in %s storage function", "cHRM fixed");
484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL || info_ptr == NULL)
504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   xy.redx = red_x;
534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   xy.redy = red_y;
544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   xy.greenx = green_x;
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   xy.greeny = green_y;
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   xy.bluex = blue_x;
574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   xy.bluey = blue_y;
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   xy.whitex = white_x;
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   xy.whitey = white_y;
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_colorspace_set_chromaticities(png_ptr, &info_ptr->colorspace, &xy,
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       2/* override with app values*/) != 0)
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      info_ptr->colorspace.flags |= PNG_COLORSPACE_FROM_cHRM;
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_colorspace_sync_info(png_ptr, info_ptr);
664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGFAPI
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_cHRM_XYZ_fixed(png_const_structrp png_ptr, png_inforp info_ptr,
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_fixed_point int_red_X, png_fixed_point int_red_Y,
714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_fixed_point int_red_Z, png_fixed_point int_green_X,
724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_fixed_point int_green_Y, png_fixed_point int_green_Z,
734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_fixed_point int_blue_X, png_fixed_point int_blue_Y,
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_fixed_point int_blue_Z)
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_XYZ XYZ;
774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug1(1, "in %s storage function", "cHRM XYZ fixed");
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL || info_ptr == NULL)
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   XYZ.red_X = int_red_X;
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   XYZ.red_Y = int_red_Y;
854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   XYZ.red_Z = int_red_Z;
864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   XYZ.green_X = int_green_X;
874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   XYZ.green_Y = int_green_Y;
884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   XYZ.green_Z = int_green_Z;
894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   XYZ.blue_X = int_blue_X;
904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   XYZ.blue_Y = int_blue_Y;
914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   XYZ.blue_Z = int_blue_Z;
924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_colorspace_set_endpoints(png_ptr, &info_ptr->colorspace,
944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &XYZ, 2) != 0)
954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      info_ptr->colorspace.flags |= PNG_COLORSPACE_FROM_cHRM;
964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_colorspace_sync_info(png_ptr, info_ptr);
984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  ifdef PNG_FLOATING_POINT_SUPPORTED
1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_cHRM(png_const_structrp png_ptr, png_inforp info_ptr,
1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    double white_x, double white_y, double red_x, double red_y,
1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    double green_x, double green_y, double blue_x, double blue_y)
1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_set_cHRM_fixed(png_ptr, info_ptr,
1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_fixed(png_ptr, white_x, "cHRM White X"),
1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_fixed(png_ptr, white_y, "cHRM White Y"),
1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_fixed(png_ptr, red_x, "cHRM Red X"),
1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_fixed(png_ptr, red_y, "cHRM Red Y"),
1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_fixed(png_ptr, green_x, "cHRM Green X"),
1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_fixed(png_ptr, green_y, "cHRM Green Y"),
1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_fixed(png_ptr, blue_x, "cHRM Blue X"),
1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_fixed(png_ptr, blue_y, "cHRM Blue Y"));
1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_cHRM_XYZ(png_const_structrp png_ptr, png_inforp info_ptr, double red_X,
1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    double red_Y, double red_Z, double green_X, double green_Y, double green_Z,
1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    double blue_X, double blue_Y, double blue_Z)
1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_set_cHRM_XYZ_fixed(png_ptr, info_ptr,
1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_fixed(png_ptr, red_X, "cHRM Red X"),
1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_fixed(png_ptr, red_Y, "cHRM Red Y"),
1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_fixed(png_ptr, red_Z, "cHRM Red Z"),
1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_fixed(png_ptr, green_X, "cHRM Green X"),
1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_fixed(png_ptr, green_Y, "cHRM Green Y"),
1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_fixed(png_ptr, green_Z, "cHRM Green Z"),
1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_fixed(png_ptr, blue_X, "cHRM Blue X"),
1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_fixed(png_ptr, blue_Y, "cHRM Blue Y"),
1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_fixed(png_ptr, blue_Z, "cHRM Blue Z"));
1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  endif /* FLOATING_POINT */
1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif /* cHRM */
1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_gAMA_SUPPORTED
1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGFAPI
1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_gAMA_fixed(png_const_structrp png_ptr, png_inforp info_ptr,
1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_fixed_point file_gamma)
1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug1(1, "in %s storage function", "gAMA");
1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL || info_ptr == NULL)
1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_colorspace_set_gamma(png_ptr, &info_ptr->colorspace, file_gamma);
1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_colorspace_sync_info(png_ptr, info_ptr);
1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  ifdef PNG_FLOATING_POINT_SUPPORTED
1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_gAMA(png_const_structrp png_ptr, png_inforp info_ptr, double file_gamma)
1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_set_gAMA_fixed(png_ptr, info_ptr, png_fixed(png_ptr, file_gamma,
1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       "png_set_gAMA"));
1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  endif
1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif
1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_hIST_SUPPORTED
1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_hIST(png_const_structrp png_ptr, png_inforp info_ptr,
1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_const_uint_16p hist)
1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   int i;
1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug1(1, "in %s storage function", "hIST");
1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL || info_ptr == NULL)
1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (info_ptr->num_palette == 0 || info_ptr->num_palette
1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       > PNG_MAX_PALETTE_LENGTH)
1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_warning(png_ptr,
1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          "Invalid palette size, hIST allocation skipped");
1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_free_data(png_ptr, info_ptr, PNG_FREE_HIST, 0);
1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* Changed from info->num_palette to PNG_MAX_PALETTE_LENGTH in
1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * version 1.2.1
1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    */
1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->hist = png_voidcast(png_uint_16p, png_malloc_warn(png_ptr,
1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       PNG_MAX_PALETTE_LENGTH * (sizeof (png_uint_16))));
1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (info_ptr->hist == NULL)
1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_warning(png_ptr, "Insufficient memory for hIST chunk data");
1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->free_me |= PNG_FREE_HIST;
1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   for (i = 0; i < info_ptr->num_palette; i++)
2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      info_ptr->hist[i] = hist[i];
2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->valid |= PNG_INFO_hIST;
2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif
2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_IHDR(png_const_structrp png_ptr, png_inforp info_ptr,
2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_uint_32 width, png_uint_32 height, int bit_depth,
2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int color_type, int interlace_type, int compression_type,
2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int filter_type)
2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug1(1, "in %s storage function", "IHDR");
2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL || info_ptr == NULL)
2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->width = width;
2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->height = height;
2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->bit_depth = (png_byte)bit_depth;
2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->color_type = (png_byte)color_type;
2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->compression_type = (png_byte)compression_type;
2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->filter_type = (png_byte)filter_type;
2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->interlace_type = (png_byte)interlace_type;
2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_check_IHDR (png_ptr, info_ptr->width, info_ptr->height,
2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       info_ptr->bit_depth, info_ptr->color_type, info_ptr->interlace_type,
2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       info_ptr->compression_type, info_ptr->filter_type);
2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      info_ptr->channels = 1;
2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   else if ((info_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)
2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      info_ptr->channels = 3;
2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   else
2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      info_ptr->channels = 1;
2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if ((info_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0)
2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      info_ptr->channels++;
2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth);
2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width);
2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_oFFs_SUPPORTED
2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_oFFs(png_const_structrp png_ptr, png_inforp info_ptr,
2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_int_32 offset_x, png_int_32 offset_y, int unit_type)
2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug1(1, "in %s storage function", "oFFs");
2524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL || info_ptr == NULL)
2544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->x_offset = offset_x;
2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->y_offset = offset_y;
2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->offset_unit_type = (png_byte)unit_type;
2594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->valid |= PNG_INFO_oFFs;
2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif
2624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_pCAL_SUPPORTED
2644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_pCAL(png_const_structrp png_ptr, png_inforp info_ptr,
2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_const_charp purpose, png_int_32 X0, png_int_32 X1, int type,
2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int nparams, png_const_charp units, png_charpp params)
2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_size_t length;
2704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   int i;
2714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug1(1, "in %s storage function", "pCAL");
2734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL || info_ptr == NULL || purpose == NULL || units == NULL
2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       || (nparams > 0 && params == NULL))
2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   length = strlen(purpose) + 1;
2794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug1(3, "allocating purpose for info (%lu bytes)",
2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       (unsigned long)length);
2814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* TODO: validate format of calibration name and unit name */
2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* Check that the type matches the specification. */
2854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (type < 0 || type > 3)
2864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
2874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_chunk_report(png_ptr, "Invalid pCAL equation type",
2884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            PNG_CHUNK_WRITE_ERROR);
2894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
2904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
2914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (nparams < 0 || nparams > 255)
2934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
2944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_chunk_report(png_ptr, "Invalid pCAL parameter count",
2954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            PNG_CHUNK_WRITE_ERROR);
2964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
2974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* Validate params[nparams] */
3004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   for (i=0; i<nparams; ++i)
3014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
3024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (params[i] == NULL ||
3034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          !png_check_fp_string(params[i], strlen(params[i])))
3044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
3054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         png_chunk_report(png_ptr, "Invalid format for pCAL parameter",
3064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann               PNG_CHUNK_WRITE_ERROR);
3074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         return;
3084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
3094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
3104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->pcal_purpose = png_voidcast(png_charp,
3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       png_malloc_warn(png_ptr, length));
3134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (info_ptr->pcal_purpose == NULL)
3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
3164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_chunk_report(png_ptr, "Insufficient memory for pCAL purpose",
3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            PNG_CHUNK_WRITE_ERROR);
3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
3204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   memcpy(info_ptr->pcal_purpose, purpose, length);
3224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug(3, "storing X0, X1, type, and nparams in info");
3244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->pcal_X0 = X0;
3254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->pcal_X1 = X1;
3264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->pcal_type = (png_byte)type;
3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->pcal_nparams = (png_byte)nparams;
3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   length = strlen(units) + 1;
3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug1(3, "allocating units for info (%lu bytes)",
3314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     (unsigned long)length);
3324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->pcal_units = png_voidcast(png_charp,
3344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_malloc_warn(png_ptr, length));
3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (info_ptr->pcal_units == NULL)
3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_warning(png_ptr, "Insufficient memory for pCAL units");
3394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
3424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   memcpy(info_ptr->pcal_units, units, length);
3444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->pcal_params = png_voidcast(png_charpp, png_malloc_warn(png_ptr,
3464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       (png_size_t)((nparams + 1) * (sizeof (png_charp)))));
3474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (info_ptr->pcal_params == NULL)
3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
3504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_warning(png_ptr, "Insufficient memory for pCAL params");
3514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
3544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   memset(info_ptr->pcal_params, 0, (nparams + 1) * (sizeof (png_charp)));
3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   for (i = 0; i < nparams; i++)
3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      length = strlen(params[i]) + 1;
3604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_debug2(3, "allocating parameter %d for info (%lu bytes)", i,
3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          (unsigned long)length);
3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      info_ptr->pcal_params[i] = (png_charp)png_malloc_warn(png_ptr, length);
3644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (info_ptr->pcal_params[i] == NULL)
3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         png_warning(png_ptr, "Insufficient memory for pCAL parameter");
3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         return;
3704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      memcpy(info_ptr->pcal_params[i], params[i], length);
3734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
3744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->valid |= PNG_INFO_pCAL;
3764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->free_me |= PNG_FREE_PCAL;
3774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif
3794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_sCAL_SUPPORTED
3814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
3824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_sCAL_s(png_const_structrp png_ptr, png_inforp info_ptr,
3834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int unit, png_const_charp swidth, png_const_charp sheight)
3844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
3854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_size_t lengthw = 0, lengthh = 0;
3864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug1(1, "in %s storage function", "sCAL");
3884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL || info_ptr == NULL)
3904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
3914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* Double check the unit (should never get here with an invalid
3934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * unit unless this is an API call.)
3944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    */
3954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (unit != 1 && unit != 2)
3964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_error(png_ptr, "Invalid sCAL unit");
3974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (swidth == NULL || (lengthw = strlen(swidth)) == 0 ||
3994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       swidth[0] == 45 /* '-' */ || !png_check_fp_string(swidth, lengthw))
4004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_error(png_ptr, "Invalid sCAL width");
4014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (sheight == NULL || (lengthh = strlen(sheight)) == 0 ||
4034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       sheight[0] == 45 /* '-' */ || !png_check_fp_string(sheight, lengthh))
4044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_error(png_ptr, "Invalid sCAL height");
4054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->scal_unit = (png_byte)unit;
4074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   ++lengthw;
4094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug1(3, "allocating unit for info (%u bytes)", (unsigned int)lengthw);
4114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->scal_s_width = png_voidcast(png_charp,
4134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_malloc_warn(png_ptr, lengthw));
4144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (info_ptr->scal_s_width == NULL)
4164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
4174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_warning(png_ptr, "Memory allocation failed while processing sCAL");
4184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
4204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
4214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   memcpy(info_ptr->scal_s_width, swidth, lengthw);
4234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   ++lengthh;
4254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug1(3, "allocating unit for info (%u bytes)", (unsigned int)lengthh);
4274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->scal_s_height = png_voidcast(png_charp,
4294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_malloc_warn(png_ptr, lengthh));
4304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (info_ptr->scal_s_height == NULL)
4324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
4334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_free (png_ptr, info_ptr->scal_s_width);
4344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      info_ptr->scal_s_width = NULL;
4354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_warning(png_ptr, "Memory allocation failed while processing sCAL");
4374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
4394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
4404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   memcpy(info_ptr->scal_s_height, sheight, lengthh);
4424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->valid |= PNG_INFO_sCAL;
4444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->free_me |= PNG_FREE_SCAL;
4454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  ifdef PNG_FLOATING_POINT_SUPPORTED
4484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
4494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_sCAL(png_const_structrp png_ptr, png_inforp info_ptr, int unit,
4504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    double width, double height)
4514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
4524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug1(1, "in %s storage function", "sCAL");
4534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* Check the arguments. */
4554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (width <= 0)
4564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_warning(png_ptr, "Invalid sCAL width ignored");
4574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   else if (height <= 0)
4594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_warning(png_ptr, "Invalid sCAL height ignored");
4604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   else
4624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
4634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      /* Convert 'width' and 'height' to ASCII. */
4644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      char swidth[PNG_sCAL_MAX_DIGITS+1];
4654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      char sheight[PNG_sCAL_MAX_DIGITS+1];
4664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_ascii_from_fp(png_ptr, swidth, (sizeof swidth), width,
4684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         PNG_sCAL_PRECISION);
4694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_ascii_from_fp(png_ptr, sheight, (sizeof sheight), height,
4704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         PNG_sCAL_PRECISION);
4714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_set_sCAL_s(png_ptr, info_ptr, unit, swidth, sheight);
4734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
4744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  endif
4764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  ifdef PNG_FIXED_POINT_SUPPORTED
4784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
4794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_sCAL_fixed(png_const_structrp png_ptr, png_inforp info_ptr, int unit,
4804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_fixed_point width, png_fixed_point height)
4814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
4824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug1(1, "in %s storage function", "sCAL");
4834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* Check the arguments. */
4854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (width <= 0)
4864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_warning(png_ptr, "Invalid sCAL width ignored");
4874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   else if (height <= 0)
4894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_warning(png_ptr, "Invalid sCAL height ignored");
4904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   else
4924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
4934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      /* Convert 'width' and 'height' to ASCII. */
4944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      char swidth[PNG_sCAL_MAX_DIGITS+1];
4954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      char sheight[PNG_sCAL_MAX_DIGITS+1];
4964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_ascii_from_fixed(png_ptr, swidth, (sizeof swidth), width);
4984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_ascii_from_fixed(png_ptr, sheight, (sizeof sheight), height);
4994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_set_sCAL_s(png_ptr, info_ptr, unit, swidth, sheight);
5014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
5024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  endif
5044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif
5054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_pHYs_SUPPORTED
5074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
5084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_pHYs(png_const_structrp png_ptr, png_inforp info_ptr,
5094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_uint_32 res_x, png_uint_32 res_y, int unit_type)
5104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
5114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug1(1, "in %s storage function", "pHYs");
5124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL || info_ptr == NULL)
5144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
5154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->x_pixels_per_unit = res_x;
5174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->y_pixels_per_unit = res_y;
5184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->phys_unit_type = (png_byte)unit_type;
5194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->valid |= PNG_INFO_pHYs;
5204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif
5224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
5244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_PLTE(png_structrp png_ptr, png_inforp info_ptr,
5254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_const_colorp palette, int num_palette)
5264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
5274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_uint_32 max_palette_length;
5294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug1(1, "in %s storage function", "PLTE");
5314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL || info_ptr == NULL)
5334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
5344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   max_palette_length = (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ?
5364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      (1 << info_ptr->bit_depth) : PNG_MAX_PALETTE_LENGTH;
5374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (num_palette < 0 || num_palette > (int) max_palette_length)
5394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
5404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
5414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         png_error(png_ptr, "Invalid palette length");
5424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      else
5444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
5454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         png_warning(png_ptr, "Invalid palette length");
5464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         return;
5484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
5494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
5504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if ((num_palette > 0 && palette == NULL) ||
5524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      (num_palette == 0
5534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#        ifdef PNG_MNG_FEATURES_SUPPORTED
5544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            && (png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) == 0
5554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#        endif
5564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      ))
5574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
5584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_error(png_ptr, "Invalid palette");
5594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
5604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* It may not actually be necessary to set png_ptr->palette here;
5624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * we do it for backward compatibility with the way the png_handle_tRNS
5634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * function used to do the allocation.
5644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    *
5654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * 1.6.0: the above statement appears to be incorrect; something has to set
5664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * the palette inside png_struct on read.
5674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    */
5684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_free_data(png_ptr, info_ptr, PNG_FREE_PLTE, 0);
5694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* Changed in libpng-1.2.1 to allocate PNG_MAX_PALETTE_LENGTH instead
5714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * of num_palette entries, in case of an invalid PNG file or incorrect
5724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * call to png_set_PLTE() with too-large sample values.
5734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    */
5744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_ptr->palette = png_voidcast(png_colorp, png_calloc(png_ptr,
5754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       PNG_MAX_PALETTE_LENGTH * (sizeof (png_color))));
5764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (num_palette > 0)
5784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      memcpy(png_ptr->palette, palette, num_palette * (sizeof (png_color)));
5794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->palette = png_ptr->palette;
5804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->num_palette = png_ptr->num_palette = (png_uint_16)num_palette;
5814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->free_me |= PNG_FREE_PLTE;
5834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->valid |= PNG_INFO_PLTE;
5854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_sBIT_SUPPORTED
5884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
5894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_sBIT(png_const_structrp png_ptr, png_inforp info_ptr,
5904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_const_color_8p sig_bit)
5914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
5924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug1(1, "in %s storage function", "sBIT");
5934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL || info_ptr == NULL || sig_bit == NULL)
5954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
5964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->sig_bit = *sig_bit;
5984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->valid |= PNG_INFO_sBIT;
5994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif
6014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_sRGB_SUPPORTED
6034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
6044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_sRGB(png_const_structrp png_ptr, png_inforp info_ptr, int srgb_intent)
6054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
6064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug1(1, "in %s storage function", "sRGB");
6074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL || info_ptr == NULL)
6094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
6104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   (void)png_colorspace_set_sRGB(png_ptr, &info_ptr->colorspace, srgb_intent);
6124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_colorspace_sync_info(png_ptr, info_ptr);
6134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
6164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_sRGB_gAMA_and_cHRM(png_const_structrp png_ptr, png_inforp info_ptr,
6174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int srgb_intent)
6184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
6194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug1(1, "in %s storage function", "sRGB_gAMA_and_cHRM");
6204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL || info_ptr == NULL)
6224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
6234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_colorspace_set_sRGB(png_ptr, &info_ptr->colorspace,
6254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       srgb_intent) != 0)
6264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
6274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      /* This causes the gAMA and cHRM to be written too */
6284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      info_ptr->colorspace.flags |=
6294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         PNG_COLORSPACE_FROM_gAMA|PNG_COLORSPACE_FROM_cHRM;
6304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
6314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_colorspace_sync_info(png_ptr, info_ptr);
6334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif /* sRGB */
6354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_iCCP_SUPPORTED
6384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
6394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_iCCP(png_const_structrp png_ptr, png_inforp info_ptr,
6404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_const_charp name, int compression_type,
6414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_const_bytep profile, png_uint_32 proflen)
6424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
6434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_charp new_iccp_name;
6444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_bytep new_iccp_profile;
6454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_size_t length;
6464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug1(1, "in %s storage function", "iCCP");
6484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL || info_ptr == NULL || name == NULL || profile == NULL)
6504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
6514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (compression_type != PNG_COMPRESSION_TYPE_BASE)
6534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_app_error(png_ptr, "Invalid iCCP compression method");
6544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* Set the colorspace first because this validates the profile; do not
6564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * override previously set app cHRM or gAMA here (because likely as not the
6574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * application knows better than libpng what the correct values are.)  Pass
6584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * the info_ptr color_type field to png_colorspace_set_ICC because in the
6594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * write case it has not yet been stored in png_ptr.
6604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    */
6614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
6624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      int result = png_colorspace_set_ICC(png_ptr, &info_ptr->colorspace, name,
6634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         proflen, profile, info_ptr->color_type);
6644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_colorspace_sync_info(png_ptr, info_ptr);
6664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      /* Don't do any of the copying if the profile was bad, or inconsistent. */
6684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (result == 0)
6694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         return;
6704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      /* But do write the gAMA and cHRM chunks from the profile. */
6724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      info_ptr->colorspace.flags |=
6734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         PNG_COLORSPACE_FROM_gAMA|PNG_COLORSPACE_FROM_cHRM;
6744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
6754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   length = strlen(name)+1;
6774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   new_iccp_name = png_voidcast(png_charp, png_malloc_warn(png_ptr, length));
6784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (new_iccp_name == NULL)
6804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
6814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_benign_error(png_ptr, "Insufficient memory to process iCCP chunk");
6824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
6844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
6854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   memcpy(new_iccp_name, name, length);
6874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   new_iccp_profile = png_voidcast(png_bytep,
6884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_malloc_warn(png_ptr, proflen));
6894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (new_iccp_profile == NULL)
6914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
6924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_free(png_ptr, new_iccp_name);
6934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_benign_error(png_ptr,
6944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          "Insufficient memory to process iCCP profile");
6954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
6974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
6984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   memcpy(new_iccp_profile, profile, proflen);
7004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, 0);
7024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->iccp_proflen = proflen;
7044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->iccp_name = new_iccp_name;
7054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->iccp_profile = new_iccp_profile;
7064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->free_me |= PNG_FREE_ICCP;
7074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->valid |= PNG_INFO_iCCP;
7084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif
7104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_TEXT_SUPPORTED
7124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
7134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_text(png_const_structrp png_ptr, png_inforp info_ptr,
7144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_const_textp text_ptr, int num_text)
7154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
7164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   int ret;
7174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   ret = png_set_text_2(png_ptr, info_ptr, text_ptr, num_text);
7184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (ret != 0)
7204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_error(png_ptr, "Insufficient memory to store text");
7214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint /* PRIVATE */
7244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_text_2(png_const_structrp png_ptr, png_inforp info_ptr,
7254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_const_textp text_ptr, int num_text)
7264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
7274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   int i;
7284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug1(1, "in %lx storage function", png_ptr == NULL ? 0xabadca11U :
7304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      (unsigned long)png_ptr->chunk_name);
7314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL || info_ptr == NULL || num_text <= 0 || text_ptr == NULL)
7334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return(0);
7344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* Make sure we have enough space in the "text" array in info_struct
7364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * to hold all of the incoming text_ptr objects.  This compare can't overflow
7374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * because max_text >= num_text (anyway, subtract of two positive integers
7384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * can't overflow in any case.)
7394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    */
7404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (num_text > info_ptr->max_text - info_ptr->num_text)
7414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
7424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      int old_num_text = info_ptr->num_text;
7434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      int max_text;
7444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_textp new_text = NULL;
7454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      /* Calculate an appropriate max_text, checking for overflow. */
7474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      max_text = old_num_text;
7484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (num_text <= INT_MAX - max_text)
7494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
7504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         max_text += num_text;
7514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         /* Round up to a multiple of 8 */
7534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         if (max_text < INT_MAX-8)
7544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            max_text = (max_text + 8) & ~0x7;
7554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         else
7574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            max_text = INT_MAX;
7584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         /* Now allocate a new array and copy the old members in; this does all
7604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          * the overflow checks.
7614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          */
7624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         new_text = png_voidcast(png_textp,png_realloc_array(png_ptr,
7634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            info_ptr->text, old_num_text, max_text-old_num_text,
7644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            sizeof *new_text));
7654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
7664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (new_text == NULL)
7684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
7694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         png_chunk_report(png_ptr, "too many text chunks",
7704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            PNG_CHUNK_WRITE_ERROR);
7714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         return 1;
7734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
7744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_free(png_ptr, info_ptr->text);
7764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      info_ptr->text = new_text;
7784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      info_ptr->free_me |= PNG_FREE_TEXT;
7794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      info_ptr->max_text = max_text;
7804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      /* num_text is adjusted below as the entries are copied in */
7814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_debug1(3, "allocated %d entries for info_ptr->text", max_text);
7834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
7844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   for (i = 0; i < num_text; i++)
7864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
7874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      size_t text_length, key_len;
7884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      size_t lang_len, lang_key_len;
7894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_textp textp = &(info_ptr->text[info_ptr->num_text]);
7904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (text_ptr[i].key == NULL)
7924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          continue;
7934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (text_ptr[i].compression < PNG_TEXT_COMPRESSION_NONE ||
7954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          text_ptr[i].compression >= PNG_TEXT_COMPRESSION_LAST)
7964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
7974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         png_chunk_report(png_ptr, "text compression mode is out of range",
7984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            PNG_CHUNK_WRITE_ERROR);
7994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         continue;
8004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
8014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      key_len = strlen(text_ptr[i].key);
8034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (text_ptr[i].compression <= 0)
8054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
8064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         lang_len = 0;
8074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         lang_key_len = 0;
8084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
8094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      else
8114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  ifdef PNG_iTXt_SUPPORTED
8124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
8134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         /* Set iTXt data */
8144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         if (text_ptr[i].lang != NULL)
8164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            lang_len = strlen(text_ptr[i].lang);
8174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         else
8194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            lang_len = 0;
8204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         if (text_ptr[i].lang_key != NULL)
8224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            lang_key_len = strlen(text_ptr[i].lang_key);
8234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         else
8254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            lang_key_len = 0;
8264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
8274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  else /* iTXt */
8284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
8294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         png_chunk_report(png_ptr, "iTXt chunk not supported",
8304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            PNG_CHUNK_WRITE_ERROR);
8314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         continue;
8324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
8334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  endif
8344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (text_ptr[i].text == NULL || text_ptr[i].text[0] == '\0')
8364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
8374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         text_length = 0;
8384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  ifdef PNG_iTXt_SUPPORTED
8394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         if (text_ptr[i].compression > 0)
8404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            textp->compression = PNG_ITXT_COMPRESSION_NONE;
8414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         else
8434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  endif
8444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            textp->compression = PNG_TEXT_COMPRESSION_NONE;
8454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
8464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      else
8484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
8494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         text_length = strlen(text_ptr[i].text);
8504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         textp->compression = text_ptr[i].compression;
8514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
8524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      textp->key = png_voidcast(png_charp,png_malloc_base(png_ptr,
8544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          key_len + text_length + lang_len + lang_key_len + 4));
8554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (textp->key == NULL)
8574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
8584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         png_chunk_report(png_ptr, "text chunk: out of memory",
8594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann               PNG_CHUNK_WRITE_ERROR);
8604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         return 1;
8624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
8634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_debug2(2, "Allocated %lu bytes at %p in png_set_text",
8654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          (unsigned long)(png_uint_32)
8664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          (key_len + lang_len + lang_key_len + text_length + 4),
8674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          textp->key);
8684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      memcpy(textp->key, text_ptr[i].key, key_len);
8704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      *(textp->key + key_len) = '\0';
8714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (text_ptr[i].compression > 0)
8734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
8744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         textp->lang = textp->key + key_len + 1;
8754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         memcpy(textp->lang, text_ptr[i].lang, lang_len);
8764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         *(textp->lang + lang_len) = '\0';
8774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         textp->lang_key = textp->lang + lang_len + 1;
8784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         memcpy(textp->lang_key, text_ptr[i].lang_key, lang_key_len);
8794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         *(textp->lang_key + lang_key_len) = '\0';
8804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         textp->text = textp->lang_key + lang_key_len + 1;
8814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
8824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      else
8844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
8854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         textp->lang=NULL;
8864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         textp->lang_key=NULL;
8874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         textp->text = textp->key + key_len + 1;
8884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
8894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (text_length != 0)
8914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         memcpy(textp->text, text_ptr[i].text, text_length);
8924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      *(textp->text + text_length) = '\0';
8944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  ifdef PNG_iTXt_SUPPORTED
8964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (textp->compression > 0)
8974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
8984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         textp->text_length = 0;
8994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         textp->itxt_length = text_length;
9004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
9014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      else
9034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  endif
9044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
9054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         textp->text_length = text_length;
9064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         textp->itxt_length = 0;
9074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
9084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      info_ptr->num_text++;
9104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_debug1(3, "transferred text chunk %d", info_ptr->num_text);
9114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
9124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   return(0);
9144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif
9164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_tIME_SUPPORTED
9184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
9194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_tIME(png_const_structrp png_ptr, png_inforp info_ptr,
9204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_const_timep mod_time)
9214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
9224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug1(1, "in %s storage function", "tIME");
9234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL || info_ptr == NULL || mod_time == NULL ||
9254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       (png_ptr->mode & PNG_WROTE_tIME) != 0)
9264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
9274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (mod_time->month == 0   || mod_time->month > 12  ||
9294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       mod_time->day   == 0   || mod_time->day   > 31  ||
9304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       mod_time->hour  > 23   || mod_time->minute > 59 ||
9314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       mod_time->second > 60)
9324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
9334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_warning(png_ptr, "Ignoring invalid time value");
9344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
9364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
9374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->mod_time = *mod_time;
9394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->valid |= PNG_INFO_tIME;
9404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif
9424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_tRNS_SUPPORTED
9444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
9454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_tRNS(png_structrp png_ptr, png_inforp info_ptr,
9464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_const_bytep trans_alpha, int num_trans, png_const_color_16p trans_color)
9474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
9484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug1(1, "in %s storage function", "tRNS");
9494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL || info_ptr == NULL)
9514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
9534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (trans_alpha != NULL)
9554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
9564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       /* It may not actually be necessary to set png_ptr->trans_alpha here;
9574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        * we do it for backward compatibility with the way the png_handle_tRNS
9584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        * function used to do the allocation.
9594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        *
9604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        * 1.6.0: The above statement is incorrect; png_handle_tRNS effectively
9614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        * relies on png_set_tRNS storing the information in png_struct
9624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        * (otherwise it won't be there for the code in pngrtran.c).
9634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        */
9644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0);
9664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       if (num_trans > 0 && num_trans <= PNG_MAX_PALETTE_LENGTH)
9684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       {
9694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         /* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */
9704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          info_ptr->trans_alpha = png_voidcast(png_bytep,
9714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH));
9724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          memcpy(info_ptr->trans_alpha, trans_alpha, (png_size_t)num_trans);
9744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       }
9754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       png_ptr->trans_alpha = info_ptr->trans_alpha;
9764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
9774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (trans_color != NULL)
9794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
9804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_WARNINGS_SUPPORTED
9814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (info_ptr->bit_depth < 16)
9824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
9834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         int sample_max = (1 << info_ptr->bit_depth) - 1;
9844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         if ((info_ptr->color_type == PNG_COLOR_TYPE_GRAY &&
9864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             trans_color->gray > sample_max) ||
9874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             (info_ptr->color_type == PNG_COLOR_TYPE_RGB &&
9884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             (trans_color->red > sample_max ||
9894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             trans_color->green > sample_max ||
9904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             trans_color->blue > sample_max)))
9914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            png_warning(png_ptr,
9924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann               "tRNS chunk has out-of-range samples for bit_depth");
9934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
9944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif
9954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      info_ptr->trans_color = *trans_color;
9974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (num_trans == 0)
9994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         num_trans = 1;
10004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
10014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->num_trans = (png_uint_16)num_trans;
10034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (num_trans != 0)
10054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
10064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      info_ptr->valid |= PNG_INFO_tRNS;
10074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      info_ptr->free_me |= PNG_FREE_TRNS;
10084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
10094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
10104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif
10114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_sPLT_SUPPORTED
10134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
10144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_sPLT(png_const_structrp png_ptr,
10154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_inforp info_ptr, png_const_sPLT_tp entries, int nentries)
10164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann/*
10174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *  entries        - array of png_sPLT_t structures
10184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *                   to be added to the list of palettes
10194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *                   in the info structure.
10204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *
10214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *  nentries       - number of palette structures to be
10224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *                   added.
10234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann */
10244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
10254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_sPLT_tp np;
10264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL || info_ptr == NULL || nentries <= 0 || entries == NULL)
10284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
10294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* Use the internal realloc function, which checks for all the possible
10314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * overflows.  Notice that the parameters are (int) and (size_t)
10324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    */
10334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   np = png_voidcast(png_sPLT_tp,png_realloc_array(png_ptr,
10344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      info_ptr->splt_palettes, info_ptr->splt_palettes_num, nentries,
10354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      sizeof *np));
10364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (np == NULL)
10384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
10394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      /* Out of memory or too many chunks */
10404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_chunk_report(png_ptr, "too many sPLT chunks", PNG_CHUNK_WRITE_ERROR);
10414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
10434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
10444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_free(png_ptr, info_ptr->splt_palettes);
10464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->splt_palettes = np;
10474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->free_me |= PNG_FREE_SPLT;
10484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   np += info_ptr->splt_palettes_num;
10504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   do
10524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
10534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_size_t length;
10544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      /* Skip invalid input entries */
10564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (entries->name == NULL || entries->entries == NULL)
10574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
10584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         /* png_handle_sPLT doesn't do this, so this is an app error */
10594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         png_app_error(png_ptr, "png_set_sPLT: invalid sPLT");
10604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         /* Just skip the invalid entry */
10614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         continue;
10624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
10634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      np->depth = entries->depth;
10654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      /* In the event of out-of-memory just return - there's no point keeping
10674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       * on trying to add sPLT chunks.
10684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       */
10694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      length = strlen(entries->name) + 1;
10704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      np->name = png_voidcast(png_charp, png_malloc_base(png_ptr, length));
10714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (np->name == NULL)
10734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         break;
10744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      memcpy(np->name, entries->name, length);
10764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      /* IMPORTANT: we have memory now that won't get freed if something else
10784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       * goes wrong; this code must free it.  png_malloc_array produces no
10794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       * warnings; use a png_chunk_report (below) if there is an error.
10804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       */
10814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      np->entries = png_voidcast(png_sPLT_entryp, png_malloc_array(png_ptr,
10824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          entries->nentries, sizeof (png_sPLT_entry)));
10834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (np->entries == NULL)
10854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
10864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         png_free(png_ptr, np->name);
10874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         np->name = NULL;
10884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         break;
10894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
10904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      np->nentries = entries->nentries;
10924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      /* This multiply can't overflow because png_malloc_array has already
10934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       * checked it when doing the allocation.
10944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       */
10954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      memcpy(np->entries, entries->entries,
10964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         entries->nentries * sizeof (png_sPLT_entry));
10974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      /* Note that 'continue' skips the advance of the out pointer and out
10994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       * count, so an invalid entry is not added.
11004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       */
11014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      info_ptr->valid |= PNG_INFO_sPLT;
11024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      ++(info_ptr->splt_palettes_num);
11034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      ++np;
11044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
11054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   while (++entries, --nentries);
11064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (nentries > 0)
11084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_chunk_report(png_ptr, "sPLT out of memory", PNG_CHUNK_WRITE_ERROR);
11094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
11104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif /* sPLT */
11114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
11134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstatic png_byte
11144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanncheck_location(png_const_structrp png_ptr, int location)
11154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
11164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   location &= (PNG_HAVE_IHDR|PNG_HAVE_PLTE|PNG_AFTER_IDAT);
11174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* New in 1.6.0; copy the location and check it.  This is an API
11194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * change; previously the app had to use the
11204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * png_set_unknown_chunk_location API below for each chunk.
11214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    */
11224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (location == 0 && (png_ptr->mode & PNG_IS_READ_STRUCT) == 0)
11234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
11244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      /* Write struct, so unknown chunks come from the app */
11254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_app_warning(png_ptr,
11264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         "png_set_unknown_chunks now expects a valid location");
11274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      /* Use the old behavior */
11284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      location = (png_byte)(png_ptr->mode &
11294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         (PNG_HAVE_IHDR|PNG_HAVE_PLTE|PNG_AFTER_IDAT));
11304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
11314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* This need not be an internal error - if the app calls
11334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * png_set_unknown_chunks on a read pointer it must get the location right.
11344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    */
11354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (location == 0)
11364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_error(png_ptr, "invalid location in png_set_unknown_chunks");
11374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* Now reduce the location to the top-most set bit by removing each least
11394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * significant bit in turn.
11404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    */
11414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   while (location != (location & -location))
11424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      location &= ~(location & -location);
11434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* The cast is safe because 'location' is a bit mask and only the low four
11454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * bits are significant.
11464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    */
11474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   return (png_byte)location;
11484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
11494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
11514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_unknown_chunks(png_const_structrp png_ptr,
11524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_inforp info_ptr, png_const_unknown_chunkp unknowns, int num_unknowns)
11534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
11544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_unknown_chunkp np;
11554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL || info_ptr == NULL || num_unknowns <= 0 ||
11574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       unknowns == NULL)
11584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
11594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* Check for the failure cases where support has been disabled at compile
11614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * time.  This code is hardly ever compiled - it's here because
11624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * STORE_UNKNOWN_CHUNKS is set by both read and write code (compiling in this
11634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * code) but may be meaningless if the read or write handling of unknown
11644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * chunks is not compiled in.
11654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    */
11664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  if !defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) && \
11674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      defined(PNG_READ_SUPPORTED)
11684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
11694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
11704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         png_app_error(png_ptr, "no unknown chunk support on read");
11714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         return;
11734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
11744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  endif
11754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  if !defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) && \
11764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      defined(PNG_WRITE_SUPPORTED)
11774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if ((png_ptr->mode & PNG_IS_READ_STRUCT) == 0)
11784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
11794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         png_app_error(png_ptr, "no unknown chunk support on write");
11804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         return;
11824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
11834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  endif
11844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* Prior to 1.6.0 this code used png_malloc_warn; however, this meant that
11864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * unknown critical chunks could be lost with just a warning resulting in
11874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * undefined behavior.  Now png_chunk_report is used to provide behavior
11884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * appropriate to read or write.
11894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    */
11904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   np = png_voidcast(png_unknown_chunkp, png_realloc_array(png_ptr,
11914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         info_ptr->unknown_chunks, info_ptr->unknown_chunks_num, num_unknowns,
11924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         sizeof *np));
11934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (np == NULL)
11954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
11964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_chunk_report(png_ptr, "too many unknown chunks",
11974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         PNG_CHUNK_WRITE_ERROR);
11984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
12004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
12014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
12024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_free(png_ptr, info_ptr->unknown_chunks);
12034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->unknown_chunks = np; /* safe because it is initialized */
12044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->free_me |= PNG_FREE_UNKN;
12054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
12064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   np += info_ptr->unknown_chunks_num;
12074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
12084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* Increment unknown_chunks_num each time round the loop to protect the
12094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * just-allocated chunk data.
12104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    */
12114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   for (; num_unknowns > 0; --num_unknowns, ++unknowns)
12124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
12134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      memcpy(np->name, unknowns->name, (sizeof np->name));
12144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      np->name[(sizeof np->name)-1] = '\0';
12154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      np->location = check_location(png_ptr, unknowns->location);
12164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
12174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (unknowns->size == 0)
12184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
12194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         np->data = NULL;
12204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         np->size = 0;
12214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
12224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
12234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      else
12244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
12254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         np->data = png_voidcast(png_bytep,
12264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            png_malloc_base(png_ptr, unknowns->size));
12274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
12284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         if (np->data == NULL)
12294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         {
12304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            png_chunk_report(png_ptr, "unknown chunk: out of memory",
12314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann               PNG_CHUNK_WRITE_ERROR);
12324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            /* But just skip storing the unknown chunk */
12334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            continue;
12344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         }
12354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
12364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         memcpy(np->data, unknowns->data, unknowns->size);
12374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         np->size = unknowns->size;
12384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
12394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
12404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      /* These increments are skipped on out-of-memory for the data - the
12414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       * unknown chunk entry gets overwritten if the png_chunk_report returns.
12424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       * This is correct in the read case (the chunk is just dropped.)
12434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       */
12444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      ++np;
12454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      ++(info_ptr->unknown_chunks_num);
12464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
12474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
12484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
12494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
12504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_unknown_chunk_location(png_const_structrp png_ptr, png_inforp info_ptr,
12514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int chunk, int location)
12524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
12534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* This API is pretty pointless in 1.6.0 because the location can be set
12544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * before the call to png_set_unknown_chunks.
12554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    *
12564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * TODO: add a png_app_warning in 1.7
12574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    */
12584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr != NULL && info_ptr != NULL && chunk >= 0 &&
12594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      chunk < info_ptr->unknown_chunks_num)
12604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
12614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if ((location & (PNG_HAVE_IHDR|PNG_HAVE_PLTE|PNG_AFTER_IDAT)) == 0)
12624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
12634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         png_app_error(png_ptr, "invalid unknown chunk location");
12644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         /* Fake out the pre 1.6.0 behavior: */
12654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         if ((location & PNG_HAVE_IDAT) != 0) /* undocumented! */
12664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            location = PNG_AFTER_IDAT;
12674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
12684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         else
12694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            location = PNG_HAVE_IHDR; /* also undocumented */
12704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
12714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
12724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      info_ptr->unknown_chunks[chunk].location =
12734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         check_location(png_ptr, location);
12744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
12754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
12764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif /* STORE_UNKNOWN_CHUNKS */
12774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
12784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_MNG_FEATURES_SUPPORTED
12794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_uint_32 PNGAPI
12804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_permit_mng_features (png_structrp png_ptr, png_uint_32 mng_features)
12814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
12824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug(1, "in png_permit_mng_features");
12834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
12844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL)
12854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return 0;
12864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
12874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_ptr->mng_features_permitted = mng_features & PNG_ALL_MNG_FEATURES;
12884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
12894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   return png_ptr->mng_features_permitted;
12904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
12914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif
12924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
12934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
12944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstatic unsigned int
12954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannadd_one_chunk(png_bytep list, unsigned int count, png_const_bytep add, int keep)
12964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
12974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   unsigned int i;
12984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
12994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* Utility function: update the 'keep' state of a chunk if it is already in
13004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * the list, otherwise add it to the list.
13014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    */
13024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   for (i=0; i<count; ++i, list += 5)
13034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
13044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (memcmp(list, add, 4) == 0)
13054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
13064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         list[4] = (png_byte)keep;
13074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         return count;
13094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
13104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
13114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (keep != PNG_HANDLE_CHUNK_AS_DEFAULT)
13134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
13144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      ++count;
13154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      memcpy(list, add, 4);
13164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      list[4] = (png_byte)keep;
13174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
13184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   return count;
13204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
13214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
13234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_keep_unknown_chunks(png_structrp png_ptr, int keep,
13244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_const_bytep chunk_list, int num_chunks_in)
13254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
13264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_bytep new_list;
13274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   unsigned int num_chunks, old_num_chunks;
13284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL)
13304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
13314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (keep < 0 || keep >= PNG_HANDLE_CHUNK_LAST)
13334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
13344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_app_error(png_ptr, "png_set_keep_unknown_chunks: invalid keep");
13354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
13374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
13384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (num_chunks_in <= 0)
13404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
13414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_ptr->unknown_default = keep;
13424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      /* '0' means just set the flags, so stop here */
13444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (num_chunks_in == 0)
13454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return;
13464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
13474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (num_chunks_in < 0)
13494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
13504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      /* Ignore all unknown chunks and all chunks recognized by
13514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       * libpng except for IHDR, PLTE, tRNS, IDAT, and IEND
13524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       */
13534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      static PNG_CONST png_byte chunks_to_ignore[] = {
13544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         98,  75,  71,  68, '\0',  /* bKGD */
13554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         99,  72,  82,  77, '\0',  /* cHRM */
13564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        103,  65,  77,  65, '\0',  /* gAMA */
13574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        104,  73,  83,  84, '\0',  /* hIST */
13584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        105,  67,  67,  80, '\0',  /* iCCP */
13594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        105,  84,  88, 116, '\0',  /* iTXt */
13604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        111,  70,  70, 115, '\0',  /* oFFs */
13614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        112,  67,  65,  76, '\0',  /* pCAL */
13624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        112,  72,  89, 115, '\0',  /* pHYs */
13634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        115,  66,  73,  84, '\0',  /* sBIT */
13644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        115,  67,  65,  76, '\0',  /* sCAL */
13654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        115,  80,  76,  84, '\0',  /* sPLT */
13664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        115,  84,  69,  82, '\0',  /* sTER */
13674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        115,  82,  71,  66, '\0',  /* sRGB */
13684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        116,  69,  88, 116, '\0',  /* tEXt */
13694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        116,  73,  77,  69, '\0',  /* tIME */
13704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        122,  84,  88, 116, '\0'   /* zTXt */
13714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      };
13724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      chunk_list = chunks_to_ignore;
13744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      num_chunks = (unsigned int)/*SAFE*/(sizeof chunks_to_ignore)/5U;
13754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
13764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   else /* num_chunks_in > 0 */
13784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
13794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (chunk_list == NULL)
13804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
13814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         /* Prior to 1.6.0 this was silently ignored, now it is an app_error
13824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          * which can be switched off.
13834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          */
13844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         png_app_error(png_ptr, "png_set_keep_unknown_chunks: no chunk list");
13854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         return;
13874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
13884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      num_chunks = num_chunks_in;
13904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
13914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   old_num_chunks = png_ptr->num_chunk_list;
13934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr->chunk_list == NULL)
13944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      old_num_chunks = 0;
13954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* Since num_chunks is always restricted to UINT_MAX/5 this can't overflow.
13974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    */
13984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (num_chunks + old_num_chunks > UINT_MAX/5)
13994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
14004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_app_error(png_ptr, "png_set_keep_unknown_chunks: too many chunks");
14014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
14034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
14044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* If these chunks are being reset to the default then no more memory is
14064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * required because add_one_chunk above doesn't extend the list if the 'keep'
14074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * parameter is the default.
14084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    */
14094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (keep != 0)
14104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
14114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      new_list = png_voidcast(png_bytep, png_malloc(png_ptr,
14124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          5 * (num_chunks + old_num_chunks)));
14134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (old_num_chunks > 0)
14154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         memcpy(new_list, png_ptr->chunk_list, 5*old_num_chunks);
14164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
14174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   else if (old_num_chunks > 0)
14194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      new_list = png_ptr->chunk_list;
14204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   else
14224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      new_list = NULL;
14234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* Add the new chunks together with each one's handling code.  If the chunk
14254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * already exists the code is updated, otherwise the chunk is added to the
14264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * end.  (In libpng 1.6.0 order no longer matters because this code enforces
14274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * the earlier convention that the last setting is the one that is used.)
14284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    */
14294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (new_list != NULL)
14304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
14314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_const_bytep inlist;
14324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_bytep outlist;
14334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      unsigned int i;
14344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      for (i=0; i<num_chunks; ++i)
14364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
14374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         old_num_chunks = add_one_chunk(new_list, old_num_chunks,
14384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            chunk_list+5*i, keep);
14394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
14404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      /* Now remove any spurious 'default' entries. */
14424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      num_chunks = 0;
14434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      for (i=0, inlist=outlist=new_list; i<old_num_chunks; ++i, inlist += 5)
14444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
14454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         if (inlist[4])
14464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         {
14474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            if (outlist != inlist)
14484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann               memcpy(outlist, inlist, 5);
14494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            outlist += 5;
14504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            ++num_chunks;
14514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         }
14524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
14534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      /* This means the application has removed all the specialized handling. */
14554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (num_chunks == 0)
14564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
14574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         if (png_ptr->chunk_list != new_list)
14584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            png_free(png_ptr, new_list);
14594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         new_list = NULL;
14614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
14624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
14634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   else
14654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      num_chunks = 0;
14664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_ptr->num_chunk_list = num_chunks;
14684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr->chunk_list != new_list)
14704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
14714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (png_ptr->chunk_list != NULL)
14724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         png_free(png_ptr, png_ptr->chunk_list);
14734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_ptr->chunk_list = new_list;
14754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
14764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
14774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif
14784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
14804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
14814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_read_user_chunk_fn(png_structrp png_ptr, png_voidp user_chunk_ptr,
14824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_user_chunk_ptr read_user_chunk_fn)
14834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
14844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug(1, "in png_set_read_user_chunk_fn");
14854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL)
14874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
14884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_ptr->read_user_chunk_fn = read_user_chunk_fn;
14904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_ptr->user_chunk_ptr = user_chunk_ptr;
14914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
14924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif
14934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_INFO_IMAGE_SUPPORTED
14954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
14964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_rows(png_const_structrp png_ptr, png_inforp info_ptr,
14974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_bytepp row_pointers)
14984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
14994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug1(1, "in %s storage function", "rows");
15004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
15014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL || info_ptr == NULL)
15024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
15034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
15044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (info_ptr->row_pointers != NULL &&
15054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       (info_ptr->row_pointers != row_pointers))
15064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0);
15074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
15084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   info_ptr->row_pointers = row_pointers;
15094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
15104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (row_pointers != NULL)
15114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      info_ptr->valid |= PNG_INFO_IDAT;
15124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
15134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif
15144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
15154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
15164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_compression_buffer_size(png_structrp png_ptr, png_size_t size)
15174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
15184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (png_ptr == NULL)
15194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       return;
15204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
15214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (size == 0 || size > PNG_UINT_31_MAX)
15224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       png_error(png_ptr, "invalid compression buffer size");
15234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
15244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  ifdef PNG_SEQUENTIAL_READ_SUPPORTED
15254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
15264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
15274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         png_ptr->IDAT_read_size = (png_uint_32)size; /* checked above */
15284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         return;
15294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
15304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  endif
15314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
15324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  ifdef PNG_WRITE_SUPPORTED
15334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if ((png_ptr->mode & PNG_IS_READ_STRUCT) == 0)
15344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
15354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         if (png_ptr->zowner != 0)
15364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         {
15374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            png_warning(png_ptr,
15384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              "Compression buffer size cannot be changed because it is in use");
15394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
15404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            return;
15414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         }
15424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
15434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifndef __COVERITY__
15444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         /* Some compilers complain that this is always false.  However, it
15454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          * can be true when integer overflow happens.
15464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          */
15474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         if (size > ZLIB_IO_MAX)
15484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         {
15494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            png_warning(png_ptr,
15504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann               "Compression buffer size limited to system maximum");
15514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            size = ZLIB_IO_MAX; /* must fit */
15524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         }
15534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif
15544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
15554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         if (size < 6)
15564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         {
15574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            /* Deflate will potentially go into an infinite loop on a SYNC_FLUSH
15584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             * if this is permitted.
15594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             */
15604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            png_warning(png_ptr,
15614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann               "Compression buffer size cannot be reduced below 6");
15624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
15634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            return;
15644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         }
15654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
15664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         if (png_ptr->zbuffer_size != size)
15674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         {
15684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            png_free_buffer_list(png_ptr, &png_ptr->zbuffer_list);
15694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            png_ptr->zbuffer_size = (uInt)size;
15704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         }
15714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
15724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#  endif
15734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
15744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
15754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
15764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_invalid(png_const_structrp png_ptr, png_inforp info_ptr, int mask)
15774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
15784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr != NULL && info_ptr != NULL)
15794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      info_ptr->valid &= ~mask;
15804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
15814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
15824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
15834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_SET_USER_LIMITS_SUPPORTED
15844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann/* This function was added to libpng 1.2.6 */
15854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
15864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_user_limits (png_structrp png_ptr, png_uint_32 user_width_max,
15874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_uint_32 user_height_max)
15884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
15894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* Images with dimensions larger than these limits will be
15904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * rejected by png_set_IHDR().  To accept any PNG datastream
15914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * regardless of dimensions, set both limits to 0x7fffffff.
15924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    */
15934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr == NULL)
15944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
15954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
15964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_ptr->user_width_max = user_width_max;
15974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_ptr->user_height_max = user_height_max;
15984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
15994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
16004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann/* This function was added to libpng 1.4.0 */
16014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
16024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_chunk_cache_max (png_structrp png_ptr, png_uint_32 user_chunk_cache_max)
16034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
16044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr != NULL)
16054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_ptr->user_chunk_cache_max = user_chunk_cache_max;
16064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
16074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
16084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann/* This function was added to libpng 1.4.1 */
16094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
16104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_chunk_malloc_max (png_structrp png_ptr,
16114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    png_alloc_size_t user_chunk_malloc_max)
16124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
16134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (png_ptr != NULL)
16144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_ptr->user_chunk_malloc_max = user_chunk_malloc_max;
16154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
16164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif /* ?SET_USER_LIMITS */
16174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
16184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
16194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_BENIGN_ERRORS_SUPPORTED
16204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
16214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_benign_errors(png_structrp png_ptr, int allowed)
16224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
16234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug(1, "in png_set_benign_errors");
16244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
16254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* If allowed is 1, png_benign_error() is treated as a warning.
16264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    *
16274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * If allowed is 0, png_benign_error() is treated as an error (which
16284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * is the default behavior if png_set_benign_errors() is not called).
16294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    */
16304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
16314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (allowed != 0)
16324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_ptr->flags |= PNG_FLAG_BENIGN_ERRORS_WARN |
16334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         PNG_FLAG_APP_WARNINGS_WARN | PNG_FLAG_APP_ERRORS_WARN;
16344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
16354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   else
16364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_ptr->flags &= ~(PNG_FLAG_BENIGN_ERRORS_WARN |
16374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         PNG_FLAG_APP_WARNINGS_WARN | PNG_FLAG_APP_ERRORS_WARN);
16384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
16394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif /* BENIGN_ERRORS */
16404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
16414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED
16424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* Whether to report invalid palette index; added at libng-1.5.10.
16434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * It is possible for an indexed (color-type==3) PNG file to contain
16444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * pixels with invalid (out-of-range) indexes if the PLTE chunk has
16454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * fewer entries than the image's bit-depth would allow. We recover
16464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * from this gracefully by filling any incomplete palette with zeros
16474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * (opaque black).  By default, when this occurs libpng will issue
16484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    * a benign error.  This API can be used to override that behavior.
16494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    */
16504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid PNGAPI
16514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_set_check_for_invalid_index(png_structrp png_ptr, int allowed)
16524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
16534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug(1, "in png_set_check_for_invalid_index");
16544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
16554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (allowed > 0)
16564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_ptr->num_palette_max = 0;
16574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
16584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   else
16594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_ptr->num_palette_max = -1;
16604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
16614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif
16624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
16634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#if defined(PNG_TEXT_SUPPORTED) || defined(PNG_pCAL_SUPPORTED) || \
16644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED)
16654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann/* Check that the tEXt or zTXt keyword is valid per PNG 1.0 specification,
16664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * and if invalid, correct the keyword rather than discarding the entire
16674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * chunk.  The PNG 1.0 specification requires keywords 1-79 characters in
16684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * length, forbids leading or trailing whitespace, multiple internal spaces,
16694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * and the non-break space (0x80) from ISO 8859-1.  Returns keyword length.
16704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *
16714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * The 'new_key' buffer must be 80 characters in size (for the keyword plus a
16724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * trailing '\0').  If this routine returns 0 then there was no keyword, or a
16734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * valid one could not be generated, and the caller must png_error.
16744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann */
16754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_uint_32 /* PRIVATE */
16764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannpng_check_keyword(png_structrp png_ptr, png_const_charp key, png_bytep new_key)
16774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann{
16784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_const_charp orig_key = key;
16794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_uint_32 key_len = 0;
16804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   int bad_character = 0;
16814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   int space = 1;
16824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
16834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   png_debug(1, "in png_check_keyword");
16844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
16854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (key == NULL)
16864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
16874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      *new_key = 0;
16884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return 0;
16894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
16904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
16914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   while (*key && key_len < 79)
16924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
16934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_byte ch = (png_byte)*key++;
16944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
16954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if ((ch > 32 && ch <= 126) || (ch >= 161 /*&& ch <= 255*/))
16964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         *new_key++ = ch, ++key_len, space = 0;
16974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
16984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      else if (space == 0)
16994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {
17004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         /* A space or an invalid character when one wasn't seen immediately
17014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          * before; output just a space.
17024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          */
17034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         *new_key++ = 32, ++key_len, space = 1;
17044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
17054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         /* If the character was not a space then it is invalid. */
17064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         if (ch != 32)
17074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            bad_character = ch;
17084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
17094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
17104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      else if (bad_character == 0)
17114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         bad_character = ch; /* just skip it, record the first error */
17124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
17134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
17144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (key_len > 0 && space != 0) /* trailing space */
17154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
17164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      --key_len, --new_key;
17174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (bad_character == 0)
17184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         bad_character = 32;
17194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
17204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
17214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* Terminate the keyword */
17224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   *new_key = 0;
17234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
17244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (key_len == 0)
17254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return 0;
17264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
17274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PNG_WARNINGS_SUPPORTED
17284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   /* Try to only output one warning per keyword: */
17294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   if (*key != 0) /* keyword too long */
17304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_warning(png_ptr, "keyword truncated");
17314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
17324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   else if (bad_character != 0)
17334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   {
17344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      PNG_WARNING_PARAMETERS(p)
17354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
17364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_warning_parameter(p, 1, orig_key);
17374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_warning_parameter_signed(p, 2, PNG_NUMBER_FORMAT_02x, bad_character);
17384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
17394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      png_formatted_warning(png_ptr, p, "keyword \"@1\": bad character '0x@2'");
17404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   }
17414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif /* WARNINGS */
17424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
17434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann   return key_len;
17444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
17454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif /* TEXT || pCAL || iCCP || sPLT */
17464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif /* READ || WRITE */
1747