xref: /aosp_15_r20/external/libpng/pngget.c (revision a67afe4df73cf47866eedc69947994b8ff839aba)
1*a67afe4dSAndroid Build Coastguard Worker 
2*a67afe4dSAndroid Build Coastguard Worker /* pngget.c - retrieval of values from info struct
3*a67afe4dSAndroid Build Coastguard Worker  *
4*a67afe4dSAndroid Build Coastguard Worker  * Copyright (c) 2018-2024 Cosmin Truta
5*a67afe4dSAndroid Build Coastguard Worker  * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
6*a67afe4dSAndroid Build Coastguard Worker  * Copyright (c) 1996-1997 Andreas Dilger
7*a67afe4dSAndroid Build Coastguard Worker  * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
8*a67afe4dSAndroid Build Coastguard Worker  *
9*a67afe4dSAndroid Build Coastguard Worker  * This code is released under the libpng license.
10*a67afe4dSAndroid Build Coastguard Worker  * For conditions of distribution and use, see the disclaimer
11*a67afe4dSAndroid Build Coastguard Worker  * and license in png.h
12*a67afe4dSAndroid Build Coastguard Worker  *
13*a67afe4dSAndroid Build Coastguard Worker  */
14*a67afe4dSAndroid Build Coastguard Worker 
15*a67afe4dSAndroid Build Coastguard Worker #include "pngpriv.h"
16*a67afe4dSAndroid Build Coastguard Worker 
17*a67afe4dSAndroid Build Coastguard Worker #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
18*a67afe4dSAndroid Build Coastguard Worker 
19*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_valid(png_const_structrp png_ptr,png_const_inforp info_ptr,png_uint_32 flag)20*a67afe4dSAndroid Build Coastguard Worker png_get_valid(png_const_structrp png_ptr, png_const_inforp info_ptr,
21*a67afe4dSAndroid Build Coastguard Worker     png_uint_32 flag)
22*a67afe4dSAndroid Build Coastguard Worker {
23*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL)
24*a67afe4dSAndroid Build Coastguard Worker    {
25*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_READ_tRNS_SUPPORTED
26*a67afe4dSAndroid Build Coastguard Worker       /* png_handle_PLTE() may have canceled a valid tRNS chunk but left the
27*a67afe4dSAndroid Build Coastguard Worker        * 'valid' flag for the detection of duplicate chunks. Do not report a
28*a67afe4dSAndroid Build Coastguard Worker        * valid tRNS chunk in this case.
29*a67afe4dSAndroid Build Coastguard Worker        */
30*a67afe4dSAndroid Build Coastguard Worker       if (flag == PNG_INFO_tRNS && png_ptr->num_trans == 0)
31*a67afe4dSAndroid Build Coastguard Worker          return 0;
32*a67afe4dSAndroid Build Coastguard Worker #endif
33*a67afe4dSAndroid Build Coastguard Worker 
34*a67afe4dSAndroid Build Coastguard Worker       return info_ptr->valid & flag;
35*a67afe4dSAndroid Build Coastguard Worker    }
36*a67afe4dSAndroid Build Coastguard Worker 
37*a67afe4dSAndroid Build Coastguard Worker    return 0;
38*a67afe4dSAndroid Build Coastguard Worker }
39*a67afe4dSAndroid Build Coastguard Worker 
40*a67afe4dSAndroid Build Coastguard Worker size_t PNGAPI
png_get_rowbytes(png_const_structrp png_ptr,png_const_inforp info_ptr)41*a67afe4dSAndroid Build Coastguard Worker png_get_rowbytes(png_const_structrp png_ptr, png_const_inforp info_ptr)
42*a67afe4dSAndroid Build Coastguard Worker {
43*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL)
44*a67afe4dSAndroid Build Coastguard Worker       return info_ptr->rowbytes;
45*a67afe4dSAndroid Build Coastguard Worker 
46*a67afe4dSAndroid Build Coastguard Worker    return 0;
47*a67afe4dSAndroid Build Coastguard Worker }
48*a67afe4dSAndroid Build Coastguard Worker 
49*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_INFO_IMAGE_SUPPORTED
50*a67afe4dSAndroid Build Coastguard Worker png_bytepp PNGAPI
png_get_rows(png_const_structrp png_ptr,png_const_inforp info_ptr)51*a67afe4dSAndroid Build Coastguard Worker png_get_rows(png_const_structrp png_ptr, png_const_inforp info_ptr)
52*a67afe4dSAndroid Build Coastguard Worker {
53*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL)
54*a67afe4dSAndroid Build Coastguard Worker       return info_ptr->row_pointers;
55*a67afe4dSAndroid Build Coastguard Worker 
56*a67afe4dSAndroid Build Coastguard Worker    return 0;
57*a67afe4dSAndroid Build Coastguard Worker }
58*a67afe4dSAndroid Build Coastguard Worker #endif
59*a67afe4dSAndroid Build Coastguard Worker 
60*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_EASY_ACCESS_SUPPORTED
61*a67afe4dSAndroid Build Coastguard Worker /* Easy access to info, added in libpng-0.99 */
62*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_image_width(png_const_structrp png_ptr,png_const_inforp info_ptr)63*a67afe4dSAndroid Build Coastguard Worker png_get_image_width(png_const_structrp png_ptr, png_const_inforp info_ptr)
64*a67afe4dSAndroid Build Coastguard Worker {
65*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL)
66*a67afe4dSAndroid Build Coastguard Worker       return info_ptr->width;
67*a67afe4dSAndroid Build Coastguard Worker 
68*a67afe4dSAndroid Build Coastguard Worker    return 0;
69*a67afe4dSAndroid Build Coastguard Worker }
70*a67afe4dSAndroid Build Coastguard Worker 
71*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_image_height(png_const_structrp png_ptr,png_const_inforp info_ptr)72*a67afe4dSAndroid Build Coastguard Worker png_get_image_height(png_const_structrp png_ptr, png_const_inforp info_ptr)
73*a67afe4dSAndroid Build Coastguard Worker {
74*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL)
75*a67afe4dSAndroid Build Coastguard Worker       return info_ptr->height;
76*a67afe4dSAndroid Build Coastguard Worker 
77*a67afe4dSAndroid Build Coastguard Worker    return 0;
78*a67afe4dSAndroid Build Coastguard Worker }
79*a67afe4dSAndroid Build Coastguard Worker 
80*a67afe4dSAndroid Build Coastguard Worker png_byte PNGAPI
png_get_bit_depth(png_const_structrp png_ptr,png_const_inforp info_ptr)81*a67afe4dSAndroid Build Coastguard Worker png_get_bit_depth(png_const_structrp png_ptr, png_const_inforp info_ptr)
82*a67afe4dSAndroid Build Coastguard Worker {
83*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL)
84*a67afe4dSAndroid Build Coastguard Worker       return info_ptr->bit_depth;
85*a67afe4dSAndroid Build Coastguard Worker 
86*a67afe4dSAndroid Build Coastguard Worker    return 0;
87*a67afe4dSAndroid Build Coastguard Worker }
88*a67afe4dSAndroid Build Coastguard Worker 
89*a67afe4dSAndroid Build Coastguard Worker png_byte PNGAPI
png_get_color_type(png_const_structrp png_ptr,png_const_inforp info_ptr)90*a67afe4dSAndroid Build Coastguard Worker png_get_color_type(png_const_structrp png_ptr, png_const_inforp info_ptr)
91*a67afe4dSAndroid Build Coastguard Worker {
92*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL)
93*a67afe4dSAndroid Build Coastguard Worker       return info_ptr->color_type;
94*a67afe4dSAndroid Build Coastguard Worker 
95*a67afe4dSAndroid Build Coastguard Worker    return 0;
96*a67afe4dSAndroid Build Coastguard Worker }
97*a67afe4dSAndroid Build Coastguard Worker 
98*a67afe4dSAndroid Build Coastguard Worker png_byte PNGAPI
png_get_filter_type(png_const_structrp png_ptr,png_const_inforp info_ptr)99*a67afe4dSAndroid Build Coastguard Worker png_get_filter_type(png_const_structrp png_ptr, png_const_inforp info_ptr)
100*a67afe4dSAndroid Build Coastguard Worker {
101*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL)
102*a67afe4dSAndroid Build Coastguard Worker       return info_ptr->filter_type;
103*a67afe4dSAndroid Build Coastguard Worker 
104*a67afe4dSAndroid Build Coastguard Worker    return 0;
105*a67afe4dSAndroid Build Coastguard Worker }
106*a67afe4dSAndroid Build Coastguard Worker 
107*a67afe4dSAndroid Build Coastguard Worker png_byte PNGAPI
png_get_interlace_type(png_const_structrp png_ptr,png_const_inforp info_ptr)108*a67afe4dSAndroid Build Coastguard Worker png_get_interlace_type(png_const_structrp png_ptr, png_const_inforp info_ptr)
109*a67afe4dSAndroid Build Coastguard Worker {
110*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL)
111*a67afe4dSAndroid Build Coastguard Worker       return info_ptr->interlace_type;
112*a67afe4dSAndroid Build Coastguard Worker 
113*a67afe4dSAndroid Build Coastguard Worker    return 0;
114*a67afe4dSAndroid Build Coastguard Worker }
115*a67afe4dSAndroid Build Coastguard Worker 
116*a67afe4dSAndroid Build Coastguard Worker png_byte PNGAPI
png_get_compression_type(png_const_structrp png_ptr,png_const_inforp info_ptr)117*a67afe4dSAndroid Build Coastguard Worker png_get_compression_type(png_const_structrp png_ptr, png_const_inforp info_ptr)
118*a67afe4dSAndroid Build Coastguard Worker {
119*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL)
120*a67afe4dSAndroid Build Coastguard Worker       return info_ptr->compression_type;
121*a67afe4dSAndroid Build Coastguard Worker 
122*a67afe4dSAndroid Build Coastguard Worker    return 0;
123*a67afe4dSAndroid Build Coastguard Worker }
124*a67afe4dSAndroid Build Coastguard Worker 
125*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_x_pixels_per_meter(png_const_structrp png_ptr,png_const_inforp info_ptr)126*a67afe4dSAndroid Build Coastguard Worker png_get_x_pixels_per_meter(png_const_structrp png_ptr, png_const_inforp
127*a67afe4dSAndroid Build Coastguard Worker    info_ptr)
128*a67afe4dSAndroid Build Coastguard Worker {
129*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_pHYs_SUPPORTED
130*a67afe4dSAndroid Build Coastguard Worker    png_debug(1, "in png_get_x_pixels_per_meter");
131*a67afe4dSAndroid Build Coastguard Worker 
132*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
133*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->valid & PNG_INFO_pHYs) != 0)
134*a67afe4dSAndroid Build Coastguard Worker    {
135*a67afe4dSAndroid Build Coastguard Worker       if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER)
136*a67afe4dSAndroid Build Coastguard Worker          return info_ptr->x_pixels_per_unit;
137*a67afe4dSAndroid Build Coastguard Worker    }
138*a67afe4dSAndroid Build Coastguard Worker #else
139*a67afe4dSAndroid Build Coastguard Worker    PNG_UNUSED(png_ptr)
140*a67afe4dSAndroid Build Coastguard Worker    PNG_UNUSED(info_ptr)
141*a67afe4dSAndroid Build Coastguard Worker #endif
142*a67afe4dSAndroid Build Coastguard Worker 
143*a67afe4dSAndroid Build Coastguard Worker    return 0;
144*a67afe4dSAndroid Build Coastguard Worker }
145*a67afe4dSAndroid Build Coastguard Worker 
146*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_y_pixels_per_meter(png_const_structrp png_ptr,png_const_inforp info_ptr)147*a67afe4dSAndroid Build Coastguard Worker png_get_y_pixels_per_meter(png_const_structrp png_ptr, png_const_inforp
148*a67afe4dSAndroid Build Coastguard Worker     info_ptr)
149*a67afe4dSAndroid Build Coastguard Worker {
150*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_pHYs_SUPPORTED
151*a67afe4dSAndroid Build Coastguard Worker    png_debug(1, "in png_get_y_pixels_per_meter");
152*a67afe4dSAndroid Build Coastguard Worker 
153*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
154*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->valid & PNG_INFO_pHYs) != 0)
155*a67afe4dSAndroid Build Coastguard Worker    {
156*a67afe4dSAndroid Build Coastguard Worker       if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER)
157*a67afe4dSAndroid Build Coastguard Worker          return info_ptr->y_pixels_per_unit;
158*a67afe4dSAndroid Build Coastguard Worker    }
159*a67afe4dSAndroid Build Coastguard Worker #else
160*a67afe4dSAndroid Build Coastguard Worker    PNG_UNUSED(png_ptr)
161*a67afe4dSAndroid Build Coastguard Worker    PNG_UNUSED(info_ptr)
162*a67afe4dSAndroid Build Coastguard Worker #endif
163*a67afe4dSAndroid Build Coastguard Worker 
164*a67afe4dSAndroid Build Coastguard Worker    return 0;
165*a67afe4dSAndroid Build Coastguard Worker }
166*a67afe4dSAndroid Build Coastguard Worker 
167*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_pixels_per_meter(png_const_structrp png_ptr,png_const_inforp info_ptr)168*a67afe4dSAndroid Build Coastguard Worker png_get_pixels_per_meter(png_const_structrp png_ptr, png_const_inforp info_ptr)
169*a67afe4dSAndroid Build Coastguard Worker {
170*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_pHYs_SUPPORTED
171*a67afe4dSAndroid Build Coastguard Worker    png_debug(1, "in png_get_pixels_per_meter");
172*a67afe4dSAndroid Build Coastguard Worker 
173*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
174*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->valid & PNG_INFO_pHYs) != 0)
175*a67afe4dSAndroid Build Coastguard Worker    {
176*a67afe4dSAndroid Build Coastguard Worker       if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER &&
177*a67afe4dSAndroid Build Coastguard Worker           info_ptr->x_pixels_per_unit == info_ptr->y_pixels_per_unit)
178*a67afe4dSAndroid Build Coastguard Worker          return info_ptr->x_pixels_per_unit;
179*a67afe4dSAndroid Build Coastguard Worker    }
180*a67afe4dSAndroid Build Coastguard Worker #else
181*a67afe4dSAndroid Build Coastguard Worker    PNG_UNUSED(png_ptr)
182*a67afe4dSAndroid Build Coastguard Worker    PNG_UNUSED(info_ptr)
183*a67afe4dSAndroid Build Coastguard Worker #endif
184*a67afe4dSAndroid Build Coastguard Worker 
185*a67afe4dSAndroid Build Coastguard Worker    return 0;
186*a67afe4dSAndroid Build Coastguard Worker }
187*a67afe4dSAndroid Build Coastguard Worker 
188*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_FLOATING_POINT_SUPPORTED
189*a67afe4dSAndroid Build Coastguard Worker float PNGAPI
png_get_pixel_aspect_ratio(png_const_structrp png_ptr,png_const_inforp info_ptr)190*a67afe4dSAndroid Build Coastguard Worker png_get_pixel_aspect_ratio(png_const_structrp png_ptr, png_const_inforp
191*a67afe4dSAndroid Build Coastguard Worker    info_ptr)
192*a67afe4dSAndroid Build Coastguard Worker {
193*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_READ_pHYs_SUPPORTED
194*a67afe4dSAndroid Build Coastguard Worker    png_debug(1, "in png_get_pixel_aspect_ratio");
195*a67afe4dSAndroid Build Coastguard Worker 
196*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
197*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->valid & PNG_INFO_pHYs) != 0)
198*a67afe4dSAndroid Build Coastguard Worker    {
199*a67afe4dSAndroid Build Coastguard Worker       if (info_ptr->x_pixels_per_unit != 0)
200*a67afe4dSAndroid Build Coastguard Worker          return (float)info_ptr->y_pixels_per_unit
201*a67afe4dSAndroid Build Coastguard Worker               / (float)info_ptr->x_pixels_per_unit;
202*a67afe4dSAndroid Build Coastguard Worker    }
203*a67afe4dSAndroid Build Coastguard Worker #else
204*a67afe4dSAndroid Build Coastguard Worker    PNG_UNUSED(png_ptr)
205*a67afe4dSAndroid Build Coastguard Worker    PNG_UNUSED(info_ptr)
206*a67afe4dSAndroid Build Coastguard Worker #endif
207*a67afe4dSAndroid Build Coastguard Worker 
208*a67afe4dSAndroid Build Coastguard Worker    return (float)0.0;
209*a67afe4dSAndroid Build Coastguard Worker }
210*a67afe4dSAndroid Build Coastguard Worker #endif
211*a67afe4dSAndroid Build Coastguard Worker 
212*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_FIXED_POINT_SUPPORTED
213*a67afe4dSAndroid Build Coastguard Worker png_fixed_point PNGAPI
png_get_pixel_aspect_ratio_fixed(png_const_structrp png_ptr,png_const_inforp info_ptr)214*a67afe4dSAndroid Build Coastguard Worker png_get_pixel_aspect_ratio_fixed(png_const_structrp png_ptr,
215*a67afe4dSAndroid Build Coastguard Worker     png_const_inforp info_ptr)
216*a67afe4dSAndroid Build Coastguard Worker {
217*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_READ_pHYs_SUPPORTED
218*a67afe4dSAndroid Build Coastguard Worker    png_debug(1, "in png_get_pixel_aspect_ratio_fixed");
219*a67afe4dSAndroid Build Coastguard Worker 
220*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
221*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->valid & PNG_INFO_pHYs) != 0 &&
222*a67afe4dSAndroid Build Coastguard Worker        info_ptr->x_pixels_per_unit > 0 && info_ptr->y_pixels_per_unit > 0 &&
223*a67afe4dSAndroid Build Coastguard Worker        info_ptr->x_pixels_per_unit <= PNG_UINT_31_MAX &&
224*a67afe4dSAndroid Build Coastguard Worker        info_ptr->y_pixels_per_unit <= PNG_UINT_31_MAX)
225*a67afe4dSAndroid Build Coastguard Worker    {
226*a67afe4dSAndroid Build Coastguard Worker       png_fixed_point res;
227*a67afe4dSAndroid Build Coastguard Worker 
228*a67afe4dSAndroid Build Coastguard Worker       /* The following casts work because a PNG 4 byte integer only has a valid
229*a67afe4dSAndroid Build Coastguard Worker        * range of 0..2^31-1; otherwise the cast might overflow.
230*a67afe4dSAndroid Build Coastguard Worker        */
231*a67afe4dSAndroid Build Coastguard Worker       if (png_muldiv(&res, (png_int_32)info_ptr->y_pixels_per_unit, PNG_FP_1,
232*a67afe4dSAndroid Build Coastguard Worker           (png_int_32)info_ptr->x_pixels_per_unit) != 0)
233*a67afe4dSAndroid Build Coastguard Worker          return res;
234*a67afe4dSAndroid Build Coastguard Worker    }
235*a67afe4dSAndroid Build Coastguard Worker #else
236*a67afe4dSAndroid Build Coastguard Worker    PNG_UNUSED(png_ptr)
237*a67afe4dSAndroid Build Coastguard Worker    PNG_UNUSED(info_ptr)
238*a67afe4dSAndroid Build Coastguard Worker #endif
239*a67afe4dSAndroid Build Coastguard Worker 
240*a67afe4dSAndroid Build Coastguard Worker    return 0;
241*a67afe4dSAndroid Build Coastguard Worker }
242*a67afe4dSAndroid Build Coastguard Worker #endif
243*a67afe4dSAndroid Build Coastguard Worker 
244*a67afe4dSAndroid Build Coastguard Worker png_int_32 PNGAPI
png_get_x_offset_microns(png_const_structrp png_ptr,png_const_inforp info_ptr)245*a67afe4dSAndroid Build Coastguard Worker png_get_x_offset_microns(png_const_structrp png_ptr, png_const_inforp info_ptr)
246*a67afe4dSAndroid Build Coastguard Worker {
247*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_oFFs_SUPPORTED
248*a67afe4dSAndroid Build Coastguard Worker    png_debug(1, "in png_get_x_offset_microns");
249*a67afe4dSAndroid Build Coastguard Worker 
250*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
251*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->valid & PNG_INFO_oFFs) != 0)
252*a67afe4dSAndroid Build Coastguard Worker    {
253*a67afe4dSAndroid Build Coastguard Worker       if (info_ptr->offset_unit_type == PNG_OFFSET_MICROMETER)
254*a67afe4dSAndroid Build Coastguard Worker          return info_ptr->x_offset;
255*a67afe4dSAndroid Build Coastguard Worker    }
256*a67afe4dSAndroid Build Coastguard Worker #else
257*a67afe4dSAndroid Build Coastguard Worker    PNG_UNUSED(png_ptr)
258*a67afe4dSAndroid Build Coastguard Worker    PNG_UNUSED(info_ptr)
259*a67afe4dSAndroid Build Coastguard Worker #endif
260*a67afe4dSAndroid Build Coastguard Worker 
261*a67afe4dSAndroid Build Coastguard Worker    return 0;
262*a67afe4dSAndroid Build Coastguard Worker }
263*a67afe4dSAndroid Build Coastguard Worker 
264*a67afe4dSAndroid Build Coastguard Worker png_int_32 PNGAPI
png_get_y_offset_microns(png_const_structrp png_ptr,png_const_inforp info_ptr)265*a67afe4dSAndroid Build Coastguard Worker png_get_y_offset_microns(png_const_structrp png_ptr, png_const_inforp info_ptr)
266*a67afe4dSAndroid Build Coastguard Worker {
267*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_oFFs_SUPPORTED
268*a67afe4dSAndroid Build Coastguard Worker    png_debug(1, "in png_get_y_offset_microns");
269*a67afe4dSAndroid Build Coastguard Worker 
270*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
271*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->valid & PNG_INFO_oFFs) != 0)
272*a67afe4dSAndroid Build Coastguard Worker    {
273*a67afe4dSAndroid Build Coastguard Worker       if (info_ptr->offset_unit_type == PNG_OFFSET_MICROMETER)
274*a67afe4dSAndroid Build Coastguard Worker          return info_ptr->y_offset;
275*a67afe4dSAndroid Build Coastguard Worker    }
276*a67afe4dSAndroid Build Coastguard Worker #else
277*a67afe4dSAndroid Build Coastguard Worker    PNG_UNUSED(png_ptr)
278*a67afe4dSAndroid Build Coastguard Worker    PNG_UNUSED(info_ptr)
279*a67afe4dSAndroid Build Coastguard Worker #endif
280*a67afe4dSAndroid Build Coastguard Worker 
281*a67afe4dSAndroid Build Coastguard Worker    return 0;
282*a67afe4dSAndroid Build Coastguard Worker }
283*a67afe4dSAndroid Build Coastguard Worker 
284*a67afe4dSAndroid Build Coastguard Worker png_int_32 PNGAPI
png_get_x_offset_pixels(png_const_structrp png_ptr,png_const_inforp info_ptr)285*a67afe4dSAndroid Build Coastguard Worker png_get_x_offset_pixels(png_const_structrp png_ptr, png_const_inforp info_ptr)
286*a67afe4dSAndroid Build Coastguard Worker {
287*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_oFFs_SUPPORTED
288*a67afe4dSAndroid Build Coastguard Worker    png_debug(1, "in png_get_x_offset_pixels");
289*a67afe4dSAndroid Build Coastguard Worker 
290*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
291*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->valid & PNG_INFO_oFFs) != 0)
292*a67afe4dSAndroid Build Coastguard Worker    {
293*a67afe4dSAndroid Build Coastguard Worker       if (info_ptr->offset_unit_type == PNG_OFFSET_PIXEL)
294*a67afe4dSAndroid Build Coastguard Worker          return info_ptr->x_offset;
295*a67afe4dSAndroid Build Coastguard Worker    }
296*a67afe4dSAndroid Build Coastguard Worker #else
297*a67afe4dSAndroid Build Coastguard Worker    PNG_UNUSED(png_ptr)
298*a67afe4dSAndroid Build Coastguard Worker    PNG_UNUSED(info_ptr)
299*a67afe4dSAndroid Build Coastguard Worker #endif
300*a67afe4dSAndroid Build Coastguard Worker 
301*a67afe4dSAndroid Build Coastguard Worker    return 0;
302*a67afe4dSAndroid Build Coastguard Worker }
303*a67afe4dSAndroid Build Coastguard Worker 
304*a67afe4dSAndroid Build Coastguard Worker png_int_32 PNGAPI
png_get_y_offset_pixels(png_const_structrp png_ptr,png_const_inforp info_ptr)305*a67afe4dSAndroid Build Coastguard Worker png_get_y_offset_pixels(png_const_structrp png_ptr, png_const_inforp info_ptr)
306*a67afe4dSAndroid Build Coastguard Worker {
307*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_oFFs_SUPPORTED
308*a67afe4dSAndroid Build Coastguard Worker    png_debug(1, "in png_get_y_offset_pixels");
309*a67afe4dSAndroid Build Coastguard Worker 
310*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
311*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->valid & PNG_INFO_oFFs) != 0)
312*a67afe4dSAndroid Build Coastguard Worker    {
313*a67afe4dSAndroid Build Coastguard Worker       if (info_ptr->offset_unit_type == PNG_OFFSET_PIXEL)
314*a67afe4dSAndroid Build Coastguard Worker          return info_ptr->y_offset;
315*a67afe4dSAndroid Build Coastguard Worker    }
316*a67afe4dSAndroid Build Coastguard Worker #else
317*a67afe4dSAndroid Build Coastguard Worker    PNG_UNUSED(png_ptr)
318*a67afe4dSAndroid Build Coastguard Worker    PNG_UNUSED(info_ptr)
319*a67afe4dSAndroid Build Coastguard Worker #endif
320*a67afe4dSAndroid Build Coastguard Worker 
321*a67afe4dSAndroid Build Coastguard Worker    return 0;
322*a67afe4dSAndroid Build Coastguard Worker }
323*a67afe4dSAndroid Build Coastguard Worker 
324*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_INCH_CONVERSIONS_SUPPORTED
325*a67afe4dSAndroid Build Coastguard Worker static png_uint_32
ppi_from_ppm(png_uint_32 ppm)326*a67afe4dSAndroid Build Coastguard Worker ppi_from_ppm(png_uint_32 ppm)
327*a67afe4dSAndroid Build Coastguard Worker {
328*a67afe4dSAndroid Build Coastguard Worker #if 0
329*a67afe4dSAndroid Build Coastguard Worker    /* The conversion is *(2.54/100), in binary (32 digits):
330*a67afe4dSAndroid Build Coastguard Worker     * .00000110100000001001110101001001
331*a67afe4dSAndroid Build Coastguard Worker     */
332*a67afe4dSAndroid Build Coastguard Worker    png_uint_32 t1001, t1101;
333*a67afe4dSAndroid Build Coastguard Worker    ppm >>= 1;                  /* .1 */
334*a67afe4dSAndroid Build Coastguard Worker    t1001 = ppm + (ppm >> 3);   /* .1001 */
335*a67afe4dSAndroid Build Coastguard Worker    t1101 = t1001 + (ppm >> 1); /* .1101 */
336*a67afe4dSAndroid Build Coastguard Worker    ppm >>= 20;                 /* .000000000000000000001 */
337*a67afe4dSAndroid Build Coastguard Worker    t1101 += t1101 >> 15;       /* .1101000000000001101 */
338*a67afe4dSAndroid Build Coastguard Worker    t1001 >>= 11;               /* .000000000001001 */
339*a67afe4dSAndroid Build Coastguard Worker    t1001 += t1001 >> 12;       /* .000000000001001000000001001 */
340*a67afe4dSAndroid Build Coastguard Worker    ppm += t1001;               /* .000000000001001000001001001 */
341*a67afe4dSAndroid Build Coastguard Worker    ppm += t1101;               /* .110100000001001110101001001 */
342*a67afe4dSAndroid Build Coastguard Worker    return (ppm + 16) >> 5;/* .00000110100000001001110101001001 */
343*a67afe4dSAndroid Build Coastguard Worker #else
344*a67afe4dSAndroid Build Coastguard Worker    /* The argument is a PNG unsigned integer, so it is not permitted
345*a67afe4dSAndroid Build Coastguard Worker     * to be bigger than 2^31.
346*a67afe4dSAndroid Build Coastguard Worker     */
347*a67afe4dSAndroid Build Coastguard Worker    png_fixed_point result;
348*a67afe4dSAndroid Build Coastguard Worker    if (ppm <= PNG_UINT_31_MAX && png_muldiv(&result, (png_int_32)ppm, 127,
349*a67afe4dSAndroid Build Coastguard Worker        5000) != 0)
350*a67afe4dSAndroid Build Coastguard Worker       return (png_uint_32)result;
351*a67afe4dSAndroid Build Coastguard Worker 
352*a67afe4dSAndroid Build Coastguard Worker    /* Overflow. */
353*a67afe4dSAndroid Build Coastguard Worker    return 0;
354*a67afe4dSAndroid Build Coastguard Worker #endif
355*a67afe4dSAndroid Build Coastguard Worker }
356*a67afe4dSAndroid Build Coastguard Worker 
357*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_pixels_per_inch(png_const_structrp png_ptr,png_const_inforp info_ptr)358*a67afe4dSAndroid Build Coastguard Worker png_get_pixels_per_inch(png_const_structrp png_ptr, png_const_inforp info_ptr)
359*a67afe4dSAndroid Build Coastguard Worker {
360*a67afe4dSAndroid Build Coastguard Worker    return ppi_from_ppm(png_get_pixels_per_meter(png_ptr, info_ptr));
361*a67afe4dSAndroid Build Coastguard Worker }
362*a67afe4dSAndroid Build Coastguard Worker 
363*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_x_pixels_per_inch(png_const_structrp png_ptr,png_const_inforp info_ptr)364*a67afe4dSAndroid Build Coastguard Worker png_get_x_pixels_per_inch(png_const_structrp png_ptr, png_const_inforp info_ptr)
365*a67afe4dSAndroid Build Coastguard Worker {
366*a67afe4dSAndroid Build Coastguard Worker    return ppi_from_ppm(png_get_x_pixels_per_meter(png_ptr, info_ptr));
367*a67afe4dSAndroid Build Coastguard Worker }
368*a67afe4dSAndroid Build Coastguard Worker 
369*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_y_pixels_per_inch(png_const_structrp png_ptr,png_const_inforp info_ptr)370*a67afe4dSAndroid Build Coastguard Worker png_get_y_pixels_per_inch(png_const_structrp png_ptr, png_const_inforp info_ptr)
371*a67afe4dSAndroid Build Coastguard Worker {
372*a67afe4dSAndroid Build Coastguard Worker    return ppi_from_ppm(png_get_y_pixels_per_meter(png_ptr, info_ptr));
373*a67afe4dSAndroid Build Coastguard Worker }
374*a67afe4dSAndroid Build Coastguard Worker 
375*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_FIXED_POINT_SUPPORTED
376*a67afe4dSAndroid Build Coastguard Worker static png_fixed_point
png_fixed_inches_from_microns(png_const_structrp png_ptr,png_int_32 microns)377*a67afe4dSAndroid Build Coastguard Worker png_fixed_inches_from_microns(png_const_structrp png_ptr, png_int_32 microns)
378*a67afe4dSAndroid Build Coastguard Worker {
379*a67afe4dSAndroid Build Coastguard Worker    /* Convert from meters * 1,000,000 to inches * 100,000, meters to
380*a67afe4dSAndroid Build Coastguard Worker     * inches is simply *(100/2.54), so we want *(10/2.54) == 500/127.
381*a67afe4dSAndroid Build Coastguard Worker     * Notice that this can overflow - a warning is output and 0 is
382*a67afe4dSAndroid Build Coastguard Worker     * returned.
383*a67afe4dSAndroid Build Coastguard Worker     */
384*a67afe4dSAndroid Build Coastguard Worker    return png_muldiv_warn(png_ptr, microns, 500, 127);
385*a67afe4dSAndroid Build Coastguard Worker }
386*a67afe4dSAndroid Build Coastguard Worker 
387*a67afe4dSAndroid Build Coastguard Worker png_fixed_point PNGAPI
png_get_x_offset_inches_fixed(png_const_structrp png_ptr,png_const_inforp info_ptr)388*a67afe4dSAndroid Build Coastguard Worker png_get_x_offset_inches_fixed(png_const_structrp png_ptr,
389*a67afe4dSAndroid Build Coastguard Worker     png_const_inforp info_ptr)
390*a67afe4dSAndroid Build Coastguard Worker {
391*a67afe4dSAndroid Build Coastguard Worker    return png_fixed_inches_from_microns(png_ptr,
392*a67afe4dSAndroid Build Coastguard Worker        png_get_x_offset_microns(png_ptr, info_ptr));
393*a67afe4dSAndroid Build Coastguard Worker }
394*a67afe4dSAndroid Build Coastguard Worker #endif
395*a67afe4dSAndroid Build Coastguard Worker 
396*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_FIXED_POINT_SUPPORTED
397*a67afe4dSAndroid Build Coastguard Worker png_fixed_point PNGAPI
png_get_y_offset_inches_fixed(png_const_structrp png_ptr,png_const_inforp info_ptr)398*a67afe4dSAndroid Build Coastguard Worker png_get_y_offset_inches_fixed(png_const_structrp png_ptr,
399*a67afe4dSAndroid Build Coastguard Worker     png_const_inforp info_ptr)
400*a67afe4dSAndroid Build Coastguard Worker {
401*a67afe4dSAndroid Build Coastguard Worker    return png_fixed_inches_from_microns(png_ptr,
402*a67afe4dSAndroid Build Coastguard Worker        png_get_y_offset_microns(png_ptr, info_ptr));
403*a67afe4dSAndroid Build Coastguard Worker }
404*a67afe4dSAndroid Build Coastguard Worker #endif
405*a67afe4dSAndroid Build Coastguard Worker 
406*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_FLOATING_POINT_SUPPORTED
407*a67afe4dSAndroid Build Coastguard Worker float PNGAPI
png_get_x_offset_inches(png_const_structrp png_ptr,png_const_inforp info_ptr)408*a67afe4dSAndroid Build Coastguard Worker png_get_x_offset_inches(png_const_structrp png_ptr, png_const_inforp info_ptr)
409*a67afe4dSAndroid Build Coastguard Worker {
410*a67afe4dSAndroid Build Coastguard Worker    /* To avoid the overflow do the conversion directly in floating
411*a67afe4dSAndroid Build Coastguard Worker     * point.
412*a67afe4dSAndroid Build Coastguard Worker     */
413*a67afe4dSAndroid Build Coastguard Worker    return (float)(png_get_x_offset_microns(png_ptr, info_ptr) * .00003937);
414*a67afe4dSAndroid Build Coastguard Worker }
415*a67afe4dSAndroid Build Coastguard Worker #endif
416*a67afe4dSAndroid Build Coastguard Worker 
417*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_FLOATING_POINT_SUPPORTED
418*a67afe4dSAndroid Build Coastguard Worker float PNGAPI
png_get_y_offset_inches(png_const_structrp png_ptr,png_const_inforp info_ptr)419*a67afe4dSAndroid Build Coastguard Worker png_get_y_offset_inches(png_const_structrp png_ptr, png_const_inforp info_ptr)
420*a67afe4dSAndroid Build Coastguard Worker {
421*a67afe4dSAndroid Build Coastguard Worker    /* To avoid the overflow do the conversion directly in floating
422*a67afe4dSAndroid Build Coastguard Worker     * point.
423*a67afe4dSAndroid Build Coastguard Worker     */
424*a67afe4dSAndroid Build Coastguard Worker    return (float)(png_get_y_offset_microns(png_ptr, info_ptr) * .00003937);
425*a67afe4dSAndroid Build Coastguard Worker }
426*a67afe4dSAndroid Build Coastguard Worker #endif
427*a67afe4dSAndroid Build Coastguard Worker 
428*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_pHYs_SUPPORTED
429*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_pHYs_dpi(png_const_structrp png_ptr,png_const_inforp info_ptr,png_uint_32 * res_x,png_uint_32 * res_y,int * unit_type)430*a67afe4dSAndroid Build Coastguard Worker png_get_pHYs_dpi(png_const_structrp png_ptr, png_const_inforp info_ptr,
431*a67afe4dSAndroid Build Coastguard Worker     png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)
432*a67afe4dSAndroid Build Coastguard Worker {
433*a67afe4dSAndroid Build Coastguard Worker    png_uint_32 retval = 0;
434*a67afe4dSAndroid Build Coastguard Worker 
435*a67afe4dSAndroid Build Coastguard Worker    png_debug1(1, "in %s retrieval function", "pHYs");
436*a67afe4dSAndroid Build Coastguard Worker 
437*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
438*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->valid & PNG_INFO_pHYs) != 0)
439*a67afe4dSAndroid Build Coastguard Worker    {
440*a67afe4dSAndroid Build Coastguard Worker       if (res_x != NULL)
441*a67afe4dSAndroid Build Coastguard Worker       {
442*a67afe4dSAndroid Build Coastguard Worker          *res_x = info_ptr->x_pixels_per_unit;
443*a67afe4dSAndroid Build Coastguard Worker          retval |= PNG_INFO_pHYs;
444*a67afe4dSAndroid Build Coastguard Worker       }
445*a67afe4dSAndroid Build Coastguard Worker 
446*a67afe4dSAndroid Build Coastguard Worker       if (res_y != NULL)
447*a67afe4dSAndroid Build Coastguard Worker       {
448*a67afe4dSAndroid Build Coastguard Worker          *res_y = info_ptr->y_pixels_per_unit;
449*a67afe4dSAndroid Build Coastguard Worker          retval |= PNG_INFO_pHYs;
450*a67afe4dSAndroid Build Coastguard Worker       }
451*a67afe4dSAndroid Build Coastguard Worker 
452*a67afe4dSAndroid Build Coastguard Worker       if (unit_type != NULL)
453*a67afe4dSAndroid Build Coastguard Worker       {
454*a67afe4dSAndroid Build Coastguard Worker          *unit_type = (int)info_ptr->phys_unit_type;
455*a67afe4dSAndroid Build Coastguard Worker          retval |= PNG_INFO_pHYs;
456*a67afe4dSAndroid Build Coastguard Worker 
457*a67afe4dSAndroid Build Coastguard Worker          if (*unit_type == 1)
458*a67afe4dSAndroid Build Coastguard Worker          {
459*a67afe4dSAndroid Build Coastguard Worker             if (res_x != NULL) *res_x = (png_uint_32)(*res_x * .0254 + .50);
460*a67afe4dSAndroid Build Coastguard Worker             if (res_y != NULL) *res_y = (png_uint_32)(*res_y * .0254 + .50);
461*a67afe4dSAndroid Build Coastguard Worker          }
462*a67afe4dSAndroid Build Coastguard Worker       }
463*a67afe4dSAndroid Build Coastguard Worker    }
464*a67afe4dSAndroid Build Coastguard Worker 
465*a67afe4dSAndroid Build Coastguard Worker    return retval;
466*a67afe4dSAndroid Build Coastguard Worker }
467*a67afe4dSAndroid Build Coastguard Worker #endif /* pHYs */
468*a67afe4dSAndroid Build Coastguard Worker #endif /* INCH_CONVERSIONS */
469*a67afe4dSAndroid Build Coastguard Worker 
470*a67afe4dSAndroid Build Coastguard Worker /* png_get_channels really belongs in here, too, but it's been around longer */
471*a67afe4dSAndroid Build Coastguard Worker 
472*a67afe4dSAndroid Build Coastguard Worker #endif /* EASY_ACCESS */
473*a67afe4dSAndroid Build Coastguard Worker 
474*a67afe4dSAndroid Build Coastguard Worker 
475*a67afe4dSAndroid Build Coastguard Worker png_byte PNGAPI
png_get_channels(png_const_structrp png_ptr,png_const_inforp info_ptr)476*a67afe4dSAndroid Build Coastguard Worker png_get_channels(png_const_structrp png_ptr, png_const_inforp info_ptr)
477*a67afe4dSAndroid Build Coastguard Worker {
478*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL)
479*a67afe4dSAndroid Build Coastguard Worker       return info_ptr->channels;
480*a67afe4dSAndroid Build Coastguard Worker 
481*a67afe4dSAndroid Build Coastguard Worker    return 0;
482*a67afe4dSAndroid Build Coastguard Worker }
483*a67afe4dSAndroid Build Coastguard Worker 
484*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_READ_SUPPORTED
485*a67afe4dSAndroid Build Coastguard Worker png_const_bytep PNGAPI
png_get_signature(png_const_structrp png_ptr,png_const_inforp info_ptr)486*a67afe4dSAndroid Build Coastguard Worker png_get_signature(png_const_structrp png_ptr, png_const_inforp info_ptr)
487*a67afe4dSAndroid Build Coastguard Worker {
488*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL)
489*a67afe4dSAndroid Build Coastguard Worker       return info_ptr->signature;
490*a67afe4dSAndroid Build Coastguard Worker 
491*a67afe4dSAndroid Build Coastguard Worker    return NULL;
492*a67afe4dSAndroid Build Coastguard Worker }
493*a67afe4dSAndroid Build Coastguard Worker #endif
494*a67afe4dSAndroid Build Coastguard Worker 
495*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_bKGD_SUPPORTED
496*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_bKGD(png_const_structrp png_ptr,png_inforp info_ptr,png_color_16p * background)497*a67afe4dSAndroid Build Coastguard Worker png_get_bKGD(png_const_structrp png_ptr, png_inforp info_ptr,
498*a67afe4dSAndroid Build Coastguard Worker     png_color_16p *background)
499*a67afe4dSAndroid Build Coastguard Worker {
500*a67afe4dSAndroid Build Coastguard Worker    png_debug1(1, "in %s retrieval function", "bKGD");
501*a67afe4dSAndroid Build Coastguard Worker 
502*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
503*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->valid & PNG_INFO_bKGD) != 0 &&
504*a67afe4dSAndroid Build Coastguard Worker        background != NULL)
505*a67afe4dSAndroid Build Coastguard Worker    {
506*a67afe4dSAndroid Build Coastguard Worker       *background = &(info_ptr->background);
507*a67afe4dSAndroid Build Coastguard Worker       return PNG_INFO_bKGD;
508*a67afe4dSAndroid Build Coastguard Worker    }
509*a67afe4dSAndroid Build Coastguard Worker 
510*a67afe4dSAndroid Build Coastguard Worker    return 0;
511*a67afe4dSAndroid Build Coastguard Worker }
512*a67afe4dSAndroid Build Coastguard Worker #endif
513*a67afe4dSAndroid Build Coastguard Worker 
514*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_cHRM_SUPPORTED
515*a67afe4dSAndroid Build Coastguard Worker /* The XYZ APIs were added in 1.5.5 to take advantage of the code added at the
516*a67afe4dSAndroid Build Coastguard Worker  * same time to correct the rgb grayscale coefficient defaults obtained from the
517*a67afe4dSAndroid Build Coastguard Worker  * cHRM chunk in 1.5.4
518*a67afe4dSAndroid Build Coastguard Worker  */
519*a67afe4dSAndroid Build Coastguard Worker #  ifdef PNG_FLOATING_POINT_SUPPORTED
520*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_cHRM(png_const_structrp png_ptr,png_const_inforp info_ptr,double * white_x,double * white_y,double * red_x,double * red_y,double * green_x,double * green_y,double * blue_x,double * blue_y)521*a67afe4dSAndroid Build Coastguard Worker png_get_cHRM(png_const_structrp png_ptr, png_const_inforp info_ptr,
522*a67afe4dSAndroid Build Coastguard Worker     double *white_x, double *white_y, double *red_x, double *red_y,
523*a67afe4dSAndroid Build Coastguard Worker     double *green_x, double *green_y, double *blue_x, double *blue_y)
524*a67afe4dSAndroid Build Coastguard Worker {
525*a67afe4dSAndroid Build Coastguard Worker    png_debug1(1, "in %s retrieval function", "cHRM");
526*a67afe4dSAndroid Build Coastguard Worker 
527*a67afe4dSAndroid Build Coastguard Worker    /* Quiet API change: this code used to only return the end points if a cHRM
528*a67afe4dSAndroid Build Coastguard Worker     * chunk was present, but the end points can also come from iCCP or sRGB
529*a67afe4dSAndroid Build Coastguard Worker     * chunks, so in 1.6.0 the png_get_ APIs return the end points regardless and
530*a67afe4dSAndroid Build Coastguard Worker     * the png_set_ APIs merely check that set end points are mutually
531*a67afe4dSAndroid Build Coastguard Worker     * consistent.
532*a67afe4dSAndroid Build Coastguard Worker     */
533*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
534*a67afe4dSAndroid Build Coastguard Worker       (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
535*a67afe4dSAndroid Build Coastguard Worker    {
536*a67afe4dSAndroid Build Coastguard Worker       if (white_x != NULL)
537*a67afe4dSAndroid Build Coastguard Worker          *white_x = png_float(png_ptr,
538*a67afe4dSAndroid Build Coastguard Worker              info_ptr->colorspace.end_points_xy.whitex, "cHRM white X");
539*a67afe4dSAndroid Build Coastguard Worker       if (white_y != NULL)
540*a67afe4dSAndroid Build Coastguard Worker          *white_y = png_float(png_ptr,
541*a67afe4dSAndroid Build Coastguard Worker              info_ptr->colorspace.end_points_xy.whitey, "cHRM white Y");
542*a67afe4dSAndroid Build Coastguard Worker       if (red_x != NULL)
543*a67afe4dSAndroid Build Coastguard Worker          *red_x = png_float(png_ptr, info_ptr->colorspace.end_points_xy.redx,
544*a67afe4dSAndroid Build Coastguard Worker              "cHRM red X");
545*a67afe4dSAndroid Build Coastguard Worker       if (red_y != NULL)
546*a67afe4dSAndroid Build Coastguard Worker          *red_y = png_float(png_ptr, info_ptr->colorspace.end_points_xy.redy,
547*a67afe4dSAndroid Build Coastguard Worker              "cHRM red Y");
548*a67afe4dSAndroid Build Coastguard Worker       if (green_x != NULL)
549*a67afe4dSAndroid Build Coastguard Worker          *green_x = png_float(png_ptr,
550*a67afe4dSAndroid Build Coastguard Worker              info_ptr->colorspace.end_points_xy.greenx, "cHRM green X");
551*a67afe4dSAndroid Build Coastguard Worker       if (green_y != NULL)
552*a67afe4dSAndroid Build Coastguard Worker          *green_y = png_float(png_ptr,
553*a67afe4dSAndroid Build Coastguard Worker              info_ptr->colorspace.end_points_xy.greeny, "cHRM green Y");
554*a67afe4dSAndroid Build Coastguard Worker       if (blue_x != NULL)
555*a67afe4dSAndroid Build Coastguard Worker          *blue_x = png_float(png_ptr, info_ptr->colorspace.end_points_xy.bluex,
556*a67afe4dSAndroid Build Coastguard Worker              "cHRM blue X");
557*a67afe4dSAndroid Build Coastguard Worker       if (blue_y != NULL)
558*a67afe4dSAndroid Build Coastguard Worker          *blue_y = png_float(png_ptr, info_ptr->colorspace.end_points_xy.bluey,
559*a67afe4dSAndroid Build Coastguard Worker              "cHRM blue Y");
560*a67afe4dSAndroid Build Coastguard Worker       return PNG_INFO_cHRM;
561*a67afe4dSAndroid Build Coastguard Worker    }
562*a67afe4dSAndroid Build Coastguard Worker 
563*a67afe4dSAndroid Build Coastguard Worker    return 0;
564*a67afe4dSAndroid Build Coastguard Worker }
565*a67afe4dSAndroid Build Coastguard Worker 
566*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_cHRM_XYZ(png_const_structrp png_ptr,png_const_inforp info_ptr,double * red_X,double * red_Y,double * red_Z,double * green_X,double * green_Y,double * green_Z,double * blue_X,double * blue_Y,double * blue_Z)567*a67afe4dSAndroid Build Coastguard Worker png_get_cHRM_XYZ(png_const_structrp png_ptr, png_const_inforp info_ptr,
568*a67afe4dSAndroid Build Coastguard Worker     double *red_X, double *red_Y, double *red_Z, double *green_X,
569*a67afe4dSAndroid Build Coastguard Worker     double *green_Y, double *green_Z, double *blue_X, double *blue_Y,
570*a67afe4dSAndroid Build Coastguard Worker     double *blue_Z)
571*a67afe4dSAndroid Build Coastguard Worker {
572*a67afe4dSAndroid Build Coastguard Worker    png_debug1(1, "in %s retrieval function", "cHRM_XYZ(float)");
573*a67afe4dSAndroid Build Coastguard Worker 
574*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
575*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
576*a67afe4dSAndroid Build Coastguard Worker    {
577*a67afe4dSAndroid Build Coastguard Worker       if (red_X != NULL)
578*a67afe4dSAndroid Build Coastguard Worker          *red_X = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_X,
579*a67afe4dSAndroid Build Coastguard Worker              "cHRM red X");
580*a67afe4dSAndroid Build Coastguard Worker       if (red_Y != NULL)
581*a67afe4dSAndroid Build Coastguard Worker          *red_Y = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_Y,
582*a67afe4dSAndroid Build Coastguard Worker              "cHRM red Y");
583*a67afe4dSAndroid Build Coastguard Worker       if (red_Z != NULL)
584*a67afe4dSAndroid Build Coastguard Worker          *red_Z = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_Z,
585*a67afe4dSAndroid Build Coastguard Worker              "cHRM red Z");
586*a67afe4dSAndroid Build Coastguard Worker       if (green_X != NULL)
587*a67afe4dSAndroid Build Coastguard Worker          *green_X = png_float(png_ptr,
588*a67afe4dSAndroid Build Coastguard Worker              info_ptr->colorspace.end_points_XYZ.green_X, "cHRM green X");
589*a67afe4dSAndroid Build Coastguard Worker       if (green_Y != NULL)
590*a67afe4dSAndroid Build Coastguard Worker          *green_Y = png_float(png_ptr,
591*a67afe4dSAndroid Build Coastguard Worker              info_ptr->colorspace.end_points_XYZ.green_Y, "cHRM green Y");
592*a67afe4dSAndroid Build Coastguard Worker       if (green_Z != NULL)
593*a67afe4dSAndroid Build Coastguard Worker          *green_Z = png_float(png_ptr,
594*a67afe4dSAndroid Build Coastguard Worker              info_ptr->colorspace.end_points_XYZ.green_Z, "cHRM green Z");
595*a67afe4dSAndroid Build Coastguard Worker       if (blue_X != NULL)
596*a67afe4dSAndroid Build Coastguard Worker          *blue_X = png_float(png_ptr,
597*a67afe4dSAndroid Build Coastguard Worker              info_ptr->colorspace.end_points_XYZ.blue_X, "cHRM blue X");
598*a67afe4dSAndroid Build Coastguard Worker       if (blue_Y != NULL)
599*a67afe4dSAndroid Build Coastguard Worker          *blue_Y = png_float(png_ptr,
600*a67afe4dSAndroid Build Coastguard Worker              info_ptr->colorspace.end_points_XYZ.blue_Y, "cHRM blue Y");
601*a67afe4dSAndroid Build Coastguard Worker       if (blue_Z != NULL)
602*a67afe4dSAndroid Build Coastguard Worker          *blue_Z = png_float(png_ptr,
603*a67afe4dSAndroid Build Coastguard Worker              info_ptr->colorspace.end_points_XYZ.blue_Z, "cHRM blue Z");
604*a67afe4dSAndroid Build Coastguard Worker       return PNG_INFO_cHRM;
605*a67afe4dSAndroid Build Coastguard Worker    }
606*a67afe4dSAndroid Build Coastguard Worker 
607*a67afe4dSAndroid Build Coastguard Worker    return 0;
608*a67afe4dSAndroid Build Coastguard Worker }
609*a67afe4dSAndroid Build Coastguard Worker #  endif
610*a67afe4dSAndroid Build Coastguard Worker 
611*a67afe4dSAndroid Build Coastguard Worker #  ifdef PNG_FIXED_POINT_SUPPORTED
612*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_cHRM_XYZ_fixed(png_const_structrp png_ptr,png_const_inforp info_ptr,png_fixed_point * int_red_X,png_fixed_point * int_red_Y,png_fixed_point * int_red_Z,png_fixed_point * int_green_X,png_fixed_point * int_green_Y,png_fixed_point * int_green_Z,png_fixed_point * int_blue_X,png_fixed_point * int_blue_Y,png_fixed_point * int_blue_Z)613*a67afe4dSAndroid Build Coastguard Worker png_get_cHRM_XYZ_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,
614*a67afe4dSAndroid Build Coastguard Worker     png_fixed_point *int_red_X, png_fixed_point *int_red_Y,
615*a67afe4dSAndroid Build Coastguard Worker     png_fixed_point *int_red_Z, png_fixed_point *int_green_X,
616*a67afe4dSAndroid Build Coastguard Worker     png_fixed_point *int_green_Y, png_fixed_point *int_green_Z,
617*a67afe4dSAndroid Build Coastguard Worker     png_fixed_point *int_blue_X, png_fixed_point *int_blue_Y,
618*a67afe4dSAndroid Build Coastguard Worker     png_fixed_point *int_blue_Z)
619*a67afe4dSAndroid Build Coastguard Worker {
620*a67afe4dSAndroid Build Coastguard Worker    png_debug1(1, "in %s retrieval function", "cHRM_XYZ");
621*a67afe4dSAndroid Build Coastguard Worker 
622*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
623*a67afe4dSAndroid Build Coastguard Worker       (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
624*a67afe4dSAndroid Build Coastguard Worker    {
625*a67afe4dSAndroid Build Coastguard Worker       if (int_red_X != NULL)
626*a67afe4dSAndroid Build Coastguard Worker          *int_red_X = info_ptr->colorspace.end_points_XYZ.red_X;
627*a67afe4dSAndroid Build Coastguard Worker       if (int_red_Y != NULL)
628*a67afe4dSAndroid Build Coastguard Worker          *int_red_Y = info_ptr->colorspace.end_points_XYZ.red_Y;
629*a67afe4dSAndroid Build Coastguard Worker       if (int_red_Z != NULL)
630*a67afe4dSAndroid Build Coastguard Worker          *int_red_Z = info_ptr->colorspace.end_points_XYZ.red_Z;
631*a67afe4dSAndroid Build Coastguard Worker       if (int_green_X != NULL)
632*a67afe4dSAndroid Build Coastguard Worker          *int_green_X = info_ptr->colorspace.end_points_XYZ.green_X;
633*a67afe4dSAndroid Build Coastguard Worker       if (int_green_Y != NULL)
634*a67afe4dSAndroid Build Coastguard Worker          *int_green_Y = info_ptr->colorspace.end_points_XYZ.green_Y;
635*a67afe4dSAndroid Build Coastguard Worker       if (int_green_Z != NULL)
636*a67afe4dSAndroid Build Coastguard Worker          *int_green_Z = info_ptr->colorspace.end_points_XYZ.green_Z;
637*a67afe4dSAndroid Build Coastguard Worker       if (int_blue_X != NULL)
638*a67afe4dSAndroid Build Coastguard Worker          *int_blue_X = info_ptr->colorspace.end_points_XYZ.blue_X;
639*a67afe4dSAndroid Build Coastguard Worker       if (int_blue_Y != NULL)
640*a67afe4dSAndroid Build Coastguard Worker          *int_blue_Y = info_ptr->colorspace.end_points_XYZ.blue_Y;
641*a67afe4dSAndroid Build Coastguard Worker       if (int_blue_Z != NULL)
642*a67afe4dSAndroid Build Coastguard Worker          *int_blue_Z = info_ptr->colorspace.end_points_XYZ.blue_Z;
643*a67afe4dSAndroid Build Coastguard Worker       return PNG_INFO_cHRM;
644*a67afe4dSAndroid Build Coastguard Worker    }
645*a67afe4dSAndroid Build Coastguard Worker 
646*a67afe4dSAndroid Build Coastguard Worker    return 0;
647*a67afe4dSAndroid Build Coastguard Worker }
648*a67afe4dSAndroid Build Coastguard Worker 
649*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_cHRM_fixed(png_const_structrp png_ptr,png_const_inforp info_ptr,png_fixed_point * white_x,png_fixed_point * white_y,png_fixed_point * red_x,png_fixed_point * red_y,png_fixed_point * green_x,png_fixed_point * green_y,png_fixed_point * blue_x,png_fixed_point * blue_y)650*a67afe4dSAndroid Build Coastguard Worker png_get_cHRM_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,
651*a67afe4dSAndroid Build Coastguard Worker     png_fixed_point *white_x, png_fixed_point *white_y, png_fixed_point *red_x,
652*a67afe4dSAndroid Build Coastguard Worker     png_fixed_point *red_y, png_fixed_point *green_x, png_fixed_point *green_y,
653*a67afe4dSAndroid Build Coastguard Worker     png_fixed_point *blue_x, png_fixed_point *blue_y)
654*a67afe4dSAndroid Build Coastguard Worker {
655*a67afe4dSAndroid Build Coastguard Worker    png_debug1(1, "in %s retrieval function", "cHRM");
656*a67afe4dSAndroid Build Coastguard Worker 
657*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
658*a67afe4dSAndroid Build Coastguard Worker       (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
659*a67afe4dSAndroid Build Coastguard Worker    {
660*a67afe4dSAndroid Build Coastguard Worker       if (white_x != NULL)
661*a67afe4dSAndroid Build Coastguard Worker          *white_x = info_ptr->colorspace.end_points_xy.whitex;
662*a67afe4dSAndroid Build Coastguard Worker       if (white_y != NULL)
663*a67afe4dSAndroid Build Coastguard Worker          *white_y = info_ptr->colorspace.end_points_xy.whitey;
664*a67afe4dSAndroid Build Coastguard Worker       if (red_x != NULL)
665*a67afe4dSAndroid Build Coastguard Worker          *red_x = info_ptr->colorspace.end_points_xy.redx;
666*a67afe4dSAndroid Build Coastguard Worker       if (red_y != NULL)
667*a67afe4dSAndroid Build Coastguard Worker          *red_y = info_ptr->colorspace.end_points_xy.redy;
668*a67afe4dSAndroid Build Coastguard Worker       if (green_x != NULL)
669*a67afe4dSAndroid Build Coastguard Worker          *green_x = info_ptr->colorspace.end_points_xy.greenx;
670*a67afe4dSAndroid Build Coastguard Worker       if (green_y != NULL)
671*a67afe4dSAndroid Build Coastguard Worker          *green_y = info_ptr->colorspace.end_points_xy.greeny;
672*a67afe4dSAndroid Build Coastguard Worker       if (blue_x != NULL)
673*a67afe4dSAndroid Build Coastguard Worker          *blue_x = info_ptr->colorspace.end_points_xy.bluex;
674*a67afe4dSAndroid Build Coastguard Worker       if (blue_y != NULL)
675*a67afe4dSAndroid Build Coastguard Worker          *blue_y = info_ptr->colorspace.end_points_xy.bluey;
676*a67afe4dSAndroid Build Coastguard Worker       return PNG_INFO_cHRM;
677*a67afe4dSAndroid Build Coastguard Worker    }
678*a67afe4dSAndroid Build Coastguard Worker 
679*a67afe4dSAndroid Build Coastguard Worker    return 0;
680*a67afe4dSAndroid Build Coastguard Worker }
681*a67afe4dSAndroid Build Coastguard Worker #  endif
682*a67afe4dSAndroid Build Coastguard Worker #endif
683*a67afe4dSAndroid Build Coastguard Worker 
684*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_gAMA_SUPPORTED
685*a67afe4dSAndroid Build Coastguard Worker #  ifdef PNG_FIXED_POINT_SUPPORTED
686*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_gAMA_fixed(png_const_structrp png_ptr,png_const_inforp info_ptr,png_fixed_point * file_gamma)687*a67afe4dSAndroid Build Coastguard Worker png_get_gAMA_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,
688*a67afe4dSAndroid Build Coastguard Worker     png_fixed_point *file_gamma)
689*a67afe4dSAndroid Build Coastguard Worker {
690*a67afe4dSAndroid Build Coastguard Worker    png_debug1(1, "in %s retrieval function", "gAMA");
691*a67afe4dSAndroid Build Coastguard Worker 
692*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
693*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) != 0 &&
694*a67afe4dSAndroid Build Coastguard Worker        file_gamma != NULL)
695*a67afe4dSAndroid Build Coastguard Worker    {
696*a67afe4dSAndroid Build Coastguard Worker       *file_gamma = info_ptr->colorspace.gamma;
697*a67afe4dSAndroid Build Coastguard Worker       return PNG_INFO_gAMA;
698*a67afe4dSAndroid Build Coastguard Worker    }
699*a67afe4dSAndroid Build Coastguard Worker 
700*a67afe4dSAndroid Build Coastguard Worker    return 0;
701*a67afe4dSAndroid Build Coastguard Worker }
702*a67afe4dSAndroid Build Coastguard Worker #  endif
703*a67afe4dSAndroid Build Coastguard Worker 
704*a67afe4dSAndroid Build Coastguard Worker #  ifdef PNG_FLOATING_POINT_SUPPORTED
705*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_gAMA(png_const_structrp png_ptr,png_const_inforp info_ptr,double * file_gamma)706*a67afe4dSAndroid Build Coastguard Worker png_get_gAMA(png_const_structrp png_ptr, png_const_inforp info_ptr,
707*a67afe4dSAndroid Build Coastguard Worker     double *file_gamma)
708*a67afe4dSAndroid Build Coastguard Worker {
709*a67afe4dSAndroid Build Coastguard Worker    png_debug1(1, "in %s retrieval function", "gAMA(float)");
710*a67afe4dSAndroid Build Coastguard Worker 
711*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
712*a67afe4dSAndroid Build Coastguard Worker       (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) != 0 &&
713*a67afe4dSAndroid Build Coastguard Worker       file_gamma != NULL)
714*a67afe4dSAndroid Build Coastguard Worker    {
715*a67afe4dSAndroid Build Coastguard Worker       *file_gamma = png_float(png_ptr, info_ptr->colorspace.gamma,
716*a67afe4dSAndroid Build Coastguard Worker           "png_get_gAMA");
717*a67afe4dSAndroid Build Coastguard Worker       return PNG_INFO_gAMA;
718*a67afe4dSAndroid Build Coastguard Worker    }
719*a67afe4dSAndroid Build Coastguard Worker 
720*a67afe4dSAndroid Build Coastguard Worker    return 0;
721*a67afe4dSAndroid Build Coastguard Worker }
722*a67afe4dSAndroid Build Coastguard Worker #  endif
723*a67afe4dSAndroid Build Coastguard Worker #endif
724*a67afe4dSAndroid Build Coastguard Worker 
725*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_sRGB_SUPPORTED
726*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_sRGB(png_const_structrp png_ptr,png_const_inforp info_ptr,int * file_srgb_intent)727*a67afe4dSAndroid Build Coastguard Worker png_get_sRGB(png_const_structrp png_ptr, png_const_inforp info_ptr,
728*a67afe4dSAndroid Build Coastguard Worker     int *file_srgb_intent)
729*a67afe4dSAndroid Build Coastguard Worker {
730*a67afe4dSAndroid Build Coastguard Worker    png_debug1(1, "in %s retrieval function", "sRGB");
731*a67afe4dSAndroid Build Coastguard Worker 
732*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
733*a67afe4dSAndroid Build Coastguard Worker       (info_ptr->valid & PNG_INFO_sRGB) != 0 && file_srgb_intent != NULL)
734*a67afe4dSAndroid Build Coastguard Worker    {
735*a67afe4dSAndroid Build Coastguard Worker       *file_srgb_intent = info_ptr->colorspace.rendering_intent;
736*a67afe4dSAndroid Build Coastguard Worker       return PNG_INFO_sRGB;
737*a67afe4dSAndroid Build Coastguard Worker    }
738*a67afe4dSAndroid Build Coastguard Worker 
739*a67afe4dSAndroid Build Coastguard Worker    return 0;
740*a67afe4dSAndroid Build Coastguard Worker }
741*a67afe4dSAndroid Build Coastguard Worker #endif
742*a67afe4dSAndroid Build Coastguard Worker 
743*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_iCCP_SUPPORTED
744*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_iCCP(png_const_structrp png_ptr,png_inforp info_ptr,png_charpp name,int * compression_type,png_bytepp profile,png_uint_32 * proflen)745*a67afe4dSAndroid Build Coastguard Worker png_get_iCCP(png_const_structrp png_ptr, png_inforp info_ptr,
746*a67afe4dSAndroid Build Coastguard Worker     png_charpp name, int *compression_type,
747*a67afe4dSAndroid Build Coastguard Worker     png_bytepp profile, png_uint_32 *proflen)
748*a67afe4dSAndroid Build Coastguard Worker {
749*a67afe4dSAndroid Build Coastguard Worker    png_debug1(1, "in %s retrieval function", "iCCP");
750*a67afe4dSAndroid Build Coastguard Worker 
751*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
752*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->valid & PNG_INFO_iCCP) != 0 &&
753*a67afe4dSAndroid Build Coastguard Worker        name != NULL && profile != NULL && proflen != NULL)
754*a67afe4dSAndroid Build Coastguard Worker    {
755*a67afe4dSAndroid Build Coastguard Worker       *name = info_ptr->iccp_name;
756*a67afe4dSAndroid Build Coastguard Worker       *profile = info_ptr->iccp_profile;
757*a67afe4dSAndroid Build Coastguard Worker       *proflen = png_get_uint_32(info_ptr->iccp_profile);
758*a67afe4dSAndroid Build Coastguard Worker       /* This is somewhat irrelevant since the profile data returned has
759*a67afe4dSAndroid Build Coastguard Worker        * actually been uncompressed.
760*a67afe4dSAndroid Build Coastguard Worker        */
761*a67afe4dSAndroid Build Coastguard Worker       if (compression_type != NULL)
762*a67afe4dSAndroid Build Coastguard Worker          *compression_type = PNG_COMPRESSION_TYPE_BASE;
763*a67afe4dSAndroid Build Coastguard Worker       return PNG_INFO_iCCP;
764*a67afe4dSAndroid Build Coastguard Worker    }
765*a67afe4dSAndroid Build Coastguard Worker 
766*a67afe4dSAndroid Build Coastguard Worker    return 0;
767*a67afe4dSAndroid Build Coastguard Worker 
768*a67afe4dSAndroid Build Coastguard Worker }
769*a67afe4dSAndroid Build Coastguard Worker #endif
770*a67afe4dSAndroid Build Coastguard Worker 
771*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_sPLT_SUPPORTED
772*a67afe4dSAndroid Build Coastguard Worker int PNGAPI
png_get_sPLT(png_const_structrp png_ptr,png_inforp info_ptr,png_sPLT_tpp spalettes)773*a67afe4dSAndroid Build Coastguard Worker png_get_sPLT(png_const_structrp png_ptr, png_inforp info_ptr,
774*a67afe4dSAndroid Build Coastguard Worker     png_sPLT_tpp spalettes)
775*a67afe4dSAndroid Build Coastguard Worker {
776*a67afe4dSAndroid Build Coastguard Worker    png_debug1(1, "in %s retrieval function", "sPLT");
777*a67afe4dSAndroid Build Coastguard Worker 
778*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL && spalettes != NULL)
779*a67afe4dSAndroid Build Coastguard Worker    {
780*a67afe4dSAndroid Build Coastguard Worker       *spalettes = info_ptr->splt_palettes;
781*a67afe4dSAndroid Build Coastguard Worker       return info_ptr->splt_palettes_num;
782*a67afe4dSAndroid Build Coastguard Worker    }
783*a67afe4dSAndroid Build Coastguard Worker 
784*a67afe4dSAndroid Build Coastguard Worker    return 0;
785*a67afe4dSAndroid Build Coastguard Worker }
786*a67afe4dSAndroid Build Coastguard Worker #endif
787*a67afe4dSAndroid Build Coastguard Worker 
788*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_eXIf_SUPPORTED
789*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_eXIf(png_const_structrp png_ptr,png_inforp info_ptr,png_bytep * exif)790*a67afe4dSAndroid Build Coastguard Worker png_get_eXIf(png_const_structrp png_ptr, png_inforp info_ptr,
791*a67afe4dSAndroid Build Coastguard Worker     png_bytep *exif)
792*a67afe4dSAndroid Build Coastguard Worker {
793*a67afe4dSAndroid Build Coastguard Worker   png_warning(png_ptr, "png_get_eXIf does not work; use png_get_eXIf_1");
794*a67afe4dSAndroid Build Coastguard Worker   PNG_UNUSED(info_ptr)
795*a67afe4dSAndroid Build Coastguard Worker   PNG_UNUSED(exif)
796*a67afe4dSAndroid Build Coastguard Worker   return 0;
797*a67afe4dSAndroid Build Coastguard Worker }
798*a67afe4dSAndroid Build Coastguard Worker 
799*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_eXIf_1(png_const_structrp png_ptr,png_const_inforp info_ptr,png_uint_32 * num_exif,png_bytep * exif)800*a67afe4dSAndroid Build Coastguard Worker png_get_eXIf_1(png_const_structrp png_ptr, png_const_inforp info_ptr,
801*a67afe4dSAndroid Build Coastguard Worker     png_uint_32 *num_exif, png_bytep *exif)
802*a67afe4dSAndroid Build Coastguard Worker {
803*a67afe4dSAndroid Build Coastguard Worker    png_debug1(1, "in %s retrieval function", "eXIf");
804*a67afe4dSAndroid Build Coastguard Worker 
805*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
806*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->valid & PNG_INFO_eXIf) != 0 && exif != NULL)
807*a67afe4dSAndroid Build Coastguard Worker    {
808*a67afe4dSAndroid Build Coastguard Worker       *num_exif = info_ptr->num_exif;
809*a67afe4dSAndroid Build Coastguard Worker       *exif = info_ptr->exif;
810*a67afe4dSAndroid Build Coastguard Worker       return PNG_INFO_eXIf;
811*a67afe4dSAndroid Build Coastguard Worker    }
812*a67afe4dSAndroid Build Coastguard Worker 
813*a67afe4dSAndroid Build Coastguard Worker    return 0;
814*a67afe4dSAndroid Build Coastguard Worker }
815*a67afe4dSAndroid Build Coastguard Worker #endif
816*a67afe4dSAndroid Build Coastguard Worker 
817*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_hIST_SUPPORTED
818*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_hIST(png_const_structrp png_ptr,png_inforp info_ptr,png_uint_16p * hist)819*a67afe4dSAndroid Build Coastguard Worker png_get_hIST(png_const_structrp png_ptr, png_inforp info_ptr,
820*a67afe4dSAndroid Build Coastguard Worker     png_uint_16p *hist)
821*a67afe4dSAndroid Build Coastguard Worker {
822*a67afe4dSAndroid Build Coastguard Worker    png_debug1(1, "in %s retrieval function", "hIST");
823*a67afe4dSAndroid Build Coastguard Worker 
824*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
825*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->valid & PNG_INFO_hIST) != 0 && hist != NULL)
826*a67afe4dSAndroid Build Coastguard Worker    {
827*a67afe4dSAndroid Build Coastguard Worker       *hist = info_ptr->hist;
828*a67afe4dSAndroid Build Coastguard Worker       return PNG_INFO_hIST;
829*a67afe4dSAndroid Build Coastguard Worker    }
830*a67afe4dSAndroid Build Coastguard Worker 
831*a67afe4dSAndroid Build Coastguard Worker    return 0;
832*a67afe4dSAndroid Build Coastguard Worker }
833*a67afe4dSAndroid Build Coastguard Worker #endif
834*a67afe4dSAndroid Build Coastguard Worker 
835*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_IHDR(png_const_structrp png_ptr,png_const_inforp info_ptr,png_uint_32 * width,png_uint_32 * height,int * bit_depth,int * color_type,int * interlace_type,int * compression_type,int * filter_type)836*a67afe4dSAndroid Build Coastguard Worker png_get_IHDR(png_const_structrp png_ptr, png_const_inforp info_ptr,
837*a67afe4dSAndroid Build Coastguard Worker     png_uint_32 *width, png_uint_32 *height, int *bit_depth,
838*a67afe4dSAndroid Build Coastguard Worker     int *color_type, int *interlace_type, int *compression_type,
839*a67afe4dSAndroid Build Coastguard Worker     int *filter_type)
840*a67afe4dSAndroid Build Coastguard Worker {
841*a67afe4dSAndroid Build Coastguard Worker    png_debug1(1, "in %s retrieval function", "IHDR");
842*a67afe4dSAndroid Build Coastguard Worker 
843*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr == NULL || info_ptr == NULL)
844*a67afe4dSAndroid Build Coastguard Worker       return 0;
845*a67afe4dSAndroid Build Coastguard Worker 
846*a67afe4dSAndroid Build Coastguard Worker    if (width != NULL)
847*a67afe4dSAndroid Build Coastguard Worker        *width = info_ptr->width;
848*a67afe4dSAndroid Build Coastguard Worker 
849*a67afe4dSAndroid Build Coastguard Worker    if (height != NULL)
850*a67afe4dSAndroid Build Coastguard Worker        *height = info_ptr->height;
851*a67afe4dSAndroid Build Coastguard Worker 
852*a67afe4dSAndroid Build Coastguard Worker    if (bit_depth != NULL)
853*a67afe4dSAndroid Build Coastguard Worker        *bit_depth = info_ptr->bit_depth;
854*a67afe4dSAndroid Build Coastguard Worker 
855*a67afe4dSAndroid Build Coastguard Worker    if (color_type != NULL)
856*a67afe4dSAndroid Build Coastguard Worker        *color_type = info_ptr->color_type;
857*a67afe4dSAndroid Build Coastguard Worker 
858*a67afe4dSAndroid Build Coastguard Worker    if (compression_type != NULL)
859*a67afe4dSAndroid Build Coastguard Worker       *compression_type = info_ptr->compression_type;
860*a67afe4dSAndroid Build Coastguard Worker 
861*a67afe4dSAndroid Build Coastguard Worker    if (filter_type != NULL)
862*a67afe4dSAndroid Build Coastguard Worker       *filter_type = info_ptr->filter_type;
863*a67afe4dSAndroid Build Coastguard Worker 
864*a67afe4dSAndroid Build Coastguard Worker    if (interlace_type != NULL)
865*a67afe4dSAndroid Build Coastguard Worker       *interlace_type = info_ptr->interlace_type;
866*a67afe4dSAndroid Build Coastguard Worker 
867*a67afe4dSAndroid Build Coastguard Worker    /* This is redundant if we can be sure that the info_ptr values were all
868*a67afe4dSAndroid Build Coastguard Worker     * assigned in png_set_IHDR().  We do the check anyhow in case an
869*a67afe4dSAndroid Build Coastguard Worker     * application has ignored our advice not to mess with the members
870*a67afe4dSAndroid Build Coastguard Worker     * of info_ptr directly.
871*a67afe4dSAndroid Build Coastguard Worker     */
872*a67afe4dSAndroid Build Coastguard Worker    png_check_IHDR(png_ptr, info_ptr->width, info_ptr->height,
873*a67afe4dSAndroid Build Coastguard Worker        info_ptr->bit_depth, info_ptr->color_type, info_ptr->interlace_type,
874*a67afe4dSAndroid Build Coastguard Worker        info_ptr->compression_type, info_ptr->filter_type);
875*a67afe4dSAndroid Build Coastguard Worker 
876*a67afe4dSAndroid Build Coastguard Worker    return 1;
877*a67afe4dSAndroid Build Coastguard Worker }
878*a67afe4dSAndroid Build Coastguard Worker 
879*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_oFFs_SUPPORTED
880*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_oFFs(png_const_structrp png_ptr,png_const_inforp info_ptr,png_int_32 * offset_x,png_int_32 * offset_y,int * unit_type)881*a67afe4dSAndroid Build Coastguard Worker png_get_oFFs(png_const_structrp png_ptr, png_const_inforp info_ptr,
882*a67afe4dSAndroid Build Coastguard Worker     png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type)
883*a67afe4dSAndroid Build Coastguard Worker {
884*a67afe4dSAndroid Build Coastguard Worker    png_debug1(1, "in %s retrieval function", "oFFs");
885*a67afe4dSAndroid Build Coastguard Worker 
886*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
887*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->valid & PNG_INFO_oFFs) != 0 &&
888*a67afe4dSAndroid Build Coastguard Worker        offset_x != NULL && offset_y != NULL && unit_type != NULL)
889*a67afe4dSAndroid Build Coastguard Worker    {
890*a67afe4dSAndroid Build Coastguard Worker       *offset_x = info_ptr->x_offset;
891*a67afe4dSAndroid Build Coastguard Worker       *offset_y = info_ptr->y_offset;
892*a67afe4dSAndroid Build Coastguard Worker       *unit_type = (int)info_ptr->offset_unit_type;
893*a67afe4dSAndroid Build Coastguard Worker       return PNG_INFO_oFFs;
894*a67afe4dSAndroid Build Coastguard Worker    }
895*a67afe4dSAndroid Build Coastguard Worker 
896*a67afe4dSAndroid Build Coastguard Worker    return 0;
897*a67afe4dSAndroid Build Coastguard Worker }
898*a67afe4dSAndroid Build Coastguard Worker #endif
899*a67afe4dSAndroid Build Coastguard Worker 
900*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_pCAL_SUPPORTED
901*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_pCAL(png_const_structrp png_ptr,png_inforp info_ptr,png_charp * purpose,png_int_32 * X0,png_int_32 * X1,int * type,int * nparams,png_charp * units,png_charpp * params)902*a67afe4dSAndroid Build Coastguard Worker png_get_pCAL(png_const_structrp png_ptr, png_inforp info_ptr,
903*a67afe4dSAndroid Build Coastguard Worker     png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams,
904*a67afe4dSAndroid Build Coastguard Worker     png_charp *units, png_charpp *params)
905*a67afe4dSAndroid Build Coastguard Worker {
906*a67afe4dSAndroid Build Coastguard Worker    png_debug1(1, "in %s retrieval function", "pCAL");
907*a67afe4dSAndroid Build Coastguard Worker 
908*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
909*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->valid & PNG_INFO_pCAL) != 0 &&
910*a67afe4dSAndroid Build Coastguard Worker        purpose != NULL && X0 != NULL && X1 != NULL && type != NULL &&
911*a67afe4dSAndroid Build Coastguard Worker        nparams != NULL && units != NULL && params != NULL)
912*a67afe4dSAndroid Build Coastguard Worker    {
913*a67afe4dSAndroid Build Coastguard Worker       *purpose = info_ptr->pcal_purpose;
914*a67afe4dSAndroid Build Coastguard Worker       *X0 = info_ptr->pcal_X0;
915*a67afe4dSAndroid Build Coastguard Worker       *X1 = info_ptr->pcal_X1;
916*a67afe4dSAndroid Build Coastguard Worker       *type = (int)info_ptr->pcal_type;
917*a67afe4dSAndroid Build Coastguard Worker       *nparams = (int)info_ptr->pcal_nparams;
918*a67afe4dSAndroid Build Coastguard Worker       *units = info_ptr->pcal_units;
919*a67afe4dSAndroid Build Coastguard Worker       *params = info_ptr->pcal_params;
920*a67afe4dSAndroid Build Coastguard Worker       return PNG_INFO_pCAL;
921*a67afe4dSAndroid Build Coastguard Worker    }
922*a67afe4dSAndroid Build Coastguard Worker 
923*a67afe4dSAndroid Build Coastguard Worker    return 0;
924*a67afe4dSAndroid Build Coastguard Worker }
925*a67afe4dSAndroid Build Coastguard Worker #endif
926*a67afe4dSAndroid Build Coastguard Worker 
927*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_sCAL_SUPPORTED
928*a67afe4dSAndroid Build Coastguard Worker #  ifdef PNG_FIXED_POINT_SUPPORTED
929*a67afe4dSAndroid Build Coastguard Worker #    if defined(PNG_FLOATING_ARITHMETIC_SUPPORTED) || \
930*a67afe4dSAndroid Build Coastguard Worker          defined(PNG_FLOATING_POINT_SUPPORTED)
931*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_sCAL_fixed(png_const_structrp png_ptr,png_const_inforp info_ptr,int * unit,png_fixed_point * width,png_fixed_point * height)932*a67afe4dSAndroid Build Coastguard Worker png_get_sCAL_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,
933*a67afe4dSAndroid Build Coastguard Worker     int *unit, png_fixed_point *width, png_fixed_point *height)
934*a67afe4dSAndroid Build Coastguard Worker {
935*a67afe4dSAndroid Build Coastguard Worker    png_debug1(1, "in %s retrieval function", "sCAL");
936*a67afe4dSAndroid Build Coastguard Worker 
937*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
938*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->valid & PNG_INFO_sCAL) != 0)
939*a67afe4dSAndroid Build Coastguard Worker    {
940*a67afe4dSAndroid Build Coastguard Worker       *unit = info_ptr->scal_unit;
941*a67afe4dSAndroid Build Coastguard Worker       /*TODO: make this work without FP support; the API is currently eliminated
942*a67afe4dSAndroid Build Coastguard Worker        * if neither floating point APIs nor internal floating point arithmetic
943*a67afe4dSAndroid Build Coastguard Worker        * are enabled.
944*a67afe4dSAndroid Build Coastguard Worker        */
945*a67afe4dSAndroid Build Coastguard Worker       *width = png_fixed(png_ptr, atof(info_ptr->scal_s_width), "sCAL width");
946*a67afe4dSAndroid Build Coastguard Worker       *height = png_fixed(png_ptr, atof(info_ptr->scal_s_height),
947*a67afe4dSAndroid Build Coastguard Worker           "sCAL height");
948*a67afe4dSAndroid Build Coastguard Worker       return PNG_INFO_sCAL;
949*a67afe4dSAndroid Build Coastguard Worker    }
950*a67afe4dSAndroid Build Coastguard Worker 
951*a67afe4dSAndroid Build Coastguard Worker    return 0;
952*a67afe4dSAndroid Build Coastguard Worker }
953*a67afe4dSAndroid Build Coastguard Worker #    endif /* FLOATING_ARITHMETIC */
954*a67afe4dSAndroid Build Coastguard Worker #  endif /* FIXED_POINT */
955*a67afe4dSAndroid Build Coastguard Worker #  ifdef PNG_FLOATING_POINT_SUPPORTED
956*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_sCAL(png_const_structrp png_ptr,png_const_inforp info_ptr,int * unit,double * width,double * height)957*a67afe4dSAndroid Build Coastguard Worker png_get_sCAL(png_const_structrp png_ptr, png_const_inforp info_ptr,
958*a67afe4dSAndroid Build Coastguard Worker     int *unit, double *width, double *height)
959*a67afe4dSAndroid Build Coastguard Worker {
960*a67afe4dSAndroid Build Coastguard Worker    png_debug1(1, "in %s retrieval function", "sCAL(float)");
961*a67afe4dSAndroid Build Coastguard Worker 
962*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
963*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->valid & PNG_INFO_sCAL) != 0)
964*a67afe4dSAndroid Build Coastguard Worker    {
965*a67afe4dSAndroid Build Coastguard Worker       *unit = info_ptr->scal_unit;
966*a67afe4dSAndroid Build Coastguard Worker       *width = atof(info_ptr->scal_s_width);
967*a67afe4dSAndroid Build Coastguard Worker       *height = atof(info_ptr->scal_s_height);
968*a67afe4dSAndroid Build Coastguard Worker       return PNG_INFO_sCAL;
969*a67afe4dSAndroid Build Coastguard Worker    }
970*a67afe4dSAndroid Build Coastguard Worker 
971*a67afe4dSAndroid Build Coastguard Worker    return 0;
972*a67afe4dSAndroid Build Coastguard Worker }
973*a67afe4dSAndroid Build Coastguard Worker #  endif /* FLOATING POINT */
974*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_sCAL_s(png_const_structrp png_ptr,png_const_inforp info_ptr,int * unit,png_charpp width,png_charpp height)975*a67afe4dSAndroid Build Coastguard Worker png_get_sCAL_s(png_const_structrp png_ptr, png_const_inforp info_ptr,
976*a67afe4dSAndroid Build Coastguard Worker     int *unit, png_charpp width, png_charpp height)
977*a67afe4dSAndroid Build Coastguard Worker {
978*a67afe4dSAndroid Build Coastguard Worker    png_debug1(1, "in %s retrieval function", "sCAL(str)");
979*a67afe4dSAndroid Build Coastguard Worker 
980*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
981*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->valid & PNG_INFO_sCAL) != 0)
982*a67afe4dSAndroid Build Coastguard Worker    {
983*a67afe4dSAndroid Build Coastguard Worker       *unit = info_ptr->scal_unit;
984*a67afe4dSAndroid Build Coastguard Worker       *width = info_ptr->scal_s_width;
985*a67afe4dSAndroid Build Coastguard Worker       *height = info_ptr->scal_s_height;
986*a67afe4dSAndroid Build Coastguard Worker       return PNG_INFO_sCAL;
987*a67afe4dSAndroid Build Coastguard Worker    }
988*a67afe4dSAndroid Build Coastguard Worker 
989*a67afe4dSAndroid Build Coastguard Worker    return 0;
990*a67afe4dSAndroid Build Coastguard Worker }
991*a67afe4dSAndroid Build Coastguard Worker #endif /* sCAL */
992*a67afe4dSAndroid Build Coastguard Worker 
993*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_pHYs_SUPPORTED
994*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_pHYs(png_const_structrp png_ptr,png_const_inforp info_ptr,png_uint_32 * res_x,png_uint_32 * res_y,int * unit_type)995*a67afe4dSAndroid Build Coastguard Worker png_get_pHYs(png_const_structrp png_ptr, png_const_inforp info_ptr,
996*a67afe4dSAndroid Build Coastguard Worker     png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)
997*a67afe4dSAndroid Build Coastguard Worker {
998*a67afe4dSAndroid Build Coastguard Worker    png_uint_32 retval = 0;
999*a67afe4dSAndroid Build Coastguard Worker 
1000*a67afe4dSAndroid Build Coastguard Worker    png_debug1(1, "in %s retrieval function", "pHYs");
1001*a67afe4dSAndroid Build Coastguard Worker 
1002*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
1003*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->valid & PNG_INFO_pHYs) != 0)
1004*a67afe4dSAndroid Build Coastguard Worker    {
1005*a67afe4dSAndroid Build Coastguard Worker       if (res_x != NULL)
1006*a67afe4dSAndroid Build Coastguard Worker       {
1007*a67afe4dSAndroid Build Coastguard Worker          *res_x = info_ptr->x_pixels_per_unit;
1008*a67afe4dSAndroid Build Coastguard Worker          retval |= PNG_INFO_pHYs;
1009*a67afe4dSAndroid Build Coastguard Worker       }
1010*a67afe4dSAndroid Build Coastguard Worker 
1011*a67afe4dSAndroid Build Coastguard Worker       if (res_y != NULL)
1012*a67afe4dSAndroid Build Coastguard Worker       {
1013*a67afe4dSAndroid Build Coastguard Worker          *res_y = info_ptr->y_pixels_per_unit;
1014*a67afe4dSAndroid Build Coastguard Worker          retval |= PNG_INFO_pHYs;
1015*a67afe4dSAndroid Build Coastguard Worker       }
1016*a67afe4dSAndroid Build Coastguard Worker 
1017*a67afe4dSAndroid Build Coastguard Worker       if (unit_type != NULL)
1018*a67afe4dSAndroid Build Coastguard Worker       {
1019*a67afe4dSAndroid Build Coastguard Worker          *unit_type = (int)info_ptr->phys_unit_type;
1020*a67afe4dSAndroid Build Coastguard Worker          retval |= PNG_INFO_pHYs;
1021*a67afe4dSAndroid Build Coastguard Worker       }
1022*a67afe4dSAndroid Build Coastguard Worker    }
1023*a67afe4dSAndroid Build Coastguard Worker 
1024*a67afe4dSAndroid Build Coastguard Worker    return retval;
1025*a67afe4dSAndroid Build Coastguard Worker }
1026*a67afe4dSAndroid Build Coastguard Worker #endif /* pHYs */
1027*a67afe4dSAndroid Build Coastguard Worker 
1028*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_PLTE(png_const_structrp png_ptr,png_inforp info_ptr,png_colorp * palette,int * num_palette)1029*a67afe4dSAndroid Build Coastguard Worker png_get_PLTE(png_const_structrp png_ptr, png_inforp info_ptr,
1030*a67afe4dSAndroid Build Coastguard Worker     png_colorp *palette, int *num_palette)
1031*a67afe4dSAndroid Build Coastguard Worker {
1032*a67afe4dSAndroid Build Coastguard Worker    png_debug1(1, "in %s retrieval function", "PLTE");
1033*a67afe4dSAndroid Build Coastguard Worker 
1034*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
1035*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->valid & PNG_INFO_PLTE) != 0 && palette != NULL)
1036*a67afe4dSAndroid Build Coastguard Worker    {
1037*a67afe4dSAndroid Build Coastguard Worker       *palette = info_ptr->palette;
1038*a67afe4dSAndroid Build Coastguard Worker       *num_palette = info_ptr->num_palette;
1039*a67afe4dSAndroid Build Coastguard Worker       png_debug1(3, "num_palette = %d", *num_palette);
1040*a67afe4dSAndroid Build Coastguard Worker       return PNG_INFO_PLTE;
1041*a67afe4dSAndroid Build Coastguard Worker    }
1042*a67afe4dSAndroid Build Coastguard Worker 
1043*a67afe4dSAndroid Build Coastguard Worker    return 0;
1044*a67afe4dSAndroid Build Coastguard Worker }
1045*a67afe4dSAndroid Build Coastguard Worker 
1046*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_sBIT_SUPPORTED
1047*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_sBIT(png_const_structrp png_ptr,png_inforp info_ptr,png_color_8p * sig_bit)1048*a67afe4dSAndroid Build Coastguard Worker png_get_sBIT(png_const_structrp png_ptr, png_inforp info_ptr,
1049*a67afe4dSAndroid Build Coastguard Worker     png_color_8p *sig_bit)
1050*a67afe4dSAndroid Build Coastguard Worker {
1051*a67afe4dSAndroid Build Coastguard Worker    png_debug1(1, "in %s retrieval function", "sBIT");
1052*a67afe4dSAndroid Build Coastguard Worker 
1053*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
1054*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->valid & PNG_INFO_sBIT) != 0 && sig_bit != NULL)
1055*a67afe4dSAndroid Build Coastguard Worker    {
1056*a67afe4dSAndroid Build Coastguard Worker       *sig_bit = &(info_ptr->sig_bit);
1057*a67afe4dSAndroid Build Coastguard Worker       return PNG_INFO_sBIT;
1058*a67afe4dSAndroid Build Coastguard Worker    }
1059*a67afe4dSAndroid Build Coastguard Worker 
1060*a67afe4dSAndroid Build Coastguard Worker    return 0;
1061*a67afe4dSAndroid Build Coastguard Worker }
1062*a67afe4dSAndroid Build Coastguard Worker #endif
1063*a67afe4dSAndroid Build Coastguard Worker 
1064*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_TEXT_SUPPORTED
1065*a67afe4dSAndroid Build Coastguard Worker int PNGAPI
png_get_text(png_const_structrp png_ptr,png_inforp info_ptr,png_textp * text_ptr,int * num_text)1066*a67afe4dSAndroid Build Coastguard Worker png_get_text(png_const_structrp png_ptr, png_inforp info_ptr,
1067*a67afe4dSAndroid Build Coastguard Worker     png_textp *text_ptr, int *num_text)
1068*a67afe4dSAndroid Build Coastguard Worker {
1069*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0)
1070*a67afe4dSAndroid Build Coastguard Worker    {
1071*a67afe4dSAndroid Build Coastguard Worker       png_debug1(1, "in text retrieval function, chunk typeid = 0x%lx",
1072*a67afe4dSAndroid Build Coastguard Worker          (unsigned long)png_ptr->chunk_name);
1073*a67afe4dSAndroid Build Coastguard Worker 
1074*a67afe4dSAndroid Build Coastguard Worker       if (text_ptr != NULL)
1075*a67afe4dSAndroid Build Coastguard Worker          *text_ptr = info_ptr->text;
1076*a67afe4dSAndroid Build Coastguard Worker 
1077*a67afe4dSAndroid Build Coastguard Worker       if (num_text != NULL)
1078*a67afe4dSAndroid Build Coastguard Worker          *num_text = info_ptr->num_text;
1079*a67afe4dSAndroid Build Coastguard Worker 
1080*a67afe4dSAndroid Build Coastguard Worker       return info_ptr->num_text;
1081*a67afe4dSAndroid Build Coastguard Worker    }
1082*a67afe4dSAndroid Build Coastguard Worker 
1083*a67afe4dSAndroid Build Coastguard Worker    if (num_text != NULL)
1084*a67afe4dSAndroid Build Coastguard Worker       *num_text = 0;
1085*a67afe4dSAndroid Build Coastguard Worker 
1086*a67afe4dSAndroid Build Coastguard Worker    return 0;
1087*a67afe4dSAndroid Build Coastguard Worker }
1088*a67afe4dSAndroid Build Coastguard Worker #endif
1089*a67afe4dSAndroid Build Coastguard Worker 
1090*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_tIME_SUPPORTED
1091*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_tIME(png_const_structrp png_ptr,png_inforp info_ptr,png_timep * mod_time)1092*a67afe4dSAndroid Build Coastguard Worker png_get_tIME(png_const_structrp png_ptr, png_inforp info_ptr,
1093*a67afe4dSAndroid Build Coastguard Worker     png_timep *mod_time)
1094*a67afe4dSAndroid Build Coastguard Worker {
1095*a67afe4dSAndroid Build Coastguard Worker    png_debug1(1, "in %s retrieval function", "tIME");
1096*a67afe4dSAndroid Build Coastguard Worker 
1097*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
1098*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->valid & PNG_INFO_tIME) != 0 && mod_time != NULL)
1099*a67afe4dSAndroid Build Coastguard Worker    {
1100*a67afe4dSAndroid Build Coastguard Worker       *mod_time = &(info_ptr->mod_time);
1101*a67afe4dSAndroid Build Coastguard Worker       return PNG_INFO_tIME;
1102*a67afe4dSAndroid Build Coastguard Worker    }
1103*a67afe4dSAndroid Build Coastguard Worker 
1104*a67afe4dSAndroid Build Coastguard Worker    return 0;
1105*a67afe4dSAndroid Build Coastguard Worker }
1106*a67afe4dSAndroid Build Coastguard Worker #endif
1107*a67afe4dSAndroid Build Coastguard Worker 
1108*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_tRNS_SUPPORTED
1109*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_tRNS(png_const_structrp png_ptr,png_inforp info_ptr,png_bytep * trans_alpha,int * num_trans,png_color_16p * trans_color)1110*a67afe4dSAndroid Build Coastguard Worker png_get_tRNS(png_const_structrp png_ptr, png_inforp info_ptr,
1111*a67afe4dSAndroid Build Coastguard Worker     png_bytep *trans_alpha, int *num_trans, png_color_16p *trans_color)
1112*a67afe4dSAndroid Build Coastguard Worker {
1113*a67afe4dSAndroid Build Coastguard Worker    png_uint_32 retval = 0;
1114*a67afe4dSAndroid Build Coastguard Worker 
1115*a67afe4dSAndroid Build Coastguard Worker    png_debug1(1, "in %s retrieval function", "tRNS");
1116*a67afe4dSAndroid Build Coastguard Worker 
1117*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL &&
1118*a67afe4dSAndroid Build Coastguard Worker        (info_ptr->valid & PNG_INFO_tRNS) != 0)
1119*a67afe4dSAndroid Build Coastguard Worker    {
1120*a67afe4dSAndroid Build Coastguard Worker       if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
1121*a67afe4dSAndroid Build Coastguard Worker       {
1122*a67afe4dSAndroid Build Coastguard Worker          if (trans_alpha != NULL)
1123*a67afe4dSAndroid Build Coastguard Worker          {
1124*a67afe4dSAndroid Build Coastguard Worker             *trans_alpha = info_ptr->trans_alpha;
1125*a67afe4dSAndroid Build Coastguard Worker             retval |= PNG_INFO_tRNS;
1126*a67afe4dSAndroid Build Coastguard Worker          }
1127*a67afe4dSAndroid Build Coastguard Worker 
1128*a67afe4dSAndroid Build Coastguard Worker          if (trans_color != NULL)
1129*a67afe4dSAndroid Build Coastguard Worker             *trans_color = &(info_ptr->trans_color);
1130*a67afe4dSAndroid Build Coastguard Worker       }
1131*a67afe4dSAndroid Build Coastguard Worker 
1132*a67afe4dSAndroid Build Coastguard Worker       else /* if (info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) */
1133*a67afe4dSAndroid Build Coastguard Worker       {
1134*a67afe4dSAndroid Build Coastguard Worker          if (trans_color != NULL)
1135*a67afe4dSAndroid Build Coastguard Worker          {
1136*a67afe4dSAndroid Build Coastguard Worker             *trans_color = &(info_ptr->trans_color);
1137*a67afe4dSAndroid Build Coastguard Worker             retval |= PNG_INFO_tRNS;
1138*a67afe4dSAndroid Build Coastguard Worker          }
1139*a67afe4dSAndroid Build Coastguard Worker 
1140*a67afe4dSAndroid Build Coastguard Worker          if (trans_alpha != NULL)
1141*a67afe4dSAndroid Build Coastguard Worker             *trans_alpha = NULL;
1142*a67afe4dSAndroid Build Coastguard Worker       }
1143*a67afe4dSAndroid Build Coastguard Worker 
1144*a67afe4dSAndroid Build Coastguard Worker       if (num_trans != NULL)
1145*a67afe4dSAndroid Build Coastguard Worker       {
1146*a67afe4dSAndroid Build Coastguard Worker          *num_trans = info_ptr->num_trans;
1147*a67afe4dSAndroid Build Coastguard Worker          retval |= PNG_INFO_tRNS;
1148*a67afe4dSAndroid Build Coastguard Worker       }
1149*a67afe4dSAndroid Build Coastguard Worker    }
1150*a67afe4dSAndroid Build Coastguard Worker 
1151*a67afe4dSAndroid Build Coastguard Worker    return retval;
1152*a67afe4dSAndroid Build Coastguard Worker }
1153*a67afe4dSAndroid Build Coastguard Worker #endif
1154*a67afe4dSAndroid Build Coastguard Worker 
1155*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
1156*a67afe4dSAndroid Build Coastguard Worker int PNGAPI
png_get_unknown_chunks(png_const_structrp png_ptr,png_inforp info_ptr,png_unknown_chunkpp unknowns)1157*a67afe4dSAndroid Build Coastguard Worker png_get_unknown_chunks(png_const_structrp png_ptr, png_inforp info_ptr,
1158*a67afe4dSAndroid Build Coastguard Worker     png_unknown_chunkpp unknowns)
1159*a67afe4dSAndroid Build Coastguard Worker {
1160*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL && unknowns != NULL)
1161*a67afe4dSAndroid Build Coastguard Worker    {
1162*a67afe4dSAndroid Build Coastguard Worker       *unknowns = info_ptr->unknown_chunks;
1163*a67afe4dSAndroid Build Coastguard Worker       return info_ptr->unknown_chunks_num;
1164*a67afe4dSAndroid Build Coastguard Worker    }
1165*a67afe4dSAndroid Build Coastguard Worker 
1166*a67afe4dSAndroid Build Coastguard Worker    return 0;
1167*a67afe4dSAndroid Build Coastguard Worker }
1168*a67afe4dSAndroid Build Coastguard Worker #endif
1169*a67afe4dSAndroid Build Coastguard Worker 
1170*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
1171*a67afe4dSAndroid Build Coastguard Worker png_byte PNGAPI
png_get_rgb_to_gray_status(png_const_structrp png_ptr)1172*a67afe4dSAndroid Build Coastguard Worker png_get_rgb_to_gray_status(png_const_structrp png_ptr)
1173*a67afe4dSAndroid Build Coastguard Worker {
1174*a67afe4dSAndroid Build Coastguard Worker    return (png_byte)(png_ptr ? png_ptr->rgb_to_gray_status : 0);
1175*a67afe4dSAndroid Build Coastguard Worker }
1176*a67afe4dSAndroid Build Coastguard Worker #endif
1177*a67afe4dSAndroid Build Coastguard Worker 
1178*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_USER_CHUNKS_SUPPORTED
1179*a67afe4dSAndroid Build Coastguard Worker png_voidp PNGAPI
png_get_user_chunk_ptr(png_const_structrp png_ptr)1180*a67afe4dSAndroid Build Coastguard Worker png_get_user_chunk_ptr(png_const_structrp png_ptr)
1181*a67afe4dSAndroid Build Coastguard Worker {
1182*a67afe4dSAndroid Build Coastguard Worker    return (png_ptr ? png_ptr->user_chunk_ptr : NULL);
1183*a67afe4dSAndroid Build Coastguard Worker }
1184*a67afe4dSAndroid Build Coastguard Worker #endif
1185*a67afe4dSAndroid Build Coastguard Worker 
1186*a67afe4dSAndroid Build Coastguard Worker size_t PNGAPI
png_get_compression_buffer_size(png_const_structrp png_ptr)1187*a67afe4dSAndroid Build Coastguard Worker png_get_compression_buffer_size(png_const_structrp png_ptr)
1188*a67afe4dSAndroid Build Coastguard Worker {
1189*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr == NULL)
1190*a67afe4dSAndroid Build Coastguard Worker       return 0;
1191*a67afe4dSAndroid Build Coastguard Worker 
1192*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_WRITE_SUPPORTED
1193*a67afe4dSAndroid Build Coastguard Worker    if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
1194*a67afe4dSAndroid Build Coastguard Worker #endif
1195*a67afe4dSAndroid Build Coastguard Worker    {
1196*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_SEQUENTIAL_READ_SUPPORTED
1197*a67afe4dSAndroid Build Coastguard Worker       return png_ptr->IDAT_read_size;
1198*a67afe4dSAndroid Build Coastguard Worker #else
1199*a67afe4dSAndroid Build Coastguard Worker       return PNG_IDAT_READ_SIZE;
1200*a67afe4dSAndroid Build Coastguard Worker #endif
1201*a67afe4dSAndroid Build Coastguard Worker    }
1202*a67afe4dSAndroid Build Coastguard Worker 
1203*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_WRITE_SUPPORTED
1204*a67afe4dSAndroid Build Coastguard Worker    else
1205*a67afe4dSAndroid Build Coastguard Worker       return png_ptr->zbuffer_size;
1206*a67afe4dSAndroid Build Coastguard Worker #endif
1207*a67afe4dSAndroid Build Coastguard Worker }
1208*a67afe4dSAndroid Build Coastguard Worker 
1209*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_SET_USER_LIMITS_SUPPORTED
1210*a67afe4dSAndroid Build Coastguard Worker /* These functions were added to libpng 1.2.6 and were enabled
1211*a67afe4dSAndroid Build Coastguard Worker  * by default in libpng-1.4.0 */
1212*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_user_width_max(png_const_structrp png_ptr)1213*a67afe4dSAndroid Build Coastguard Worker png_get_user_width_max(png_const_structrp png_ptr)
1214*a67afe4dSAndroid Build Coastguard Worker {
1215*a67afe4dSAndroid Build Coastguard Worker    return (png_ptr ? png_ptr->user_width_max : 0);
1216*a67afe4dSAndroid Build Coastguard Worker }
1217*a67afe4dSAndroid Build Coastguard Worker 
1218*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_user_height_max(png_const_structrp png_ptr)1219*a67afe4dSAndroid Build Coastguard Worker png_get_user_height_max(png_const_structrp png_ptr)
1220*a67afe4dSAndroid Build Coastguard Worker {
1221*a67afe4dSAndroid Build Coastguard Worker    return (png_ptr ? png_ptr->user_height_max : 0);
1222*a67afe4dSAndroid Build Coastguard Worker }
1223*a67afe4dSAndroid Build Coastguard Worker 
1224*a67afe4dSAndroid Build Coastguard Worker /* This function was added to libpng 1.4.0 */
1225*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_chunk_cache_max(png_const_structrp png_ptr)1226*a67afe4dSAndroid Build Coastguard Worker png_get_chunk_cache_max(png_const_structrp png_ptr)
1227*a67afe4dSAndroid Build Coastguard Worker {
1228*a67afe4dSAndroid Build Coastguard Worker    return (png_ptr ? png_ptr->user_chunk_cache_max : 0);
1229*a67afe4dSAndroid Build Coastguard Worker }
1230*a67afe4dSAndroid Build Coastguard Worker 
1231*a67afe4dSAndroid Build Coastguard Worker /* This function was added to libpng 1.4.1 */
1232*a67afe4dSAndroid Build Coastguard Worker png_alloc_size_t PNGAPI
png_get_chunk_malloc_max(png_const_structrp png_ptr)1233*a67afe4dSAndroid Build Coastguard Worker png_get_chunk_malloc_max(png_const_structrp png_ptr)
1234*a67afe4dSAndroid Build Coastguard Worker {
1235*a67afe4dSAndroid Build Coastguard Worker    return (png_ptr ? png_ptr->user_chunk_malloc_max : 0);
1236*a67afe4dSAndroid Build Coastguard Worker }
1237*a67afe4dSAndroid Build Coastguard Worker #endif /* SET_USER_LIMITS */
1238*a67afe4dSAndroid Build Coastguard Worker 
1239*a67afe4dSAndroid Build Coastguard Worker /* These functions were added to libpng 1.4.0 */
1240*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_IO_STATE_SUPPORTED
1241*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_io_state(png_const_structrp png_ptr)1242*a67afe4dSAndroid Build Coastguard Worker png_get_io_state(png_const_structrp png_ptr)
1243*a67afe4dSAndroid Build Coastguard Worker {
1244*a67afe4dSAndroid Build Coastguard Worker    return png_ptr->io_state;
1245*a67afe4dSAndroid Build Coastguard Worker }
1246*a67afe4dSAndroid Build Coastguard Worker 
1247*a67afe4dSAndroid Build Coastguard Worker png_uint_32 PNGAPI
png_get_io_chunk_type(png_const_structrp png_ptr)1248*a67afe4dSAndroid Build Coastguard Worker png_get_io_chunk_type(png_const_structrp png_ptr)
1249*a67afe4dSAndroid Build Coastguard Worker {
1250*a67afe4dSAndroid Build Coastguard Worker    return png_ptr->chunk_name;
1251*a67afe4dSAndroid Build Coastguard Worker }
1252*a67afe4dSAndroid Build Coastguard Worker #endif /* IO_STATE */
1253*a67afe4dSAndroid Build Coastguard Worker 
1254*a67afe4dSAndroid Build Coastguard Worker #ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED
1255*a67afe4dSAndroid Build Coastguard Worker #  ifdef PNG_GET_PALETTE_MAX_SUPPORTED
1256*a67afe4dSAndroid Build Coastguard Worker int PNGAPI
png_get_palette_max(png_const_structp png_ptr,png_const_infop info_ptr)1257*a67afe4dSAndroid Build Coastguard Worker png_get_palette_max(png_const_structp png_ptr, png_const_infop info_ptr)
1258*a67afe4dSAndroid Build Coastguard Worker {
1259*a67afe4dSAndroid Build Coastguard Worker    if (png_ptr != NULL && info_ptr != NULL)
1260*a67afe4dSAndroid Build Coastguard Worker       return png_ptr->num_palette_max;
1261*a67afe4dSAndroid Build Coastguard Worker 
1262*a67afe4dSAndroid Build Coastguard Worker    return -1;
1263*a67afe4dSAndroid Build Coastguard Worker }
1264*a67afe4dSAndroid Build Coastguard Worker #  endif
1265*a67afe4dSAndroid Build Coastguard Worker #endif
1266*a67afe4dSAndroid Build Coastguard Worker 
1267*a67afe4dSAndroid Build Coastguard Worker #endif /* READ || WRITE */
1268