1
2/* pngget.c - retrieval of values from info struct
3 *
4 * Last changed in libpng 1.2.43 [February 25, 2010]
5 * Copyright (c) 1998-2010 Glenn Randers-Pehrson
6 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
7 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
8 *
9 * This code is released under the libpng license.
10 * For conditions of distribution and use, see the disclaimer
11 * and license in png.h
12 *
13 */
14
15#define PNG_INTERNAL
16#define PNG_NO_PEDANTIC_WARNINGS
17#include "png.h"
18#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
19
20png_uint_32 PNGAPI
21png_get_valid(png_structp png_ptr, png_infop info_ptr, png_uint_32 flag)
22{
23   if (png_ptr != NULL && info_ptr != NULL)
24      return(info_ptr->valid & flag);
25
26   else
27      return(0);
28}
29
30png_uint_32 PNGAPI
31png_get_rowbytes(png_structp png_ptr, png_infop info_ptr)
32{
33   if (png_ptr != NULL && info_ptr != NULL)
34      return(info_ptr->rowbytes);
35
36   else
37      return(0);
38}
39
40#ifdef PNG_INFO_IMAGE_SUPPORTED
41png_bytepp PNGAPI
42png_get_rows(png_structp png_ptr, png_infop info_ptr)
43{
44   if (png_ptr != NULL && info_ptr != NULL)
45      return(info_ptr->row_pointers);
46
47   else
48      return(0);
49}
50#endif
51
52#ifdef PNG_EASY_ACCESS_SUPPORTED
53/* Easy access to info, added in libpng-0.99 */
54png_uint_32 PNGAPI
55png_get_image_width(png_structp png_ptr, png_infop info_ptr)
56{
57   if (png_ptr != NULL && info_ptr != NULL)
58      return info_ptr->width;
59
60   return (0);
61}
62
63png_uint_32 PNGAPI
64png_get_image_height(png_structp png_ptr, png_infop info_ptr)
65{
66   if (png_ptr != NULL && info_ptr != NULL)
67      return info_ptr->height;
68
69   return (0);
70}
71
72png_byte PNGAPI
73png_get_bit_depth(png_structp png_ptr, png_infop info_ptr)
74{
75   if (png_ptr != NULL && info_ptr != NULL)
76      return info_ptr->bit_depth;
77
78   return (0);
79}
80
81png_byte PNGAPI
82png_get_color_type(png_structp png_ptr, png_infop info_ptr)
83{
84   if (png_ptr != NULL && info_ptr != NULL)
85      return info_ptr->color_type;
86
87   return (0);
88}
89
90png_byte PNGAPI
91png_get_filter_type(png_structp png_ptr, png_infop info_ptr)
92{
93   if (png_ptr != NULL && info_ptr != NULL)
94      return info_ptr->filter_type;
95
96   return (0);
97}
98
99png_byte PNGAPI
100png_get_interlace_type(png_structp png_ptr, png_infop info_ptr)
101{
102   if (png_ptr != NULL && info_ptr != NULL)
103      return info_ptr->interlace_type;
104
105   return (0);
106}
107
108png_byte PNGAPI
109png_get_compression_type(png_structp png_ptr, png_infop info_ptr)
110{
111   if (png_ptr != NULL && info_ptr != NULL)
112      return info_ptr->compression_type;
113
114   return (0);
115}
116
117png_uint_32 PNGAPI
118png_get_x_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
119{
120   if (png_ptr != NULL && info_ptr != NULL)
121#ifdef PNG_pHYs_SUPPORTED
122   if (info_ptr->valid & PNG_INFO_pHYs)
123   {
124      png_debug1(1, "in %s retrieval function", "png_get_x_pixels_per_meter");
125
126      if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER)
127          return (0);
128
129      else
130          return (info_ptr->x_pixels_per_unit);
131   }
132#else
133   return (0);
134#endif
135   return (0);
136}
137
138png_uint_32 PNGAPI
139png_get_y_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
140{
141   if (png_ptr != NULL && info_ptr != NULL)
142#ifdef PNG_pHYs_SUPPORTED
143   if (info_ptr->valid & PNG_INFO_pHYs)
144   {
145      png_debug1(1, "in %s retrieval function", "png_get_y_pixels_per_meter");
146
147      if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER)
148          return (0);
149
150      else
151          return (info_ptr->y_pixels_per_unit);
152   }
153#else
154   return (0);
155#endif
156   return (0);
157}
158
159png_uint_32 PNGAPI
160png_get_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
161{
162   if (png_ptr != NULL && info_ptr != NULL)
163#ifdef PNG_pHYs_SUPPORTED
164   if (info_ptr->valid & PNG_INFO_pHYs)
165   {
166      png_debug1(1, "in %s retrieval function", "png_get_pixels_per_meter");
167
168      if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER ||
169         info_ptr->x_pixels_per_unit != info_ptr->y_pixels_per_unit)
170          return (0);
171
172      else
173          return (info_ptr->x_pixels_per_unit);
174   }
175#else
176   return (0);
177#endif
178   return (0);
179}
180
181#ifdef PNG_FLOATING_POINT_SUPPORTED
182float PNGAPI
183png_get_pixel_aspect_ratio(png_structp png_ptr, png_infop info_ptr)
184   {
185   if (png_ptr != NULL && info_ptr != NULL)
186#ifdef PNG_pHYs_SUPPORTED
187
188   if (info_ptr->valid & PNG_INFO_pHYs)
189   {
190      png_debug1(1, "in %s retrieval function", "png_get_aspect_ratio");
191
192      if (info_ptr->x_pixels_per_unit == 0)
193         return ((float)0.0);
194
195      else
196         return ((float)((float)info_ptr->y_pixels_per_unit
197            /(float)info_ptr->x_pixels_per_unit));
198   }
199#else
200      return (0.0);
201#endif
202   return ((float)0.0);
203}
204#endif
205
206png_int_32 PNGAPI
207png_get_x_offset_microns(png_structp png_ptr, png_infop info_ptr)
208{
209   if (png_ptr != NULL && info_ptr != NULL)
210#ifdef PNG_oFFs_SUPPORTED
211
212   if (info_ptr->valid & PNG_INFO_oFFs)
213   {
214      png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns");
215
216      if (info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER)
217          return (0);
218
219      else
220          return (info_ptr->x_offset);
221   }
222#else
223      return (0);
224#endif
225   return (0);
226}
227
228png_int_32 PNGAPI
229png_get_y_offset_microns(png_structp png_ptr, png_infop info_ptr)
230{
231   if (png_ptr != NULL && info_ptr != NULL)
232
233#ifdef PNG_oFFs_SUPPORTED
234   if (info_ptr->valid & PNG_INFO_oFFs)
235   {
236      png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns");
237
238      if (info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER)
239          return (0);
240
241      else
242          return (info_ptr->y_offset);
243   }
244#else
245   return (0);
246#endif
247   return (0);
248}
249
250png_int_32 PNGAPI
251png_get_x_offset_pixels(png_structp png_ptr, png_infop info_ptr)
252{
253   if (png_ptr != NULL && info_ptr != NULL)
254
255#ifdef PNG_oFFs_SUPPORTED
256   if (info_ptr->valid & PNG_INFO_oFFs)
257   {
258      png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns");
259
260      if (info_ptr->offset_unit_type != PNG_OFFSET_PIXEL)
261          return (0);
262
263      else
264          return (info_ptr->x_offset);
265   }
266#else
267   return (0);
268#endif
269   return (0);
270}
271
272png_int_32 PNGAPI
273png_get_y_offset_pixels(png_structp png_ptr, png_infop info_ptr)
274{
275   if (png_ptr != NULL && info_ptr != NULL)
276
277#ifdef PNG_oFFs_SUPPORTED
278   if (info_ptr->valid & PNG_INFO_oFFs)
279   {
280      png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns");
281
282      if (info_ptr->offset_unit_type != PNG_OFFSET_PIXEL)
283          return (0);
284
285      else
286          return (info_ptr->y_offset);
287   }
288#else
289   return (0);
290#endif
291   return (0);
292}
293
294#if defined(PNG_INCH_CONVERSIONS) && defined(PNG_FLOATING_POINT_SUPPORTED)
295png_uint_32 PNGAPI
296png_get_pixels_per_inch(png_structp png_ptr, png_infop info_ptr)
297{
298   return ((png_uint_32)((float)png_get_pixels_per_meter(png_ptr, info_ptr)
299     *.0254 +.5));
300}
301
302png_uint_32 PNGAPI
303png_get_x_pixels_per_inch(png_structp png_ptr, png_infop info_ptr)
304{
305   return ((png_uint_32)((float)png_get_x_pixels_per_meter(png_ptr, info_ptr)
306     *.0254 +.5));
307}
308
309png_uint_32 PNGAPI
310png_get_y_pixels_per_inch(png_structp png_ptr, png_infop info_ptr)
311{
312   return ((png_uint_32)((float)png_get_y_pixels_per_meter(png_ptr, info_ptr)
313     *.0254 +.5));
314}
315
316float PNGAPI
317png_get_x_offset_inches(png_structp png_ptr, png_infop info_ptr)
318{
319   return ((float)png_get_x_offset_microns(png_ptr, info_ptr)
320     *.00003937);
321}
322
323float PNGAPI
324png_get_y_offset_inches(png_structp png_ptr, png_infop info_ptr)
325{
326   return ((float)png_get_y_offset_microns(png_ptr, info_ptr)
327     *.00003937);
328}
329
330#ifdef PNG_pHYs_SUPPORTED
331png_uint_32 PNGAPI
332png_get_pHYs_dpi(png_structp png_ptr, png_infop info_ptr,
333   png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)
334{
335   png_uint_32 retval = 0;
336
337   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs))
338   {
339      png_debug1(1, "in %s retrieval function", "pHYs");
340
341      if (res_x != NULL)
342      {
343         *res_x = info_ptr->x_pixels_per_unit;
344         retval |= PNG_INFO_pHYs;
345      }
346      if (res_y != NULL)
347      {
348         *res_y = info_ptr->y_pixels_per_unit;
349         retval |= PNG_INFO_pHYs;
350      }
351      if (unit_type != NULL)
352      {
353         *unit_type = (int)info_ptr->phys_unit_type;
354         retval |= PNG_INFO_pHYs;
355         if (*unit_type == 1)
356         {
357            if (res_x != NULL) *res_x = (png_uint_32)(*res_x * .0254 + .50);
358            if (res_y != NULL) *res_y = (png_uint_32)(*res_y * .0254 + .50);
359         }
360      }
361   }
362   return (retval);
363}
364#endif /* PNG_pHYs_SUPPORTED */
365#endif  /* PNG_INCH_CONVERSIONS && PNG_FLOATING_POINT_SUPPORTED */
366
367/* png_get_channels really belongs in here, too, but it's been around longer */
368
369#endif  /* PNG_EASY_ACCESS_SUPPORTED */
370
371png_byte PNGAPI
372png_get_channels(png_structp png_ptr, png_infop info_ptr)
373{
374   if (png_ptr != NULL && info_ptr != NULL)
375      return(info_ptr->channels);
376   else
377      return (0);
378}
379
380png_bytep PNGAPI
381png_get_signature(png_structp png_ptr, png_infop info_ptr)
382{
383   if (png_ptr != NULL && info_ptr != NULL)
384      return(info_ptr->signature);
385   else
386      return (NULL);
387}
388
389#ifdef PNG_bKGD_SUPPORTED
390png_uint_32 PNGAPI
391png_get_bKGD(png_structp png_ptr, png_infop info_ptr,
392   png_color_16p *background)
393{
394   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD)
395      && background != NULL)
396   {
397      png_debug1(1, "in %s retrieval function", "bKGD");
398
399      *background = &(info_ptr->background);
400      return (PNG_INFO_bKGD);
401   }
402   return (0);
403}
404#endif
405
406#ifdef PNG_cHRM_SUPPORTED
407#ifdef PNG_FLOATING_POINT_SUPPORTED
408png_uint_32 PNGAPI
409png_get_cHRM(png_structp png_ptr, png_infop info_ptr,
410   double *white_x, double *white_y, double *red_x, double *red_y,
411   double *green_x, double *green_y, double *blue_x, double *blue_y)
412{
413   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM))
414   {
415      png_debug1(1, "in %s retrieval function", "cHRM");
416
417      if (white_x != NULL)
418         *white_x = (double)info_ptr->x_white;
419      if (white_y != NULL)
420         *white_y = (double)info_ptr->y_white;
421      if (red_x != NULL)
422         *red_x = (double)info_ptr->x_red;
423      if (red_y != NULL)
424         *red_y = (double)info_ptr->y_red;
425      if (green_x != NULL)
426         *green_x = (double)info_ptr->x_green;
427      if (green_y != NULL)
428         *green_y = (double)info_ptr->y_green;
429      if (blue_x != NULL)
430         *blue_x = (double)info_ptr->x_blue;
431      if (blue_y != NULL)
432         *blue_y = (double)info_ptr->y_blue;
433      return (PNG_INFO_cHRM);
434   }
435   return (0);
436}
437#endif
438#ifdef PNG_FIXED_POINT_SUPPORTED
439png_uint_32 PNGAPI
440png_get_cHRM_fixed(png_structp png_ptr, png_infop info_ptr,
441   png_fixed_point *white_x, png_fixed_point *white_y, png_fixed_point *red_x,
442   png_fixed_point *red_y, png_fixed_point *green_x, png_fixed_point *green_y,
443   png_fixed_point *blue_x, png_fixed_point *blue_y)
444{
445   png_debug1(1, "in %s retrieval function", "cHRM");
446
447   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM))
448   {
449      if (white_x != NULL)
450         *white_x = info_ptr->int_x_white;
451      if (white_y != NULL)
452         *white_y = info_ptr->int_y_white;
453      if (red_x != NULL)
454         *red_x = info_ptr->int_x_red;
455      if (red_y != NULL)
456         *red_y = info_ptr->int_y_red;
457      if (green_x != NULL)
458         *green_x = info_ptr->int_x_green;
459      if (green_y != NULL)
460         *green_y = info_ptr->int_y_green;
461      if (blue_x != NULL)
462         *blue_x = info_ptr->int_x_blue;
463      if (blue_y != NULL)
464         *blue_y = info_ptr->int_y_blue;
465      return (PNG_INFO_cHRM);
466   }
467   return (0);
468}
469#endif
470#endif
471
472#ifdef PNG_gAMA_SUPPORTED
473#ifdef PNG_FLOATING_POINT_SUPPORTED
474png_uint_32 PNGAPI
475png_get_gAMA(png_structp png_ptr, png_infop info_ptr, double *file_gamma)
476{
477   png_debug1(1, "in %s retrieval function", "gAMA");
478
479   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA)
480      && file_gamma != NULL)
481   {
482      *file_gamma = (double)info_ptr->gamma;
483      return (PNG_INFO_gAMA);
484   }
485   return (0);
486}
487#endif
488#ifdef PNG_FIXED_POINT_SUPPORTED
489png_uint_32 PNGAPI
490png_get_gAMA_fixed(png_structp png_ptr, png_infop info_ptr,
491    png_fixed_point *int_file_gamma)
492{
493   png_debug1(1, "in %s retrieval function", "gAMA");
494
495   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA)
496      && int_file_gamma != NULL)
497   {
498      *int_file_gamma = info_ptr->int_gamma;
499      return (PNG_INFO_gAMA);
500   }
501   return (0);
502}
503#endif
504#endif
505
506#ifdef PNG_sRGB_SUPPORTED
507png_uint_32 PNGAPI
508png_get_sRGB(png_structp png_ptr, png_infop info_ptr, int *file_srgb_intent)
509{
510   png_debug1(1, "in %s retrieval function", "sRGB");
511
512   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB)
513      && file_srgb_intent != NULL)
514   {
515      *file_srgb_intent = (int)info_ptr->srgb_intent;
516      return (PNG_INFO_sRGB);
517   }
518   return (0);
519}
520#endif
521
522#ifdef PNG_iCCP_SUPPORTED
523png_uint_32 PNGAPI
524png_get_iCCP(png_structp png_ptr, png_infop info_ptr,
525             png_charpp name, int *compression_type,
526             png_charpp profile, png_uint_32 *proflen)
527{
528   png_debug1(1, "in %s retrieval function", "iCCP");
529
530   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP)
531      && name != NULL && profile != NULL && proflen != NULL)
532   {
533      *name = info_ptr->iccp_name;
534      *profile = info_ptr->iccp_profile;
535      /* Compression_type is a dummy so the API won't have to change
536       * if we introduce multiple compression types later.
537       */
538      *proflen = (int)info_ptr->iccp_proflen;
539      *compression_type = (int)info_ptr->iccp_compression;
540      return (PNG_INFO_iCCP);
541   }
542   return (0);
543}
544#endif
545
546#ifdef PNG_sPLT_SUPPORTED
547png_uint_32 PNGAPI
548png_get_sPLT(png_structp png_ptr, png_infop info_ptr,
549             png_sPLT_tpp spalettes)
550{
551   if (png_ptr != NULL && info_ptr != NULL && spalettes != NULL)
552   {
553     *spalettes = info_ptr->splt_palettes;
554     return ((png_uint_32)info_ptr->splt_palettes_num);
555   }
556   return (0);
557}
558#endif
559
560#ifdef PNG_hIST_SUPPORTED
561png_uint_32 PNGAPI
562png_get_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p *hist)
563{
564   png_debug1(1, "in %s retrieval function", "hIST");
565
566   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST)
567      && hist != NULL)
568   {
569      *hist = info_ptr->hist;
570      return (PNG_INFO_hIST);
571   }
572   return (0);
573}
574#endif
575
576png_uint_32 PNGAPI
577png_get_IHDR(png_structp png_ptr, png_infop info_ptr,
578   png_uint_32 *width, png_uint_32 *height, int *bit_depth,
579   int *color_type, int *interlace_type, int *compression_type,
580   int *filter_type)
581
582{
583   png_debug1(1, "in %s retrieval function", "IHDR");
584
585   if (png_ptr == NULL || info_ptr == NULL || width == NULL ||
586       height == NULL || bit_depth == NULL || color_type == NULL)
587      return (0);
588
589   *width = info_ptr->width;
590   *height = info_ptr->height;
591   *bit_depth = info_ptr->bit_depth;
592   *color_type = info_ptr->color_type;
593
594   if (compression_type != NULL)
595      *compression_type = info_ptr->compression_type;
596
597   if (filter_type != NULL)
598      *filter_type = info_ptr->filter_type;
599
600   if (interlace_type != NULL)
601      *interlace_type = info_ptr->interlace_type;
602
603   /* This is redundant if we can be sure that the info_ptr values were all
604    * assigned in png_set_IHDR().  We do the check anyhow in case an
605    * application has ignored our advice not to mess with the members
606    * of info_ptr directly.
607    */
608   png_check_IHDR (png_ptr, info_ptr->width, info_ptr->height,
609       info_ptr->bit_depth, info_ptr->color_type, info_ptr->interlace_type,
610       info_ptr->compression_type, info_ptr->filter_type);
611
612   return (1);
613}
614
615#ifdef PNG_oFFs_SUPPORTED
616png_uint_32 PNGAPI
617png_get_oFFs(png_structp png_ptr, png_infop info_ptr,
618   png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type)
619{
620   png_debug1(1, "in %s retrieval function", "oFFs");
621
622   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)
623      && offset_x != NULL && offset_y != NULL && unit_type != NULL)
624   {
625      *offset_x = info_ptr->x_offset;
626      *offset_y = info_ptr->y_offset;
627      *unit_type = (int)info_ptr->offset_unit_type;
628      return (PNG_INFO_oFFs);
629   }
630   return (0);
631}
632#endif
633
634#ifdef PNG_pCAL_SUPPORTED
635png_uint_32 PNGAPI
636png_get_pCAL(png_structp png_ptr, png_infop info_ptr,
637   png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams,
638   png_charp *units, png_charpp *params)
639{
640   png_debug1(1, "in %s retrieval function", "pCAL");
641
642   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL)
643       && purpose != NULL && X0 != NULL && X1 != NULL && type != NULL &&
644       nparams != NULL && units != NULL && params != NULL)
645   {
646      *purpose = info_ptr->pcal_purpose;
647      *X0 = info_ptr->pcal_X0;
648      *X1 = info_ptr->pcal_X1;
649      *type = (int)info_ptr->pcal_type;
650      *nparams = (int)info_ptr->pcal_nparams;
651      *units = info_ptr->pcal_units;
652      *params = info_ptr->pcal_params;
653      return (PNG_INFO_pCAL);
654   }
655   return (0);
656}
657#endif
658
659#ifdef PNG_sCAL_SUPPORTED
660#ifdef PNG_FLOATING_POINT_SUPPORTED
661png_uint_32 PNGAPI
662png_get_sCAL(png_structp png_ptr, png_infop info_ptr,
663             int *unit, double *width, double *height)
664{
665    if (png_ptr != NULL && info_ptr != NULL &&
666        (info_ptr->valid & PNG_INFO_sCAL))
667    {
668        *unit = info_ptr->scal_unit;
669        *width = info_ptr->scal_pixel_width;
670        *height = info_ptr->scal_pixel_height;
671        return (PNG_INFO_sCAL);
672    }
673    return(0);
674}
675#else
676#ifdef PNG_FIXED_POINT_SUPPORTED
677png_uint_32 PNGAPI
678png_get_sCAL_s(png_structp png_ptr, png_infop info_ptr,
679             int *unit, png_charpp width, png_charpp height)
680{
681    if (png_ptr != NULL && info_ptr != NULL &&
682        (info_ptr->valid & PNG_INFO_sCAL))
683    {
684        *unit = info_ptr->scal_unit;
685        *width = info_ptr->scal_s_width;
686        *height = info_ptr->scal_s_height;
687        return (PNG_INFO_sCAL);
688    }
689    return(0);
690}
691#endif
692#endif
693#endif
694
695#ifdef PNG_pHYs_SUPPORTED
696png_uint_32 PNGAPI
697png_get_pHYs(png_structp png_ptr, png_infop info_ptr,
698   png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)
699{
700   png_uint_32 retval = 0;
701
702   png_debug1(1, "in %s retrieval function", "pHYs");
703
704   if (png_ptr != NULL && info_ptr != NULL &&
705      (info_ptr->valid & PNG_INFO_pHYs))
706   {
707      if (res_x != NULL)
708      {
709         *res_x = info_ptr->x_pixels_per_unit;
710         retval |= PNG_INFO_pHYs;
711      }
712
713      if (res_y != NULL)
714      {
715         *res_y = info_ptr->y_pixels_per_unit;
716         retval |= PNG_INFO_pHYs;
717      }
718
719      if (unit_type != NULL)
720      {
721         *unit_type = (int)info_ptr->phys_unit_type;
722         retval |= PNG_INFO_pHYs;
723      }
724   }
725   return (retval);
726}
727#endif
728
729png_uint_32 PNGAPI
730png_get_PLTE(png_structp png_ptr, png_infop info_ptr, png_colorp *palette,
731   int *num_palette)
732{
733   png_debug1(1, "in %s retrieval function", "PLTE");
734
735   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_PLTE)
736       && palette != NULL)
737   {
738      *palette = info_ptr->palette;
739      *num_palette = info_ptr->num_palette;
740      png_debug1(3, "num_palette = %d", *num_palette);
741      return (PNG_INFO_PLTE);
742   }
743   return (0);
744}
745
746#ifdef PNG_sBIT_SUPPORTED
747png_uint_32 PNGAPI
748png_get_sBIT(png_structp png_ptr, png_infop info_ptr, png_color_8p *sig_bit)
749{
750   png_debug1(1, "in %s retrieval function", "sBIT");
751
752   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT)
753      && sig_bit != NULL)
754   {
755      *sig_bit = &(info_ptr->sig_bit);
756      return (PNG_INFO_sBIT);
757   }
758   return (0);
759}
760#endif
761
762#ifdef PNG_TEXT_SUPPORTED
763png_uint_32 PNGAPI
764png_get_text(png_structp png_ptr, png_infop info_ptr, png_textp *text_ptr,
765   int *num_text)
766{
767   if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0)
768   {
769      png_debug1(1, "in %s retrieval function",
770         (png_ptr->chunk_name[0] == '\0' ? "text"
771             : (png_const_charp)png_ptr->chunk_name));
772
773      if (text_ptr != NULL)
774         *text_ptr = info_ptr->text;
775
776      if (num_text != NULL)
777         *num_text = info_ptr->num_text;
778
779      return ((png_uint_32)info_ptr->num_text);
780   }
781   if (num_text != NULL)
782     *num_text = 0;
783   return(0);
784}
785#endif
786
787#ifdef PNG_tIME_SUPPORTED
788png_uint_32 PNGAPI
789png_get_tIME(png_structp png_ptr, png_infop info_ptr, png_timep *mod_time)
790{
791   png_debug1(1, "in %s retrieval function", "tIME");
792
793   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME)
794       && mod_time != NULL)
795   {
796      *mod_time = &(info_ptr->mod_time);
797      return (PNG_INFO_tIME);
798   }
799   return (0);
800}
801#endif
802
803#ifdef PNG_tRNS_SUPPORTED
804png_uint_32 PNGAPI
805png_get_tRNS(png_structp png_ptr, png_infop info_ptr,
806   png_bytep *trans, int *num_trans, png_color_16p *trans_values)
807{
808   png_uint_32 retval = 0;
809   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS))
810   {
811      png_debug1(1, "in %s retrieval function", "tRNS");
812
813      if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
814      {
815          if (trans != NULL)
816          {
817             *trans = info_ptr->trans;
818             retval |= PNG_INFO_tRNS;
819          }
820
821          if (trans_values != NULL)
822             *trans_values = &(info_ptr->trans_values);
823      }
824      else /* if (info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) */
825      {
826          if (trans_values != NULL)
827          {
828             *trans_values = &(info_ptr->trans_values);
829             retval |= PNG_INFO_tRNS;
830          }
831
832          if (trans != NULL)
833             *trans = NULL;
834      }
835      if (num_trans != NULL)
836      {
837         *num_trans = info_ptr->num_trans;
838         retval |= PNG_INFO_tRNS;
839      }
840   }
841   return (retval);
842}
843#endif
844
845#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
846png_uint_32 PNGAPI
847png_get_unknown_chunks(png_structp png_ptr, png_infop info_ptr,
848             png_unknown_chunkpp unknowns)
849{
850   if (png_ptr != NULL && info_ptr != NULL && unknowns != NULL)
851   {
852     *unknowns = info_ptr->unknown_chunks;
853     return ((png_uint_32)info_ptr->unknown_chunks_num);
854   }
855   return (0);
856}
857#endif
858
859#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
860png_byte PNGAPI
861png_get_rgb_to_gray_status (png_structp png_ptr)
862{
863   return (png_byte)(png_ptr? png_ptr->rgb_to_gray_status : 0);
864}
865#endif
866
867#ifdef PNG_USER_CHUNKS_SUPPORTED
868png_voidp PNGAPI
869png_get_user_chunk_ptr(png_structp png_ptr)
870{
871   return (png_ptr? png_ptr->user_chunk_ptr : NULL);
872}
873#endif
874
875png_uint_32 PNGAPI
876png_get_compression_buffer_size(png_structp png_ptr)
877{
878   return (png_uint_32)(png_ptr? png_ptr->zbuf_size : 0L);
879}
880
881#ifdef PNG_ASSEMBLER_CODE_SUPPORTED
882#ifndef PNG_1_0_X
883/* This function was added to libpng 1.2.0 and should exist by default */
884png_uint_32 PNGAPI
885png_get_asm_flags (png_structp png_ptr)
886{
887    /* Obsolete, to be removed from libpng-1.4.0 */
888    return (png_ptr? 0L: 0L);
889}
890
891/* This function was added to libpng 1.2.0 and should exist by default */
892png_uint_32 PNGAPI
893png_get_asm_flagmask (int flag_select)
894{
895    /* Obsolete, to be removed from libpng-1.4.0 */
896    flag_select=flag_select;
897    return 0L;
898}
899
900    /* GRR:  could add this:   && defined(PNG_MMX_CODE_SUPPORTED) */
901/* This function was added to libpng 1.2.0 */
902png_uint_32 PNGAPI
903png_get_mmx_flagmask (int flag_select, int *compilerID)
904{
905    /* Obsolete, to be removed from libpng-1.4.0 */
906    flag_select=flag_select;
907    *compilerID = -1;   /* unknown (i.e., no asm/MMX code compiled) */
908    return 0L;
909}
910
911/* This function was added to libpng 1.2.0 */
912png_byte PNGAPI
913png_get_mmx_bitdepth_threshold (png_structp png_ptr)
914{
915    /* Obsolete, to be removed from libpng-1.4.0 */
916    return (png_ptr? 0: 0);
917}
918
919/* This function was added to libpng 1.2.0 */
920png_uint_32 PNGAPI
921png_get_mmx_rowbytes_threshold (png_structp png_ptr)
922{
923    /* Obsolete, to be removed from libpng-1.4.0 */
924    return (png_ptr? 0L: 0L);
925}
926#endif /* ?PNG_1_0_X */
927#endif /* ?PNG_ASSEMBLER_CODE_SUPPORTED */
928
929#ifdef PNG_SET_USER_LIMITS_SUPPORTED
930/* These functions were added to libpng 1.2.6 but not enabled
931* by default. They will be enabled in libpng-1.4.0 */
932png_uint_32 PNGAPI
933png_get_user_width_max (png_structp png_ptr)
934{
935    return (png_ptr? png_ptr->user_width_max : 0);
936}
937png_uint_32 PNGAPI
938png_get_user_height_max (png_structp png_ptr)
939{
940    return (png_ptr? png_ptr->user_height_max : 0);
941}
942#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */
943
944#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
945