pngget.c 32.6 KB
Newer Older
A
Andreas Dilger 已提交
1 2

/* pngget.c - retrieval of values from info struct
3
 *
4 5
 * Last changed in libpng 1.6.24 [August 4, 2016]
 * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
6 7
 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
 * (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
 */
A
Andreas Dilger 已提交
14

15
#include "pngpriv.h"
16

17 18
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)

19
png_uint_32 PNGAPI
20
png_get_valid(png_const_structrp png_ptr, png_const_inforp info_ptr,
21
    png_uint_32 flag)
A
Andreas Dilger 已提交
22
{
23
   if (png_ptr != NULL && info_ptr != NULL)
A
Andreas Dilger 已提交
24
      return(info_ptr->valid & flag);
25

26
   return(0);
A
Andreas Dilger 已提交
27 28
}

29
png_size_t PNGAPI
30
png_get_rowbytes(png_const_structrp png_ptr, png_const_inforp info_ptr)
A
Andreas Dilger 已提交
31
{
32
   if (png_ptr != NULL && info_ptr != NULL)
A
Andreas Dilger 已提交
33
      return(info_ptr->rowbytes);
34

35
   return(0);
A
Andreas Dilger 已提交
36 37
}

38
#ifdef PNG_INFO_IMAGE_SUPPORTED
39
png_bytepp PNGAPI
40
png_get_rows(png_const_structrp png_ptr, png_const_inforp info_ptr)
41 42 43
{
   if (png_ptr != NULL && info_ptr != NULL)
      return(info_ptr->row_pointers);
44

45
   return(0);
46 47 48
}
#endif

49
#ifdef PNG_EASY_ACCESS_SUPPORTED
50
/* Easy access to info, added in libpng-0.99 */
51
png_uint_32 PNGAPI
52
png_get_image_width(png_const_structrp png_ptr, png_const_inforp info_ptr)
53
{
54
   if (png_ptr != NULL && info_ptr != NULL)
55
      return info_ptr->width;
56

57 58 59
   return (0);
}

60
png_uint_32 PNGAPI
61
png_get_image_height(png_const_structrp png_ptr, png_const_inforp info_ptr)
62
{
63
   if (png_ptr != NULL && info_ptr != NULL)
64
      return info_ptr->height;
65

66 67 68
   return (0);
}

69
png_byte PNGAPI
70
png_get_bit_depth(png_const_structrp png_ptr, png_const_inforp info_ptr)
71
{
72
   if (png_ptr != NULL && info_ptr != NULL)
73
      return info_ptr->bit_depth;
74

75 76 77
   return (0);
}

78
png_byte PNGAPI
79
png_get_color_type(png_const_structrp png_ptr, png_const_inforp info_ptr)
80
{
81
   if (png_ptr != NULL && info_ptr != NULL)
82
      return info_ptr->color_type;
83

84 85 86
   return (0);
}

87
png_byte PNGAPI
88
png_get_filter_type(png_const_structrp png_ptr, png_const_inforp info_ptr)
89
{
90
   if (png_ptr != NULL && info_ptr != NULL)
91
      return info_ptr->filter_type;
92

93 94 95
   return (0);
}

96
png_byte PNGAPI
97
png_get_interlace_type(png_const_structrp png_ptr, png_const_inforp info_ptr)
98
{
99
   if (png_ptr != NULL && info_ptr != NULL)
100
      return info_ptr->interlace_type;
101

102 103 104
   return (0);
}

105
png_byte PNGAPI
106
png_get_compression_type(png_const_structrp png_ptr, png_const_inforp info_ptr)
107
{
108
   if (png_ptr != NULL && info_ptr != NULL)
109
      return info_ptr->compression_type;
110

111 112 113
   return (0);
}

114
png_uint_32 PNGAPI
115 116
png_get_x_pixels_per_meter(png_const_structrp png_ptr, png_const_inforp
   info_ptr)
117
{
118
#ifdef PNG_pHYs_SUPPORTED
119 120
   if (png_ptr != NULL && info_ptr != NULL &&
       (info_ptr->valid & PNG_INFO_pHYs) != 0)
121 122 123
      {
         png_debug1(1, "in %s retrieval function",
             "png_get_x_pixels_per_meter");
124

125 126 127
         if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER)
            return (info_ptr->x_pixels_per_unit);
      }
128 129 130
#else
   PNG_UNUSED(png_ptr)
   PNG_UNUSED(info_ptr)
131
#endif
132

133 134 135
   return (0);
}

136
png_uint_32 PNGAPI
137 138
png_get_y_pixels_per_meter(png_const_structrp png_ptr, png_const_inforp
    info_ptr)
139
{
140
#ifdef PNG_pHYs_SUPPORTED
141 142
   if (png_ptr != NULL && info_ptr != NULL &&
       (info_ptr->valid & PNG_INFO_pHYs) != 0)
143
   {
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 (info_ptr->y_pixels_per_unit);
149
   }
150 151 152
#else
   PNG_UNUSED(png_ptr)
   PNG_UNUSED(info_ptr)
153
#endif
154

155 156 157
   return (0);
}

158
png_uint_32 PNGAPI
159
png_get_pixels_per_meter(png_const_structrp png_ptr, png_const_inforp info_ptr)
160
{
161
#ifdef PNG_pHYs_SUPPORTED
162 163
   if (png_ptr != NULL && info_ptr != NULL &&
       (info_ptr->valid & PNG_INFO_pHYs) != 0)
164
   {
165
      png_debug1(1, "in %s retrieval function", "png_get_pixels_per_meter");
166

167 168
      if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER &&
          info_ptr->x_pixels_per_unit == info_ptr->y_pixels_per_unit)
169
         return (info_ptr->x_pixels_per_unit);
170
   }
171 172 173
#else
   PNG_UNUSED(png_ptr)
   PNG_UNUSED(info_ptr)
174
#endif
175

176 177 178
   return (0);
}

179
#ifdef PNG_FLOATING_POINT_SUPPORTED
180
float PNGAPI
181 182
png_get_pixel_aspect_ratio(png_const_structrp png_ptr, png_const_inforp
   info_ptr)
183
{
184
#ifdef PNG_READ_pHYs_SUPPORTED
185 186
   if (png_ptr != NULL && info_ptr != NULL &&
       (info_ptr->valid & PNG_INFO_pHYs) != 0)
187
   {
188
      png_debug1(1, "in %s retrieval function", "png_get_aspect_ratio");
189

190
      if (info_ptr->x_pixels_per_unit != 0)
191
         return ((float)((float)info_ptr->y_pixels_per_unit
192
             /(float)info_ptr->x_pixels_per_unit));
193
   }
194 195 196
#else
   PNG_UNUSED(png_ptr)
   PNG_UNUSED(info_ptr)
197
#endif
198

199
   return ((float)0.0);
200
}
201
#endif
202

203 204
#ifdef PNG_FIXED_POINT_SUPPORTED
png_fixed_point PNGAPI
205 206
png_get_pixel_aspect_ratio_fixed(png_const_structrp png_ptr,
    png_const_inforp info_ptr)
207 208
{
#ifdef PNG_READ_pHYs_SUPPORTED
209 210 211 212 213
   if (png_ptr != NULL && info_ptr != NULL &&
       (info_ptr->valid & PNG_INFO_pHYs) != 0 &&
       info_ptr->x_pixels_per_unit > 0 && info_ptr->y_pixels_per_unit > 0 &&
       info_ptr->x_pixels_per_unit <= PNG_UINT_31_MAX &&
       info_ptr->y_pixels_per_unit <= PNG_UINT_31_MAX)
214 215 216 217 218
   {
      png_fixed_point res;

      png_debug1(1, "in %s retrieval function", "png_get_aspect_ratio_fixed");

219 220 221 222
      /* The following casts work because a PNG 4 byte integer only has a valid
       * range of 0..2^31-1; otherwise the cast might overflow.
       */
      if (png_muldiv(&res, (png_int_32)info_ptr->y_pixels_per_unit, PNG_FP_1,
223
          (png_int_32)info_ptr->x_pixels_per_unit) != 0)
224
         return res;
225
   }
226 227 228
#else
   PNG_UNUSED(png_ptr)
   PNG_UNUSED(info_ptr)
229
#endif
230

231 232 233 234
   return 0;
}
#endif

235
png_int_32 PNGAPI
236
png_get_x_offset_microns(png_const_structrp png_ptr, png_const_inforp info_ptr)
237
{
238
#ifdef PNG_oFFs_SUPPORTED
239 240
   if (png_ptr != NULL && info_ptr != NULL &&
       (info_ptr->valid & PNG_INFO_oFFs) != 0)
241
   {
242
      png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns");
243

244
      if (info_ptr->offset_unit_type == PNG_OFFSET_MICROMETER)
245
         return (info_ptr->x_offset);
246
   }
247 248 249
#else
   PNG_UNUSED(png_ptr)
   PNG_UNUSED(info_ptr)
250
#endif
251

252 253 254
   return (0);
}

255
png_int_32 PNGAPI
256
png_get_y_offset_microns(png_const_structrp png_ptr, png_const_inforp info_ptr)
257
{
258
#ifdef PNG_oFFs_SUPPORTED
259 260
   if (png_ptr != NULL && info_ptr != NULL &&
       (info_ptr->valid & PNG_INFO_oFFs) != 0)
261
   {
262
      png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns");
263

264
      if (info_ptr->offset_unit_type == PNG_OFFSET_MICROMETER)
265
         return (info_ptr->y_offset);
266
   }
267 268 269
#else
   PNG_UNUSED(png_ptr)
   PNG_UNUSED(info_ptr)
270
#endif
271

272 273 274
   return (0);
}

275
png_int_32 PNGAPI
276
png_get_x_offset_pixels(png_const_structrp png_ptr, png_const_inforp info_ptr)
277
{
278
#ifdef PNG_oFFs_SUPPORTED
279 280
   if (png_ptr != NULL && info_ptr != NULL &&
       (info_ptr->valid & PNG_INFO_oFFs) != 0)
281
   {
G
[devel]  
Glenn Randers-Pehrson 已提交
282
      png_debug1(1, "in %s retrieval function", "png_get_x_offset_pixels");
283

284
      if (info_ptr->offset_unit_type == PNG_OFFSET_PIXEL)
285
         return (info_ptr->x_offset);
286
   }
287 288 289
#else
   PNG_UNUSED(png_ptr)
   PNG_UNUSED(info_ptr)
290
#endif
291

292 293 294
   return (0);
}

295
png_int_32 PNGAPI
296
png_get_y_offset_pixels(png_const_structrp png_ptr, png_const_inforp info_ptr)
297
{
298
#ifdef PNG_oFFs_SUPPORTED
299 300
   if (png_ptr != NULL && info_ptr != NULL &&
       (info_ptr->valid & PNG_INFO_oFFs) != 0)
301
   {
G
[devel]  
Glenn Randers-Pehrson 已提交
302
      png_debug1(1, "in %s retrieval function", "png_get_y_offset_pixels");
303

304
      if (info_ptr->offset_unit_type == PNG_OFFSET_PIXEL)
305
         return (info_ptr->y_offset);
306
   }
307 308 309
#else
   PNG_UNUSED(png_ptr)
   PNG_UNUSED(info_ptr)
310
#endif
311

312 313 314
   return (0);
}

G
[devel]  
Glenn Randers-Pehrson 已提交
315 316 317 318 319
#ifdef PNG_INCH_CONVERSIONS_SUPPORTED
static png_uint_32
ppi_from_ppm(png_uint_32 ppm)
{
#if 0
320
   /* The conversion is *(2.54/100), in binary (32 digits):
G
[devel]  
Glenn Randers-Pehrson 已提交
321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338
    * .00000110100000001001110101001001
    */
   png_uint_32 t1001, t1101;
   ppm >>= 1;                  /* .1 */
   t1001 = ppm + (ppm >> 3);   /* .1001 */
   t1101 = t1001 + (ppm >> 1); /* .1101 */
   ppm >>= 20;                 /* .000000000000000000001 */
   t1101 += t1101 >> 15;       /* .1101000000000001101 */
   t1001 >>= 11;               /* .000000000001001 */
   t1001 += t1001 >> 12;       /* .000000000001001000000001001 */
   ppm += t1001;               /* .000000000001001000001001001 */
   ppm += t1101;               /* .110100000001001110101001001 */
   return (ppm + 16) >> 5;/* .00000110100000001001110101001001 */
#else
   /* The argument is a PNG unsigned integer, so it is not permitted
    * to be bigger than 2^31.
    */
   png_fixed_point result;
339
   if (ppm <= PNG_UINT_31_MAX && png_muldiv(&result, (png_int_32)ppm, 127,
340
       5000) != 0)
G
[devel]  
Glenn Randers-Pehrson 已提交
341 342 343 344 345 346 347
      return result;

   /* Overflow. */
   return 0;
#endif
}

348
png_uint_32 PNGAPI
349
png_get_pixels_per_inch(png_const_structrp png_ptr, png_const_inforp info_ptr)
350
{
G
[devel]  
Glenn Randers-Pehrson 已提交
351
   return ppi_from_ppm(png_get_pixels_per_meter(png_ptr, info_ptr));
352 353
}

354
png_uint_32 PNGAPI
355
png_get_x_pixels_per_inch(png_const_structrp png_ptr, png_const_inforp info_ptr)
356
{
G
[devel]  
Glenn Randers-Pehrson 已提交
357
   return ppi_from_ppm(png_get_x_pixels_per_meter(png_ptr, info_ptr));
358 359
}

360
png_uint_32 PNGAPI
361
png_get_y_pixels_per_inch(png_const_structrp png_ptr, png_const_inforp info_ptr)
362
{
G
[devel]  
Glenn Randers-Pehrson 已提交
363 364 365 366 367
   return ppi_from_ppm(png_get_y_pixels_per_meter(png_ptr, info_ptr));
}

#ifdef PNG_FIXED_POINT_SUPPORTED
static png_fixed_point
368
png_fixed_inches_from_microns(png_const_structrp png_ptr, png_int_32 microns)
G
[devel]  
Glenn Randers-Pehrson 已提交
369 370
{
   /* Convert from metres * 1,000,000 to inches * 100,000, meters to
371
    * inches is simply *(100/2.54), so we want *(10/2.54) == 500/127.
G
[devel]  
Glenn Randers-Pehrson 已提交
372 373 374 375 376 377 378
    * Notice that this can overflow - a warning is output and 0 is
    * returned.
    */
   return png_muldiv_warn(png_ptr, microns, 500, 127);
}

png_fixed_point PNGAPI
379 380
png_get_x_offset_inches_fixed(png_const_structrp png_ptr,
    png_const_inforp info_ptr)
G
[devel]  
Glenn Randers-Pehrson 已提交
381 382
{
   return png_fixed_inches_from_microns(png_ptr,
383
       png_get_x_offset_microns(png_ptr, info_ptr));
G
[devel]  
Glenn Randers-Pehrson 已提交
384 385 386 387 388
}
#endif

#ifdef PNG_FIXED_POINT_SUPPORTED
png_fixed_point PNGAPI
389 390
png_get_y_offset_inches_fixed(png_const_structrp png_ptr,
    png_const_inforp info_ptr)
G
[devel]  
Glenn Randers-Pehrson 已提交
391 392
{
   return png_fixed_inches_from_microns(png_ptr,
393
       png_get_y_offset_microns(png_ptr, info_ptr));
394
}
G
[devel]  
Glenn Randers-Pehrson 已提交
395
#endif
396

G
[devel]  
Glenn Randers-Pehrson 已提交
397
#ifdef PNG_FLOATING_POINT_SUPPORTED
398
float PNGAPI
399
png_get_x_offset_inches(png_const_structrp png_ptr, png_const_inforp info_ptr)
400
{
G
[devel]  
Glenn Randers-Pehrson 已提交
401 402 403
   /* To avoid the overflow do the conversion directly in floating
    * point.
    */
404
   return (float)(png_get_x_offset_microns(png_ptr, info_ptr) * .00003937);
405
}
G
[devel]  
Glenn Randers-Pehrson 已提交
406
#endif
407

G
[devel]  
Glenn Randers-Pehrson 已提交
408
#ifdef PNG_FLOATING_POINT_SUPPORTED
409
float PNGAPI
410
png_get_y_offset_inches(png_const_structrp png_ptr, png_const_inforp info_ptr)
411
{
G
[devel]  
Glenn Randers-Pehrson 已提交
412 413 414
   /* To avoid the overflow do the conversion directly in floating
    * point.
    */
415
   return (float)(png_get_y_offset_microns(png_ptr, info_ptr) * .00003937);
416
}
G
[devel]  
Glenn Randers-Pehrson 已提交
417
#endif
418

419
#ifdef PNG_pHYs_SUPPORTED
420
png_uint_32 PNGAPI
421
png_get_pHYs_dpi(png_const_structrp png_ptr, png_const_inforp info_ptr,
422
    png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)
423 424 425
{
   png_uint_32 retval = 0;

426 427
   if (png_ptr != NULL && info_ptr != NULL &&
       (info_ptr->valid & PNG_INFO_pHYs) != 0)
428
   {
429
      png_debug1(1, "in %s retrieval function", "pHYs");
430

431 432 433 434 435
      if (res_x != NULL)
      {
         *res_x = info_ptr->x_pixels_per_unit;
         retval |= PNG_INFO_pHYs;
      }
436

437 438 439 440 441
      if (res_y != NULL)
      {
         *res_y = info_ptr->y_pixels_per_unit;
         retval |= PNG_INFO_pHYs;
      }
442

443 444 445 446
      if (unit_type != NULL)
      {
         *unit_type = (int)info_ptr->phys_unit_type;
         retval |= PNG_INFO_pHYs;
447

448
         if (*unit_type == 1)
449
         {
450 451
            if (res_x != NULL) *res_x = (png_uint_32)(*res_x * .0254 + .50);
            if (res_y != NULL) *res_y = (png_uint_32)(*res_y * .0254 + .50);
452 453 454
         }
      }
   }
455

456 457
   return (retval);
}
458
#endif /* pHYs */
459
#endif /* INCH_CONVERSIONS */
460 461

/* png_get_channels really belongs in here, too, but it's been around longer */
462

463
#endif /* EASY_ACCESS */
464

465

466
png_byte PNGAPI
467
png_get_channels(png_const_structrp png_ptr, png_const_inforp info_ptr)
A
Andreas Dilger 已提交
468
{
469
   if (png_ptr != NULL && info_ptr != NULL)
A
Andreas Dilger 已提交
470
      return(info_ptr->channels);
471

472
   return (0);
A
Andreas Dilger 已提交
473 474
}

475
#ifdef PNG_READ_SUPPORTED
476
png_const_bytep PNGAPI
477
png_get_signature(png_const_structrp png_ptr, png_const_inforp info_ptr)
A
Andreas Dilger 已提交
478
{
479
   if (png_ptr != NULL && info_ptr != NULL)
A
Andreas Dilger 已提交
480
      return(info_ptr->signature);
481

482
   return (NULL);
A
Andreas Dilger 已提交
483
}
484
#endif
A
Andreas Dilger 已提交
485

486
#ifdef PNG_bKGD_SUPPORTED
487
png_uint_32 PNGAPI
488
png_get_bKGD(png_const_structrp png_ptr, png_inforp info_ptr,
489
    png_color_16p *background)
A
Andreas Dilger 已提交
490
{
491 492 493
   if (png_ptr != NULL && info_ptr != NULL &&
       (info_ptr->valid & PNG_INFO_bKGD) != 0 &&
       background != NULL)
A
Andreas Dilger 已提交
494
   {
495
      png_debug1(1, "in %s retrieval function", "bKGD");
496

A
Andreas Dilger 已提交
497 498 499
      *background = &(info_ptr->background);
      return (PNG_INFO_bKGD);
   }
500

A
Andreas Dilger 已提交
501 502 503 504
   return (0);
}
#endif

505
#ifdef PNG_cHRM_SUPPORTED
506 507 508 509
/* The XYZ APIs were added in 1.5.5 to take advantage of the code added at the
 * same time to correct the rgb grayscale coefficient defaults obtained from the
 * cHRM chunk in 1.5.4
 */
510
#  ifdef PNG_FLOATING_POINT_SUPPORTED
511
png_uint_32 PNGAPI
512
png_get_cHRM(png_const_structrp png_ptr, png_const_inforp info_ptr,
513 514
    double *white_x, double *white_y, double *red_x, double *red_y,
    double *green_x, double *green_y, double *blue_x, double *blue_y)
A
Andreas Dilger 已提交
515
{
516 517 518 519 520 521 522
   /* Quiet API change: this code used to only return the end points if a cHRM
    * chunk was present, but the end points can also come from iCCP or sRGB
    * chunks, so in 1.6.0 the png_get_ APIs return the end points regardless and
    * the png_set_ APIs merely check that set end points are mutually
    * consistent.
    */
   if (png_ptr != NULL && info_ptr != NULL &&
523
      (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
A
Andreas Dilger 已提交
524
   {
525
      png_debug1(1, "in %s retrieval function", "cHRM");
526

A
Andreas Dilger 已提交
527
      if (white_x != NULL)
528
         *white_x = png_float(png_ptr,
529
             info_ptr->colorspace.end_points_xy.whitex, "cHRM white X");
A
Andreas Dilger 已提交
530
      if (white_y != NULL)
531
         *white_y = png_float(png_ptr,
532
             info_ptr->colorspace.end_points_xy.whitey, "cHRM white Y");
A
Andreas Dilger 已提交
533
      if (red_x != NULL)
534
         *red_x = png_float(png_ptr, info_ptr->colorspace.end_points_xy.redx,
535
             "cHRM red X");
A
Andreas Dilger 已提交
536
      if (red_y != NULL)
537
         *red_y = png_float(png_ptr, info_ptr->colorspace.end_points_xy.redy,
538
             "cHRM red Y");
A
Andreas Dilger 已提交
539
      if (green_x != NULL)
540
         *green_x = png_float(png_ptr,
541
             info_ptr->colorspace.end_points_xy.greenx, "cHRM green X");
A
Andreas Dilger 已提交
542
      if (green_y != NULL)
543
         *green_y = png_float(png_ptr,
544
             info_ptr->colorspace.end_points_xy.greeny, "cHRM green Y");
A
Andreas Dilger 已提交
545
      if (blue_x != NULL)
546
         *blue_x = png_float(png_ptr, info_ptr->colorspace.end_points_xy.bluex,
547
             "cHRM blue X");
A
Andreas Dilger 已提交
548
      if (blue_y != NULL)
549
         *blue_y = png_float(png_ptr, info_ptr->colorspace.end_points_xy.bluey,
550
             "cHRM blue Y");
A
Andreas Dilger 已提交
551 552
      return (PNG_INFO_cHRM);
   }
553

A
Andreas Dilger 已提交
554 555
   return (0);
}
556 557

png_uint_32 PNGAPI
558
png_get_cHRM_XYZ(png_const_structrp png_ptr, png_const_inforp info_ptr,
559 560 561
    double *red_X, double *red_Y, double *red_Z, double *green_X,
    double *green_Y, double *green_Z, double *blue_X, double *blue_Y,
    double *blue_Z)
562
{
563
   if (png_ptr != NULL && info_ptr != NULL &&
564
       (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
565
   {
566 567
      png_debug1(1, "in %s retrieval function", "cHRM_XYZ(float)");

568
      if (red_X != NULL)
569
         *red_X = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_X,
570
             "cHRM red X");
571
      if (red_Y != NULL)
572
         *red_Y = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_Y,
573
             "cHRM red Y");
574
      if (red_Z != NULL)
575
         *red_Z = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_Z,
576
             "cHRM red Z");
577
      if (green_X != NULL)
578
         *green_X = png_float(png_ptr,
579
             info_ptr->colorspace.end_points_XYZ.green_X, "cHRM green X");
580
      if (green_Y != NULL)
581
         *green_Y = png_float(png_ptr,
582
             info_ptr->colorspace.end_points_XYZ.green_Y, "cHRM green Y");
583
      if (green_Z != NULL)
584
         *green_Z = png_float(png_ptr,
585
             info_ptr->colorspace.end_points_XYZ.green_Z, "cHRM green Z");
586
      if (blue_X != NULL)
587
         *blue_X = png_float(png_ptr,
588
             info_ptr->colorspace.end_points_XYZ.blue_X, "cHRM blue X");
589
      if (blue_Y != NULL)
590
         *blue_Y = png_float(png_ptr,
591
             info_ptr->colorspace.end_points_XYZ.blue_Y, "cHRM blue Y");
592
      if (blue_Z != NULL)
593
         *blue_Z = png_float(png_ptr,
594
             info_ptr->colorspace.end_points_XYZ.blue_Z, "cHRM blue Z");
595 596 597 598 599
      return (PNG_INFO_cHRM);
   }

   return (0);
}
600
#  endif
G
[devel]  
Glenn Randers-Pehrson 已提交
601

602
#  ifdef PNG_FIXED_POINT_SUPPORTED
603
png_uint_32 PNGAPI
604 605 606 607 608 609 610 611
png_get_cHRM_XYZ_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,
    png_fixed_point *int_red_X, png_fixed_point *int_red_Y,
    png_fixed_point *int_red_Z, png_fixed_point *int_green_X,
    png_fixed_point *int_green_Y, png_fixed_point *int_green_Z,
    png_fixed_point *int_blue_X, png_fixed_point *int_blue_Y,
    png_fixed_point *int_blue_Z)
{
   if (png_ptr != NULL && info_ptr != NULL &&
612
      (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641
   {
      png_debug1(1, "in %s retrieval function", "cHRM_XYZ");

      if (int_red_X != NULL)
         *int_red_X = info_ptr->colorspace.end_points_XYZ.red_X;
      if (int_red_Y != NULL)
         *int_red_Y = info_ptr->colorspace.end_points_XYZ.red_Y;
      if (int_red_Z != NULL)
         *int_red_Z = info_ptr->colorspace.end_points_XYZ.red_Z;
      if (int_green_X != NULL)
         *int_green_X = info_ptr->colorspace.end_points_XYZ.green_X;
      if (int_green_Y != NULL)
         *int_green_Y = info_ptr->colorspace.end_points_XYZ.green_Y;
      if (int_green_Z != NULL)
         *int_green_Z = info_ptr->colorspace.end_points_XYZ.green_Z;
      if (int_blue_X != NULL)
         *int_blue_X = info_ptr->colorspace.end_points_XYZ.blue_X;
      if (int_blue_Y != NULL)
         *int_blue_Y = info_ptr->colorspace.end_points_XYZ.blue_Y;
      if (int_blue_Z != NULL)
         *int_blue_Z = info_ptr->colorspace.end_points_XYZ.blue_Z;
      return (PNG_INFO_cHRM);
   }

   return (0);
}

png_uint_32 PNGAPI
png_get_cHRM_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,
642 643 644
    png_fixed_point *white_x, png_fixed_point *white_y, png_fixed_point *red_x,
    png_fixed_point *red_y, png_fixed_point *green_x, png_fixed_point *green_y,
    png_fixed_point *blue_x, png_fixed_point *blue_y)
645
{
646 647
   png_debug1(1, "in %s retrieval function", "cHRM");

648
   if (png_ptr != NULL && info_ptr != NULL &&
649
      (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
650 651
   {
      if (white_x != NULL)
652
         *white_x = info_ptr->colorspace.end_points_xy.whitex;
653
      if (white_y != NULL)
654
         *white_y = info_ptr->colorspace.end_points_xy.whitey;
655
      if (red_x != NULL)
656
         *red_x = info_ptr->colorspace.end_points_xy.redx;
657
      if (red_y != NULL)
658
         *red_y = info_ptr->colorspace.end_points_xy.redy;
659
      if (green_x != NULL)
660
         *green_x = info_ptr->colorspace.end_points_xy.greenx;
661
      if (green_y != NULL)
662
         *green_y = info_ptr->colorspace.end_points_xy.greeny;
663
      if (blue_x != NULL)
664
         *blue_x = info_ptr->colorspace.end_points_xy.bluex;
665
      if (blue_y != NULL)
666
         *blue_y = info_ptr->colorspace.end_points_xy.bluey;
667 668
      return (PNG_INFO_cHRM);
   }
669

670 671
   return (0);
}
672
#  endif
673
#endif
A
Andreas Dilger 已提交
674

675
#ifdef PNG_gAMA_SUPPORTED
676 677 678
#  ifdef PNG_FIXED_POINT_SUPPORTED
png_uint_32 PNGAPI
png_get_gAMA_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,
G
[devel]  
Glenn Randers-Pehrson 已提交
679
    png_fixed_point *file_gamma)
A
Andreas Dilger 已提交
680
{
681 682
   png_debug1(1, "in %s retrieval function", "gAMA");

683
   if (png_ptr != NULL && info_ptr != NULL &&
684 685
       (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) != 0 &&
       file_gamma != NULL)
A
Andreas Dilger 已提交
686
   {
687
      *file_gamma = info_ptr->colorspace.gamma;
A
Andreas Dilger 已提交
688 689
      return (PNG_INFO_gAMA);
   }
G
[devel]  
Glenn Randers-Pehrson 已提交
690

A
Andreas Dilger 已提交
691 692
   return (0);
}
693 694
#  endif

695
#  ifdef PNG_FLOATING_POINT_SUPPORTED
696
png_uint_32 PNGAPI
697
png_get_gAMA(png_const_structrp png_ptr, png_const_inforp info_ptr,
698
    double *file_gamma)
699
{
700
   png_debug1(1, "in %s retrieval function", "gAMA(float)");
701

702
   if (png_ptr != NULL && info_ptr != NULL &&
703
      (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) != 0 &&
704 705 706
      file_gamma != NULL)
   {
      *file_gamma = png_float(png_ptr, info_ptr->colorspace.gamma,
707
          "png_get_gAMA");
708 709
      return (PNG_INFO_gAMA);
   }
710

711
   return (0);
712
}
713
#  endif
714
#endif
A
Andreas Dilger 已提交
715

716
#ifdef PNG_sRGB_SUPPORTED
717
png_uint_32 PNGAPI
718
png_get_sRGB(png_const_structrp png_ptr, png_const_inforp info_ptr,
719
    int *file_srgb_intent)
720
{
721 722
   png_debug1(1, "in %s retrieval function", "sRGB");

723 724
   if (png_ptr != NULL && info_ptr != NULL &&
      (info_ptr->valid & PNG_INFO_sRGB) != 0 && file_srgb_intent != NULL)
725
   {
726
      *file_srgb_intent = info_ptr->colorspace.rendering_intent;
727 728
      return (PNG_INFO_sRGB);
   }
729

730 731 732 733
   return (0);
}
#endif

734
#ifdef PNG_iCCP_SUPPORTED
735
png_uint_32 PNGAPI
736
png_get_iCCP(png_const_structrp png_ptr, png_inforp info_ptr,
737
    png_charpp name, int *compression_type,
G
[devel]  
Glenn Randers-Pehrson 已提交
738
    png_bytepp profile, png_uint_32 *proflen)
739
{
740 741
   png_debug1(1, "in %s retrieval function", "iCCP");

742 743 744 745
   if (png_ptr != NULL && info_ptr != NULL &&
       (info_ptr->valid & PNG_INFO_iCCP) != 0 &&
       name != NULL && compression_type != NULL && profile != NULL &&
           proflen != NULL)
746 747 748
   {
      *name = info_ptr->iccp_name;
      *profile = info_ptr->iccp_profile;
749 750 751
      *proflen = png_get_uint_32(info_ptr->iccp_profile);
      /* This is somewhat irrelevant since the profile data returned has
       * actually been uncompressed.
752
       */
753
      *compression_type = PNG_COMPRESSION_TYPE_BASE;
754 755
      return (PNG_INFO_iCCP);
   }
756

757 758 759 760
   return (0);
}
#endif

761
#ifdef PNG_sPLT_SUPPORTED
762 763
int PNGAPI
png_get_sPLT(png_const_structrp png_ptr, png_inforp info_ptr,
764
    png_sPLT_tpp spalettes)
765 766
{
   if (png_ptr != NULL && info_ptr != NULL && spalettes != NULL)
767
   {
768
      *spalettes = info_ptr->splt_palettes;
769
      return info_ptr->splt_palettes_num;
770
   }
771

772
   return (0);
773 774 775
}
#endif

776
#ifdef PNG_hIST_SUPPORTED
777
png_uint_32 PNGAPI
778
png_get_hIST(png_const_structrp png_ptr, png_inforp info_ptr,
779
    png_uint_16p *hist)
A
Andreas Dilger 已提交
780
{
781 782
   png_debug1(1, "in %s retrieval function", "hIST");

783 784
   if (png_ptr != NULL && info_ptr != NULL &&
       (info_ptr->valid & PNG_INFO_hIST) != 0 && hist != NULL)
A
Andreas Dilger 已提交
785 786 787 788
   {
      *hist = info_ptr->hist;
      return (PNG_INFO_hIST);
   }
789

A
Andreas Dilger 已提交
790 791 792 793
   return (0);
}
#endif

794
png_uint_32 PNGAPI
795
png_get_IHDR(png_const_structrp png_ptr, png_const_inforp info_ptr,
796 797 798
    png_uint_32 *width, png_uint_32 *height, int *bit_depth,
    int *color_type, int *interlace_type, int *compression_type,
    int *filter_type)
A
Andreas Dilger 已提交
799
{
800
   png_debug1(1, "in %s retrieval function", "IHDR");
801

802
   if (png_ptr == NULL || info_ptr == NULL)
803
      return (0);
804

805 806 807 808 809 810 811 812 813 814 815
   if (width != NULL)
       *width = info_ptr->width;

   if (height != NULL)
       *height = info_ptr->height;

   if (bit_depth != NULL)
       *bit_depth = info_ptr->bit_depth;

   if (color_type != NULL)
       *color_type = info_ptr->color_type;
816

817 818
   if (compression_type != NULL)
      *compression_type = info_ptr->compression_type;
819

820 821
   if (filter_type != NULL)
      *filter_type = info_ptr->filter_type;
822

823 824
   if (interlace_type != NULL)
      *interlace_type = info_ptr->interlace_type;
825

826 827 828 829 830
   /* This is redundant if we can be sure that the info_ptr values were all
    * assigned in png_set_IHDR().  We do the check anyhow in case an
    * application has ignored our advice not to mess with the members
    * of info_ptr directly.
    */
831
   png_check_IHDR(png_ptr, info_ptr->width, info_ptr->height,
832 833
       info_ptr->bit_depth, info_ptr->color_type, info_ptr->interlace_type,
       info_ptr->compression_type, info_ptr->filter_type);
834

835
   return (1);
A
Andreas Dilger 已提交
836 837
}

838
#ifdef PNG_oFFs_SUPPORTED
839
png_uint_32 PNGAPI
840
png_get_oFFs(png_const_structrp png_ptr, png_const_inforp info_ptr,
841
    png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type)
A
Andreas Dilger 已提交
842
{
843 844
   png_debug1(1, "in %s retrieval function", "oFFs");

845 846 847
   if (png_ptr != NULL && info_ptr != NULL &&
       (info_ptr->valid & PNG_INFO_oFFs) != 0 &&
       offset_x != NULL && offset_y != NULL && unit_type != NULL)
A
Andreas Dilger 已提交
848 849 850 851 852 853
   {
      *offset_x = info_ptr->x_offset;
      *offset_y = info_ptr->y_offset;
      *unit_type = (int)info_ptr->offset_unit_type;
      return (PNG_INFO_oFFs);
   }
854

A
Andreas Dilger 已提交
855 856 857 858
   return (0);
}
#endif

859
#ifdef PNG_pCAL_SUPPORTED
860
png_uint_32 PNGAPI
861
png_get_pCAL(png_const_structrp png_ptr, png_inforp info_ptr,
862 863
    png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams,
    png_charp *units, png_charpp *params)
A
Andreas Dilger 已提交
864
{
865 866
   png_debug1(1, "in %s retrieval function", "pCAL");

867 868 869
   if (png_ptr != NULL && info_ptr != NULL &&
       (info_ptr->valid & PNG_INFO_pCAL) != 0 &&
       purpose != NULL && X0 != NULL && X1 != NULL && type != NULL &&
870
       nparams != NULL && units != NULL && params != NULL)
A
Andreas Dilger 已提交
871 872 873 874 875 876 877 878 879 880
   {
      *purpose = info_ptr->pcal_purpose;
      *X0 = info_ptr->pcal_X0;
      *X1 = info_ptr->pcal_X1;
      *type = (int)info_ptr->pcal_type;
      *nparams = (int)info_ptr->pcal_nparams;
      *units = info_ptr->pcal_units;
      *params = info_ptr->pcal_params;
      return (PNG_INFO_pCAL);
   }
881

A
Andreas Dilger 已提交
882 883 884 885
   return (0);
}
#endif

886
#ifdef PNG_sCAL_SUPPORTED
887
#  ifdef PNG_FIXED_POINT_SUPPORTED
888 889
#    if defined(PNG_FLOATING_ARITHMETIC_SUPPORTED) || \
         defined(PNG_FLOATING_POINT_SUPPORTED)
G
[devel]  
Glenn Randers-Pehrson 已提交
890
png_uint_32 PNGAPI
891
png_get_sCAL_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,
G
[devel]  
Glenn Randers-Pehrson 已提交
892 893 894
    int *unit, png_fixed_point *width, png_fixed_point *height)
{
   if (png_ptr != NULL && info_ptr != NULL &&
895
       (info_ptr->valid & PNG_INFO_sCAL) != 0)
G
[devel]  
Glenn Randers-Pehrson 已提交
896 897
   {
      *unit = info_ptr->scal_unit;
898 899 900 901
      /*TODO: make this work without FP support; the API is currently eliminated
       * if neither floating point APIs nor internal floating point arithmetic
       * are enabled.
       */
G
[devel]  
Glenn Randers-Pehrson 已提交
902 903
      *width = png_fixed(png_ptr, atof(info_ptr->scal_s_width), "sCAL width");
      *height = png_fixed(png_ptr, atof(info_ptr->scal_s_height),
904
          "sCAL height");
G
[devel]  
Glenn Randers-Pehrson 已提交
905 906 907 908 909
      return (PNG_INFO_sCAL);
   }

   return(0);
}
910 911 912
#    endif /* FLOATING_ARITHMETIC */
#  endif /* FIXED_POINT */
#  ifdef PNG_FLOATING_POINT_SUPPORTED
913
png_uint_32 PNGAPI
914
png_get_sCAL(png_const_structrp png_ptr, png_const_inforp info_ptr,
915 916 917
    int *unit, double *width, double *height)
{
   if (png_ptr != NULL && info_ptr != NULL &&
918
       (info_ptr->valid & PNG_INFO_sCAL) != 0)
919 920
   {
      *unit = info_ptr->scal_unit;
G
[devel]  
Glenn Randers-Pehrson 已提交
921 922
      *width = atof(info_ptr->scal_s_width);
      *height = atof(info_ptr->scal_s_height);
923 924
      return (PNG_INFO_sCAL);
   }
925

926
   return(0);
927
}
928
#  endif /* FLOATING POINT */
929
png_uint_32 PNGAPI
930
png_get_sCAL_s(png_const_structrp png_ptr, png_const_inforp info_ptr,
931
    int *unit, png_charpp width, png_charpp height)
932
{
933
   if (png_ptr != NULL && info_ptr != NULL &&
934
       (info_ptr->valid & PNG_INFO_sCAL) != 0)
935 936 937 938 939 940
   {
      *unit = info_ptr->scal_unit;
      *width = info_ptr->scal_s_width;
      *height = info_ptr->scal_s_height;
      return (PNG_INFO_sCAL);
   }
941

942
   return(0);
943
}
944
#endif /* sCAL */
945

946
#ifdef PNG_pHYs_SUPPORTED
947
png_uint_32 PNGAPI
948
png_get_pHYs(png_const_structrp png_ptr, png_const_inforp info_ptr,
949
    png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)
A
Andreas Dilger 已提交
950
{
951 952
   png_uint_32 retval = 0;

953 954
   png_debug1(1, "in %s retrieval function", "pHYs");

955
   if (png_ptr != NULL && info_ptr != NULL &&
956
       (info_ptr->valid & PNG_INFO_pHYs) != 0)
A
Andreas Dilger 已提交
957
   {
958
      if (res_x != NULL)
959 960
      {
         *res_x = info_ptr->x_pixels_per_unit;
961 962
         retval |= PNG_INFO_pHYs;
      }
963

964 965
      if (res_y != NULL)
      {
966 967 968
         *res_y = info_ptr->y_pixels_per_unit;
         retval |= PNG_INFO_pHYs;
      }
969

970 971 972 973 974
      if (unit_type != NULL)
      {
         *unit_type = (int)info_ptr->phys_unit_type;
         retval |= PNG_INFO_pHYs;
      }
A
Andreas Dilger 已提交
975
   }
976

977
   return (retval);
A
Andreas Dilger 已提交
978
}
979
#endif /* pHYs */
A
Andreas Dilger 已提交
980

981
png_uint_32 PNGAPI
982
png_get_PLTE(png_const_structrp png_ptr, png_inforp info_ptr,
983
    png_colorp *palette, int *num_palette)
A
Andreas Dilger 已提交
984
{
985 986
   png_debug1(1, "in %s retrieval function", "PLTE");

987 988
   if (png_ptr != NULL && info_ptr != NULL &&
       (info_ptr->valid & PNG_INFO_PLTE) != 0 && palette != NULL)
A
Andreas Dilger 已提交
989 990 991
   {
      *palette = info_ptr->palette;
      *num_palette = info_ptr->num_palette;
992
      png_debug1(3, "num_palette = %d", *num_palette);
A
Andreas Dilger 已提交
993 994
      return (PNG_INFO_PLTE);
   }
995

A
Andreas Dilger 已提交
996 997 998
   return (0);
}

999
#ifdef PNG_sBIT_SUPPORTED
1000
png_uint_32 PNGAPI
1001
png_get_sBIT(png_const_structrp png_ptr, png_inforp info_ptr,
1002
    png_color_8p *sig_bit)
A
Andreas Dilger 已提交
1003
{
1004 1005
   png_debug1(1, "in %s retrieval function", "sBIT");

1006 1007
   if (png_ptr != NULL && info_ptr != NULL &&
       (info_ptr->valid & PNG_INFO_sBIT) != 0 && sig_bit != NULL)
A
Andreas Dilger 已提交
1008 1009 1010 1011
   {
      *sig_bit = &(info_ptr->sig_bit);
      return (PNG_INFO_sBIT);
   }
1012

A
Andreas Dilger 已提交
1013 1014 1015 1016
   return (0);
}
#endif

1017
#ifdef PNG_TEXT_SUPPORTED
1018 1019
int PNGAPI
png_get_text(png_const_structrp png_ptr, png_inforp info_ptr,
1020
    png_textp *text_ptr, int *num_text)
A
Andreas Dilger 已提交
1021
{
1022
   if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0)
A
Andreas Dilger 已提交
1023
   {
1024 1025
      png_debug1(1, "in 0x%lx retrieval function",
         (unsigned long)png_ptr->chunk_name);
1026

A
Andreas Dilger 已提交
1027 1028
      if (text_ptr != NULL)
         *text_ptr = info_ptr->text;
1029

A
Andreas Dilger 已提交
1030 1031
      if (num_text != NULL)
         *num_text = info_ptr->num_text;
1032

1033
      return info_ptr->num_text;
A
Andreas Dilger 已提交
1034
   }
1035

1036
   if (num_text != NULL)
1037
      *num_text = 0;
1038

A
Andreas Dilger 已提交
1039 1040 1041 1042
   return(0);
}
#endif

1043
#ifdef PNG_tIME_SUPPORTED
1044
png_uint_32 PNGAPI
1045 1046
png_get_tIME(png_const_structrp png_ptr, png_inforp info_ptr,
    png_timep *mod_time)
A
Andreas Dilger 已提交
1047
{
1048 1049
   png_debug1(1, "in %s retrieval function", "tIME");

1050 1051
   if (png_ptr != NULL && info_ptr != NULL &&
       (info_ptr->valid & PNG_INFO_tIME) != 0 && mod_time != NULL)
A
Andreas Dilger 已提交
1052 1053 1054 1055
   {
      *mod_time = &(info_ptr->mod_time);
      return (PNG_INFO_tIME);
   }
1056

A
Andreas Dilger 已提交
1057 1058 1059 1060
   return (0);
}
#endif

1061
#ifdef PNG_tRNS_SUPPORTED
1062
png_uint_32 PNGAPI
1063
png_get_tRNS(png_const_structrp png_ptr, png_inforp info_ptr,
1064
    png_bytep *trans_alpha, int *num_trans, png_color_16p *trans_color)
A
Andreas Dilger 已提交
1065
{
1066
   png_uint_32 retval = 0;
1067 1068
   if (png_ptr != NULL && info_ptr != NULL &&
       (info_ptr->valid & PNG_INFO_tRNS) != 0)
A
Andreas Dilger 已提交
1069
   {
1070
      png_debug1(1, "in %s retrieval function", "tRNS");
1071

1072
      if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
A
Andreas Dilger 已提交
1073
      {
1074 1075 1076 1077 1078 1079 1080 1081
         if (trans_alpha != NULL)
         {
            *trans_alpha = info_ptr->trans_alpha;
            retval |= PNG_INFO_tRNS;
         }

         if (trans_color != NULL)
            *trans_color = &(info_ptr->trans_color);
A
Andreas Dilger 已提交
1082
      }
1083

1084
      else /* if (info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) */
A
Andreas Dilger 已提交
1085
      {
1086 1087 1088 1089 1090 1091 1092 1093
         if (trans_color != NULL)
         {
            *trans_color = &(info_ptr->trans_color);
            retval |= PNG_INFO_tRNS;
         }

         if (trans_alpha != NULL)
            *trans_alpha = NULL;
A
Andreas Dilger 已提交
1094
      }
1095

1096
      if (num_trans != NULL)
A
Andreas Dilger 已提交
1097
      {
1098 1099
         *num_trans = info_ptr->num_trans;
         retval |= PNG_INFO_tRNS;
A
Andreas Dilger 已提交
1100 1101
      }
   }
1102

1103
   return (retval);
A
Andreas Dilger 已提交
1104 1105 1106
}
#endif

1107
#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
1108
int PNGAPI
1109
png_get_unknown_chunks(png_const_structrp png_ptr, png_inforp info_ptr,
1110
    png_unknown_chunkpp unknowns)
1111 1112
{
   if (png_ptr != NULL && info_ptr != NULL && unknowns != NULL)
1113
   {
1114
      *unknowns = info_ptr->unknown_chunks;
1115
      return info_ptr->unknown_chunks_num;
1116
   }
1117

1118
   return (0);
1119 1120 1121
}
#endif

1122
#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
1123
png_byte PNGAPI
1124
png_get_rgb_to_gray_status (png_const_structrp png_ptr)
1125
{
1126
   return (png_byte)(png_ptr ? png_ptr->rgb_to_gray_status : 0);
1127 1128
}
#endif
1129

1130
#ifdef PNG_USER_CHUNKS_SUPPORTED
1131
png_voidp PNGAPI
1132
png_get_user_chunk_ptr(png_const_structrp png_ptr)
1133
{
1134
   return (png_ptr ? png_ptr->user_chunk_ptr : NULL);
1135 1136 1137
}
#endif

1138
png_size_t PNGAPI
1139
png_get_compression_buffer_size(png_const_structrp png_ptr)
1140
{
1141 1142 1143
   if (png_ptr == NULL)
      return 0;

1144
#ifdef PNG_WRITE_SUPPORTED
1145
   if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
1146
#endif
1147
   {
1148
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
1149
      return png_ptr->IDAT_read_size;
1150
#else
1151
      return PNG_IDAT_READ_SIZE;
1152
#endif
1153 1154
   }

1155
#ifdef PNG_WRITE_SUPPORTED
1156 1157
   else
      return png_ptr->zbuffer_size;
1158
#endif
1159 1160
}

1161
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
1162 1163
/* These functions were added to libpng 1.2.6 and were enabled
 * by default in libpng-1.4.0 */
1164
png_uint_32 PNGAPI
1165
png_get_user_width_max (png_const_structrp png_ptr)
1166
{
1167
   return (png_ptr ? png_ptr->user_width_max : 0);
1168
}
1169

1170
png_uint_32 PNGAPI
1171
png_get_user_height_max (png_const_structrp png_ptr)
1172
{
1173
   return (png_ptr ? png_ptr->user_height_max : 0);
1174
}
1175

1176
/* This function was added to libpng 1.4.0 */
1177
png_uint_32 PNGAPI
1178
png_get_chunk_cache_max (png_const_structrp png_ptr)
1179
{
1180
   return (png_ptr ? png_ptr->user_chunk_cache_max : 0);
1181
}
1182

1183
/* This function was added to libpng 1.4.1 */
1184
png_alloc_size_t PNGAPI
1185
png_get_chunk_malloc_max (png_const_structrp png_ptr)
1186
{
1187
   return (png_ptr ? png_ptr->user_chunk_malloc_max : 0);
1188
}
1189
#endif /* SET_USER_LIMITS */
1190

1191
/* These functions were added to libpng 1.4.0 */
1192 1193
#ifdef PNG_IO_STATE_SUPPORTED
png_uint_32 PNGAPI
1194
png_get_io_state (png_const_structrp png_ptr)
1195
{
1196
   return png_ptr->io_state;
1197 1198
}

1199
png_uint_32 PNGAPI
1200
png_get_io_chunk_type (png_const_structrp png_ptr)
1201
{
1202
   return png_ptr->chunk_name;
1203
}
1204
#endif /* IO_STATE */
1205

1206 1207 1208 1209
#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED
#  ifdef PNG_GET_PALETTE_MAX_SUPPORTED
int PNGAPI
png_get_palette_max(png_const_structp png_ptr, png_const_infop info_ptr)
1210
{
1211 1212 1213 1214
   if (png_ptr != NULL && info_ptr != NULL)
      return png_ptr->num_palette_max;

   return (-1);
1215
}
1216 1217
#  endif
#endif
1218

1219
#endif /* READ || WRITE */