1793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* pngset.c - storage of image information into info struct
3793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *
4793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Last changed in libpng 1.5.11 [June 14, 2012]
5793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Copyright (c) 1998-2012 Glenn Randers-Pehrson
6793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
7793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
8793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *
9793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * This code is released under the libpng license.
10793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * For conditions of distribution and use, see the disclaimer
11793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * and license in png.h
12793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *
13793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * The functions here are used during reads to store data from the file
14793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * into the info struct, and during writes to store application data
15793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * into the info struct for writing into the file.  This abstracts the
16793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * info struct and allows us to change the structure in the future.
17793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
18793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
19793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "pngpriv.h"
20793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
21793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
22793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
23793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_bKGD_SUPPORTED
24793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
25793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_bKGD(png_structp png_ptr, png_infop info_ptr,
26793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_const_color_16p background)
27793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
28793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug1(1, "in %s storage function", "bKGD");
29793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
30793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr == NULL || info_ptr == NULL)
31793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
32793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
33793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_memcpy(&(info_ptr->background), background, png_sizeof(png_color_16));
34793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->valid |= PNG_INFO_bKGD;
35793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
36793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
37793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
38793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_cHRM_SUPPORTED
39793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGFAPI
40793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_cHRM_fixed(png_structp png_ptr, png_infop info_ptr,
41793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x,
42793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y,
43793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_fixed_point blue_x, png_fixed_point blue_y)
44793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
45793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug1(1, "in %s storage function", "cHRM fixed");
46793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
47793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr == NULL || info_ptr == NULL)
48793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
49793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
50793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  ifdef PNG_CHECK_cHRM_SUPPORTED
51793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_check_cHRM_fixed(png_ptr,
52793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y))
53793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  endif
54793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
55793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      info_ptr->x_white = white_x;
56793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      info_ptr->y_white = white_y;
57793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      info_ptr->x_red   = red_x;
58793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      info_ptr->y_red   = red_y;
59793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      info_ptr->x_green = green_x;
60793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      info_ptr->y_green = green_y;
61793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      info_ptr->x_blue  = blue_x;
62793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      info_ptr->y_blue  = blue_y;
63793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      info_ptr->valid |= PNG_INFO_cHRM;
64793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
65793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
66793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
67793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGFAPI
68793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_cHRM_XYZ_fixed(png_structp png_ptr, png_infop info_ptr,
69793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_fixed_point int_red_X, png_fixed_point int_red_Y,
70793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_fixed_point int_red_Z, png_fixed_point int_green_X,
71793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_fixed_point int_green_Y, png_fixed_point int_green_Z,
72793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_fixed_point int_blue_X, png_fixed_point int_blue_Y,
73793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_fixed_point int_blue_Z)
74793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
75793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_XYZ XYZ;
76793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_xy xy;
77793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
78793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug1(1, "in %s storage function", "cHRM XYZ fixed");
79793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
80793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr == NULL || info_ptr == NULL)
81793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
82793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
83793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   XYZ.redX = int_red_X;
84793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   XYZ.redY = int_red_Y;
85793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   XYZ.redZ = int_red_Z;
86793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   XYZ.greenX = int_green_X;
87793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   XYZ.greenY = int_green_Y;
88793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   XYZ.greenZ = int_green_Z;
89793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   XYZ.blueX = int_blue_X;
90793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   XYZ.blueY = int_blue_Y;
91793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   XYZ.blueZ = int_blue_Z;
92793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
93793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_xy_from_XYZ(&xy, XYZ))
94793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_error(png_ptr, "XYZ values out of representable range");
95793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
96793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_set_cHRM_fixed(png_ptr, info_ptr, xy.whitex, xy.whitey, xy.redx, xy.redy,
97793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      xy.greenx, xy.greeny, xy.bluex, xy.bluey);
98793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
99793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  ifdef PNG_FLOATING_POINT_SUPPORTED
101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_cHRM(png_structp png_ptr, png_infop info_ptr,
103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    double white_x, double white_y, double red_x, double red_y,
104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    double green_x, double green_y, double blue_x, double blue_y)
105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_set_cHRM_fixed(png_ptr, info_ptr,
107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_fixed(png_ptr, white_x, "cHRM White X"),
108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_fixed(png_ptr, white_y, "cHRM White Y"),
109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_fixed(png_ptr, red_x, "cHRM Red X"),
110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_fixed(png_ptr, red_y, "cHRM Red Y"),
111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_fixed(png_ptr, green_x, "cHRM Green X"),
112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_fixed(png_ptr, green_y, "cHRM Green Y"),
113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_fixed(png_ptr, blue_x, "cHRM Blue X"),
114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_fixed(png_ptr, blue_y, "cHRM Blue Y"));
115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_cHRM_XYZ(png_structp png_ptr, png_infop info_ptr, double red_X,
119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    double red_Y, double red_Z, double green_X, double green_Y, double green_Z,
120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    double blue_X, double blue_Y, double blue_Z)
121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_set_cHRM_XYZ_fixed(png_ptr, info_ptr,
123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_fixed(png_ptr, red_X, "cHRM Red X"),
124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_fixed(png_ptr, red_Y, "cHRM Red Y"),
125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_fixed(png_ptr, red_Z, "cHRM Red Z"),
126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_fixed(png_ptr, green_X, "cHRM Red X"),
127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_fixed(png_ptr, green_Y, "cHRM Red Y"),
128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_fixed(png_ptr, green_Z, "cHRM Red Z"),
129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_fixed(png_ptr, blue_X, "cHRM Red X"),
130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_fixed(png_ptr, blue_Y, "cHRM Red Y"),
131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_fixed(png_ptr, blue_Z, "cHRM Red Z"));
132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  endif /* PNG_FLOATING_POINT_SUPPORTED */
134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif /* PNG_cHRM_SUPPORTED */
136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_gAMA_SUPPORTED
138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGFAPI
139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, png_fixed_point
140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    file_gamma)
141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug1(1, "in %s storage function", "gAMA");
143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr == NULL || info_ptr == NULL)
145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   /* Changed in libpng-1.5.4 to limit the values to ensure overflow can't
148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    * occur.  Since the fixed point representation is assymetrical it is
149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    * possible for 1/gamma to overflow the limit of 21474 and this means the
150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    * gamma value must be at least 5/100000 and hence at most 20000.0.  For
151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    * safety the limits here are a little narrower.  The values are 0.00016 to
152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    * 6250.0, which are truly ridiculous gamma values (and will produce
153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    * displays that are all black or all white.)
154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    */
155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (file_gamma < 16 || file_gamma > 625000000)
156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_warning(png_ptr, "Out of range gamma value ignored");
157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   else
159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      info_ptr->gamma = file_gamma;
161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      info_ptr->valid |= PNG_INFO_gAMA;
162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  ifdef PNG_FLOATING_POINT_SUPPORTED
166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_gAMA(png_structp png_ptr, png_infop info_ptr, double file_gamma)
168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_set_gAMA_fixed(png_ptr, info_ptr, png_fixed(png_ptr, file_gamma,
170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       "png_set_gAMA"));
171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  endif
173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_hIST_SUPPORTED
176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_hIST(png_structp png_ptr, png_infop info_ptr, png_const_uint_16p hist)
178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   int i;
180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug1(1, "in %s storage function", "hIST");
182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr == NULL || info_ptr == NULL)
184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (info_ptr->num_palette == 0 || info_ptr->num_palette
187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       > PNG_MAX_PALETTE_LENGTH)
188793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
189793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_warning(png_ptr,
190793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          "Invalid palette size, hIST allocation skipped");
191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
192793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_free_data(png_ptr, info_ptr, PNG_FREE_HIST, 0);
196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
197793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   /* Changed from info->num_palette to PNG_MAX_PALETTE_LENGTH in
198793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    * version 1.2.1
199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    */
200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_ptr->hist = (png_uint_16p)png_malloc_warn(png_ptr,
201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       PNG_MAX_PALETTE_LENGTH * png_sizeof(png_uint_16));
202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr->hist == NULL)
204793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_warning(png_ptr, "Insufficient memory for hIST chunk data");
206793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
207793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
208793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   for (i = 0; i < info_ptr->num_palette; i++)
210793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_ptr->hist[i] = hist[i];
211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->hist = png_ptr->hist;
213793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->valid |= PNG_INFO_hIST;
214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->free_me |= PNG_FREE_HIST;
215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
219793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_IHDR(png_structp png_ptr, png_infop info_ptr,
220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_uint_32 width, png_uint_32 height, int bit_depth,
221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int color_type, int interlace_type, int compression_type,
222793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int filter_type)
223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
224793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug1(1, "in %s storage function", "IHDR");
225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr == NULL || info_ptr == NULL)
227793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
228793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
229793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->width = width;
230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->height = height;
231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->bit_depth = (png_byte)bit_depth;
232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->color_type = (png_byte)color_type;
233793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->compression_type = (png_byte)compression_type;
234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->filter_type = (png_byte)filter_type;
235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->interlace_type = (png_byte)interlace_type;
236793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_check_IHDR (png_ptr, info_ptr->width, info_ptr->height,
238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       info_ptr->bit_depth, info_ptr->color_type, info_ptr->interlace_type,
239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       info_ptr->compression_type, info_ptr->filter_type);
240793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
241793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
242793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      info_ptr->channels = 1;
243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
244793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR)
245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      info_ptr->channels = 3;
246793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   else
248793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      info_ptr->channels = 1;
249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA)
251793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      info_ptr->channels++;
252793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth);
254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   /* Check for potential overflow */
256793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (width >
257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       (PNG_UINT_32_MAX >> 3)      /* 8-byte RRGGBBAA pixels */
258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       - 48       /* bigrowbuf hack */
259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       - 1        /* filter byte */
260793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       - 7*8      /* rounding of width to multiple of 8 pixels */
261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       - 8)       /* extra max_pixel_depth pad */
262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      info_ptr->rowbytes = 0;
263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   else
264793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width);
265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_oFFs_SUPPORTED
268793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
269793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_oFFs(png_structp png_ptr, png_infop info_ptr,
270793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_int_32 offset_x, png_int_32 offset_y, int unit_type)
271793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
272793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug1(1, "in %s storage function", "oFFs");
273793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
274793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr == NULL || info_ptr == NULL)
275793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
276793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
277793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->x_offset = offset_x;
278793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->y_offset = offset_y;
279793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->offset_unit_type = (png_byte)unit_type;
280793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->valid |= PNG_INFO_oFFs;
281793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
282793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
283793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
284793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_pCAL_SUPPORTED
285793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
286793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_pCAL(png_structp png_ptr, png_infop info_ptr,
287793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_const_charp purpose, png_int_32 X0, png_int_32 X1, int type,
288793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int nparams, png_const_charp units, png_charpp params)
289793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
290793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_size_t length;
291793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   int i;
292793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
293793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug1(1, "in %s storage function", "pCAL");
294793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
295793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr == NULL || info_ptr == NULL)
296793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
297793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
298793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   length = png_strlen(purpose) + 1;
299793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug1(3, "allocating purpose for info (%lu bytes)",
300793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       (unsigned long)length);
301793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
302793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   /* TODO: validate format of calibration name and unit name */
303793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
304793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   /* Check that the type matches the specification. */
305793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (type < 0 || type > 3)
306793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_error(png_ptr, "Invalid pCAL equation type");
307793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
308793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   /* Validate params[nparams] */
309793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   for (i=0; i<nparams; ++i)
310793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (!png_check_fp_string(params[i], png_strlen(params[i])))
311793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         png_error(png_ptr, "Invalid format for pCAL parameter");
312793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
313793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->pcal_purpose = (png_charp)png_malloc_warn(png_ptr, length);
314793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
315793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (info_ptr->pcal_purpose == NULL)
316793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
317793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_warning(png_ptr, "Insufficient memory for pCAL purpose");
318793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
319793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
320793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
321793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_memcpy(info_ptr->pcal_purpose, purpose, length);
322793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
323793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug(3, "storing X0, X1, type, and nparams in info");
324793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->pcal_X0 = X0;
325793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->pcal_X1 = X1;
326793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->pcal_type = (png_byte)type;
327793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->pcal_nparams = (png_byte)nparams;
328793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
329793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   length = png_strlen(units) + 1;
330793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug1(3, "allocating units for info (%lu bytes)",
331793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     (unsigned long)length);
332793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
333793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->pcal_units = (png_charp)png_malloc_warn(png_ptr, length);
334793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
335793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (info_ptr->pcal_units == NULL)
336793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
337793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_warning(png_ptr, "Insufficient memory for pCAL units");
338793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
339793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
340793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
341793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_memcpy(info_ptr->pcal_units, units, length);
342793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
343793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->pcal_params = (png_charpp)png_malloc_warn(png_ptr,
344793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       (png_size_t)((nparams + 1) * png_sizeof(png_charp)));
345793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
346793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (info_ptr->pcal_params == NULL)
347793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
348793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_warning(png_ptr, "Insufficient memory for pCAL params");
349793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
350793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
351793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
352793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_memset(info_ptr->pcal_params, 0, (nparams + 1) * png_sizeof(png_charp));
353793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
354793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   for (i = 0; i < nparams; i++)
355793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
356793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      length = png_strlen(params[i]) + 1;
357793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_debug2(3, "allocating parameter %d for info (%lu bytes)", i,
358793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          (unsigned long)length);
359793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
360793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      info_ptr->pcal_params[i] = (png_charp)png_malloc_warn(png_ptr, length);
361793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
362793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (info_ptr->pcal_params[i] == NULL)
363793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      {
364793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         png_warning(png_ptr, "Insufficient memory for pCAL parameter");
365793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         return;
366793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
367793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
368793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_memcpy(info_ptr->pcal_params[i], params[i], length);
369793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
370793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
371793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->valid |= PNG_INFO_pCAL;
372793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->free_me |= PNG_FREE_PCAL;
373793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
374793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
375793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
376793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_sCAL_SUPPORTED
377793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
378793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_sCAL_s(png_structp png_ptr, png_infop info_ptr,
379793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int unit, png_const_charp swidth, png_const_charp sheight)
380793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
381793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_size_t lengthw = 0, lengthh = 0;
382793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
383793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug1(1, "in %s storage function", "sCAL");
384793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
385793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr == NULL || info_ptr == NULL)
386793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
387793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
388793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   /* Double check the unit (should never get here with an invalid
389793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    * unit unless this is an API call.)
390793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    */
391793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (unit != 1 && unit != 2)
392793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_error(png_ptr, "Invalid sCAL unit");
393793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
394793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (swidth == NULL || (lengthw = png_strlen(swidth)) == 0 ||
395793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       swidth[0] == 45 /* '-' */ || !png_check_fp_string(swidth, lengthw))
396793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_error(png_ptr, "Invalid sCAL width");
397793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
398793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (sheight == NULL || (lengthh = png_strlen(sheight)) == 0 ||
399793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       sheight[0] == 45 /* '-' */ || !png_check_fp_string(sheight, lengthh))
400793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_error(png_ptr, "Invalid sCAL height");
401793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
402793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->scal_unit = (png_byte)unit;
403793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
404793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   ++lengthw;
405793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
406793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug1(3, "allocating unit for info (%u bytes)", (unsigned int)lengthw);
407793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
408793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->scal_s_width = (png_charp)png_malloc_warn(png_ptr, lengthw);
409793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
410793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (info_ptr->scal_s_width == NULL)
411793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
412793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_warning(png_ptr, "Memory allocation failed while processing sCAL");
413793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
414793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
415793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
416793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_memcpy(info_ptr->scal_s_width, swidth, lengthw);
417793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
418793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   ++lengthh;
419793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
420793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug1(3, "allocating unit for info (%u bytes)", (unsigned int)lengthh);
421793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
422793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->scal_s_height = (png_charp)png_malloc_warn(png_ptr, lengthh);
423793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
424793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (info_ptr->scal_s_height == NULL)
425793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
426793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_free (png_ptr, info_ptr->scal_s_width);
427793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      info_ptr->scal_s_width = NULL;
428793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
429793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_warning(png_ptr, "Memory allocation failed while processing sCAL");
430793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
431793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
432793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
433793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_memcpy(info_ptr->scal_s_height, sheight, lengthh);
434793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
435793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->valid |= PNG_INFO_sCAL;
436793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->free_me |= PNG_FREE_SCAL;
437793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
438793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
439793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  ifdef PNG_FLOATING_POINT_SUPPORTED
440793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
441793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_sCAL(png_structp png_ptr, png_infop info_ptr, int unit, double width,
442793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    double height)
443793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
444793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug1(1, "in %s storage function", "sCAL");
445793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
446793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   /* Check the arguments. */
447793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (width <= 0)
448793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_warning(png_ptr, "Invalid sCAL width ignored");
449793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
450793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   else if (height <= 0)
451793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_warning(png_ptr, "Invalid sCAL height ignored");
452793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
453793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   else
454793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
455793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* Convert 'width' and 'height' to ASCII. */
456793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      char swidth[PNG_sCAL_MAX_DIGITS+1];
457793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      char sheight[PNG_sCAL_MAX_DIGITS+1];
458793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
459793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_ascii_from_fp(png_ptr, swidth, sizeof swidth, width,
460793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         PNG_sCAL_PRECISION);
461793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_ascii_from_fp(png_ptr, sheight, sizeof sheight, height,
462793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         PNG_sCAL_PRECISION);
463793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
464793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_set_sCAL_s(png_ptr, info_ptr, unit, swidth, sheight);
465793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
466793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
467793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  endif
468793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
469793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  ifdef PNG_FIXED_POINT_SUPPORTED
470793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
471793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_sCAL_fixed(png_structp png_ptr, png_infop info_ptr, int unit,
472793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_fixed_point width, png_fixed_point height)
473793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
474793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug1(1, "in %s storage function", "sCAL");
475793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
476793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   /* Check the arguments. */
477793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (width <= 0)
478793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_warning(png_ptr, "Invalid sCAL width ignored");
479793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
480793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   else if (height <= 0)
481793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_warning(png_ptr, "Invalid sCAL height ignored");
482793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
483793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   else
484793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
485793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* Convert 'width' and 'height' to ASCII. */
486793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      char swidth[PNG_sCAL_MAX_DIGITS+1];
487793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      char sheight[PNG_sCAL_MAX_DIGITS+1];
488793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
489793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_ascii_from_fixed(png_ptr, swidth, sizeof swidth, width);
490793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_ascii_from_fixed(png_ptr, sheight, sizeof sheight, height);
491793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
492793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_set_sCAL_s(png_ptr, info_ptr, unit, swidth, sheight);
493793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
494793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
495793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  endif
496793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
497793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
498793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_pHYs_SUPPORTED
499793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
500793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_pHYs(png_structp png_ptr, png_infop info_ptr,
501793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_uint_32 res_x, png_uint_32 res_y, int unit_type)
502793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
503793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug1(1, "in %s storage function", "pHYs");
504793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
505793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr == NULL || info_ptr == NULL)
506793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
507793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
508793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->x_pixels_per_unit = res_x;
509793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->y_pixels_per_unit = res_y;
510793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->phys_unit_type = (png_byte)unit_type;
511793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->valid |= PNG_INFO_pHYs;
512793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
513793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
514793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
515793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
516793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_PLTE(png_structp png_ptr, png_infop info_ptr,
517793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_const_colorp palette, int num_palette)
518793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
519793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
520793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug1(1, "in %s storage function", "PLTE");
521793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
522793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr == NULL || info_ptr == NULL)
523793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
524793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
525793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (num_palette < 0 || num_palette > PNG_MAX_PALETTE_LENGTH)
526793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
527793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
528793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         png_error(png_ptr, "Invalid palette length");
529793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
530793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      else
531793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      {
532793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         png_warning(png_ptr, "Invalid palette length");
533793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         return;
534793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
535793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
536793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
537793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   /* It may not actually be necessary to set png_ptr->palette here;
538793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    * we do it for backward compatibility with the way the png_handle_tRNS
539793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    * function used to do the allocation.
540793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    */
541793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_free_data(png_ptr, info_ptr, PNG_FREE_PLTE, 0);
542793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
543793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   /* Changed in libpng-1.2.1 to allocate PNG_MAX_PALETTE_LENGTH instead
544793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    * of num_palette entries, in case of an invalid PNG file that has
545793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    * too-large sample values.
546793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    */
547793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_ptr->palette = (png_colorp)png_calloc(png_ptr,
548793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       PNG_MAX_PALETTE_LENGTH * png_sizeof(png_color));
549793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
550793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_memcpy(png_ptr->palette, palette, num_palette * png_sizeof(png_color));
551793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->palette = png_ptr->palette;
552793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->num_palette = png_ptr->num_palette = (png_uint_16)num_palette;
553793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
554793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->free_me |= PNG_FREE_PLTE;
555793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
556793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->valid |= PNG_INFO_PLTE;
557793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
558793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
559793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_sBIT_SUPPORTED
560793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
561793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_sBIT(png_structp png_ptr, png_infop info_ptr,
562793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_const_color_8p sig_bit)
563793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
564793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug1(1, "in %s storage function", "sBIT");
565793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
566793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr == NULL || info_ptr == NULL)
567793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
568793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
569793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_memcpy(&(info_ptr->sig_bit), sig_bit, png_sizeof(png_color_8));
570793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->valid |= PNG_INFO_sBIT;
571793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
572793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
573793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
574793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_sRGB_SUPPORTED
575793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
576793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_sRGB(png_structp png_ptr, png_infop info_ptr, int srgb_intent)
577793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
578793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug1(1, "in %s storage function", "sRGB");
579793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
580793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr == NULL || info_ptr == NULL)
581793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
582793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
583793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->srgb_intent = (png_byte)srgb_intent;
584793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->valid |= PNG_INFO_sRGB;
585793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
586793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
587793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
588793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr,
589793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int srgb_intent)
590793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
591793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug1(1, "in %s storage function", "sRGB_gAMA_and_cHRM");
592793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
593793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr == NULL || info_ptr == NULL)
594793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
595793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
596793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_set_sRGB(png_ptr, info_ptr, srgb_intent);
597793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
598793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  ifdef PNG_gAMA_SUPPORTED
599793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_set_gAMA_fixed(png_ptr, info_ptr, PNG_GAMMA_sRGB_INVERSE);
600793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  endif
601793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
602793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  ifdef PNG_cHRM_SUPPORTED
603793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_set_cHRM_fixed(png_ptr, info_ptr,
604793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* color      x       y */
605793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* white */ 31270, 32900,
606793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* red   */ 64000, 33000,
607793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* green */ 30000, 60000,
608793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* blue  */ 15000,  6000
609793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   );
610793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  endif /* cHRM */
611793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
612793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif /* sRGB */
613793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
614793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
615793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_iCCP_SUPPORTED
616793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
617793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_iCCP(png_structp png_ptr, png_infop info_ptr,
618793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_const_charp name, int compression_type,
619793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_const_bytep profile, png_uint_32 proflen)
620793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
621793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_charp new_iccp_name;
622793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_bytep new_iccp_profile;
623793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_size_t length;
624793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
625793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug1(1, "in %s storage function", "iCCP");
626793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
627793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr == NULL || info_ptr == NULL || name == NULL || profile == NULL)
628793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
629793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
630793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   length = png_strlen(name)+1;
631793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   new_iccp_name = (png_charp)png_malloc_warn(png_ptr, length);
632793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
633793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (new_iccp_name == NULL)
634793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
635793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        png_warning(png_ptr, "Insufficient memory to process iCCP chunk");
636793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
637793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
638793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
639793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_memcpy(new_iccp_name, name, length);
640793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   new_iccp_profile = (png_bytep)png_malloc_warn(png_ptr, proflen);
641793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
642793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (new_iccp_profile == NULL)
643793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
644793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_free (png_ptr, new_iccp_name);
645793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_warning(png_ptr,
646793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          "Insufficient memory to process iCCP profile");
647793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
648793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
649793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
650793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_memcpy(new_iccp_profile, profile, (png_size_t)proflen);
651793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
652793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, 0);
653793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
654793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->iccp_proflen = proflen;
655793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->iccp_name = new_iccp_name;
656793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->iccp_profile = new_iccp_profile;
657793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   /* Compression is always zero but is here so the API and info structure
658793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    * does not have to change if we introduce multiple compression types
659793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    */
660793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->iccp_compression = (png_byte)compression_type;
661793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->free_me |= PNG_FREE_ICCP;
662793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->valid |= PNG_INFO_iCCP;
663793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
664793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
665793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
666793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_TEXT_SUPPORTED
667793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
668793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_text(png_structp png_ptr, png_infop info_ptr, png_const_textp text_ptr,
669793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int num_text)
670793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
671793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   int ret;
672793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   ret = png_set_text_2(png_ptr, info_ptr, text_ptr, num_text);
673793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
674793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (ret)
675793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_error(png_ptr, "Insufficient memory to store text");
676793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
677793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
678793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint /* PRIVATE */
679793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_text_2(png_structp png_ptr, png_infop info_ptr,
680793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_const_textp text_ptr, int num_text)
681793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
682793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   int i;
683793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
684793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug1(1, "in %lx storage function", png_ptr == NULL ? "unexpected" :
685793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      (unsigned long)png_ptr->chunk_name);
686793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
687793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr == NULL || info_ptr == NULL || num_text == 0)
688793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return(0);
689793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
690793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   /* Make sure we have enough space in the "text" array in info_struct
691793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    * to hold all of the incoming text_ptr objects.
692793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    */
693793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (info_ptr->num_text + num_text > info_ptr->max_text)
694793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
695793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      int old_max_text = info_ptr->max_text;
696793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      int old_num_text = info_ptr->num_text;
697793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
698793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (info_ptr->text != NULL)
699793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      {
700793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         png_textp old_text;
701793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
702793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         info_ptr->max_text = info_ptr->num_text + num_text + 8;
703793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         old_text = info_ptr->text;
704793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
705793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         info_ptr->text = (png_textp)png_malloc_warn(png_ptr,
706793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            (png_size_t)(info_ptr->max_text * png_sizeof(png_text)));
707793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
708793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         if (info_ptr->text == NULL)
709793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         {
710793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            /* Restore to previous condition */
711793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            info_ptr->max_text = old_max_text;
712793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            info_ptr->text = old_text;
713793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(1);
714793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         }
715793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
716793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         png_memcpy(info_ptr->text, old_text, (png_size_t)(old_max_text *
717793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             png_sizeof(png_text)));
718793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         png_free(png_ptr, old_text);
719793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
720793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
721793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      else
722793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      {
723793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         info_ptr->max_text = num_text + 8;
724793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         info_ptr->num_text = 0;
725793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         info_ptr->text = (png_textp)png_malloc_warn(png_ptr,
726793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             (png_size_t)(info_ptr->max_text * png_sizeof(png_text)));
727793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         if (info_ptr->text == NULL)
728793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         {
729793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            /* Restore to previous condition */
730793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            info_ptr->num_text = old_num_text;
731793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            info_ptr->max_text = old_max_text;
732793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(1);
733793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         }
734793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         info_ptr->free_me |= PNG_FREE_TEXT;
735793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
736793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
737793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_debug1(3, "allocated %d entries for info_ptr->text",
738793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          info_ptr->max_text);
739793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
740793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   for (i = 0; i < num_text; i++)
741793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
742793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_size_t text_length, key_len;
743793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_size_t lang_len, lang_key_len;
744793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_textp textp = &(info_ptr->text[info_ptr->num_text]);
745793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
746793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (text_ptr[i].key == NULL)
747793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          continue;
748793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
749793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (text_ptr[i].compression < PNG_TEXT_COMPRESSION_NONE ||
750793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          text_ptr[i].compression >= PNG_TEXT_COMPRESSION_LAST)
751793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      {
752793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         png_warning(png_ptr, "text compression mode is out of range");
753793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         continue;
754793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
755793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
756793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      key_len = png_strlen(text_ptr[i].key);
757793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
758793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (text_ptr[i].compression <= 0)
759793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      {
760793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         lang_len = 0;
761793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         lang_key_len = 0;
762793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
763793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
764793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      else
765793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  ifdef PNG_iTXt_SUPPORTED
766793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      {
767793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         /* Set iTXt data */
768793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
769793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         if (text_ptr[i].lang != NULL)
770793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            lang_len = png_strlen(text_ptr[i].lang);
771793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
772793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         else
773793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            lang_len = 0;
774793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
775793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         if (text_ptr[i].lang_key != NULL)
776793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            lang_key_len = png_strlen(text_ptr[i].lang_key);
777793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
778793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         else
779793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            lang_key_len = 0;
780793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
781793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  else /* PNG_iTXt_SUPPORTED */
782793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      {
783793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         png_warning(png_ptr, "iTXt chunk not supported");
784793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         continue;
785793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
786793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  endif
787793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
788793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (text_ptr[i].text == NULL || text_ptr[i].text[0] == '\0')
789793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      {
790793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         text_length = 0;
791793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  ifdef PNG_iTXt_SUPPORTED
792793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         if (text_ptr[i].compression > 0)
793793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            textp->compression = PNG_ITXT_COMPRESSION_NONE;
794793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
795793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         else
796793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  endif
797793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            textp->compression = PNG_TEXT_COMPRESSION_NONE;
798793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
799793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
800793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      else
801793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      {
802793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         text_length = png_strlen(text_ptr[i].text);
803793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         textp->compression = text_ptr[i].compression;
804793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
805793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
806793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      textp->key = (png_charp)png_malloc_warn(png_ptr,
807793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          (png_size_t)
808793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          (key_len + text_length + lang_len + lang_key_len + 4));
809793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
810793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (textp->key == NULL)
811793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         return(1);
812793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
813793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_debug2(2, "Allocated %lu bytes at %p in png_set_text",
814793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          (unsigned long)(png_uint_32)
815793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          (key_len + lang_len + lang_key_len + text_length + 4),
816793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          textp->key);
817793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
818793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_memcpy(textp->key, text_ptr[i].key,(png_size_t)(key_len));
819793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      *(textp->key + key_len) = '\0';
820793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
821793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (text_ptr[i].compression > 0)
822793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      {
823793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         textp->lang = textp->key + key_len + 1;
824793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         png_memcpy(textp->lang, text_ptr[i].lang, lang_len);
825793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         *(textp->lang + lang_len) = '\0';
826793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         textp->lang_key = textp->lang + lang_len + 1;
827793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         png_memcpy(textp->lang_key, text_ptr[i].lang_key, lang_key_len);
828793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         *(textp->lang_key + lang_key_len) = '\0';
829793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         textp->text = textp->lang_key + lang_key_len + 1;
830793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
831793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
832793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      else
833793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      {
834793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         textp->lang=NULL;
835793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         textp->lang_key=NULL;
836793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         textp->text = textp->key + key_len + 1;
837793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
838793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
839793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (text_length)
840793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         png_memcpy(textp->text, text_ptr[i].text,
841793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             (png_size_t)(text_length));
842793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
843793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      *(textp->text + text_length) = '\0';
844793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
845793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  ifdef PNG_iTXt_SUPPORTED
846793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (textp->compression > 0)
847793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      {
848793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         textp->text_length = 0;
849793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         textp->itxt_length = text_length;
850793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
851793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
852793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      else
853793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  endif
854793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      {
855793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         textp->text_length = text_length;
856793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         textp->itxt_length = 0;
857793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
858793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
859793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      info_ptr->num_text++;
860793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_debug1(3, "transferred text chunk %d", info_ptr->num_text);
861793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
862793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   return(0);
863793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
864793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
865793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
866793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_tIME_SUPPORTED
867793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
868793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_tIME(png_structp png_ptr, png_infop info_ptr, png_const_timep mod_time)
869793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
870793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug1(1, "in %s storage function", "tIME");
871793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
872793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr == NULL || info_ptr == NULL ||
873793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       (png_ptr->mode & PNG_WROTE_tIME))
874793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
875793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
876793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (mod_time->month == 0   || mod_time->month > 12  ||
877793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       mod_time->day   == 0   || mod_time->day   > 31  ||
878793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       mod_time->hour  > 23   || mod_time->minute > 59 ||
879793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       mod_time->second > 60)
880793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
881793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_warning(png_ptr, "Ignoring invalid time value");
882793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
883793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
884793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
885793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_memcpy(&(info_ptr->mod_time), mod_time, png_sizeof(png_time));
886793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->valid |= PNG_INFO_tIME;
887793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
888793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
889793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
890793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_tRNS_SUPPORTED
891793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
892793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_tRNS(png_structp png_ptr, png_infop info_ptr,
893793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_const_bytep trans_alpha, int num_trans, png_const_color_16p trans_color)
894793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
895793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug1(1, "in %s storage function", "tRNS");
896793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
897793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr == NULL || info_ptr == NULL)
898793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
899793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
900793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (trans_alpha != NULL)
901793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
902793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       /* It may not actually be necessary to set png_ptr->trans_alpha here;
903793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        * we do it for backward compatibility with the way the png_handle_tRNS
904793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        * function used to do the allocation.
905793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        */
906793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
907793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0);
908793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
909793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       /* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */
910793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       png_ptr->trans_alpha = info_ptr->trans_alpha =
911793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler           (png_bytep)png_malloc(png_ptr, (png_size_t)PNG_MAX_PALETTE_LENGTH);
912793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
913793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       if (num_trans > 0 && num_trans <= PNG_MAX_PALETTE_LENGTH)
914793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          png_memcpy(info_ptr->trans_alpha, trans_alpha, (png_size_t)num_trans);
915793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
916793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
917793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (trans_color != NULL)
918793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
919793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      int sample_max = (1 << info_ptr->bit_depth);
920793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
921793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if ((info_ptr->color_type == PNG_COLOR_TYPE_GRAY &&
922793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          (int)trans_color->gray > sample_max) ||
923793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          (info_ptr->color_type == PNG_COLOR_TYPE_RGB &&
924793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          ((int)trans_color->red > sample_max ||
925793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          (int)trans_color->green > sample_max ||
926793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          (int)trans_color->blue > sample_max)))
927793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         png_warning(png_ptr,
928793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            "tRNS chunk has out-of-range samples for bit_depth");
929793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
930793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_memcpy(&(info_ptr->trans_color), trans_color,
931793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         png_sizeof(png_color_16));
932793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
933793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (num_trans == 0)
934793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         num_trans = 1;
935793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
936793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
937793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->num_trans = (png_uint_16)num_trans;
938793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
939793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (num_trans != 0)
940793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
941793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      info_ptr->valid |= PNG_INFO_tRNS;
942793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      info_ptr->free_me |= PNG_FREE_TRNS;
943793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
944793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
945793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
946793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
947793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_sPLT_SUPPORTED
948793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
949793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_sPLT(png_structp png_ptr,
950793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_infop info_ptr, png_const_sPLT_tp entries, int nentries)
951793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
952793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *  entries        - array of png_sPLT_t structures
953793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *                   to be added to the list of palettes
954793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *                   in the info structure.
955793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *
956793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *  nentries       - number of palette structures to be
957793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *                   added.
958793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
959793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
960793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_sPLT_tp np;
961793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   int i;
962793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
963793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr == NULL || info_ptr == NULL)
964793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
965793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
966793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   np = (png_sPLT_tp)png_malloc_warn(png_ptr,
967793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       (info_ptr->splt_palettes_num + nentries) *
968793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       (png_size_t)png_sizeof(png_sPLT_t));
969793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
970793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (np == NULL)
971793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
972793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_warning(png_ptr, "No memory for sPLT palettes");
973793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
974793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
975793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
976793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_memcpy(np, info_ptr->splt_palettes,
977793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       info_ptr->splt_palettes_num * png_sizeof(png_sPLT_t));
978793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
979793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_free(png_ptr, info_ptr->splt_palettes);
980793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->splt_palettes=NULL;
981793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
982793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   for (i = 0; i < nentries; i++)
983793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
984793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_sPLT_tp to = np + info_ptr->splt_palettes_num + i;
985793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_const_sPLT_tp from = entries + i;
986793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_size_t length;
987793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
988793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      length = png_strlen(from->name) + 1;
989793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      to->name = (png_charp)png_malloc_warn(png_ptr, length);
990793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
991793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (to->name == NULL)
992793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      {
993793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         png_warning(png_ptr,
994793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             "Out of memory while processing sPLT chunk");
995793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         continue;
996793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
997793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
998793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_memcpy(to->name, from->name, length);
999793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      to->entries = (png_sPLT_entryp)png_malloc_warn(png_ptr,
1000793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          from->nentries * png_sizeof(png_sPLT_entry));
1001793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1002793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (to->entries == NULL)
1003793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      {
1004793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         png_warning(png_ptr,
1005793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             "Out of memory while processing sPLT chunk");
1006793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         png_free(png_ptr, to->name);
1007793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         to->name = NULL;
1008793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         continue;
1009793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
1010793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1011793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_memcpy(to->entries, from->entries,
1012793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          from->nentries * png_sizeof(png_sPLT_entry));
1013793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1014793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      to->nentries = from->nentries;
1015793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      to->depth = from->depth;
1016793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
1017793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1018793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->splt_palettes = np;
1019793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->splt_palettes_num += nentries;
1020793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->valid |= PNG_INFO_sPLT;
1021793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->free_me |= PNG_FREE_SPLT;
1022793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1023793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif /* PNG_sPLT_SUPPORTED */
1024793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1025793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
1026793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
1027793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_unknown_chunks(png_structp png_ptr,
1028793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_infop info_ptr, png_const_unknown_chunkp unknowns, int num_unknowns)
1029793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1030793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_unknown_chunkp np;
1031793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   int i;
1032793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1033793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr == NULL || info_ptr == NULL || num_unknowns == 0)
1034793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
1035793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1036793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   np = (png_unknown_chunkp)png_malloc_warn(png_ptr,
1037793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       (png_size_t)(info_ptr->unknown_chunks_num + num_unknowns) *
1038793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       png_sizeof(png_unknown_chunk));
1039793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1040793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (np == NULL)
1041793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
1042793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_warning(png_ptr,
1043793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          "Out of memory while processing unknown chunk");
1044793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
1045793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
1046793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1047793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_memcpy(np, info_ptr->unknown_chunks,
1048793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       (png_size_t)info_ptr->unknown_chunks_num *
1049793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       png_sizeof(png_unknown_chunk));
1050793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1051793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_free(png_ptr, info_ptr->unknown_chunks);
1052793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->unknown_chunks = NULL;
1053793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1054793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   for (i = 0; i < num_unknowns; i++)
1055793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
1056793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_unknown_chunkp to = np + info_ptr->unknown_chunks_num + i;
1057793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_const_unknown_chunkp from = unknowns + i;
1058793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1059793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_memcpy(to->name, from->name, png_sizeof(from->name));
1060793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      to->name[png_sizeof(to->name)-1] = '\0';
1061793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      to->size = from->size;
1062793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1063793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* Note our location in the read or write sequence */
1064793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      to->location = (png_byte)(png_ptr->mode & 0xff);
1065793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1066793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (from->size == 0)
1067793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         to->data=NULL;
1068793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1069793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      else
1070793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      {
1071793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         to->data = (png_bytep)png_malloc_warn(png_ptr,
1072793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             (png_size_t)from->size);
1073793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1074793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         if (to->data == NULL)
1075793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         {
1076793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            png_warning(png_ptr,
1077793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                "Out of memory while processing unknown chunk");
1078793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            to->size = 0;
1079793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         }
1080793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1081793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         else
1082793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            png_memcpy(to->data, from->data, from->size);
1083793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
1084793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
1085793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1086793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->unknown_chunks = np;
1087793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->unknown_chunks_num += num_unknowns;
1088793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->free_me |= PNG_FREE_UNKN;
1089793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1090793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1091793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
1092793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_unknown_chunk_location(png_structp png_ptr, png_infop info_ptr,
1093793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int chunk, int location)
1094793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1095793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr != NULL && info_ptr != NULL && chunk >= 0 && chunk <
1096793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       info_ptr->unknown_chunks_num)
1097793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      info_ptr->unknown_chunks[chunk].location = (png_byte)location;
1098793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1099793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
1100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_MNG_FEATURES_SUPPORTED
1103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_uint_32 PNGAPI
1104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_permit_mng_features (png_structp png_ptr, png_uint_32 mng_features)
1105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug(1, "in png_permit_mng_features");
1107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr == NULL)
1109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return (png_uint_32)0;
1110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_ptr->mng_features_permitted =
1112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       (png_byte)(mng_features & PNG_ALL_MNG_FEATURES);
1113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   return (png_uint_32)png_ptr->mng_features_permitted;
1115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
1117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
1119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
1120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_keep_unknown_chunks(png_structp png_ptr, int keep, png_const_bytep
1121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    chunk_list, int num_chunks)
1122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_bytep new_list, p;
1124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   int i, old_num_chunks;
1125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr == NULL)
1126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
1127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (num_chunks == 0)
1129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
1130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (keep == PNG_HANDLE_CHUNK_ALWAYS || keep == PNG_HANDLE_CHUNK_IF_SAFE)
1131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         png_ptr->flags |= PNG_FLAG_KEEP_UNKNOWN_CHUNKS;
1132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      else
1134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         png_ptr->flags &= ~PNG_FLAG_KEEP_UNKNOWN_CHUNKS;
1135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (keep == PNG_HANDLE_CHUNK_ALWAYS)
1137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         png_ptr->flags |= PNG_FLAG_KEEP_UNSAFE_CHUNKS;
1138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      else
1140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         png_ptr->flags &= ~PNG_FLAG_KEEP_UNSAFE_CHUNKS;
1141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
1143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
1144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (chunk_list == NULL)
1146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
1147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   old_num_chunks = png_ptr->num_chunk_list;
1149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   new_list=(png_bytep)png_malloc(png_ptr,
1150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       (png_size_t)(5*(num_chunks + old_num_chunks)));
1151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr->chunk_list != NULL)
1153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   {
1154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_memcpy(new_list, png_ptr->chunk_list,
1155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          (png_size_t)(5*old_num_chunks));
1156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_free(png_ptr, png_ptr->chunk_list);
1157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_ptr->chunk_list=NULL;
1158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   }
1159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_memcpy(new_list + 5*old_num_chunks, chunk_list,
1161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       (png_size_t)(5*num_chunks));
1162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   for (p = new_list + 5*old_num_chunks + 4, i = 0; i<num_chunks; i++, p += 5)
1164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      *p=(png_byte)keep;
1165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_ptr->num_chunk_list = old_num_chunks + num_chunks;
1167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_ptr->chunk_list = new_list;
1168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_ptr->free_me |= PNG_FREE_LIST;
1169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
1171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
1173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
1174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_read_user_chunk_fn(png_structp png_ptr, png_voidp user_chunk_ptr,
1175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_user_chunk_ptr read_user_chunk_fn)
1176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug(1, "in png_set_read_user_chunk_fn");
1178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr == NULL)
1180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
1181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_ptr->read_user_chunk_fn = read_user_chunk_fn;
1183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_ptr->user_chunk_ptr = user_chunk_ptr;
1184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
1186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_INFO_IMAGE_SUPPORTED
1188793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
1189793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_rows(png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers)
1190793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug1(1, "in %s storage function", "rows");
1192793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr == NULL || info_ptr == NULL)
1194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
1195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (info_ptr->row_pointers && (info_ptr->row_pointers != row_pointers))
1197793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0);
1198793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   info_ptr->row_pointers = row_pointers;
1200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (row_pointers)
1202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      info_ptr->valid |= PNG_INFO_IDAT;
1203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1204793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
1205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1206793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
1207793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_compression_buffer_size(png_structp png_ptr, png_size_t size)
1208793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (png_ptr == NULL)
1210793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       return;
1211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_free(png_ptr, png_ptr->zbuf);
1213793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (size > ZLIB_IO_MAX)
1215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       png_warning(png_ptr, "Attempt to set buffer size beyond max ignored");
1217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       png_ptr->zbuf_size = ZLIB_IO_MAX;
1218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       size = ZLIB_IO_MAX; /* must fit */
1219793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
1222793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       png_ptr->zbuf_size = (uInt)size;
1223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1224793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, size);
1225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* The following ensures a relatively safe failure if this gets called while
1227793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * the buffer is actually in use.
1228793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
1229793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_ptr->zstream.next_out = png_ptr->zbuf;
1230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_ptr->zstream.avail_out = 0;
1231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_ptr->zstream.avail_in = 0;
1232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1233793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
1235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_invalid(png_structp png_ptr, png_infop info_ptr, int mask)
1236793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr && info_ptr)
1238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      info_ptr->valid &= ~mask;
1239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1240793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1241793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1242793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_SET_USER_LIMITS_SUPPORTED
1244793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* This function was added to libpng 1.2.6 */
1245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
1246793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_user_limits (png_structp png_ptr, png_uint_32 user_width_max,
1247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_uint_32 user_height_max)
1248793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   /* Images with dimensions larger than these limits will be
1250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    * rejected by png_set_IHDR().  To accept any PNG datastream
1251793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    * regardless of dimensions, set both limits to 0x7ffffffL.
1252793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    */
1253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr == NULL)
1254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      return;
1255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1256793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_ptr->user_width_max = user_width_max;
1257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_ptr->user_height_max = user_height_max;
1258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1260793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* This function was added to libpng 1.4.0 */
1261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
1262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_chunk_cache_max (png_structp png_ptr,
1263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_uint_32 user_chunk_cache_max)
1264793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (png_ptr)
1266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       png_ptr->user_chunk_cache_max = user_chunk_cache_max;
1267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1268793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1269793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* This function was added to libpng 1.4.1 */
1270793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
1271793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_chunk_malloc_max (png_structp png_ptr,
1272793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    png_alloc_size_t user_chunk_malloc_max)
1273793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1274793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (png_ptr)
1275793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_ptr->user_chunk_malloc_max = user_chunk_malloc_max;
1276793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1277793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */
1278793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1279793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1280793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_BENIGN_ERRORS_SUPPORTED
1281793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
1282793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_benign_errors(png_structp png_ptr, int allowed)
1283793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1284793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug(1, "in png_set_benign_errors");
1285793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1286793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (allowed)
1287793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_ptr->flags |= PNG_FLAG_BENIGN_ERRORS_WARN;
1288793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1289793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   else
1290793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_ptr->flags &= ~PNG_FLAG_BENIGN_ERRORS_WARN;
1291793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1292793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif /* PNG_BENIGN_ERRORS_SUPPORTED */
1293793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1294793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED
1295793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* Whether to report invalid palette index; added at libng-1.5.10
1296793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *   allowed  - one of 0: disable; 1: enable
1297793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
1298793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI
1299793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_check_for_invalid_index(png_structp png_ptr, int allowed)
1300793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1301793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   png_debug(1, "in png_set_check_for_invalid_index");
1302793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1303793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   if (allowed)
1304793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_ptr->num_palette_max = 0;
1305793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1306793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   else
1307793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      png_ptr->num_palette_max = -1;
1308793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1309793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
1310793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1311793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
1312