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