added libimago
[eradicate] / libs / imago / libpng / pngget.c
diff --git a/libs/imago/libpng/pngget.c b/libs/imago/libpng/pngget.c
new file mode 100644 (file)
index 0000000..cf639d0
--- /dev/null
@@ -0,0 +1,900 @@
+\r
+/* pngget.c - retrieval of values from info struct\r
+ *\r
+ * Last changed in libpng 1.2.30 [August 15, 2008]\r
+ * For conditions of distribution and use, see copyright notice in png.h\r
+ * Copyright (c) 1998-2008 Glenn Randers-Pehrson\r
+ * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)\r
+ * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)\r
+ */\r
+\r
+#define PNG_INTERNAL\r
+#include "png.h"\r
+#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)\r
+\r
+png_uint_32 PNGAPI\r
+png_get_valid(png_structp png_ptr, png_infop info_ptr, png_uint_32 flag)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL)\r
+      return(info_ptr->valid & flag);\r
+   else\r
+      return(0);\r
+}\r
+\r
+png_uint_32 PNGAPI\r
+png_get_rowbytes(png_structp png_ptr, png_infop info_ptr)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL)\r
+      return(info_ptr->rowbytes);\r
+   else\r
+      return(0);\r
+}\r
+\r
+#if defined(PNG_INFO_IMAGE_SUPPORTED)\r
+png_bytepp PNGAPI\r
+png_get_rows(png_structp png_ptr, png_infop info_ptr)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL)\r
+      return(info_ptr->row_pointers);\r
+   else\r
+      return(0);\r
+}\r
+#endif\r
+\r
+#ifdef PNG_EASY_ACCESS_SUPPORTED\r
+/* easy access to info, added in libpng-0.99 */\r
+png_uint_32 PNGAPI\r
+png_get_image_width(png_structp png_ptr, png_infop info_ptr)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL)\r
+   {\r
+      return info_ptr->width;\r
+   }\r
+   return (0);\r
+}\r
+\r
+png_uint_32 PNGAPI\r
+png_get_image_height(png_structp png_ptr, png_infop info_ptr)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL)\r
+   {\r
+      return info_ptr->height;\r
+   }\r
+   return (0);\r
+}\r
+\r
+png_byte PNGAPI\r
+png_get_bit_depth(png_structp png_ptr, png_infop info_ptr)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL)\r
+   {\r
+      return info_ptr->bit_depth;\r
+   }\r
+   return (0);\r
+}\r
+\r
+png_byte PNGAPI\r
+png_get_color_type(png_structp png_ptr, png_infop info_ptr)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL)\r
+   {\r
+      return info_ptr->color_type;\r
+   }\r
+   return (0);\r
+}\r
+\r
+png_byte PNGAPI\r
+png_get_filter_type(png_structp png_ptr, png_infop info_ptr)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL)\r
+   {\r
+      return info_ptr->filter_type;\r
+   }\r
+   return (0);\r
+}\r
+\r
+png_byte PNGAPI\r
+png_get_interlace_type(png_structp png_ptr, png_infop info_ptr)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL)\r
+   {\r
+      return info_ptr->interlace_type;\r
+   }\r
+   return (0);\r
+}\r
+\r
+png_byte PNGAPI\r
+png_get_compression_type(png_structp png_ptr, png_infop info_ptr)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL)\r
+   {\r
+      return info_ptr->compression_type;\r
+   }\r
+   return (0);\r
+}\r
+\r
+png_uint_32 PNGAPI\r
+png_get_x_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL)\r
+#if defined(PNG_pHYs_SUPPORTED)\r
+   if (info_ptr->valid & PNG_INFO_pHYs)\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n", "png_get_x_pixels_per_meter");\r
+      if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER)\r
+          return (0);\r
+      else return (info_ptr->x_pixels_per_unit);\r
+   }\r
+#else\r
+   return (0);\r
+#endif\r
+   return (0);\r
+}\r
+\r
+png_uint_32 PNGAPI\r
+png_get_y_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL)\r
+#if defined(PNG_pHYs_SUPPORTED)\r
+   if (info_ptr->valid & PNG_INFO_pHYs)\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n", "png_get_y_pixels_per_meter");\r
+      if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER)\r
+          return (0);\r
+      else return (info_ptr->y_pixels_per_unit);\r
+   }\r
+#else\r
+   return (0);\r
+#endif\r
+   return (0);\r
+}\r
+\r
+png_uint_32 PNGAPI\r
+png_get_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL)\r
+#if defined(PNG_pHYs_SUPPORTED)\r
+   if (info_ptr->valid & PNG_INFO_pHYs)\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n", "png_get_pixels_per_meter");\r
+      if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER ||\r
+         info_ptr->x_pixels_per_unit != info_ptr->y_pixels_per_unit)\r
+          return (0);\r
+      else return (info_ptr->x_pixels_per_unit);\r
+   }\r
+#else\r
+   return (0);\r
+#endif\r
+   return (0);\r
+}\r
+\r
+#ifdef PNG_FLOATING_POINT_SUPPORTED\r
+float PNGAPI\r
+png_get_pixel_aspect_ratio(png_structp png_ptr, png_infop info_ptr)\r
+   {\r
+   if (png_ptr != NULL && info_ptr != NULL)\r
+#if defined(PNG_pHYs_SUPPORTED)\r
+   if (info_ptr->valid & PNG_INFO_pHYs)\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n", "png_get_aspect_ratio");\r
+      if (info_ptr->x_pixels_per_unit == 0)\r
+         return ((float)0.0);\r
+      else\r
+         return ((float)((float)info_ptr->y_pixels_per_unit\r
+            /(float)info_ptr->x_pixels_per_unit));\r
+   }\r
+#else\r
+   return (0.0);\r
+#endif\r
+   return ((float)0.0);\r
+}\r
+#endif\r
+\r
+png_int_32 PNGAPI\r
+png_get_x_offset_microns(png_structp png_ptr, png_infop info_ptr)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL)\r
+#if defined(PNG_oFFs_SUPPORTED)\r
+   if (info_ptr->valid & PNG_INFO_oFFs)\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns");\r
+      if (info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER)\r
+          return (0);\r
+      else return (info_ptr->x_offset);\r
+   }\r
+#else\r
+   return (0);\r
+#endif\r
+   return (0);\r
+}\r
+\r
+png_int_32 PNGAPI\r
+png_get_y_offset_microns(png_structp png_ptr, png_infop info_ptr)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL)\r
+#if defined(PNG_oFFs_SUPPORTED)\r
+   if (info_ptr->valid & PNG_INFO_oFFs)\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns");\r
+      if (info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER)\r
+          return (0);\r
+      else return (info_ptr->y_offset);\r
+   }\r
+#else\r
+   return (0);\r
+#endif\r
+   return (0);\r
+}\r
+\r
+png_int_32 PNGAPI\r
+png_get_x_offset_pixels(png_structp png_ptr, png_infop info_ptr)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL)\r
+#if defined(PNG_oFFs_SUPPORTED)\r
+   if (info_ptr->valid & PNG_INFO_oFFs)\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns");\r
+      if (info_ptr->offset_unit_type != PNG_OFFSET_PIXEL)\r
+          return (0);\r
+      else return (info_ptr->x_offset);\r
+   }\r
+#else\r
+   return (0);\r
+#endif\r
+   return (0);\r
+}\r
+\r
+png_int_32 PNGAPI\r
+png_get_y_offset_pixels(png_structp png_ptr, png_infop info_ptr)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL)\r
+#if defined(PNG_oFFs_SUPPORTED)\r
+   if (info_ptr->valid & PNG_INFO_oFFs)\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns");\r
+      if (info_ptr->offset_unit_type != PNG_OFFSET_PIXEL)\r
+          return (0);\r
+      else return (info_ptr->y_offset);\r
+   }\r
+#else\r
+   return (0);\r
+#endif\r
+   return (0);\r
+}\r
+\r
+#if defined(PNG_INCH_CONVERSIONS) && defined(PNG_FLOATING_POINT_SUPPORTED)\r
+png_uint_32 PNGAPI\r
+png_get_pixels_per_inch(png_structp png_ptr, png_infop info_ptr)\r
+{\r
+   return ((png_uint_32)((float)png_get_pixels_per_meter(png_ptr, info_ptr)\r
+     *.0254 +.5));\r
+}\r
+\r
+png_uint_32 PNGAPI\r
+png_get_x_pixels_per_inch(png_structp png_ptr, png_infop info_ptr)\r
+{\r
+   return ((png_uint_32)((float)png_get_x_pixels_per_meter(png_ptr, info_ptr)\r
+     *.0254 +.5));\r
+}\r
+\r
+png_uint_32 PNGAPI\r
+png_get_y_pixels_per_inch(png_structp png_ptr, png_infop info_ptr)\r
+{\r
+   return ((png_uint_32)((float)png_get_y_pixels_per_meter(png_ptr, info_ptr)\r
+     *.0254 +.5));\r
+}\r
+\r
+float PNGAPI\r
+png_get_x_offset_inches(png_structp png_ptr, png_infop info_ptr)\r
+{\r
+   return ((float)png_get_x_offset_microns(png_ptr, info_ptr)\r
+     *.00003937);\r
+}\r
+\r
+float PNGAPI\r
+png_get_y_offset_inches(png_structp png_ptr, png_infop info_ptr)\r
+{\r
+   return ((float)png_get_y_offset_microns(png_ptr, info_ptr)\r
+     *.00003937);\r
+}\r
+\r
+#if defined(PNG_pHYs_SUPPORTED)\r
+png_uint_32 PNGAPI\r
+png_get_pHYs_dpi(png_structp png_ptr, png_infop info_ptr,\r
+   png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)\r
+{\r
+   png_uint_32 retval = 0;\r
+\r
+   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs))\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n", "pHYs");\r
+      if (res_x != NULL)\r
+      {\r
+         *res_x = info_ptr->x_pixels_per_unit;\r
+         retval |= PNG_INFO_pHYs;\r
+      }\r
+      if (res_y != NULL)\r
+      {\r
+         *res_y = info_ptr->y_pixels_per_unit;\r
+         retval |= PNG_INFO_pHYs;\r
+      }\r
+      if (unit_type != NULL)\r
+      {\r
+         *unit_type = (int)info_ptr->phys_unit_type;\r
+         retval |= PNG_INFO_pHYs;\r
+         if (*unit_type == 1)\r
+         {\r
+            if (res_x != NULL) *res_x = (png_uint_32)(*res_x * .0254 + .50);\r
+            if (res_y != NULL) *res_y = (png_uint_32)(*res_y * .0254 + .50);\r
+         }\r
+      }\r
+   }\r
+   return (retval);\r
+}\r
+#endif /* PNG_pHYs_SUPPORTED */\r
+#endif  /* PNG_INCH_CONVERSIONS && PNG_FLOATING_POINT_SUPPORTED */\r
+\r
+/* png_get_channels really belongs in here, too, but it's been around longer */\r
+\r
+#endif  /* PNG_EASY_ACCESS_SUPPORTED */\r
+\r
+png_byte PNGAPI\r
+png_get_channels(png_structp png_ptr, png_infop info_ptr)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL)\r
+      return(info_ptr->channels);\r
+   else\r
+      return (0);\r
+}\r
+\r
+png_bytep PNGAPI\r
+png_get_signature(png_structp png_ptr, png_infop info_ptr)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL)\r
+      return(info_ptr->signature);\r
+   else\r
+      return (NULL);\r
+}\r
+\r
+#if defined(PNG_bKGD_SUPPORTED)\r
+png_uint_32 PNGAPI\r
+png_get_bKGD(png_structp png_ptr, png_infop info_ptr,\r
+   png_color_16p *background)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD)\r
+      && background != NULL)\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n", "bKGD");\r
+      *background = &(info_ptr->background);\r
+      return (PNG_INFO_bKGD);\r
+   }\r
+   return (0);\r
+}\r
+#endif\r
+\r
+#if defined(PNG_cHRM_SUPPORTED)\r
+#ifdef PNG_FLOATING_POINT_SUPPORTED\r
+png_uint_32 PNGAPI\r
+png_get_cHRM(png_structp png_ptr, png_infop info_ptr,\r
+   double *white_x, double *white_y, double *red_x, double *red_y,\r
+   double *green_x, double *green_y, double *blue_x, double *blue_y)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM))\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n", "cHRM");\r
+      if (white_x != NULL)\r
+         *white_x = (double)info_ptr->x_white;\r
+      if (white_y != NULL)\r
+         *white_y = (double)info_ptr->y_white;\r
+      if (red_x != NULL)\r
+         *red_x = (double)info_ptr->x_red;\r
+      if (red_y != NULL)\r
+         *red_y = (double)info_ptr->y_red;\r
+      if (green_x != NULL)\r
+         *green_x = (double)info_ptr->x_green;\r
+      if (green_y != NULL)\r
+         *green_y = (double)info_ptr->y_green;\r
+      if (blue_x != NULL)\r
+         *blue_x = (double)info_ptr->x_blue;\r
+      if (blue_y != NULL)\r
+         *blue_y = (double)info_ptr->y_blue;\r
+      return (PNG_INFO_cHRM);\r
+   }\r
+   return (0);\r
+}\r
+#endif\r
+#ifdef PNG_FIXED_POINT_SUPPORTED\r
+png_uint_32 PNGAPI\r
+png_get_cHRM_fixed(png_structp png_ptr, png_infop info_ptr,\r
+   png_fixed_point *white_x, png_fixed_point *white_y, png_fixed_point *red_x,\r
+   png_fixed_point *red_y, png_fixed_point *green_x, png_fixed_point *green_y,\r
+   png_fixed_point *blue_x, png_fixed_point *blue_y)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM))\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n", "cHRM");\r
+      if (white_x != NULL)\r
+         *white_x = info_ptr->int_x_white;\r
+      if (white_y != NULL)\r
+         *white_y = info_ptr->int_y_white;\r
+      if (red_x != NULL)\r
+         *red_x = info_ptr->int_x_red;\r
+      if (red_y != NULL)\r
+         *red_y = info_ptr->int_y_red;\r
+      if (green_x != NULL)\r
+         *green_x = info_ptr->int_x_green;\r
+      if (green_y != NULL)\r
+         *green_y = info_ptr->int_y_green;\r
+      if (blue_x != NULL)\r
+         *blue_x = info_ptr->int_x_blue;\r
+      if (blue_y != NULL)\r
+         *blue_y = info_ptr->int_y_blue;\r
+      return (PNG_INFO_cHRM);\r
+   }\r
+   return (0);\r
+}\r
+#endif\r
+#endif\r
+\r
+#if defined(PNG_gAMA_SUPPORTED)\r
+#ifdef PNG_FLOATING_POINT_SUPPORTED\r
+png_uint_32 PNGAPI\r
+png_get_gAMA(png_structp png_ptr, png_infop info_ptr, double *file_gamma)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA)\r
+      && file_gamma != NULL)\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n", "gAMA");\r
+      *file_gamma = (double)info_ptr->gamma;\r
+      return (PNG_INFO_gAMA);\r
+   }\r
+   return (0);\r
+}\r
+#endif\r
+#ifdef PNG_FIXED_POINT_SUPPORTED\r
+png_uint_32 PNGAPI\r
+png_get_gAMA_fixed(png_structp png_ptr, png_infop info_ptr,\r
+    png_fixed_point *int_file_gamma)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA)\r
+      && int_file_gamma != NULL)\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n", "gAMA");\r
+      *int_file_gamma = info_ptr->int_gamma;\r
+      return (PNG_INFO_gAMA);\r
+   }\r
+   return (0);\r
+}\r
+#endif\r
+#endif\r
+\r
+#if defined(PNG_sRGB_SUPPORTED)\r
+png_uint_32 PNGAPI\r
+png_get_sRGB(png_structp png_ptr, png_infop info_ptr, int *file_srgb_intent)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB)\r
+      && file_srgb_intent != NULL)\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n", "sRGB");\r
+      *file_srgb_intent = (int)info_ptr->srgb_intent;\r
+      return (PNG_INFO_sRGB);\r
+   }\r
+   return (0);\r
+}\r
+#endif\r
+\r
+#if defined(PNG_iCCP_SUPPORTED)\r
+png_uint_32 PNGAPI\r
+png_get_iCCP(png_structp png_ptr, png_infop info_ptr,\r
+             png_charpp name, int *compression_type,\r
+             png_charpp profile, png_uint_32 *proflen)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP)\r
+      && name != NULL && profile != NULL && proflen != NULL)\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n", "iCCP");\r
+      *name = info_ptr->iccp_name;\r
+      *profile = info_ptr->iccp_profile;\r
+      /* compression_type is a dummy so the API won't have to change\r
+         if we introduce multiple compression types later. */\r
+      *proflen = (int)info_ptr->iccp_proflen;\r
+      *compression_type = (int)info_ptr->iccp_compression;\r
+      return (PNG_INFO_iCCP);\r
+   }\r
+   return (0);\r
+}\r
+#endif\r
+\r
+#if defined(PNG_sPLT_SUPPORTED)\r
+png_uint_32 PNGAPI\r
+png_get_sPLT(png_structp png_ptr, png_infop info_ptr,\r
+             png_sPLT_tpp spalettes)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL && spalettes != NULL)\r
+   {\r
+     *spalettes = info_ptr->splt_palettes;\r
+     return ((png_uint_32)info_ptr->splt_palettes_num);\r
+   }\r
+   return (0);\r
+}\r
+#endif\r
+\r
+#if defined(PNG_hIST_SUPPORTED)\r
+png_uint_32 PNGAPI\r
+png_get_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p *hist)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST)\r
+      && hist != NULL)\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n", "hIST");\r
+      *hist = info_ptr->hist;\r
+      return (PNG_INFO_hIST);\r
+   }\r
+   return (0);\r
+}\r
+#endif\r
+\r
+png_uint_32 PNGAPI\r
+png_get_IHDR(png_structp png_ptr, png_infop info_ptr,\r
+   png_uint_32 *width, png_uint_32 *height, int *bit_depth,\r
+   int *color_type, int *interlace_type, int *compression_type,\r
+   int *filter_type)\r
+\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL && width != NULL && height != NULL &&\r
+      bit_depth != NULL && color_type != NULL)\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n", "IHDR");\r
+      *width = info_ptr->width;\r
+      *height = info_ptr->height;\r
+      *bit_depth = info_ptr->bit_depth;\r
+      if (info_ptr->bit_depth < 1 || info_ptr->bit_depth > 16)\r
+        png_error(png_ptr, "Invalid bit depth");\r
+      *color_type = info_ptr->color_type;\r
+      if (info_ptr->color_type > 6)\r
+        png_error(png_ptr, "Invalid color type");\r
+      if (compression_type != NULL)\r
+         *compression_type = info_ptr->compression_type;\r
+      if (filter_type != NULL)\r
+         *filter_type = info_ptr->filter_type;\r
+      if (interlace_type != NULL)\r
+         *interlace_type = info_ptr->interlace_type;\r
+\r
+      /* check for potential overflow of rowbytes */\r
+      if (*width == 0 || *width > PNG_UINT_31_MAX)\r
+        png_error(png_ptr, "Invalid image width");\r
+      if (*height == 0 || *height > PNG_UINT_31_MAX)\r
+        png_error(png_ptr, "Invalid image height");\r
+      if (info_ptr->width > (PNG_UINT_32_MAX\r
+                 >> 3)      /* 8-byte RGBA pixels */\r
+                 - 64       /* bigrowbuf hack */\r
+                 - 1        /* filter byte */\r
+                 - 7*8      /* rounding of width to multiple of 8 pixels */\r
+                 - 8)       /* extra max_pixel_depth pad */\r
+      {\r
+         png_warning(png_ptr,\r
+            "Width too large for libpng to process image data.");\r
+      }\r
+      return (1);\r
+   }\r
+   return (0);\r
+}\r
+\r
+#if defined(PNG_oFFs_SUPPORTED)\r
+png_uint_32 PNGAPI\r
+png_get_oFFs(png_structp png_ptr, png_infop info_ptr,\r
+   png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)\r
+      && offset_x != NULL && offset_y != NULL && unit_type != NULL)\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n", "oFFs");\r
+      *offset_x = info_ptr->x_offset;\r
+      *offset_y = info_ptr->y_offset;\r
+      *unit_type = (int)info_ptr->offset_unit_type;\r
+      return (PNG_INFO_oFFs);\r
+   }\r
+   return (0);\r
+}\r
+#endif\r
+\r
+#if defined(PNG_pCAL_SUPPORTED)\r
+png_uint_32 PNGAPI\r
+png_get_pCAL(png_structp png_ptr, png_infop info_ptr,\r
+   png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams,\r
+   png_charp *units, png_charpp *params)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL)\r
+      && purpose != NULL && X0 != NULL && X1 != NULL && type != NULL &&\r
+      nparams != NULL && units != NULL && params != NULL)\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n", "pCAL");\r
+      *purpose = info_ptr->pcal_purpose;\r
+      *X0 = info_ptr->pcal_X0;\r
+      *X1 = info_ptr->pcal_X1;\r
+      *type = (int)info_ptr->pcal_type;\r
+      *nparams = (int)info_ptr->pcal_nparams;\r
+      *units = info_ptr->pcal_units;\r
+      *params = info_ptr->pcal_params;\r
+      return (PNG_INFO_pCAL);\r
+   }\r
+   return (0);\r
+}\r
+#endif\r
+\r
+#if defined(PNG_sCAL_SUPPORTED)\r
+#ifdef PNG_FLOATING_POINT_SUPPORTED\r
+png_uint_32 PNGAPI\r
+png_get_sCAL(png_structp png_ptr, png_infop info_ptr,\r
+             int *unit, double *width, double *height)\r
+{\r
+    if (png_ptr != NULL && info_ptr != NULL &&\r
+       (info_ptr->valid & PNG_INFO_sCAL))\r
+    {\r
+        *unit = info_ptr->scal_unit;\r
+        *width = info_ptr->scal_pixel_width;\r
+        *height = info_ptr->scal_pixel_height;\r
+        return (PNG_INFO_sCAL);\r
+    }\r
+    return(0);\r
+}\r
+#else\r
+#ifdef PNG_FIXED_POINT_SUPPORTED\r
+png_uint_32 PNGAPI\r
+png_get_sCAL_s(png_structp png_ptr, png_infop info_ptr,\r
+             int *unit, png_charpp width, png_charpp height)\r
+{\r
+    if (png_ptr != NULL && info_ptr != NULL &&\r
+       (info_ptr->valid & PNG_INFO_sCAL))\r
+    {\r
+        *unit = info_ptr->scal_unit;\r
+        *width = info_ptr->scal_s_width;\r
+        *height = info_ptr->scal_s_height;\r
+        return (PNG_INFO_sCAL);\r
+    }\r
+    return(0);\r
+}\r
+#endif\r
+#endif\r
+#endif\r
+\r
+#if defined(PNG_pHYs_SUPPORTED)\r
+png_uint_32 PNGAPI\r
+png_get_pHYs(png_structp png_ptr, png_infop info_ptr,\r
+   png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)\r
+{\r
+   png_uint_32 retval = 0;\r
+\r
+   if (png_ptr != NULL && info_ptr != NULL &&\r
+      (info_ptr->valid & PNG_INFO_pHYs))\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n", "pHYs");\r
+      if (res_x != NULL)\r
+      {\r
+         *res_x = info_ptr->x_pixels_per_unit;\r
+         retval |= PNG_INFO_pHYs;\r
+      }\r
+      if (res_y != NULL)\r
+      {\r
+         *res_y = info_ptr->y_pixels_per_unit;\r
+         retval |= PNG_INFO_pHYs;\r
+      }\r
+      if (unit_type != NULL)\r
+      {\r
+         *unit_type = (int)info_ptr->phys_unit_type;\r
+         retval |= PNG_INFO_pHYs;\r
+      }\r
+   }\r
+   return (retval);\r
+}\r
+#endif\r
+\r
+png_uint_32 PNGAPI\r
+png_get_PLTE(png_structp png_ptr, png_infop info_ptr, png_colorp *palette,\r
+   int *num_palette)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_PLTE)\r
+       && palette != NULL)\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n", "PLTE");\r
+      *palette = info_ptr->palette;\r
+      *num_palette = info_ptr->num_palette;\r
+      png_debug1(3, "num_palette = %d\n", *num_palette);\r
+      return (PNG_INFO_PLTE);\r
+   }\r
+   return (0);\r
+}\r
+\r
+#if defined(PNG_sBIT_SUPPORTED)\r
+png_uint_32 PNGAPI\r
+png_get_sBIT(png_structp png_ptr, png_infop info_ptr, png_color_8p *sig_bit)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT)\r
+      && sig_bit != NULL)\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n", "sBIT");\r
+      *sig_bit = &(info_ptr->sig_bit);\r
+      return (PNG_INFO_sBIT);\r
+   }\r
+   return (0);\r
+}\r
+#endif\r
+\r
+#if defined(PNG_TEXT_SUPPORTED)\r
+png_uint_32 PNGAPI\r
+png_get_text(png_structp png_ptr, png_infop info_ptr, png_textp *text_ptr,\r
+   int *num_text)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0)\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n",\r
+         (png_ptr->chunk_name[0] == '\0' ? "text"\r
+             : (png_const_charp)png_ptr->chunk_name));\r
+      if (text_ptr != NULL)\r
+         *text_ptr = info_ptr->text;\r
+      if (num_text != NULL)\r
+         *num_text = info_ptr->num_text;\r
+      return ((png_uint_32)info_ptr->num_text);\r
+   }\r
+   if (num_text != NULL)\r
+     *num_text = 0;\r
+   return(0);\r
+}\r
+#endif\r
+\r
+#if defined(PNG_tIME_SUPPORTED)\r
+png_uint_32 PNGAPI\r
+png_get_tIME(png_structp png_ptr, png_infop info_ptr, png_timep *mod_time)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME)\r
+       && mod_time != NULL)\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n", "tIME");\r
+      *mod_time = &(info_ptr->mod_time);\r
+      return (PNG_INFO_tIME);\r
+   }\r
+   return (0);\r
+}\r
+#endif\r
+\r
+#if defined(PNG_tRNS_SUPPORTED)\r
+png_uint_32 PNGAPI\r
+png_get_tRNS(png_structp png_ptr, png_infop info_ptr,\r
+   png_bytep *trans, int *num_trans, png_color_16p *trans_values)\r
+{\r
+   png_uint_32 retval = 0;\r
+   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS))\r
+   {\r
+      png_debug1(1, "in %s retrieval function\n", "tRNS");\r
+      if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)\r
+      {\r
+          if (trans != NULL)\r
+          {\r
+             *trans = info_ptr->trans;\r
+             retval |= PNG_INFO_tRNS;\r
+          }\r
+          if (trans_values != NULL)\r
+             *trans_values = &(info_ptr->trans_values);\r
+      }\r
+      else /* if (info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) */\r
+      {\r
+          if (trans_values != NULL)\r
+          {\r
+             *trans_values = &(info_ptr->trans_values);\r
+             retval |= PNG_INFO_tRNS;\r
+          }\r
+          if (trans != NULL)\r
+             *trans = NULL;\r
+      }\r
+      if (num_trans != NULL)\r
+      {\r
+         *num_trans = info_ptr->num_trans;\r
+         retval |= PNG_INFO_tRNS;\r
+      }\r
+   }\r
+   return (retval);\r
+}\r
+#endif\r
+\r
+#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)\r
+png_uint_32 PNGAPI\r
+png_get_unknown_chunks(png_structp png_ptr, png_infop info_ptr,\r
+             png_unknown_chunkpp unknowns)\r
+{\r
+   if (png_ptr != NULL && info_ptr != NULL && unknowns != NULL)\r
+   {\r
+     *unknowns = info_ptr->unknown_chunks;\r
+     return ((png_uint_32)info_ptr->unknown_chunks_num);\r
+   }\r
+   return (0);\r
+}\r
+#endif\r
+\r
+#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)\r
+png_byte PNGAPI\r
+png_get_rgb_to_gray_status (png_structp png_ptr)\r
+{\r
+   return (png_byte)(png_ptr? png_ptr->rgb_to_gray_status : 0);\r
+}\r
+#endif\r
+\r
+#if defined(PNG_USER_CHUNKS_SUPPORTED)\r
+png_voidp PNGAPI\r
+png_get_user_chunk_ptr(png_structp png_ptr)\r
+{\r
+   return (png_ptr? png_ptr->user_chunk_ptr : NULL);\r
+}\r
+#endif\r
+\r
+#ifdef PNG_WRITE_SUPPORTED\r
+png_uint_32 PNGAPI\r
+png_get_compression_buffer_size(png_structp png_ptr)\r
+{\r
+   return (png_uint_32)(png_ptr? png_ptr->zbuf_size : 0L);\r
+}\r
+#endif\r
+\r
+#ifdef PNG_ASSEMBLER_CODE_SUPPORTED\r
+#ifndef PNG_1_0_X\r
+/* this function was added to libpng 1.2.0 and should exist by default */\r
+png_uint_32 PNGAPI\r
+png_get_asm_flags (png_structp png_ptr)\r
+{\r
+    /* obsolete, to be removed from libpng-1.4.0 */\r
+    return (png_ptr? 0L: 0L);\r
+}\r
+\r
+/* this function was added to libpng 1.2.0 and should exist by default */\r
+png_uint_32 PNGAPI\r
+png_get_asm_flagmask (int flag_select)\r
+{\r
+    /* obsolete, to be removed from libpng-1.4.0 */\r
+    flag_select=flag_select;\r
+    return 0L;\r
+}\r
+\r
+    /* GRR:  could add this:   && defined(PNG_MMX_CODE_SUPPORTED) */\r
+/* this function was added to libpng 1.2.0 */\r
+png_uint_32 PNGAPI\r
+png_get_mmx_flagmask (int flag_select, int *compilerID)\r
+{\r
+    /* obsolete, to be removed from libpng-1.4.0 */\r
+    flag_select=flag_select;\r
+    *compilerID = -1;   /* unknown (i.e., no asm/MMX code compiled) */\r
+    return 0L;\r
+}\r
+\r
+/* this function was added to libpng 1.2.0 */\r
+png_byte PNGAPI\r
+png_get_mmx_bitdepth_threshold (png_structp png_ptr)\r
+{\r
+    /* obsolete, to be removed from libpng-1.4.0 */\r
+    return (png_ptr? 0: 0);\r
+}\r
+\r
+/* this function was added to libpng 1.2.0 */\r
+png_uint_32 PNGAPI\r
+png_get_mmx_rowbytes_threshold (png_structp png_ptr)\r
+{\r
+    /* obsolete, to be removed from libpng-1.4.0 */\r
+    return (png_ptr? 0L: 0L);\r
+}\r
+#endif /* ?PNG_1_0_X */\r
+#endif /* ?PNG_ASSEMBLER_CODE_SUPPORTED */\r
+\r
+#ifdef PNG_SET_USER_LIMITS_SUPPORTED\r
+/* these functions were added to libpng 1.2.6 */\r
+png_uint_32 PNGAPI\r
+png_get_user_width_max (png_structp png_ptr)\r
+{\r
+    return (png_ptr? png_ptr->user_width_max : 0);\r
+}\r
+png_uint_32 PNGAPI\r
+png_get_user_height_max (png_structp png_ptr)\r
+{\r
+    return (png_ptr? png_ptr->user_height_max : 0);\r
+}\r
+#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */\r
\r
+\r
+#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */\r