2 /* pngget.c - retrieval of values from info struct
4 * Last changed in libpng 1.5.1 [February 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 # ifdef PNG_FLOATING_POINT_SUPPORTED
464 png_get_cHRM(png_const_structp png_ptr
, png_const_infop info_ptr
,
465 double *white_x
, double *white_y
, double *red_x
, double *red_y
,
466 double *green_x
, double *green_y
, double *blue_x
, double *blue_y
)
468 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_cHRM
))
470 png_debug1(1, "in %s retrieval function", "cHRM");
473 *white_x
= png_float(png_ptr
, info_ptr
->x_white
, "cHRM white X");
475 *white_y
= png_float(png_ptr
, info_ptr
->y_white
, "cHRM white Y");
477 *red_x
= png_float(png_ptr
, info_ptr
->x_red
, "cHRM red X");
479 *red_y
= png_float(png_ptr
, info_ptr
->y_red
, "cHRM red Y");
481 *green_x
= png_float(png_ptr
, info_ptr
->x_green
, "cHRM green X");
483 *green_y
= png_float(png_ptr
, info_ptr
->y_green
, "cHRM green Y");
485 *blue_x
= png_float(png_ptr
, info_ptr
->x_blue
, "cHRM blue X");
487 *blue_y
= png_float(png_ptr
, info_ptr
->y_blue
, "cHRM blue Y");
488 return (PNG_INFO_cHRM
);
495 # ifdef PNG_FIXED_POINT_SUPPORTED
497 png_get_cHRM_fixed(png_const_structp png_ptr
, png_const_infop info_ptr
,
498 png_fixed_point
*white_x
, png_fixed_point
*white_y
, png_fixed_point
*red_x
,
499 png_fixed_point
*red_y
, png_fixed_point
*green_x
, png_fixed_point
*green_y
,
500 png_fixed_point
*blue_x
, png_fixed_point
*blue_y
)
502 png_debug1(1, "in %s retrieval function", "cHRM");
504 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_cHRM
))
507 *white_x
= info_ptr
->x_white
;
509 *white_y
= info_ptr
->y_white
;
511 *red_x
= info_ptr
->x_red
;
513 *red_y
= info_ptr
->y_red
;
515 *green_x
= info_ptr
->x_green
;
517 *green_y
= info_ptr
->y_green
;
519 *blue_x
= info_ptr
->x_blue
;
521 *blue_y
= info_ptr
->y_blue
;
522 return (PNG_INFO_cHRM
);
530 #ifdef PNG_gAMA_SUPPORTED
532 png_get_gAMA_fixed(png_const_structp png_ptr
, png_const_infop info_ptr
,
533 png_fixed_point
*file_gamma
)
535 png_debug1(1, "in %s retrieval function", "gAMA");
537 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_gAMA
)
538 && file_gamma
!= NULL
)
540 *file_gamma
= info_ptr
->gamma
;
541 return (PNG_INFO_gAMA
);
546 # ifdef PNG_FLOATING_POINT_SUPPORTED
548 png_get_gAMA(png_const_structp png_ptr
, png_const_infop info_ptr
,
551 png_fixed_point igamma
;
552 png_uint_32 ok
= png_get_gAMA_fixed(png_ptr
, info_ptr
, &igamma
);
555 *file_gamma
= png_float(png_ptr
, igamma
, "png_get_gAMA");
563 #ifdef PNG_sRGB_SUPPORTED
565 png_get_sRGB(png_const_structp png_ptr
, png_const_infop info_ptr
,
566 int *file_srgb_intent
)
568 png_debug1(1, "in %s retrieval function", "sRGB");
570 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_sRGB
)
571 && file_srgb_intent
!= NULL
)
573 *file_srgb_intent
= (int)info_ptr
->srgb_intent
;
574 return (PNG_INFO_sRGB
);
581 #ifdef PNG_iCCP_SUPPORTED
583 png_get_iCCP(png_const_structp png_ptr
, png_const_infop info_ptr
,
584 png_charpp name
, int *compression_type
,
585 png_bytepp profile
, png_uint_32
*proflen
)
587 png_debug1(1, "in %s retrieval function", "iCCP");
589 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_iCCP
)
590 && name
!= NULL
&& profile
!= NULL
&& proflen
!= NULL
)
592 *name
= info_ptr
->iccp_name
;
593 *profile
= info_ptr
->iccp_profile
;
594 /* Compression_type is a dummy so the API won't have to change
595 * if we introduce multiple compression types later.
597 *proflen
= (int)info_ptr
->iccp_proflen
;
598 *compression_type
= (int)info_ptr
->iccp_compression
;
599 return (PNG_INFO_iCCP
);
606 #ifdef PNG_sPLT_SUPPORTED
608 png_get_sPLT(png_const_structp png_ptr
, png_const_infop info_ptr
,
609 png_sPLT_tpp spalettes
)
611 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& spalettes
!= NULL
)
613 *spalettes
= info_ptr
->splt_palettes
;
614 return ((png_uint_32
)info_ptr
->splt_palettes_num
);
621 #ifdef PNG_hIST_SUPPORTED
623 png_get_hIST(png_const_structp png_ptr
, png_const_infop info_ptr
,
626 png_debug1(1, "in %s retrieval function", "hIST");
628 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_hIST
)
631 *hist
= info_ptr
->hist
;
632 return (PNG_INFO_hIST
);
640 png_get_IHDR(png_structp png_ptr
, png_infop info_ptr
,
641 png_uint_32
*width
, png_uint_32
*height
, int *bit_depth
,
642 int *color_type
, int *interlace_type
, int *compression_type
,
646 png_debug1(1, "in %s retrieval function", "IHDR");
648 if (png_ptr
== NULL
|| info_ptr
== NULL
|| width
== NULL
||
649 height
== NULL
|| bit_depth
== NULL
|| color_type
== NULL
)
652 *width
= info_ptr
->width
;
653 *height
= info_ptr
->height
;
654 *bit_depth
= info_ptr
->bit_depth
;
655 *color_type
= info_ptr
->color_type
;
657 if (compression_type
!= NULL
)
658 *compression_type
= info_ptr
->compression_type
;
660 if (filter_type
!= NULL
)
661 *filter_type
= info_ptr
->filter_type
;
663 if (interlace_type
!= NULL
)
664 *interlace_type
= info_ptr
->interlace_type
;
666 /* This is redundant if we can be sure that the info_ptr values were all
667 * assigned in png_set_IHDR(). We do the check anyhow in case an
668 * application has ignored our advice not to mess with the members
669 * of info_ptr directly.
671 png_check_IHDR (png_ptr
, info_ptr
->width
, info_ptr
->height
,
672 info_ptr
->bit_depth
, info_ptr
->color_type
, info_ptr
->interlace_type
,
673 info_ptr
->compression_type
, info_ptr
->filter_type
);
678 #ifdef PNG_oFFs_SUPPORTED
680 png_get_oFFs(png_const_structp png_ptr
, png_const_infop info_ptr
,
681 png_int_32
*offset_x
, png_int_32
*offset_y
, int *unit_type
)
683 png_debug1(1, "in %s retrieval function", "oFFs");
685 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_oFFs
)
686 && offset_x
!= NULL
&& offset_y
!= NULL
&& unit_type
!= NULL
)
688 *offset_x
= info_ptr
->x_offset
;
689 *offset_y
= info_ptr
->y_offset
;
690 *unit_type
= (int)info_ptr
->offset_unit_type
;
691 return (PNG_INFO_oFFs
);
698 #ifdef PNG_pCAL_SUPPORTED
700 png_get_pCAL(png_const_structp png_ptr
, png_const_infop info_ptr
,
701 png_charp
*purpose
, png_int_32
*X0
, png_int_32
*X1
, int *type
, int *nparams
,
702 png_charp
*units
, png_charpp
*params
)
704 png_debug1(1, "in %s retrieval function", "pCAL");
706 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_pCAL
)
707 && purpose
!= NULL
&& X0
!= NULL
&& X1
!= NULL
&& type
!= NULL
&&
708 nparams
!= NULL
&& units
!= NULL
&& params
!= NULL
)
710 *purpose
= info_ptr
->pcal_purpose
;
711 *X0
= info_ptr
->pcal_X0
;
712 *X1
= info_ptr
->pcal_X1
;
713 *type
= (int)info_ptr
->pcal_type
;
714 *nparams
= (int)info_ptr
->pcal_nparams
;
715 *units
= info_ptr
->pcal_units
;
716 *params
= info_ptr
->pcal_params
;
717 return (PNG_INFO_pCAL
);
724 #ifdef PNG_sCAL_SUPPORTED
725 # ifdef PNG_FIXED_POINT_SUPPORTED
726 # ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
728 png_get_sCAL_fixed(png_structp png_ptr
, png_const_infop info_ptr
,
729 int *unit
, png_fixed_point
*width
, png_fixed_point
*height
)
731 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&&
732 (info_ptr
->valid
& PNG_INFO_sCAL
))
734 *unit
= info_ptr
->scal_unit
;
735 /*TODO: make this work without FP support */
736 *width
= png_fixed(png_ptr
, atof(info_ptr
->scal_s_width
), "sCAL width");
737 *height
= png_fixed(png_ptr
, atof(info_ptr
->scal_s_height
),
739 return (PNG_INFO_sCAL
);
744 # endif /* FLOATING_ARITHMETIC */
745 # endif /* FIXED_POINT */
746 # ifdef PNG_FLOATING_POINT_SUPPORTED
748 png_get_sCAL(png_const_structp png_ptr
, png_const_infop info_ptr
,
749 int *unit
, double *width
, double *height
)
751 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&&
752 (info_ptr
->valid
& PNG_INFO_sCAL
))
754 *unit
= info_ptr
->scal_unit
;
755 *width
= atof(info_ptr
->scal_s_width
);
756 *height
= atof(info_ptr
->scal_s_height
);
757 return (PNG_INFO_sCAL
);
762 # endif /* FLOATING POINT */
764 png_get_sCAL_s(png_const_structp png_ptr
, png_const_infop info_ptr
,
765 int *unit
, png_charpp width
, png_charpp height
)
767 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&&
768 (info_ptr
->valid
& PNG_INFO_sCAL
))
770 *unit
= info_ptr
->scal_unit
;
771 *width
= info_ptr
->scal_s_width
;
772 *height
= info_ptr
->scal_s_height
;
773 return (PNG_INFO_sCAL
);
780 #ifdef PNG_pHYs_SUPPORTED
782 png_get_pHYs(png_const_structp png_ptr
, png_const_infop info_ptr
,
783 png_uint_32
*res_x
, png_uint_32
*res_y
, int *unit_type
)
785 png_uint_32 retval
= 0;
787 png_debug1(1, "in %s retrieval function", "pHYs");
789 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&&
790 (info_ptr
->valid
& PNG_INFO_pHYs
))
794 *res_x
= info_ptr
->x_pixels_per_unit
;
795 retval
|= PNG_INFO_pHYs
;
800 *res_y
= info_ptr
->y_pixels_per_unit
;
801 retval
|= PNG_INFO_pHYs
;
804 if (unit_type
!= NULL
)
806 *unit_type
= (int)info_ptr
->phys_unit_type
;
807 retval
|= PNG_INFO_pHYs
;
816 png_get_PLTE(png_const_structp png_ptr
, png_const_infop info_ptr
,
817 png_colorp
*palette
, int *num_palette
)
819 png_debug1(1, "in %s retrieval function", "PLTE");
821 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_PLTE
)
824 *palette
= info_ptr
->palette
;
825 *num_palette
= info_ptr
->num_palette
;
826 png_debug1(3, "num_palette = %d", *num_palette
);
827 return (PNG_INFO_PLTE
);
833 #ifdef PNG_sBIT_SUPPORTED
835 png_get_sBIT(png_const_structp png_ptr
, png_infop info_ptr
,
836 png_color_8p
*sig_bit
)
838 png_debug1(1, "in %s retrieval function", "sBIT");
840 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_sBIT
)
843 *sig_bit
= &(info_ptr
->sig_bit
);
844 return (PNG_INFO_sBIT
);
851 #ifdef PNG_TEXT_SUPPORTED
853 png_get_text(png_const_structp png_ptr
, png_const_infop info_ptr
,
854 png_textp
*text_ptr
, int *num_text
)
856 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& info_ptr
->num_text
> 0)
858 png_debug1(1, "in %s retrieval function",
859 (png_ptr
->chunk_name
[0] == '\0' ? "text" :
860 (png_const_charp
)png_ptr
->chunk_name
));
862 if (text_ptr
!= NULL
)
863 *text_ptr
= info_ptr
->text
;
865 if (num_text
!= NULL
)
866 *num_text
= info_ptr
->num_text
;
868 return ((png_uint_32
)info_ptr
->num_text
);
871 if (num_text
!= NULL
)
878 #ifdef PNG_tIME_SUPPORTED
880 png_get_tIME(png_const_structp png_ptr
, png_infop info_ptr
, png_timep
*mod_time
)
882 png_debug1(1, "in %s retrieval function", "tIME");
884 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_tIME
)
887 *mod_time
= &(info_ptr
->mod_time
);
888 return (PNG_INFO_tIME
);
895 #ifdef PNG_tRNS_SUPPORTED
897 png_get_tRNS(png_const_structp png_ptr
, png_infop info_ptr
,
898 png_bytep
*trans_alpha
, int *num_trans
, png_color_16p
*trans_color
)
900 png_uint_32 retval
= 0;
901 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& (info_ptr
->valid
& PNG_INFO_tRNS
))
903 png_debug1(1, "in %s retrieval function", "tRNS");
905 if (info_ptr
->color_type
== PNG_COLOR_TYPE_PALETTE
)
907 if (trans_alpha
!= NULL
)
909 *trans_alpha
= info_ptr
->trans_alpha
;
910 retval
|= PNG_INFO_tRNS
;
913 if (trans_color
!= NULL
)
914 *trans_color
= &(info_ptr
->trans_color
);
917 else /* if (info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) */
919 if (trans_color
!= NULL
)
921 *trans_color
= &(info_ptr
->trans_color
);
922 retval
|= PNG_INFO_tRNS
;
925 if (trans_alpha
!= NULL
)
929 if (num_trans
!= NULL
)
931 *num_trans
= info_ptr
->num_trans
;
932 retval
|= PNG_INFO_tRNS
;
940 #ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
942 png_get_unknown_chunks(png_const_structp png_ptr
, png_const_infop info_ptr
,
943 png_unknown_chunkpp unknowns
)
945 if (png_ptr
!= NULL
&& info_ptr
!= NULL
&& unknowns
!= NULL
)
947 *unknowns
= info_ptr
->unknown_chunks
;
948 return info_ptr
->unknown_chunks_num
;
955 #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
957 png_get_rgb_to_gray_status (png_const_structp png_ptr
)
959 return (png_byte
)(png_ptr
? png_ptr
->rgb_to_gray_status
: 0);
963 #ifdef PNG_USER_CHUNKS_SUPPORTED
965 png_get_user_chunk_ptr(png_const_structp png_ptr
)
967 return (png_ptr
? png_ptr
->user_chunk_ptr
: NULL
);
972 png_get_compression_buffer_size(png_const_structp png_ptr
)
974 return (png_ptr
? png_ptr
->zbuf_size
: 0L);
978 #ifdef PNG_SET_USER_LIMITS_SUPPORTED
979 /* These functions were added to libpng 1.2.6 and were enabled
980 * by default in libpng-1.4.0 */
982 png_get_user_width_max (png_const_structp png_ptr
)
984 return (png_ptr
? png_ptr
->user_width_max
: 0);
988 png_get_user_height_max (png_const_structp png_ptr
)
990 return (png_ptr
? png_ptr
->user_height_max
: 0);
993 /* This function was added to libpng 1.4.0 */
995 png_get_chunk_cache_max (png_const_structp png_ptr
)
997 return (png_ptr
? png_ptr
->user_chunk_cache_max
: 0);
1000 /* This function was added to libpng 1.4.1 */
1001 png_alloc_size_t PNGAPI
1002 png_get_chunk_malloc_max (png_const_structp png_ptr
)
1004 return (png_ptr
? png_ptr
->user_chunk_malloc_max
: 0);
1006 #endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */
1008 /* These functions were added to libpng 1.4.0 */
1009 #ifdef PNG_IO_STATE_SUPPORTED
1011 png_get_io_state (png_structp png_ptr
)
1013 return png_ptr
->io_state
;
1017 png_get_io_chunk_type (png_const_structp png_ptr
)
1019 return ((png_ptr
->chunk_name
[0] << 24) +
1020 (png_ptr
->chunk_name
[1] << 16) +
1021 (png_ptr
->chunk_name
[2] << 8) +
1022 (png_ptr
->chunk_name
[3]));
1025 png_const_bytep PNGAPI
1026 png_get_io_chunk_name (png_structp png_ptr
)
1028 return png_ptr
->chunk_name
;
1030 #endif /* ?PNG_IO_STATE_SUPPORTED */
1032 #endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */