2 /* pngget.c - retrieval of values from info struct
4 * Last changed in libpng 1.5.6 [November 3, 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.)
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
17 #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
20 png_get_valid(png_const_structp png_ptr
, png_const_infop info_ptr
,
23 if (png_ptr
!= NULL
&& info_ptr
!= NULL
)
24 return(info_ptr
->valid
& flag
);
30 png_get_rowbytes(png_const_structp png_ptr
, png_const_infop info_ptr
)
32 if (png_ptr
!= NULL
&& info_ptr
!= NULL
)
33 return(info_ptr
->rowbytes
);
38 #ifdef PNG_INFO_IMAGE_SUPPORTED
40 png_get_rows(png_const_structp png_ptr
, png_const_infop info_ptr
)
42 if (png_ptr
!= NULL
&& info_ptr
!= NULL
)
43 return(info_ptr
->row_pointers
);
49 #ifdef PNG_EASY_ACCESS_SUPPORTED
50 /* Easy access to info, added in libpng-0.99 */
52 png_get_image_width(png_const_structp png_ptr
, png_const_infop info_ptr
)
54 if (png_ptr
!= NULL
&& info_ptr
!= NULL
)
55 return info_ptr
->width
;
61 png_get_image_height(png_const_structp png_ptr
, png_const_infop info_ptr
)
63 if (png_ptr
!= NULL
&& info_ptr
!= NULL
)
64 return info_ptr
->height
;
70 png_get_bit_depth(png_const_structp png_ptr
, png_const_infop info_ptr
)
72 if (png_ptr
!= NULL
&& info_ptr
!= NULL
)
73 return info_ptr
->bit_depth
;
79 png_get_color_type(png_const_structp png_ptr
, png_const_infop info_ptr
)
81 if (png_ptr
!= NULL
&& info_ptr
!= NULL
)
82 return info_ptr
->color_type
;
88 png_get_filter_type(png_const_structp png_ptr
, png_const_infop info_ptr
)
90 if (png_ptr
!= NULL
&& info_ptr
!= NULL
)
91 return info_ptr
->filter_type
;
97 png_get_interlace_type(png_const_structp png_ptr
, png_const_infop info_ptr
)
99 if (png_ptr
!= NULL
&& info_ptr
!= NULL
)
100 return info_ptr
->interlace_type
;
106 png_get_compression_type(png_const_structp png_ptr
, png_const_infop info_ptr
)
108 if (png_ptr
!= NULL
&& info_ptr
!= NULL
)
109 return info_ptr
->compression_type
;
115 png_get_x_pixels_per_meter(png_const_structp png_ptr
, png_const_infop info_ptr
)
117 #ifdef PNG_pHYs_SUPPORTED
118 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_pHYs
))
120 png_debug1(1, "in %s retrieval function",
121 "png_get_x_pixels_per_meter");
123 if (info_ptr
->phys_unit_type
== PNG_RESOLUTION_METER
)
124 return (info_ptr
->x_pixels_per_unit
);
132 png_get_y_pixels_per_meter(png_const_structp png_ptr
, png_const_infop info_ptr
)
134 #ifdef PNG_pHYs_SUPPORTED
135 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_pHYs
))
137 png_debug1(1, "in %s retrieval function",
138 "png_get_y_pixels_per_meter");
140 if (info_ptr
->phys_unit_type
== PNG_RESOLUTION_METER
)
141 return (info_ptr
->y_pixels_per_unit
);
149 png_get_pixels_per_meter(png_const_structp png_ptr
, png_const_infop info_ptr
)
151 #ifdef PNG_pHYs_SUPPORTED
152 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_pHYs
))
154 png_debug1(1, "in %s retrieval function", "png_get_pixels_per_meter");
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
);
165 #ifdef PNG_FLOATING_POINT_SUPPORTED
167 png_get_pixel_aspect_ratio(png_const_structp png_ptr
, png_const_infop info_ptr
)
169 #ifdef PNG_READ_pHYs_SUPPORTED
170 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_pHYs
))
172 png_debug1(1, "in %s retrieval function", "png_get_aspect_ratio");
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
));
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
)
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
)
197 png_debug1(1, "in %s retrieval function", "png_get_aspect_ratio_fixed");
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.
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
))
213 png_get_x_offset_microns(png_const_structp png_ptr
, png_const_infop info_ptr
)
215 #ifdef PNG_oFFs_SUPPORTED
216 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_oFFs
))
218 png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns");
220 if (info_ptr
->offset_unit_type
== PNG_OFFSET_MICROMETER
)
221 return (info_ptr
->x_offset
);
229 png_get_y_offset_microns(png_const_structp png_ptr
, png_const_infop info_ptr
)
231 #ifdef PNG_oFFs_SUPPORTED
232 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_oFFs
))
234 png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns");
236 if (info_ptr
->offset_unit_type
== PNG_OFFSET_MICROMETER
)
237 return (info_ptr
->y_offset
);
245 png_get_x_offset_pixels(png_const_structp png_ptr
, png_const_infop info_ptr
)
247 #ifdef PNG_oFFs_SUPPORTED
248 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_oFFs
))
250 png_debug1(1, "in %s retrieval function", "png_get_x_offset_pixels");
252 if (info_ptr
->offset_unit_type
== PNG_OFFSET_PIXEL
)
253 return (info_ptr
->x_offset
);
261 png_get_y_offset_pixels(png_const_structp png_ptr
, png_const_infop info_ptr
)
263 #ifdef PNG_oFFs_SUPPORTED
264 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_oFFs
))
266 png_debug1(1, "in %s retrieval function", "png_get_y_offset_pixels");
268 if (info_ptr
->offset_unit_type
== PNG_OFFSET_PIXEL
)
269 return (info_ptr
->y_offset
);
276 #ifdef PNG_INCH_CONVERSIONS_SUPPORTED
278 ppi_from_ppm(png_uint_32 ppm
)
281 /* The conversion is *(2.54/100), in binary (32 digits):
282 * .00000110100000001001110101001001
284 png_uint_32 t1001
, t1101
;
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 */
296 /* The argument is a PNG unsigned integer, so it is not permitted
297 * to be bigger than 2^31.
299 png_fixed_point result
;
300 if (ppm
<= PNG_UINT_31_MAX
&& png_muldiv(&result
, (png_int_32
)ppm
, 127,
310 png_get_pixels_per_inch(png_const_structp png_ptr
, png_const_infop info_ptr
)
312 return ppi_from_ppm(png_get_pixels_per_meter(png_ptr
, info_ptr
));
316 png_get_x_pixels_per_inch(png_const_structp png_ptr
, png_const_infop info_ptr
)
318 return ppi_from_ppm(png_get_x_pixels_per_meter(png_ptr
, info_ptr
));
322 png_get_y_pixels_per_inch(png_const_structp png_ptr
, png_const_infop info_ptr
)
324 return ppi_from_ppm(png_get_y_pixels_per_meter(png_ptr
, info_ptr
));
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
)
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
336 return png_muldiv_warn(png_ptr
, microns
, 500, 127);
339 png_fixed_point PNGAPI
340 png_get_x_offset_inches_fixed(png_structp png_ptr
,
341 png_const_infop info_ptr
)
343 return png_fixed_inches_from_microns(png_ptr
,
344 png_get_x_offset_microns(png_ptr
, info_ptr
));
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
)
353 return png_fixed_inches_from_microns(png_ptr
,
354 png_get_y_offset_microns(png_ptr
, info_ptr
));
358 #ifdef PNG_FLOATING_POINT_SUPPORTED
360 png_get_x_offset_inches(png_const_structp png_ptr
, png_const_infop info_ptr
)
362 /* To avoid the overflow do the conversion directly in floating
365 return (float)(png_get_x_offset_microns(png_ptr
, info_ptr
) * .00003937);
369 #ifdef PNG_FLOATING_POINT_SUPPORTED
371 png_get_y_offset_inches(png_const_structp png_ptr
, png_const_infop info_ptr
)
373 /* To avoid the overflow do the conversion directly in floating
376 return (float)(png_get_y_offset_microns(png_ptr
, info_ptr
) * .00003937);
380 #ifdef PNG_pHYs_SUPPORTED
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
)
385 png_uint_32 retval
= 0;
387 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_pHYs
))
389 png_debug1(1, "in %s retrieval function", "pHYs");
393 *res_x
= info_ptr
->x_pixels_per_unit
;
394 retval
|= PNG_INFO_pHYs
;
399 *res_y
= info_ptr
->y_pixels_per_unit
;
400 retval
|= PNG_INFO_pHYs
;
403 if (unit_type
!= NULL
)
405 *unit_type
= (int)info_ptr
->phys_unit_type
;
406 retval
|= PNG_INFO_pHYs
;
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);
418 #endif /* PNG_pHYs_SUPPORTED */
419 #endif /* PNG_INCH_CONVERSIONS_SUPPORTED */
421 /* png_get_channels really belongs in here, too, but it's been around longer */
423 #endif /* PNG_EASY_ACCESS_SUPPORTED */
426 png_get_channels(png_const_structp png_ptr
, png_const_infop info_ptr
)
428 if (png_ptr
!= NULL
&& info_ptr
!= NULL
)
429 return(info_ptr
->channels
);
434 png_const_bytep PNGAPI
435 png_get_signature(png_const_structp png_ptr
, png_infop info_ptr
)
437 if (png_ptr
!= NULL
&& info_ptr
!= NULL
)
438 return(info_ptr
->signature
);
443 #ifdef PNG_bKGD_SUPPORTED
445 png_get_bKGD(png_const_structp png_ptr
, png_infop info_ptr
,
446 png_color_16p
*background
)
448 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_bKGD
)
449 && background
!= NULL
)
451 png_debug1(1, "in %s retrieval function", "bKGD");
453 *background
= &(info_ptr
->background
);
454 return (PNG_INFO_bKGD
);
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
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
)
474 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_cHRM
))
479 png_debug1(1, "in %s retrieval function", "cHRM_XYZ");
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
;
490 /* The *_checked function handles error reporting, so just return 0 if
491 * there is a failure here.
493 if (png_XYZ_from_xy_checked(png_ptr
, &XYZ
, xy
))
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
;
514 return (PNG_INFO_cHRM
);
521 # ifdef PNG_FLOATING_POINT_SUPPORTED
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
)
527 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_cHRM
))
529 png_debug1(1, "in %s retrieval function", "cHRM");
532 *white_x
= png_float(png_ptr
, info_ptr
->x_white
, "cHRM white X");
534 *white_y
= png_float(png_ptr
, info_ptr
->y_white
, "cHRM white Y");
536 *red_x
= png_float(png_ptr
, info_ptr
->x_red
, "cHRM red X");
538 *red_y
= png_float(png_ptr
, info_ptr
->y_red
, "cHRM red Y");
540 *green_x
= png_float(png_ptr
, info_ptr
->x_green
, "cHRM green X");
542 *green_y
= png_float(png_ptr
, info_ptr
->y_green
, "cHRM green Y");
544 *blue_x
= png_float(png_ptr
, info_ptr
->x_blue
, "cHRM blue X");
546 *blue_y
= png_float(png_ptr
, info_ptr
->y_blue
, "cHRM blue Y");
547 return (PNG_INFO_cHRM
);
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
,
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
)
566 *red_X
= png_float(png_ptr
, XYZ
.redX
, "cHRM red X");
568 *red_Y
= png_float(png_ptr
, XYZ
.redY
, "cHRM red Y");
570 *red_Z
= png_float(png_ptr
, XYZ
.redZ
, "cHRM red Z");
572 *green_X
= png_float(png_ptr
, XYZ
.greenX
, "cHRM green X");
574 *green_Y
= png_float(png_ptr
, XYZ
.greenY
, "cHRM green Y");
576 *green_Z
= png_float(png_ptr
, XYZ
.greenZ
, "cHRM green Z");
578 *blue_X
= png_float(png_ptr
, XYZ
.blueX
, "cHRM blue X");
580 *blue_Y
= png_float(png_ptr
, XYZ
.blueY
, "cHRM blue Y");
582 *blue_Z
= png_float(png_ptr
, XYZ
.blueZ
, "cHRM blue Z");
583 return (PNG_INFO_cHRM
);
590 # ifdef PNG_FIXED_POINT_SUPPORTED
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
)
597 png_debug1(1, "in %s retrieval function", "cHRM");
599 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_cHRM
))
602 *white_x
= info_ptr
->x_white
;
604 *white_y
= info_ptr
->y_white
;
606 *red_x
= info_ptr
->x_red
;
608 *red_y
= info_ptr
->y_red
;
610 *green_x
= info_ptr
->x_green
;
612 *green_y
= info_ptr
->y_green
;
614 *blue_x
= info_ptr
->x_blue
;
616 *blue_y
= info_ptr
->y_blue
;
617 return (PNG_INFO_cHRM
);
625 #ifdef PNG_gAMA_SUPPORTED
627 png_get_gAMA_fixed(png_const_structp png_ptr
, png_const_infop info_ptr
,
628 png_fixed_point
*file_gamma
)
630 png_debug1(1, "in %s retrieval function", "gAMA");
632 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_gAMA
)
633 && file_gamma
!= NULL
)
635 *file_gamma
= info_ptr
->gamma
;
636 return (PNG_INFO_gAMA
);
641 # ifdef PNG_FLOATING_POINT_SUPPORTED
643 png_get_gAMA(png_const_structp png_ptr
, png_const_infop info_ptr
,
646 png_fixed_point igamma
;
647 png_uint_32 ok
= png_get_gAMA_fixed(png_ptr
, info_ptr
, &igamma
);
650 *file_gamma
= png_float(png_ptr
, igamma
, "png_get_gAMA");
658 #ifdef PNG_sRGB_SUPPORTED
660 png_get_sRGB(png_const_structp png_ptr
, png_const_infop info_ptr
,
661 int *file_srgb_intent
)
663 png_debug1(1, "in %s retrieval function", "sRGB");
665 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_sRGB
)
666 && file_srgb_intent
!= NULL
)
668 *file_srgb_intent
= (int)info_ptr
->srgb_intent
;
669 return (PNG_INFO_sRGB
);
676 #ifdef PNG_iCCP_SUPPORTED
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
)
682 png_debug1(1, "in %s retrieval function", "iCCP");
684 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_iCCP
)
685 && name
!= NULL
&& profile
!= NULL
&& proflen
!= NULL
)
687 *name
= info_ptr
->iccp_name
;
688 *profile
= info_ptr
->iccp_profile
;
689 /* Compression_type is a dummy so the API won't have to change
690 * if we introduce multiple compression types later.
692 *proflen
= (int)info_ptr
->iccp_proflen
;
693 *compression_type
= (int)info_ptr
->iccp_compression
;
694 return (PNG_INFO_iCCP
);
701 #ifdef PNG_sPLT_SUPPORTED
703 png_get_sPLT(png_const_structp png_ptr
, png_const_infop info_ptr
,
704 png_sPLT_tpp spalettes
)
706 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& spalettes
!= NULL
)
708 *spalettes
= info_ptr
->splt_palettes
;
709 return ((png_uint_32
)info_ptr
->splt_palettes_num
);
716 #ifdef PNG_hIST_SUPPORTED
718 png_get_hIST(png_const_structp png_ptr
, png_const_infop info_ptr
,
721 png_debug1(1, "in %s retrieval function", "hIST");
723 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_hIST
)
726 *hist
= info_ptr
->hist
;
727 return (PNG_INFO_hIST
);
735 png_get_IHDR(png_structp png_ptr
, png_infop info_ptr
,
736 png_uint_32
*width
, png_uint_32
*height
, int *bit_depth
,
737 int *color_type
, int *interlace_type
, int *compression_type
,
741 png_debug1(1, "in %s retrieval function", "IHDR");
743 if (png_ptr
== NULL
|| info_ptr
== NULL
|| width
== NULL
||
744 height
== NULL
|| bit_depth
== NULL
|| color_type
== NULL
)
747 *width
= info_ptr
->width
;
748 *height
= info_ptr
->height
;
749 *bit_depth
= info_ptr
->bit_depth
;
750 *color_type
= info_ptr
->color_type
;
752 if (compression_type
!= NULL
)
753 *compression_type
= info_ptr
->compression_type
;
755 if (filter_type
!= NULL
)
756 *filter_type
= info_ptr
->filter_type
;
758 if (interlace_type
!= NULL
)
759 *interlace_type
= info_ptr
->interlace_type
;
761 /* This is redundant if we can be sure that the info_ptr values were all
762 * assigned in png_set_IHDR(). We do the check anyhow in case an
763 * application has ignored our advice not to mess with the members
764 * of info_ptr directly.
766 png_check_IHDR (png_ptr
, info_ptr
->width
, info_ptr
->height
,
767 info_ptr
->bit_depth
, info_ptr
->color_type
, info_ptr
->interlace_type
,
768 info_ptr
->compression_type
, info_ptr
->filter_type
);
773 #ifdef PNG_oFFs_SUPPORTED
775 png_get_oFFs(png_const_structp png_ptr
, png_const_infop info_ptr
,
776 png_int_32
*offset_x
, png_int_32
*offset_y
, int *unit_type
)
778 png_debug1(1, "in %s retrieval function", "oFFs");
780 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_oFFs
)
781 && offset_x
!= NULL
&& offset_y
!= NULL
&& unit_type
!= NULL
)
783 *offset_x
= info_ptr
->x_offset
;
784 *offset_y
= info_ptr
->y_offset
;
785 *unit_type
= (int)info_ptr
->offset_unit_type
;
786 return (PNG_INFO_oFFs
);
793 #ifdef PNG_pCAL_SUPPORTED
795 png_get_pCAL(png_const_structp png_ptr
, png_const_infop info_ptr
,
796 png_charp
*purpose
, png_int_32
*X0
, png_int_32
*X1
, int *type
, int *nparams
,
797 png_charp
*units
, png_charpp
*params
)
799 png_debug1(1, "in %s retrieval function", "pCAL");
801 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_pCAL
)
802 && purpose
!= NULL
&& X0
!= NULL
&& X1
!= NULL
&& type
!= NULL
&&
803 nparams
!= NULL
&& units
!= NULL
&& params
!= NULL
)
805 *purpose
= info_ptr
->pcal_purpose
;
806 *X0
= info_ptr
->pcal_X0
;
807 *X1
= info_ptr
->pcal_X1
;
808 *type
= (int)info_ptr
->pcal_type
;
809 *nparams
= (int)info_ptr
->pcal_nparams
;
810 *units
= info_ptr
->pcal_units
;
811 *params
= info_ptr
->pcal_params
;
812 return (PNG_INFO_pCAL
);
819 #ifdef PNG_sCAL_SUPPORTED
820 # ifdef PNG_FIXED_POINT_SUPPORTED
821 # ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
823 png_get_sCAL_fixed(png_structp png_ptr
, png_const_infop info_ptr
,
824 int *unit
, png_fixed_point
*width
, png_fixed_point
*height
)
826 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&&
827 (info_ptr
->valid
& PNG_INFO_sCAL
))
829 *unit
= info_ptr
->scal_unit
;
830 /*TODO: make this work without FP support */
831 *width
= png_fixed(png_ptr
, atof(info_ptr
->scal_s_width
), "sCAL width");
832 *height
= png_fixed(png_ptr
, atof(info_ptr
->scal_s_height
),
834 return (PNG_INFO_sCAL
);
839 # endif /* FLOATING_ARITHMETIC */
840 # endif /* FIXED_POINT */
841 # ifdef PNG_FLOATING_POINT_SUPPORTED
843 png_get_sCAL(png_const_structp png_ptr
, png_const_infop info_ptr
,
844 int *unit
, double *width
, double *height
)
846 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&&
847 (info_ptr
->valid
& PNG_INFO_sCAL
))
849 *unit
= info_ptr
->scal_unit
;
850 *width
= atof(info_ptr
->scal_s_width
);
851 *height
= atof(info_ptr
->scal_s_height
);
852 return (PNG_INFO_sCAL
);
857 # endif /* FLOATING POINT */
859 png_get_sCAL_s(png_const_structp png_ptr
, png_const_infop info_ptr
,
860 int *unit
, png_charpp width
, png_charpp height
)
862 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&&
863 (info_ptr
->valid
& PNG_INFO_sCAL
))
865 *unit
= info_ptr
->scal_unit
;
866 *width
= info_ptr
->scal_s_width
;
867 *height
= info_ptr
->scal_s_height
;
868 return (PNG_INFO_sCAL
);
875 #ifdef PNG_pHYs_SUPPORTED
877 png_get_pHYs(png_const_structp png_ptr
, png_const_infop info_ptr
,
878 png_uint_32
*res_x
, png_uint_32
*res_y
, int *unit_type
)
880 png_uint_32 retval
= 0;
882 png_debug1(1, "in %s retrieval function", "pHYs");
884 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&&
885 (info_ptr
->valid
& PNG_INFO_pHYs
))
889 *res_x
= info_ptr
->x_pixels_per_unit
;
890 retval
|= PNG_INFO_pHYs
;
895 *res_y
= info_ptr
->y_pixels_per_unit
;
896 retval
|= PNG_INFO_pHYs
;
899 if (unit_type
!= NULL
)
901 *unit_type
= (int)info_ptr
->phys_unit_type
;
902 retval
|= PNG_INFO_pHYs
;
911 png_get_PLTE(png_const_structp png_ptr
, png_const_infop info_ptr
,
912 png_colorp
*palette
, int *num_palette
)
914 png_debug1(1, "in %s retrieval function", "PLTE");
916 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_PLTE
)
919 *palette
= info_ptr
->palette
;
920 *num_palette
= info_ptr
->num_palette
;
921 png_debug1(3, "num_palette = %d", *num_palette
);
922 return (PNG_INFO_PLTE
);
928 #ifdef PNG_sBIT_SUPPORTED
930 png_get_sBIT(png_const_structp png_ptr
, png_infop info_ptr
,
931 png_color_8p
*sig_bit
)
933 png_debug1(1, "in %s retrieval function", "sBIT");
935 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_sBIT
)
938 *sig_bit
= &(info_ptr
->sig_bit
);
939 return (PNG_INFO_sBIT
);
946 #ifdef PNG_TEXT_SUPPORTED
948 png_get_text(png_const_structp png_ptr
, png_const_infop info_ptr
,
949 png_textp
*text_ptr
, int *num_text
)
951 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& info_ptr
->num_text
> 0)
953 png_debug1(1, "in 0x%lx retrieval function",
954 (unsigned long)png_ptr
->chunk_name
);
956 if (text_ptr
!= NULL
)
957 *text_ptr
= info_ptr
->text
;
959 if (num_text
!= NULL
)
960 *num_text
= info_ptr
->num_text
;
962 return ((png_uint_32
)info_ptr
->num_text
);
965 if (num_text
!= NULL
)
972 #ifdef PNG_tIME_SUPPORTED
974 png_get_tIME(png_const_structp png_ptr
, png_infop info_ptr
, png_timep
*mod_time
)
976 png_debug1(1, "in %s retrieval function", "tIME");
978 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_tIME
)
981 *mod_time
= &(info_ptr
->mod_time
);
982 return (PNG_INFO_tIME
);
989 #ifdef PNG_tRNS_SUPPORTED
991 png_get_tRNS(png_const_structp png_ptr
, png_infop info_ptr
,
992 png_bytep
*trans_alpha
, int *num_trans
, png_color_16p
*trans_color
)
994 png_uint_32 retval
= 0;
995 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_tRNS
))
997 png_debug1(1, "in %s retrieval function", "tRNS");
999 if (info_ptr
->color_type
== PNG_COLOR_TYPE_PALETTE
)
1001 if (trans_alpha
!= NULL
)
1003 *trans_alpha
= info_ptr
->trans_alpha
;
1004 retval
|= PNG_INFO_tRNS
;
1007 if (trans_color
!= NULL
)
1008 *trans_color
= &(info_ptr
->trans_color
);
1011 else /* if (info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) */
1013 if (trans_color
!= NULL
)
1015 *trans_color
= &(info_ptr
->trans_color
);
1016 retval
|= PNG_INFO_tRNS
;
1019 if (trans_alpha
!= NULL
)
1020 *trans_alpha
= NULL
;
1023 if (num_trans
!= NULL
)
1025 *num_trans
= info_ptr
->num_trans
;
1026 retval
|= PNG_INFO_tRNS
;
1034 #ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
1036 png_get_unknown_chunks(png_const_structp png_ptr
, png_const_infop info_ptr
,
1037 png_unknown_chunkpp unknowns
)
1039 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& unknowns
!= NULL
)
1041 *unknowns
= info_ptr
->unknown_chunks
;
1042 return info_ptr
->unknown_chunks_num
;
1049 #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
1051 png_get_rgb_to_gray_status (png_const_structp png_ptr
)
1053 return (png_byte
)(png_ptr
? png_ptr
->rgb_to_gray_status
: 0);
1057 #ifdef PNG_USER_CHUNKS_SUPPORTED
1059 png_get_user_chunk_ptr(png_const_structp png_ptr
)
1061 return (png_ptr
? png_ptr
->user_chunk_ptr
: NULL
);
1066 png_get_compression_buffer_size(png_const_structp png_ptr
)
1068 return (png_ptr
? png_ptr
->zbuf_size
: 0);
1071 #ifdef PNG_SET_USER_LIMITS_SUPPORTED
1072 /* These functions were added to libpng 1.2.6 and were enabled
1073 * by default in libpng-1.4.0 */
1075 png_get_user_width_max (png_const_structp png_ptr
)
1077 return (png_ptr
? png_ptr
->user_width_max
: 0);
1081 png_get_user_height_max (png_const_structp png_ptr
)
1083 return (png_ptr
? png_ptr
->user_height_max
: 0);
1086 /* This function was added to libpng 1.4.0 */
1088 png_get_chunk_cache_max (png_const_structp png_ptr
)
1090 return (png_ptr
? png_ptr
->user_chunk_cache_max
: 0);
1093 /* This function was added to libpng 1.4.1 */
1094 png_alloc_size_t PNGAPI
1095 png_get_chunk_malloc_max (png_const_structp png_ptr
)
1097 return (png_ptr
? png_ptr
->user_chunk_malloc_max
: 0);
1099 #endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */
1101 /* These functions were added to libpng 1.4.0 */
1102 #ifdef PNG_IO_STATE_SUPPORTED
1104 png_get_io_state (png_structp png_ptr
)
1106 return png_ptr
->io_state
;
1110 png_get_io_chunk_type (png_const_structp png_ptr
)
1112 return png_ptr
->chunk_name
;
1115 png_const_bytep PNGAPI
1116 png_get_io_chunk_name (png_structp png_ptr
)
1118 PNG_CSTRING_FROM_CHUNK(png_ptr
->io_chunk_string
, png_ptr
->chunk_name
);
1119 return png_ptr
->io_chunk_string
;
1121 #endif /* ?PNG_IO_STATE_SUPPORTED */
1123 #endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */