2
/* pngget.c - retrieval of values from info struct
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.)
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 && compression_type != NULL && profile != NULL &&
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.
693
*proflen = info_ptr->iccp_proflen;
694
*compression_type = info_ptr->iccp_compression;
695
return (PNG_INFO_iCCP);
702
#ifdef PNG_sPLT_SUPPORTED
704
png_get_sPLT(png_const_structp png_ptr, png_const_infop info_ptr,
705
png_sPLT_tpp spalettes)
707
if (png_ptr != NULL && info_ptr != NULL && spalettes != NULL)
709
*spalettes = info_ptr->splt_palettes;
710
return ((png_uint_32)info_ptr->splt_palettes_num);
717
#ifdef PNG_hIST_SUPPORTED
719
png_get_hIST(png_const_structp png_ptr, png_const_infop info_ptr,
722
png_debug1(1, "in %s retrieval function", "hIST");
724
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST)
727
*hist = info_ptr->hist;
728
return (PNG_INFO_hIST);
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,
742
png_debug1(1, "in %s retrieval function", "IHDR");
744
if (png_ptr == NULL || info_ptr == NULL || width == NULL ||
745
height == NULL || bit_depth == NULL || color_type == NULL)
748
*width = info_ptr->width;
749
*height = info_ptr->height;
750
*bit_depth = info_ptr->bit_depth;
751
*color_type = info_ptr->color_type;
753
if (compression_type != NULL)
754
*compression_type = info_ptr->compression_type;
756
if (filter_type != NULL)
757
*filter_type = info_ptr->filter_type;
759
if (interlace_type != NULL)
760
*interlace_type = info_ptr->interlace_type;
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.
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);
774
#ifdef PNG_oFFs_SUPPORTED
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)
779
png_debug1(1, "in %s retrieval function", "oFFs");
781
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)
782
&& offset_x != NULL && offset_y != NULL && unit_type != NULL)
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);
794
#ifdef PNG_pCAL_SUPPORTED
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)
800
png_debug1(1, "in %s retrieval function", "pCAL");
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)
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);
820
#ifdef PNG_sCAL_SUPPORTED
821
# ifdef PNG_FIXED_POINT_SUPPORTED
822
# ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
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)
827
if (png_ptr != NULL && info_ptr != NULL &&
828
(info_ptr->valid & PNG_INFO_sCAL))
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),
835
return (PNG_INFO_sCAL);
840
# endif /* FLOATING_ARITHMETIC */
841
# endif /* FIXED_POINT */
842
# ifdef PNG_FLOATING_POINT_SUPPORTED
844
png_get_sCAL(png_const_structp png_ptr, png_const_infop info_ptr,
845
int *unit, double *width, double *height)
847
if (png_ptr != NULL && info_ptr != NULL &&
848
(info_ptr->valid & PNG_INFO_sCAL))
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);
858
# endif /* FLOATING POINT */
860
png_get_sCAL_s(png_const_structp png_ptr, png_const_infop info_ptr,
861
int *unit, png_charpp width, png_charpp height)
863
if (png_ptr != NULL && info_ptr != NULL &&
864
(info_ptr->valid & PNG_INFO_sCAL))
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);
876
#ifdef PNG_pHYs_SUPPORTED
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)
881
png_uint_32 retval = 0;
883
png_debug1(1, "in %s retrieval function", "pHYs");
885
if (png_ptr != NULL && info_ptr != NULL &&
886
(info_ptr->valid & PNG_INFO_pHYs))
890
*res_x = info_ptr->x_pixels_per_unit;
891
retval |= PNG_INFO_pHYs;
896
*res_y = info_ptr->y_pixels_per_unit;
897
retval |= PNG_INFO_pHYs;
900
if (unit_type != NULL)
902
*unit_type = (int)info_ptr->phys_unit_type;
903
retval |= PNG_INFO_pHYs;
912
png_get_PLTE(png_const_structp png_ptr, png_const_infop info_ptr,
913
png_colorp *palette, int *num_palette)
915
png_debug1(1, "in %s retrieval function", "PLTE");
917
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_PLTE)
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);
929
#ifdef PNG_sBIT_SUPPORTED
931
png_get_sBIT(png_const_structp png_ptr, png_infop info_ptr,
932
png_color_8p *sig_bit)
934
png_debug1(1, "in %s retrieval function", "sBIT");
936
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT)
939
*sig_bit = &(info_ptr->sig_bit);
940
return (PNG_INFO_sBIT);
947
#ifdef PNG_TEXT_SUPPORTED
949
png_get_text(png_const_structp png_ptr, png_const_infop info_ptr,
950
png_textp *text_ptr, int *num_text)
952
if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0)
954
png_debug1(1, "in 0x%lx retrieval function",
955
(unsigned long)png_ptr->chunk_name);
957
if (text_ptr != NULL)
958
*text_ptr = info_ptr->text;
960
if (num_text != NULL)
961
*num_text = info_ptr->num_text;
963
return ((png_uint_32)info_ptr->num_text);
966
if (num_text != NULL)
973
#ifdef PNG_tIME_SUPPORTED
975
png_get_tIME(png_const_structp png_ptr, png_infop info_ptr, png_timep *mod_time)
977
png_debug1(1, "in %s retrieval function", "tIME");
979
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME)
982
*mod_time = &(info_ptr->mod_time);
983
return (PNG_INFO_tIME);
990
#ifdef PNG_tRNS_SUPPORTED
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)
995
png_uint_32 retval = 0;
996
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS))
998
png_debug1(1, "in %s retrieval function", "tRNS");
1000
if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
1002
if (trans_alpha != NULL)
1004
*trans_alpha = info_ptr->trans_alpha;
1005
retval |= PNG_INFO_tRNS;
1008
if (trans_color != NULL)
1009
*trans_color = &(info_ptr->trans_color);
1012
else /* if (info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) */
1014
if (trans_color != NULL)
1016
*trans_color = &(info_ptr->trans_color);
1017
retval |= PNG_INFO_tRNS;
1020
if (trans_alpha != NULL)
1021
*trans_alpha = NULL;
1024
if (num_trans != NULL)
1026
*num_trans = info_ptr->num_trans;
1027
retval |= PNG_INFO_tRNS;
1035
#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
1037
png_get_unknown_chunks(png_const_structp png_ptr, png_const_infop info_ptr,
1038
png_unknown_chunkpp unknowns)
1040
if (png_ptr != NULL && info_ptr != NULL && unknowns != NULL)
1042
*unknowns = info_ptr->unknown_chunks;
1043
return info_ptr->unknown_chunks_num;
1050
#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
1052
png_get_rgb_to_gray_status (png_const_structp png_ptr)
1054
return (png_byte)(png_ptr ? png_ptr->rgb_to_gray_status : 0);
1058
#ifdef PNG_USER_CHUNKS_SUPPORTED
1060
png_get_user_chunk_ptr(png_const_structp png_ptr)
1062
return (png_ptr ? png_ptr->user_chunk_ptr : NULL);
1067
png_get_compression_buffer_size(png_const_structp png_ptr)
1069
return (png_ptr ? png_ptr->zbuf_size : 0);
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 */
1076
png_get_user_width_max (png_const_structp png_ptr)
1078
return (png_ptr ? png_ptr->user_width_max : 0);
1082
png_get_user_height_max (png_const_structp png_ptr)
1084
return (png_ptr ? png_ptr->user_height_max : 0);
1087
/* This function was added to libpng 1.4.0 */
1089
png_get_chunk_cache_max (png_const_structp png_ptr)
1091
return (png_ptr ? png_ptr->user_chunk_cache_max : 0);
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)
1098
return (png_ptr ? png_ptr->user_chunk_malloc_max : 0);
1100
#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */
1102
/* These functions were added to libpng 1.4.0 */
1103
#ifdef PNG_IO_STATE_SUPPORTED
1105
png_get_io_state (png_structp png_ptr)
1107
return png_ptr->io_state;
1111
png_get_io_chunk_type (png_const_structp png_ptr)
1113
return png_ptr->chunk_name;
1116
png_const_bytep PNGAPI
1117
png_get_io_chunk_name (png_structp png_ptr)
1119
PNG_CSTRING_FROM_CHUNK(png_ptr->io_chunk_string, png_ptr->chunk_name);
1120
return png_ptr->io_chunk_string;
1122
#endif /* ?PNG_IO_STATE_SUPPORTED */
1124
#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */