Home | History | Annotate | Download | only in libpng
      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 
     20 png_uint_32 PNGAPI
     21 png_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 
     30 png_uint_32 PNGAPI
     31 png_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
     41 png_bytepp PNGAPI
     42 png_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 */
     54 png_uint_32 PNGAPI
     55 png_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 
     63 png_uint_32 PNGAPI
     64 png_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 
     72 png_byte PNGAPI
     73 png_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 
     81 png_byte PNGAPI
     82 png_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 
     90 png_byte PNGAPI
     91 png_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 
     99 png_byte PNGAPI
    100 png_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 
    108 png_byte PNGAPI
    109 png_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 
    117 png_uint_32 PNGAPI
    118 png_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 
    138 png_uint_32 PNGAPI
    139 png_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 
    159 png_uint_32 PNGAPI
    160 png_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
    182 float PNGAPI
    183 png_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 
    206 png_int_32 PNGAPI
    207 png_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 
    228 png_int_32 PNGAPI
    229 png_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 
    250 png_int_32 PNGAPI
    251 png_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 
    272 png_int_32 PNGAPI
    273 png_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)
    295 png_uint_32 PNGAPI
    296 png_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 
    302 png_uint_32 PNGAPI
    303 png_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 
    309 png_uint_32 PNGAPI
    310 png_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 
    316 float PNGAPI
    317 png_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 
    323 float PNGAPI
    324 png_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
    331 png_uint_32 PNGAPI
    332 png_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 
    371 png_byte PNGAPI
    372 png_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 
    380 png_bytep PNGAPI
    381 png_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
    390 png_uint_32 PNGAPI
    391 png_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
    408 png_uint_32 PNGAPI
    409 png_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
    439 png_uint_32 PNGAPI
    440 png_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
    474 png_uint_32 PNGAPI
    475 png_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
    489 png_uint_32 PNGAPI
    490 png_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
    507 png_uint_32 PNGAPI
    508 png_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
    523 png_uint_32 PNGAPI
    524 png_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
    547 png_uint_32 PNGAPI
    548 png_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
    561 png_uint_32 PNGAPI
    562 png_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 
    576 png_uint_32 PNGAPI
    577 png_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
    616 png_uint_32 PNGAPI
    617 png_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
    635 png_uint_32 PNGAPI
    636 png_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
    661 png_uint_32 PNGAPI
    662 png_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
    677 png_uint_32 PNGAPI
    678 png_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
    696 png_uint_32 PNGAPI
    697 png_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 
    729 png_uint_32 PNGAPI
    730 png_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
    747 png_uint_32 PNGAPI
    748 png_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
    763 png_uint_32 PNGAPI
    764 png_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
    788 png_uint_32 PNGAPI
    789 png_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
    804 png_uint_32 PNGAPI
    805 png_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
    846 png_uint_32 PNGAPI
    847 png_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
    860 png_byte PNGAPI
    861 png_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
    868 png_voidp PNGAPI
    869 png_get_user_chunk_ptr(png_structp png_ptr)
    870 {
    871    return (png_ptr? png_ptr->user_chunk_ptr : NULL);
    872 }
    873 #endif
    874 
    875 png_uint_32 PNGAPI
    876 png_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 */
    884 png_uint_32 PNGAPI
    885 png_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 */
    892 png_uint_32 PNGAPI
    893 png_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 */
    902 png_uint_32 PNGAPI
    903 png_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 */
    912 png_byte PNGAPI
    913 png_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 */
    920 png_uint_32 PNGAPI
    921 png_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 */
    932 png_uint_32 PNGAPI
    933 png_get_user_width_max (png_structp png_ptr)
    934 {
    935     return (png_ptr? png_ptr->user_width_max : 0);
    936 }
    937 png_uint_32 PNGAPI
    938 png_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