2 /* pngget.c - retrieval of values from info struct
\r
4 * Copyright (c) 2018 Cosmin Truta
\r
5 * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
\r
6 * Copyright (c) 1996-1997 Andreas Dilger
\r
7 * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
\r
9 * This code is released under the libpng license.
\r
10 * For conditions of distribution and use, see the disclaimer
\r
11 * and license in png.h
\r
15 #include "pngpriv.h"
\r
17 #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
\r
20 png_get_valid(png_const_structrp png_ptr, png_const_inforp info_ptr,
\r
23 if (png_ptr != NULL && info_ptr != NULL)
\r
24 return(info_ptr->valid & flag);
\r
30 png_get_rowbytes(png_const_structrp png_ptr, png_const_inforp info_ptr)
\r
32 if (png_ptr != NULL && info_ptr != NULL)
\r
33 return(info_ptr->rowbytes);
\r
38 #ifdef PNG_INFO_IMAGE_SUPPORTED
\r
40 png_get_rows(png_const_structrp png_ptr, png_const_inforp info_ptr)
\r
42 if (png_ptr != NULL && info_ptr != NULL)
\r
43 return(info_ptr->row_pointers);
\r
49 #ifdef PNG_EASY_ACCESS_SUPPORTED
\r
50 /* Easy access to info, added in libpng-0.99 */
\r
52 png_get_image_width(png_const_structrp png_ptr, png_const_inforp info_ptr)
\r
54 if (png_ptr != NULL && info_ptr != NULL)
\r
55 return info_ptr->width;
\r
61 png_get_image_height(png_const_structrp png_ptr, png_const_inforp info_ptr)
\r
63 if (png_ptr != NULL && info_ptr != NULL)
\r
64 return info_ptr->height;
\r
70 png_get_bit_depth(png_const_structrp png_ptr, png_const_inforp info_ptr)
\r
72 if (png_ptr != NULL && info_ptr != NULL)
\r
73 return info_ptr->bit_depth;
\r
79 png_get_color_type(png_const_structrp png_ptr, png_const_inforp info_ptr)
\r
81 if (png_ptr != NULL && info_ptr != NULL)
\r
82 return info_ptr->color_type;
\r
88 png_get_filter_type(png_const_structrp png_ptr, png_const_inforp info_ptr)
\r
90 if (png_ptr != NULL && info_ptr != NULL)
\r
91 return info_ptr->filter_type;
\r
97 png_get_interlace_type(png_const_structrp png_ptr, png_const_inforp info_ptr)
\r
99 if (png_ptr != NULL && info_ptr != NULL)
\r
100 return info_ptr->interlace_type;
\r
106 png_get_compression_type(png_const_structrp png_ptr, png_const_inforp info_ptr)
\r
108 if (png_ptr != NULL && info_ptr != NULL)
\r
109 return info_ptr->compression_type;
\r
115 png_get_x_pixels_per_meter(png_const_structrp png_ptr, png_const_inforp
\r
118 #ifdef PNG_pHYs_SUPPORTED
\r
119 if (png_ptr != NULL && info_ptr != NULL &&
\r
120 (info_ptr->valid & PNG_INFO_pHYs) != 0)
\r
122 png_debug1(1, "in %s retrieval function",
\r
123 "png_get_x_pixels_per_meter");
\r
125 if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER)
\r
126 return (info_ptr->x_pixels_per_unit);
\r
129 PNG_UNUSED(png_ptr)
\r
130 PNG_UNUSED(info_ptr)
\r
137 png_get_y_pixels_per_meter(png_const_structrp png_ptr, png_const_inforp
\r
140 #ifdef PNG_pHYs_SUPPORTED
\r
141 if (png_ptr != NULL && info_ptr != NULL &&
\r
142 (info_ptr->valid & PNG_INFO_pHYs) != 0)
\r
144 png_debug1(1, "in %s retrieval function",
\r
145 "png_get_y_pixels_per_meter");
\r
147 if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER)
\r
148 return (info_ptr->y_pixels_per_unit);
\r
151 PNG_UNUSED(png_ptr)
\r
152 PNG_UNUSED(info_ptr)
\r
159 png_get_pixels_per_meter(png_const_structrp png_ptr, png_const_inforp info_ptr)
\r
161 #ifdef PNG_pHYs_SUPPORTED
\r
162 if (png_ptr != NULL && info_ptr != NULL &&
\r
163 (info_ptr->valid & PNG_INFO_pHYs) != 0)
\r
165 png_debug1(1, "in %s retrieval function", "png_get_pixels_per_meter");
\r
167 if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER &&
\r
168 info_ptr->x_pixels_per_unit == info_ptr->y_pixels_per_unit)
\r
169 return (info_ptr->x_pixels_per_unit);
\r
172 PNG_UNUSED(png_ptr)
\r
173 PNG_UNUSED(info_ptr)
\r
179 #ifdef PNG_FLOATING_POINT_SUPPORTED
\r
181 png_get_pixel_aspect_ratio(png_const_structrp png_ptr, png_const_inforp
\r
184 #ifdef PNG_READ_pHYs_SUPPORTED
\r
185 if (png_ptr != NULL && info_ptr != NULL &&
\r
186 (info_ptr->valid & PNG_INFO_pHYs) != 0)
\r
188 png_debug1(1, "in %s retrieval function", "png_get_aspect_ratio");
\r
190 if (info_ptr->x_pixels_per_unit != 0)
\r
191 return ((float)((float)info_ptr->y_pixels_per_unit
\r
192 /(float)info_ptr->x_pixels_per_unit));
\r
195 PNG_UNUSED(png_ptr)
\r
196 PNG_UNUSED(info_ptr)
\r
199 return ((float)0.0);
\r
203 #ifdef PNG_FIXED_POINT_SUPPORTED
\r
204 png_fixed_point PNGAPI
\r
205 png_get_pixel_aspect_ratio_fixed(png_const_structrp png_ptr,
\r
206 png_const_inforp info_ptr)
\r
208 #ifdef PNG_READ_pHYs_SUPPORTED
\r
209 if (png_ptr != NULL && info_ptr != NULL &&
\r
210 (info_ptr->valid & PNG_INFO_pHYs) != 0 &&
\r
211 info_ptr->x_pixels_per_unit > 0 && info_ptr->y_pixels_per_unit > 0 &&
\r
212 info_ptr->x_pixels_per_unit <= PNG_UINT_31_MAX &&
\r
213 info_ptr->y_pixels_per_unit <= PNG_UINT_31_MAX)
\r
215 png_fixed_point res;
\r
217 png_debug1(1, "in %s retrieval function", "png_get_aspect_ratio_fixed");
\r
219 /* The following casts work because a PNG 4 byte integer only has a valid
\r
220 * range of 0..2^31-1; otherwise the cast might overflow.
\r
222 if (png_muldiv(&res, (png_int_32)info_ptr->y_pixels_per_unit, PNG_FP_1,
\r
223 (png_int_32)info_ptr->x_pixels_per_unit) != 0)
\r
227 PNG_UNUSED(png_ptr)
\r
228 PNG_UNUSED(info_ptr)
\r
236 png_get_x_offset_microns(png_const_structrp png_ptr, png_const_inforp info_ptr)
\r
238 #ifdef PNG_oFFs_SUPPORTED
\r
239 if (png_ptr != NULL && info_ptr != NULL &&
\r
240 (info_ptr->valid & PNG_INFO_oFFs) != 0)
\r
242 png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns");
\r
244 if (info_ptr->offset_unit_type == PNG_OFFSET_MICROMETER)
\r
245 return (info_ptr->x_offset);
\r
248 PNG_UNUSED(png_ptr)
\r
249 PNG_UNUSED(info_ptr)
\r
256 png_get_y_offset_microns(png_const_structrp png_ptr, png_const_inforp info_ptr)
\r
258 #ifdef PNG_oFFs_SUPPORTED
\r
259 if (png_ptr != NULL && info_ptr != NULL &&
\r
260 (info_ptr->valid & PNG_INFO_oFFs) != 0)
\r
262 png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns");
\r
264 if (info_ptr->offset_unit_type == PNG_OFFSET_MICROMETER)
\r
265 return (info_ptr->y_offset);
\r
268 PNG_UNUSED(png_ptr)
\r
269 PNG_UNUSED(info_ptr)
\r
276 png_get_x_offset_pixels(png_const_structrp png_ptr, png_const_inforp info_ptr)
\r
278 #ifdef PNG_oFFs_SUPPORTED
\r
279 if (png_ptr != NULL && info_ptr != NULL &&
\r
280 (info_ptr->valid & PNG_INFO_oFFs) != 0)
\r
282 png_debug1(1, "in %s retrieval function", "png_get_x_offset_pixels");
\r
284 if (info_ptr->offset_unit_type == PNG_OFFSET_PIXEL)
\r
285 return (info_ptr->x_offset);
\r
288 PNG_UNUSED(png_ptr)
\r
289 PNG_UNUSED(info_ptr)
\r
296 png_get_y_offset_pixels(png_const_structrp png_ptr, png_const_inforp info_ptr)
\r
298 #ifdef PNG_oFFs_SUPPORTED
\r
299 if (png_ptr != NULL && info_ptr != NULL &&
\r
300 (info_ptr->valid & PNG_INFO_oFFs) != 0)
\r
302 png_debug1(1, "in %s retrieval function", "png_get_y_offset_pixels");
\r
304 if (info_ptr->offset_unit_type == PNG_OFFSET_PIXEL)
\r
305 return (info_ptr->y_offset);
\r
308 PNG_UNUSED(png_ptr)
\r
309 PNG_UNUSED(info_ptr)
\r
315 #ifdef PNG_INCH_CONVERSIONS_SUPPORTED
\r
317 ppi_from_ppm(png_uint_32 ppm)
\r
320 /* The conversion is *(2.54/100), in binary (32 digits):
\r
321 * .00000110100000001001110101001001
\r
323 png_uint_32 t1001, t1101;
\r
324 ppm >>= 1; /* .1 */
\r
325 t1001 = ppm + (ppm >> 3); /* .1001 */
\r
326 t1101 = t1001 + (ppm >> 1); /* .1101 */
\r
327 ppm >>= 20; /* .000000000000000000001 */
\r
328 t1101 += t1101 >> 15; /* .1101000000000001101 */
\r
329 t1001 >>= 11; /* .000000000001001 */
\r
330 t1001 += t1001 >> 12; /* .000000000001001000000001001 */
\r
331 ppm += t1001; /* .000000000001001000001001001 */
\r
332 ppm += t1101; /* .110100000001001110101001001 */
\r
333 return (ppm + 16) >> 5;/* .00000110100000001001110101001001 */
\r
335 /* The argument is a PNG unsigned integer, so it is not permitted
\r
336 * to be bigger than 2^31.
\r
338 png_fixed_point result;
\r
339 if (ppm <= PNG_UINT_31_MAX && png_muldiv(&result, (png_int_32)ppm, 127,
\r
341 return (png_uint_32)result;
\r
349 png_get_pixels_per_inch(png_const_structrp png_ptr, png_const_inforp info_ptr)
\r
351 return ppi_from_ppm(png_get_pixels_per_meter(png_ptr, info_ptr));
\r
355 png_get_x_pixels_per_inch(png_const_structrp png_ptr, png_const_inforp info_ptr)
\r
357 return ppi_from_ppm(png_get_x_pixels_per_meter(png_ptr, info_ptr));
\r
361 png_get_y_pixels_per_inch(png_const_structrp png_ptr, png_const_inforp info_ptr)
\r
363 return ppi_from_ppm(png_get_y_pixels_per_meter(png_ptr, info_ptr));
\r
366 #ifdef PNG_FIXED_POINT_SUPPORTED
\r
367 static png_fixed_point
\r
368 png_fixed_inches_from_microns(png_const_structrp png_ptr, png_int_32 microns)
\r
370 /* Convert from meters * 1,000,000 to inches * 100,000, meters to
\r
371 * inches is simply *(100/2.54), so we want *(10/2.54) == 500/127.
\r
372 * Notice that this can overflow - a warning is output and 0 is
\r
375 return png_muldiv_warn(png_ptr, microns, 500, 127);
\r
378 png_fixed_point PNGAPI
\r
379 png_get_x_offset_inches_fixed(png_const_structrp png_ptr,
\r
380 png_const_inforp info_ptr)
\r
382 return png_fixed_inches_from_microns(png_ptr,
\r
383 png_get_x_offset_microns(png_ptr, info_ptr));
\r
387 #ifdef PNG_FIXED_POINT_SUPPORTED
\r
388 png_fixed_point PNGAPI
\r
389 png_get_y_offset_inches_fixed(png_const_structrp png_ptr,
\r
390 png_const_inforp info_ptr)
\r
392 return png_fixed_inches_from_microns(png_ptr,
\r
393 png_get_y_offset_microns(png_ptr, info_ptr));
\r
397 #ifdef PNG_FLOATING_POINT_SUPPORTED
\r
399 png_get_x_offset_inches(png_const_structrp png_ptr, png_const_inforp info_ptr)
\r
401 /* To avoid the overflow do the conversion directly in floating
\r
404 return (float)(png_get_x_offset_microns(png_ptr, info_ptr) * .00003937);
\r
408 #ifdef PNG_FLOATING_POINT_SUPPORTED
\r
410 png_get_y_offset_inches(png_const_structrp png_ptr, png_const_inforp info_ptr)
\r
412 /* To avoid the overflow do the conversion directly in floating
\r
415 return (float)(png_get_y_offset_microns(png_ptr, info_ptr) * .00003937);
\r
419 #ifdef PNG_pHYs_SUPPORTED
\r
421 png_get_pHYs_dpi(png_const_structrp png_ptr, png_const_inforp info_ptr,
\r
422 png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)
\r
424 png_uint_32 retval = 0;
\r
426 if (png_ptr != NULL && info_ptr != NULL &&
\r
427 (info_ptr->valid & PNG_INFO_pHYs) != 0)
\r
429 png_debug1(1, "in %s retrieval function", "pHYs");
\r
433 *res_x = info_ptr->x_pixels_per_unit;
\r
434 retval |= PNG_INFO_pHYs;
\r
439 *res_y = info_ptr->y_pixels_per_unit;
\r
440 retval |= PNG_INFO_pHYs;
\r
443 if (unit_type != NULL)
\r
445 *unit_type = (int)info_ptr->phys_unit_type;
\r
446 retval |= PNG_INFO_pHYs;
\r
448 if (*unit_type == 1)
\r
450 if (res_x != NULL) *res_x = (png_uint_32)(*res_x * .0254 + .50);
\r
451 if (res_y != NULL) *res_y = (png_uint_32)(*res_y * .0254 + .50);
\r
459 #endif /* INCH_CONVERSIONS */
\r
461 /* png_get_channels really belongs in here, too, but it's been around longer */
\r
463 #endif /* EASY_ACCESS */
\r
467 png_get_channels(png_const_structrp png_ptr, png_const_inforp info_ptr)
\r
469 if (png_ptr != NULL && info_ptr != NULL)
\r
470 return(info_ptr->channels);
\r
475 #ifdef PNG_READ_SUPPORTED
\r
476 png_const_bytep PNGAPI
\r
477 png_get_signature(png_const_structrp png_ptr, png_const_inforp info_ptr)
\r
479 if (png_ptr != NULL && info_ptr != NULL)
\r
480 return(info_ptr->signature);
\r
486 #ifdef PNG_bKGD_SUPPORTED
\r
488 png_get_bKGD(png_const_structrp png_ptr, png_inforp info_ptr,
\r
489 png_color_16p *background)
\r
491 if (png_ptr != NULL && info_ptr != NULL &&
\r
492 (info_ptr->valid & PNG_INFO_bKGD) != 0 &&
\r
493 background != NULL)
\r
495 png_debug1(1, "in %s retrieval function", "bKGD");
\r
497 *background = &(info_ptr->background);
\r
498 return (PNG_INFO_bKGD);
\r
505 #ifdef PNG_cHRM_SUPPORTED
\r
506 /* The XYZ APIs were added in 1.5.5 to take advantage of the code added at the
\r
507 * same time to correct the rgb grayscale coefficient defaults obtained from the
\r
508 * cHRM chunk in 1.5.4
\r
510 # ifdef PNG_FLOATING_POINT_SUPPORTED
\r
512 png_get_cHRM(png_const_structrp png_ptr, png_const_inforp info_ptr,
\r
513 double *white_x, double *white_y, double *red_x, double *red_y,
\r
514 double *green_x, double *green_y, double *blue_x, double *blue_y)
\r
516 /* Quiet API change: this code used to only return the end points if a cHRM
\r
517 * chunk was present, but the end points can also come from iCCP or sRGB
\r
518 * chunks, so in 1.6.0 the png_get_ APIs return the end points regardless and
\r
519 * the png_set_ APIs merely check that set end points are mutually
\r
522 if (png_ptr != NULL && info_ptr != NULL &&
\r
523 (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
\r
525 png_debug1(1, "in %s retrieval function", "cHRM");
\r
527 if (white_x != NULL)
\r
528 *white_x = png_float(png_ptr,
\r
529 info_ptr->colorspace.end_points_xy.whitex, "cHRM white X");
\r
530 if (white_y != NULL)
\r
531 *white_y = png_float(png_ptr,
\r
532 info_ptr->colorspace.end_points_xy.whitey, "cHRM white Y");
\r
534 *red_x = png_float(png_ptr, info_ptr->colorspace.end_points_xy.redx,
\r
537 *red_y = png_float(png_ptr, info_ptr->colorspace.end_points_xy.redy,
\r
539 if (green_x != NULL)
\r
540 *green_x = png_float(png_ptr,
\r
541 info_ptr->colorspace.end_points_xy.greenx, "cHRM green X");
\r
542 if (green_y != NULL)
\r
543 *green_y = png_float(png_ptr,
\r
544 info_ptr->colorspace.end_points_xy.greeny, "cHRM green Y");
\r
545 if (blue_x != NULL)
\r
546 *blue_x = png_float(png_ptr, info_ptr->colorspace.end_points_xy.bluex,
\r
548 if (blue_y != NULL)
\r
549 *blue_y = png_float(png_ptr, info_ptr->colorspace.end_points_xy.bluey,
\r
551 return (PNG_INFO_cHRM);
\r
558 png_get_cHRM_XYZ(png_const_structrp png_ptr, png_const_inforp info_ptr,
\r
559 double *red_X, double *red_Y, double *red_Z, double *green_X,
\r
560 double *green_Y, double *green_Z, double *blue_X, double *blue_Y,
\r
563 if (png_ptr != NULL && info_ptr != NULL &&
\r
564 (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
\r
566 png_debug1(1, "in %s retrieval function", "cHRM_XYZ(float)");
\r
569 *red_X = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_X,
\r
572 *red_Y = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_Y,
\r
575 *red_Z = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_Z,
\r
577 if (green_X != NULL)
\r
578 *green_X = png_float(png_ptr,
\r
579 info_ptr->colorspace.end_points_XYZ.green_X, "cHRM green X");
\r
580 if (green_Y != NULL)
\r
581 *green_Y = png_float(png_ptr,
\r
582 info_ptr->colorspace.end_points_XYZ.green_Y, "cHRM green Y");
\r
583 if (green_Z != NULL)
\r
584 *green_Z = png_float(png_ptr,
\r
585 info_ptr->colorspace.end_points_XYZ.green_Z, "cHRM green Z");
\r
586 if (blue_X != NULL)
\r
587 *blue_X = png_float(png_ptr,
\r
588 info_ptr->colorspace.end_points_XYZ.blue_X, "cHRM blue X");
\r
589 if (blue_Y != NULL)
\r
590 *blue_Y = png_float(png_ptr,
\r
591 info_ptr->colorspace.end_points_XYZ.blue_Y, "cHRM blue Y");
\r
592 if (blue_Z != NULL)
\r
593 *blue_Z = png_float(png_ptr,
\r
594 info_ptr->colorspace.end_points_XYZ.blue_Z, "cHRM blue Z");
\r
595 return (PNG_INFO_cHRM);
\r
602 # ifdef PNG_FIXED_POINT_SUPPORTED
\r
604 png_get_cHRM_XYZ_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,
\r
605 png_fixed_point *int_red_X, png_fixed_point *int_red_Y,
\r
606 png_fixed_point *int_red_Z, png_fixed_point *int_green_X,
\r
607 png_fixed_point *int_green_Y, png_fixed_point *int_green_Z,
\r
608 png_fixed_point *int_blue_X, png_fixed_point *int_blue_Y,
\r
609 png_fixed_point *int_blue_Z)
\r
611 if (png_ptr != NULL && info_ptr != NULL &&
\r
612 (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
\r
614 png_debug1(1, "in %s retrieval function", "cHRM_XYZ");
\r
616 if (int_red_X != NULL)
\r
617 *int_red_X = info_ptr->colorspace.end_points_XYZ.red_X;
\r
618 if (int_red_Y != NULL)
\r
619 *int_red_Y = info_ptr->colorspace.end_points_XYZ.red_Y;
\r
620 if (int_red_Z != NULL)
\r
621 *int_red_Z = info_ptr->colorspace.end_points_XYZ.red_Z;
\r
622 if (int_green_X != NULL)
\r
623 *int_green_X = info_ptr->colorspace.end_points_XYZ.green_X;
\r
624 if (int_green_Y != NULL)
\r
625 *int_green_Y = info_ptr->colorspace.end_points_XYZ.green_Y;
\r
626 if (int_green_Z != NULL)
\r
627 *int_green_Z = info_ptr->colorspace.end_points_XYZ.green_Z;
\r
628 if (int_blue_X != NULL)
\r
629 *int_blue_X = info_ptr->colorspace.end_points_XYZ.blue_X;
\r
630 if (int_blue_Y != NULL)
\r
631 *int_blue_Y = info_ptr->colorspace.end_points_XYZ.blue_Y;
\r
632 if (int_blue_Z != NULL)
\r
633 *int_blue_Z = info_ptr->colorspace.end_points_XYZ.blue_Z;
\r
634 return (PNG_INFO_cHRM);
\r
641 png_get_cHRM_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,
\r
642 png_fixed_point *white_x, png_fixed_point *white_y, png_fixed_point *red_x,
\r
643 png_fixed_point *red_y, png_fixed_point *green_x, png_fixed_point *green_y,
\r
644 png_fixed_point *blue_x, png_fixed_point *blue_y)
\r
646 png_debug1(1, "in %s retrieval function", "cHRM");
\r
648 if (png_ptr != NULL && info_ptr != NULL &&
\r
649 (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
\r
651 if (white_x != NULL)
\r
652 *white_x = info_ptr->colorspace.end_points_xy.whitex;
\r
653 if (white_y != NULL)
\r
654 *white_y = info_ptr->colorspace.end_points_xy.whitey;
\r
656 *red_x = info_ptr->colorspace.end_points_xy.redx;
\r
658 *red_y = info_ptr->colorspace.end_points_xy.redy;
\r
659 if (green_x != NULL)
\r
660 *green_x = info_ptr->colorspace.end_points_xy.greenx;
\r
661 if (green_y != NULL)
\r
662 *green_y = info_ptr->colorspace.end_points_xy.greeny;
\r
663 if (blue_x != NULL)
\r
664 *blue_x = info_ptr->colorspace.end_points_xy.bluex;
\r
665 if (blue_y != NULL)
\r
666 *blue_y = info_ptr->colorspace.end_points_xy.bluey;
\r
667 return (PNG_INFO_cHRM);
\r
675 #ifdef PNG_gAMA_SUPPORTED
\r
676 # ifdef PNG_FIXED_POINT_SUPPORTED
\r
678 png_get_gAMA_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,
\r
679 png_fixed_point *file_gamma)
\r
681 png_debug1(1, "in %s retrieval function", "gAMA");
\r
683 if (png_ptr != NULL && info_ptr != NULL &&
\r
684 (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) != 0 &&
\r
685 file_gamma != NULL)
\r
687 *file_gamma = info_ptr->colorspace.gamma;
\r
688 return (PNG_INFO_gAMA);
\r
695 # ifdef PNG_FLOATING_POINT_SUPPORTED
\r
697 png_get_gAMA(png_const_structrp png_ptr, png_const_inforp info_ptr,
\r
698 double *file_gamma)
\r
700 png_debug1(1, "in %s retrieval function", "gAMA(float)");
\r
702 if (png_ptr != NULL && info_ptr != NULL &&
\r
703 (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) != 0 &&
\r
704 file_gamma != NULL)
\r
706 *file_gamma = png_float(png_ptr, info_ptr->colorspace.gamma,
\r
708 return (PNG_INFO_gAMA);
\r
716 #ifdef PNG_sRGB_SUPPORTED
\r
718 png_get_sRGB(png_const_structrp png_ptr, png_const_inforp info_ptr,
\r
719 int *file_srgb_intent)
\r
721 png_debug1(1, "in %s retrieval function", "sRGB");
\r
723 if (png_ptr != NULL && info_ptr != NULL &&
\r
724 (info_ptr->valid & PNG_INFO_sRGB) != 0 && file_srgb_intent != NULL)
\r
726 *file_srgb_intent = info_ptr->colorspace.rendering_intent;
\r
727 return (PNG_INFO_sRGB);
\r
734 #ifdef PNG_iCCP_SUPPORTED
\r
736 png_get_iCCP(png_const_structrp png_ptr, png_inforp info_ptr,
\r
737 png_charpp name, int *compression_type,
\r
738 png_bytepp profile, png_uint_32 *proflen)
\r
740 png_debug1(1, "in %s retrieval function", "iCCP");
\r
742 if (png_ptr != NULL && info_ptr != NULL &&
\r
743 (info_ptr->valid & PNG_INFO_iCCP) != 0 &&
\r
744 name != NULL && profile != NULL && proflen != NULL)
\r
746 *name = info_ptr->iccp_name;
\r
747 *profile = info_ptr->iccp_profile;
\r
748 *proflen = png_get_uint_32(info_ptr->iccp_profile);
\r
749 /* This is somewhat irrelevant since the profile data returned has
\r
750 * actually been uncompressed.
\r
752 if (compression_type != NULL)
\r
753 *compression_type = PNG_COMPRESSION_TYPE_BASE;
\r
754 return (PNG_INFO_iCCP);
\r
762 #ifdef PNG_sPLT_SUPPORTED
\r
764 png_get_sPLT(png_const_structrp png_ptr, png_inforp info_ptr,
\r
765 png_sPLT_tpp spalettes)
\r
767 if (png_ptr != NULL && info_ptr != NULL && spalettes != NULL)
\r
769 *spalettes = info_ptr->splt_palettes;
\r
770 return info_ptr->splt_palettes_num;
\r
777 #ifdef PNG_eXIf_SUPPORTED
\r
779 png_get_eXIf(png_const_structrp png_ptr, png_inforp info_ptr,
\r
782 png_warning(png_ptr, "png_get_eXIf does not work; use png_get_eXIf_1");
\r
783 PNG_UNUSED(info_ptr)
\r
789 png_get_eXIf_1(png_const_structrp png_ptr, png_const_inforp info_ptr,
\r
790 png_uint_32 *num_exif, png_bytep *exif)
\r
792 png_debug1(1, "in %s retrieval function", "eXIf");
\r
794 if (png_ptr != NULL && info_ptr != NULL &&
\r
795 (info_ptr->valid & PNG_INFO_eXIf) != 0 && exif != NULL)
\r
797 *num_exif = info_ptr->num_exif;
\r
798 *exif = info_ptr->exif;
\r
799 return (PNG_INFO_eXIf);
\r
806 #ifdef PNG_hIST_SUPPORTED
\r
808 png_get_hIST(png_const_structrp png_ptr, png_inforp info_ptr,
\r
809 png_uint_16p *hist)
\r
811 png_debug1(1, "in %s retrieval function", "hIST");
\r
813 if (png_ptr != NULL && info_ptr != NULL &&
\r
814 (info_ptr->valid & PNG_INFO_hIST) != 0 && hist != NULL)
\r
816 *hist = info_ptr->hist;
\r
817 return (PNG_INFO_hIST);
\r
825 png_get_IHDR(png_const_structrp png_ptr, png_const_inforp info_ptr,
\r
826 png_uint_32 *width, png_uint_32 *height, int *bit_depth,
\r
827 int *color_type, int *interlace_type, int *compression_type,
\r
830 png_debug1(1, "in %s retrieval function", "IHDR");
\r
832 if (png_ptr == NULL || info_ptr == NULL)
\r
836 *width = info_ptr->width;
\r
838 if (height != NULL)
\r
839 *height = info_ptr->height;
\r
841 if (bit_depth != NULL)
\r
842 *bit_depth = info_ptr->bit_depth;
\r
844 if (color_type != NULL)
\r
845 *color_type = info_ptr->color_type;
\r
847 if (compression_type != NULL)
\r
848 *compression_type = info_ptr->compression_type;
\r
850 if (filter_type != NULL)
\r
851 *filter_type = info_ptr->filter_type;
\r
853 if (interlace_type != NULL)
\r
854 *interlace_type = info_ptr->interlace_type;
\r
856 /* This is redundant if we can be sure that the info_ptr values were all
\r
857 * assigned in png_set_IHDR(). We do the check anyhow in case an
\r
858 * application has ignored our advice not to mess with the members
\r
859 * of info_ptr directly.
\r
861 png_check_IHDR(png_ptr, info_ptr->width, info_ptr->height,
\r
862 info_ptr->bit_depth, info_ptr->color_type, info_ptr->interlace_type,
\r
863 info_ptr->compression_type, info_ptr->filter_type);
\r
868 #ifdef PNG_oFFs_SUPPORTED
\r
870 png_get_oFFs(png_const_structrp png_ptr, png_const_inforp info_ptr,
\r
871 png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type)
\r
873 png_debug1(1, "in %s retrieval function", "oFFs");
\r
875 if (png_ptr != NULL && info_ptr != NULL &&
\r
876 (info_ptr->valid & PNG_INFO_oFFs) != 0 &&
\r
877 offset_x != NULL && offset_y != NULL && unit_type != NULL)
\r
879 *offset_x = info_ptr->x_offset;
\r
880 *offset_y = info_ptr->y_offset;
\r
881 *unit_type = (int)info_ptr->offset_unit_type;
\r
882 return (PNG_INFO_oFFs);
\r
889 #ifdef PNG_pCAL_SUPPORTED
\r
891 png_get_pCAL(png_const_structrp png_ptr, png_inforp info_ptr,
\r
892 png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams,
\r
893 png_charp *units, png_charpp *params)
\r
895 png_debug1(1, "in %s retrieval function", "pCAL");
\r
897 if (png_ptr != NULL && info_ptr != NULL &&
\r
898 (info_ptr->valid & PNG_INFO_pCAL) != 0 &&
\r
899 purpose != NULL && X0 != NULL && X1 != NULL && type != NULL &&
\r
900 nparams != NULL && units != NULL && params != NULL)
\r
902 *purpose = info_ptr->pcal_purpose;
\r
903 *X0 = info_ptr->pcal_X0;
\r
904 *X1 = info_ptr->pcal_X1;
\r
905 *type = (int)info_ptr->pcal_type;
\r
906 *nparams = (int)info_ptr->pcal_nparams;
\r
907 *units = info_ptr->pcal_units;
\r
908 *params = info_ptr->pcal_params;
\r
909 return (PNG_INFO_pCAL);
\r
916 #ifdef PNG_sCAL_SUPPORTED
\r
917 # ifdef PNG_FIXED_POINT_SUPPORTED
\r
918 # if defined(PNG_FLOATING_ARITHMETIC_SUPPORTED) || \
\r
919 defined(PNG_FLOATING_POINT_SUPPORTED)
\r
921 png_get_sCAL_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,
\r
922 int *unit, png_fixed_point *width, png_fixed_point *height)
\r
924 if (png_ptr != NULL && info_ptr != NULL &&
\r
925 (info_ptr->valid & PNG_INFO_sCAL) != 0)
\r
927 *unit = info_ptr->scal_unit;
\r
928 /*TODO: make this work without FP support; the API is currently eliminated
\r
929 * if neither floating point APIs nor internal floating point arithmetic
\r
932 *width = png_fixed(png_ptr, atof(info_ptr->scal_s_width), "sCAL width");
\r
933 *height = png_fixed(png_ptr, atof(info_ptr->scal_s_height),
\r
935 return (PNG_INFO_sCAL);
\r
940 # endif /* FLOATING_ARITHMETIC */
\r
941 # endif /* FIXED_POINT */
\r
942 # ifdef PNG_FLOATING_POINT_SUPPORTED
\r
944 png_get_sCAL(png_const_structrp png_ptr, png_const_inforp info_ptr,
\r
945 int *unit, double *width, double *height)
\r
947 if (png_ptr != NULL && info_ptr != NULL &&
\r
948 (info_ptr->valid & PNG_INFO_sCAL) != 0)
\r
950 *unit = info_ptr->scal_unit;
\r
951 *width = atof(info_ptr->scal_s_width);
\r
952 *height = atof(info_ptr->scal_s_height);
\r
953 return (PNG_INFO_sCAL);
\r
958 # endif /* FLOATING POINT */
\r
960 png_get_sCAL_s(png_const_structrp png_ptr, png_const_inforp info_ptr,
\r
961 int *unit, png_charpp width, png_charpp height)
\r
963 if (png_ptr != NULL && info_ptr != NULL &&
\r
964 (info_ptr->valid & PNG_INFO_sCAL) != 0)
\r
966 *unit = info_ptr->scal_unit;
\r
967 *width = info_ptr->scal_s_width;
\r
968 *height = info_ptr->scal_s_height;
\r
969 return (PNG_INFO_sCAL);
\r
976 #ifdef PNG_pHYs_SUPPORTED
\r
978 png_get_pHYs(png_const_structrp png_ptr, png_const_inforp info_ptr,
\r
979 png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)
\r
981 png_uint_32 retval = 0;
\r
983 png_debug1(1, "in %s retrieval function", "pHYs");
\r
985 if (png_ptr != NULL && info_ptr != NULL &&
\r
986 (info_ptr->valid & PNG_INFO_pHYs) != 0)
\r
990 *res_x = info_ptr->x_pixels_per_unit;
\r
991 retval |= PNG_INFO_pHYs;
\r
996 *res_y = info_ptr->y_pixels_per_unit;
\r
997 retval |= PNG_INFO_pHYs;
\r
1000 if (unit_type != NULL)
\r
1002 *unit_type = (int)info_ptr->phys_unit_type;
\r
1003 retval |= PNG_INFO_pHYs;
\r
1011 png_uint_32 PNGAPI
\r
1012 png_get_PLTE(png_const_structrp png_ptr, png_inforp info_ptr,
\r
1013 png_colorp *palette, int *num_palette)
\r
1015 png_debug1(1, "in %s retrieval function", "PLTE");
\r
1017 if (png_ptr != NULL && info_ptr != NULL &&
\r
1018 (info_ptr->valid & PNG_INFO_PLTE) != 0 && palette != NULL)
\r
1020 *palette = info_ptr->palette;
\r
1021 *num_palette = info_ptr->num_palette;
\r
1022 png_debug1(3, "num_palette = %d", *num_palette);
\r
1023 return (PNG_INFO_PLTE);
\r
1029 #ifdef PNG_sBIT_SUPPORTED
\r
1030 png_uint_32 PNGAPI
\r
1031 png_get_sBIT(png_const_structrp png_ptr, png_inforp info_ptr,
\r
1032 png_color_8p *sig_bit)
\r
1034 png_debug1(1, "in %s retrieval function", "sBIT");
\r
1036 if (png_ptr != NULL && info_ptr != NULL &&
\r
1037 (info_ptr->valid & PNG_INFO_sBIT) != 0 && sig_bit != NULL)
\r
1039 *sig_bit = &(info_ptr->sig_bit);
\r
1040 return (PNG_INFO_sBIT);
\r
1047 #ifdef PNG_TEXT_SUPPORTED
\r
1049 png_get_text(png_const_structrp png_ptr, png_inforp info_ptr,
\r
1050 png_textp *text_ptr, int *num_text)
\r
1052 if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0)
\r
1054 png_debug1(1, "in 0x%lx retrieval function",
\r
1055 (unsigned long)png_ptr->chunk_name);
\r
1057 if (text_ptr != NULL)
\r
1058 *text_ptr = info_ptr->text;
\r
1060 if (num_text != NULL)
\r
1061 *num_text = info_ptr->num_text;
\r
1063 return info_ptr->num_text;
\r
1066 if (num_text != NULL)
\r
1073 #ifdef PNG_tIME_SUPPORTED
\r
1074 png_uint_32 PNGAPI
\r
1075 png_get_tIME(png_const_structrp png_ptr, png_inforp info_ptr,
\r
1076 png_timep *mod_time)
\r
1078 png_debug1(1, "in %s retrieval function", "tIME");
\r
1080 if (png_ptr != NULL && info_ptr != NULL &&
\r
1081 (info_ptr->valid & PNG_INFO_tIME) != 0 && mod_time != NULL)
\r
1083 *mod_time = &(info_ptr->mod_time);
\r
1084 return (PNG_INFO_tIME);
\r
1091 #ifdef PNG_tRNS_SUPPORTED
\r
1092 png_uint_32 PNGAPI
\r
1093 png_get_tRNS(png_const_structrp png_ptr, png_inforp info_ptr,
\r
1094 png_bytep *trans_alpha, int *num_trans, png_color_16p *trans_color)
\r
1096 png_uint_32 retval = 0;
\r
1097 if (png_ptr != NULL && info_ptr != NULL &&
\r
1098 (info_ptr->valid & PNG_INFO_tRNS) != 0)
\r
1100 png_debug1(1, "in %s retrieval function", "tRNS");
\r
1102 if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
\r
1104 if (trans_alpha != NULL)
\r
1106 *trans_alpha = info_ptr->trans_alpha;
\r
1107 retval |= PNG_INFO_tRNS;
\r
1110 if (trans_color != NULL)
\r
1111 *trans_color = &(info_ptr->trans_color);
\r
1114 else /* if (info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) */
\r
1116 if (trans_color != NULL)
\r
1118 *trans_color = &(info_ptr->trans_color);
\r
1119 retval |= PNG_INFO_tRNS;
\r
1122 if (trans_alpha != NULL)
\r
1123 *trans_alpha = NULL;
\r
1126 if (num_trans != NULL)
\r
1128 *num_trans = info_ptr->num_trans;
\r
1129 retval |= PNG_INFO_tRNS;
\r
1137 #ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
\r
1139 png_get_unknown_chunks(png_const_structrp png_ptr, png_inforp info_ptr,
\r
1140 png_unknown_chunkpp unknowns)
\r
1142 if (png_ptr != NULL && info_ptr != NULL && unknowns != NULL)
\r
1144 *unknowns = info_ptr->unknown_chunks;
\r
1145 return info_ptr->unknown_chunks_num;
\r
1152 #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
\r
1154 png_get_rgb_to_gray_status (png_const_structrp png_ptr)
\r
1156 return (png_byte)(png_ptr ? png_ptr->rgb_to_gray_status : 0);
\r
1160 #ifdef PNG_USER_CHUNKS_SUPPORTED
\r
1162 png_get_user_chunk_ptr(png_const_structrp png_ptr)
\r
1164 return (png_ptr ? png_ptr->user_chunk_ptr : NULL);
\r
1169 png_get_compression_buffer_size(png_const_structrp png_ptr)
\r
1171 if (png_ptr == NULL)
\r
1174 #ifdef PNG_WRITE_SUPPORTED
\r
1175 if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
\r
1178 #ifdef PNG_SEQUENTIAL_READ_SUPPORTED
\r
1179 return png_ptr->IDAT_read_size;
\r
1181 return PNG_IDAT_READ_SIZE;
\r
1185 #ifdef PNG_WRITE_SUPPORTED
\r
1187 return png_ptr->zbuffer_size;
\r
1191 #ifdef PNG_SET_USER_LIMITS_SUPPORTED
\r
1192 /* These functions were added to libpng 1.2.6 and were enabled
\r
1193 * by default in libpng-1.4.0 */
\r
1194 png_uint_32 PNGAPI
\r
1195 png_get_user_width_max (png_const_structrp png_ptr)
\r
1197 return (png_ptr ? png_ptr->user_width_max : 0);
\r
1200 png_uint_32 PNGAPI
\r
1201 png_get_user_height_max (png_const_structrp png_ptr)
\r
1203 return (png_ptr ? png_ptr->user_height_max : 0);
\r
1206 /* This function was added to libpng 1.4.0 */
\r
1207 png_uint_32 PNGAPI
\r
1208 png_get_chunk_cache_max (png_const_structrp png_ptr)
\r
1210 return (png_ptr ? png_ptr->user_chunk_cache_max : 0);
\r
1213 /* This function was added to libpng 1.4.1 */
\r
1214 png_alloc_size_t PNGAPI
\r
1215 png_get_chunk_malloc_max (png_const_structrp png_ptr)
\r
1217 return (png_ptr ? png_ptr->user_chunk_malloc_max : 0);
\r
1219 #endif /* SET_USER_LIMITS */
\r
1221 /* These functions were added to libpng 1.4.0 */
\r
1222 #ifdef PNG_IO_STATE_SUPPORTED
\r
1223 png_uint_32 PNGAPI
\r
1224 png_get_io_state (png_const_structrp png_ptr)
\r
1226 return png_ptr->io_state;
\r
1229 png_uint_32 PNGAPI
\r
1230 png_get_io_chunk_type (png_const_structrp png_ptr)
\r
1232 return png_ptr->chunk_name;
\r
1234 #endif /* IO_STATE */
\r
1236 #ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED
\r
1237 # ifdef PNG_GET_PALETTE_MAX_SUPPORTED
\r
1239 png_get_palette_max(png_const_structp png_ptr, png_const_infop info_ptr)
\r
1241 if (png_ptr != NULL && info_ptr != NULL)
\r
1242 return png_ptr->num_palette_max;
\r
1249 #endif /* READ || WRITE */
\r