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

/* pngget.c - retrieval of values from info struct
3
 *
4
 * Last changed in libpng 1.4.0 [September 17, 2009]
5
 * Copyright (c) 1998-2009 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 "png.h"
16
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
17
#include "pngpriv.h"
18

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

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

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

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

39
#if defined(PNG_INFO_IMAGE_SUPPORTED)
40
png_bytepp PNGAPI
41 42 43 44
png_get_rows(png_structp png_ptr, png_infop info_ptr)
{
   if (png_ptr != NULL && info_ptr != NULL)
      return(info_ptr->row_pointers);
45

46 47 48 49 50
   else
      return(0);
}
#endif

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

59 60 61
   return (0);
}

62
png_uint_32 PNGAPI
63 64
png_get_image_height(png_structp png_ptr, png_infop info_ptr)
{
65
   if (png_ptr != NULL && info_ptr != NULL)
66
      return info_ptr->height;
67

68 69 70
   return (0);
}

71
png_byte PNGAPI
72 73
png_get_bit_depth(png_structp png_ptr, png_infop info_ptr)
{
74
   if (png_ptr != NULL && info_ptr != NULL)
75
      return info_ptr->bit_depth;
76

77 78 79
   return (0);
}

80
png_byte PNGAPI
81 82
png_get_color_type(png_structp png_ptr, png_infop info_ptr)
{
83
   if (png_ptr != NULL && info_ptr != NULL)
84
      return info_ptr->color_type;
85

86 87 88
   return (0);
}

89
png_byte PNGAPI
90 91
png_get_filter_type(png_structp png_ptr, png_infop info_ptr)
{
92
   if (png_ptr != NULL && info_ptr != NULL)
93
      return info_ptr->filter_type;
94

95 96 97
   return (0);
}

98
png_byte PNGAPI
99 100
png_get_interlace_type(png_structp png_ptr, png_infop info_ptr)
{
101
   if (png_ptr != NULL && info_ptr != NULL)
102
      return info_ptr->interlace_type;
103

104 105 106
   return (0);
}

107
png_byte PNGAPI
108 109
png_get_compression_type(png_structp png_ptr, png_infop info_ptr)
{
110
   if (png_ptr != NULL && info_ptr != NULL)
111
      return info_ptr->compression_type;
112

113 114 115
   return (0);
}

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

125
      if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER)
126
          return (0);
127

128 129
      else
          return (info_ptr->x_pixels_per_unit);
130
   }
131 132
#else
   return (0);
133 134 135 136
#endif
   return (0);
}

137
png_uint_32 PNGAPI
138 139
png_get_y_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
{
140
   if (png_ptr != NULL && info_ptr != NULL)
141
#if defined(PNG_pHYs_SUPPORTED)
142
   if (info_ptr->valid & PNG_INFO_pHYs)
143
   {
144
      png_debug1(1, "in %s retrieval function", "png_get_y_pixels_per_meter");
145

146
      if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER)
147
          return (0);
148

149 150
      else
          return (info_ptr->y_pixels_per_unit);
151
   }
152 153
#else
   return (0);
154 155 156 157
#endif
   return (0);
}

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

167
      if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER ||
168
         info_ptr->x_pixels_per_unit != info_ptr->y_pixels_per_unit)
169
          return (0);
170

171 172
      else
          return (info_ptr->x_pixels_per_unit);
173
   }
174 175
#else
   return (0);
176 177 178 179
#endif
   return (0);
}

180
#ifdef PNG_FLOATING_POINT_SUPPORTED
181
float PNGAPI
182 183
png_get_pixel_aspect_ratio(png_structp png_ptr, png_infop info_ptr)
   {
184
   if (png_ptr != NULL && info_ptr != NULL)
185
#if defined(PNG_pHYs_SUPPORTED)
186

187
   if (info_ptr->valid & PNG_INFO_pHYs)
188
   {
189
      png_debug1(1, "in %s retrieval function", "png_get_aspect_ratio");
190

191
      if (info_ptr->x_pixels_per_unit == 0)
192
         return ((float)0.0);
193

194
      else
195 196
         return ((float)((float)info_ptr->y_pixels_per_unit
            /(float)info_ptr->x_pixels_per_unit));
197
   }
198
#else
199
      return (0.0);
200
#endif
201
   return ((float)0.0);
202
}
203
#endif
204

205
png_int_32 PNGAPI
206 207
png_get_x_offset_microns(png_structp png_ptr, png_infop info_ptr)
{
208
   if (png_ptr != NULL && info_ptr != NULL)
209
#if defined(PNG_oFFs_SUPPORTED)
210

211
   if (info_ptr->valid & PNG_INFO_oFFs)
212
   {
213
      png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns");
214

215
      if (info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER)
216
          return (0);
217

218 219
      else
          return (info_ptr->x_offset);
220
   }
221
#else
222
      return (0);
223 224 225 226
#endif
   return (0);
}

227
png_int_32 PNGAPI
228 229
png_get_y_offset_microns(png_structp png_ptr, png_infop info_ptr)
{
230
   if (png_ptr != NULL && info_ptr != NULL)
231

232
#if defined(PNG_oFFs_SUPPORTED)
233
   if (info_ptr->valid & PNG_INFO_oFFs)
234
   {
235
      png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns");
236

237
      if (info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER)
238
          return (0);
239

240 241
      else
          return (info_ptr->y_offset);
242
   }
243 244
#else
   return (0);
245 246 247 248
#endif
   return (0);
}

249
png_int_32 PNGAPI
250 251
png_get_x_offset_pixels(png_structp png_ptr, png_infop info_ptr)
{
252
   if (png_ptr != NULL && info_ptr != NULL)
253

254
#if defined(PNG_oFFs_SUPPORTED)
255
   if (info_ptr->valid & PNG_INFO_oFFs)
256
   {
257
      png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns");
258

259
      if (info_ptr->offset_unit_type != PNG_OFFSET_PIXEL)
260
          return (0);
261

262 263
      else
          return (info_ptr->x_offset);
264
   }
265 266
#else
   return (0);
267 268 269 270
#endif
   return (0);
}

271
png_int_32 PNGAPI
272 273
png_get_y_offset_pixels(png_structp png_ptr, png_infop info_ptr)
{
274
   if (png_ptr != NULL && info_ptr != NULL)
275

276
#if defined(PNG_oFFs_SUPPORTED)
277
   if (info_ptr->valid & PNG_INFO_oFFs)
278
   {
279
      png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns");
280

281
      if (info_ptr->offset_unit_type != PNG_OFFSET_PIXEL)
282
          return (0);
283

284 285
      else
          return (info_ptr->y_offset);
286
   }
287 288
#else
   return (0);
289 290 291 292
#endif
   return (0);
}

293
#if defined(PNG_INCH_CONVERSIONS) && defined(PNG_FLOATING_POINT_SUPPORTED)
294
png_uint_32 PNGAPI
295 296 297
png_get_pixels_per_inch(png_structp png_ptr, png_infop info_ptr)
{
   return ((png_uint_32)((float)png_get_pixels_per_meter(png_ptr, info_ptr)
298
     *.0254 +.5));
299 300
}

301
png_uint_32 PNGAPI
302 303 304
png_get_x_pixels_per_inch(png_structp png_ptr, png_infop info_ptr)
{
   return ((png_uint_32)((float)png_get_x_pixels_per_meter(png_ptr, info_ptr)
305
     *.0254 +.5));
306 307
}

308
png_uint_32 PNGAPI
309 310 311
png_get_y_pixels_per_inch(png_structp png_ptr, png_infop info_ptr)
{
   return ((png_uint_32)((float)png_get_y_pixels_per_meter(png_ptr, info_ptr)
312
     *.0254 +.5));
313 314
}

315
float PNGAPI
316 317 318
png_get_x_offset_inches(png_structp png_ptr, png_infop info_ptr)
{
   return ((float)png_get_x_offset_microns(png_ptr, info_ptr)
319
     *.00003937);
320 321
}

322
float PNGAPI
323 324 325
png_get_y_offset_inches(png_structp png_ptr, png_infop info_ptr)
{
   return ((float)png_get_y_offset_microns(png_ptr, info_ptr)
326
     *.00003937);
327 328
}

329
#if defined(PNG_pHYs_SUPPORTED)
330
png_uint_32 PNGAPI
331 332 333 334 335
png_get_pHYs_dpi(png_structp png_ptr, png_infop info_ptr,
   png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)
{
   png_uint_32 retval = 0;

336
   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs))
337
   {
338
      png_debug1(1, "in %s retrieval function", "pHYs");
339

340 341 342 343 344 345 346 347 348 349 350 351 352 353
      if (res_x != NULL)
      {
         *res_x = info_ptr->x_pixels_per_unit;
         retval |= PNG_INFO_pHYs;
      }
      if (res_y != NULL)
      {
         *res_y = info_ptr->y_pixels_per_unit;
         retval |= PNG_INFO_pHYs;
      }
      if (unit_type != NULL)
      {
         *unit_type = (int)info_ptr->phys_unit_type;
         retval |= PNG_INFO_pHYs;
354
         if (*unit_type == 1)
355
         {
356 357
            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);
358 359 360 361 362
         }
      }
   }
   return (retval);
}
363
#endif /* PNG_pHYs_SUPPORTED */
364
#endif  /* PNG_INCH_CONVERSIONS && PNG_FLOATING_POINT_SUPPORTED */
365 366

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

368 369
#endif  /* PNG_EASY_ACCESS_SUPPORTED */

370
png_byte PNGAPI
A
Andreas Dilger 已提交
371 372
png_get_channels(png_structp png_ptr, png_infop info_ptr)
{
373
   if (png_ptr != NULL && info_ptr != NULL)
A
Andreas Dilger 已提交
374 375
      return(info_ptr->channels);
   else
376
      return (0);
A
Andreas Dilger 已提交
377 378
}

379
png_bytep PNGAPI
A
Andreas Dilger 已提交
380 381
png_get_signature(png_structp png_ptr, png_infop info_ptr)
{
382
   if (png_ptr != NULL && info_ptr != NULL)
A
Andreas Dilger 已提交
383 384
      return(info_ptr->signature);
   else
385
      return (NULL);
A
Andreas Dilger 已提交
386 387
}

388
#if defined(PNG_bKGD_SUPPORTED)
389
png_uint_32 PNGAPI
A
Andreas Dilger 已提交
390 391 392
png_get_bKGD(png_structp png_ptr, png_infop info_ptr,
   png_color_16p *background)
{
393 394
   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD)
      && background != NULL)
A
Andreas Dilger 已提交
395
   {
396
      png_debug1(1, "in %s retrieval function", "bKGD");
397

A
Andreas Dilger 已提交
398 399 400 401 402 403 404
      *background = &(info_ptr->background);
      return (PNG_INFO_bKGD);
   }
   return (0);
}
#endif

405
#if defined(PNG_cHRM_SUPPORTED)
406
#ifdef PNG_FLOATING_POINT_SUPPORTED
407
png_uint_32 PNGAPI
A
Andreas Dilger 已提交
408 409 410 411
png_get_cHRM(png_structp png_ptr, png_infop info_ptr,
   double *white_x, double *white_y, double *red_x, double *red_y,
   double *green_x, double *green_y, double *blue_x, double *blue_y)
{
412
   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM))
A
Andreas Dilger 已提交
413
   {
414
      png_debug1(1, "in %s retrieval function", "cHRM");
415

A
Andreas Dilger 已提交
416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436
      if (white_x != NULL)
         *white_x = (double)info_ptr->x_white;
      if (white_y != NULL)
         *white_y = (double)info_ptr->y_white;
      if (red_x != NULL)
         *red_x = (double)info_ptr->x_red;
      if (red_y != NULL)
         *red_y = (double)info_ptr->y_red;
      if (green_x != NULL)
         *green_x = (double)info_ptr->x_green;
      if (green_y != NULL)
         *green_y = (double)info_ptr->y_green;
      if (blue_x != NULL)
         *blue_x = (double)info_ptr->x_blue;
      if (blue_y != NULL)
         *blue_y = (double)info_ptr->y_blue;
      return (PNG_INFO_cHRM);
   }
   return (0);
}
#endif
437
#ifdef PNG_FIXED_POINT_SUPPORTED
438
png_uint_32 PNGAPI
439
png_get_cHRM_fixed(png_structp png_ptr, png_infop info_ptr,
440 441 442
   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)
443
{
444 445
   png_debug1(1, "in %s retrieval function", "cHRM");

446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469
   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM))
   {
      if (white_x != NULL)
         *white_x = info_ptr->int_x_white;
      if (white_y != NULL)
         *white_y = info_ptr->int_y_white;
      if (red_x != NULL)
         *red_x = info_ptr->int_x_red;
      if (red_y != NULL)
         *red_y = info_ptr->int_y_red;
      if (green_x != NULL)
         *green_x = info_ptr->int_x_green;
      if (green_y != NULL)
         *green_y = info_ptr->int_y_green;
      if (blue_x != NULL)
         *blue_x = info_ptr->int_x_blue;
      if (blue_y != NULL)
         *blue_y = info_ptr->int_y_blue;
      return (PNG_INFO_cHRM);
   }
   return (0);
}
#endif
#endif
A
Andreas Dilger 已提交
470

471
#if defined(PNG_gAMA_SUPPORTED)
472
#ifdef PNG_FLOATING_POINT_SUPPORTED
473
png_uint_32 PNGAPI
A
Andreas Dilger 已提交
474 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)
      && file_gamma != NULL)
A
Andreas Dilger 已提交
480 481 482 483 484 485 486
   {
      *file_gamma = (double)info_ptr->gamma;
      return (PNG_INFO_gAMA);
   }
   return (0);
}
#endif
487
#ifdef PNG_FIXED_POINT_SUPPORTED
488
png_uint_32 PNGAPI
489
png_get_gAMA_fixed(png_structp png_ptr, png_infop info_ptr,
490
    png_fixed_point *int_file_gamma)
491
{
492 493
   png_debug1(1, "in %s retrieval function", "gAMA");

494 495 496 497 498 499 500 501 502
   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA)
      && int_file_gamma != NULL)
   {
      *int_file_gamma = info_ptr->int_gamma;
      return (PNG_INFO_gAMA);
   }
   return (0);
}
#endif
503
#endif
A
Andreas Dilger 已提交
504

505
#if defined(PNG_sRGB_SUPPORTED)
506
png_uint_32 PNGAPI
507
png_get_sRGB(png_structp png_ptr, png_infop info_ptr, int *file_srgb_intent)
508
{
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)
      && file_srgb_intent != NULL)
513
   {
514
      *file_srgb_intent = (int)info_ptr->srgb_intent;
515 516 517 518 519 520
      return (PNG_INFO_sRGB);
   }
   return (0);
}
#endif

521
#if defined(PNG_iCCP_SUPPORTED)
522
png_uint_32 PNGAPI
523 524
png_get_iCCP(png_structp png_ptr, png_infop info_ptr,
             png_charpp name, int *compression_type,
525
             png_charpp profile, png_uint_32 *proflen)
526
{
527 528
   png_debug1(1, "in %s retrieval function", "iCCP");

529 530 531 532 533
   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP)
      && name != NULL && profile != NULL && proflen != NULL)
   {
      *name = info_ptr->iccp_name;
      *profile = info_ptr->iccp_profile;
534 535 536
      /* Compression_type is a dummy so the API won't have to change
       * if we introduce multiple compression types later.
       */
537 538 539 540 541 542 543 544
      *proflen = (int)info_ptr->iccp_proflen;
      *compression_type = (int)info_ptr->iccp_compression;
      return (PNG_INFO_iCCP);
   }
   return (0);
}
#endif

545
#if defined(PNG_sPLT_SUPPORTED)
546
png_uint_32 PNGAPI
547
png_get_sPLT(png_structp png_ptr, png_infop info_ptr,
548
             png_sPLT_tpp spalettes)
549 550
{
   if (png_ptr != NULL && info_ptr != NULL && spalettes != NULL)
551
   {
552
     *spalettes = info_ptr->splt_palettes;
553 554 555
     return ((png_uint_32)info_ptr->splt_palettes_num);
   }
   return (0);
556 557 558
}
#endif

559
#if defined(PNG_hIST_SUPPORTED)
560
png_uint_32 PNGAPI
A
Andreas Dilger 已提交
561 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)
      && hist != NULL)
A
Andreas Dilger 已提交
567 568 569 570 571 572 573 574
   {
      *hist = info_ptr->hist;
      return (PNG_INFO_hIST);
   }
   return (0);
}
#endif

575
png_uint_32 PNGAPI
A
Andreas Dilger 已提交
576 577 578 579
png_get_IHDR(png_structp png_ptr, png_infop info_ptr,
   png_uint_32 *width, png_uint_32 *height, int *bit_depth,
   int *color_type, int *interlace_type, int *compression_type,
   int *filter_type)
580

A
Andreas Dilger 已提交
581
{
582 583
   png_debug1(1, "in %s retrieval function", "IHDR");

584
   if (png_ptr != NULL && info_ptr != NULL && width != NULL && height != NULL &&
A
Andreas Dilger 已提交
585 586 587 588 589
      bit_depth != NULL && color_type != NULL)
   {
      *width = info_ptr->width;
      *height = info_ptr->height;
      *bit_depth = info_ptr->bit_depth;
590
      if (info_ptr->bit_depth < 1 || info_ptr->bit_depth > 16)
591 592
         png_error(png_ptr, "Invalid bit depth");

A
Andreas Dilger 已提交
593
      *color_type = info_ptr->color_type;
594

595
      if (info_ptr->color_type > 6)
596 597
         png_error(png_ptr, "Invalid color type");

A
Andreas Dilger 已提交
598 599
      if (compression_type != NULL)
         *compression_type = info_ptr->compression_type;
600

A
Andreas Dilger 已提交
601 602
      if (filter_type != NULL)
         *filter_type = info_ptr->filter_type;
603

A
Andreas Dilger 已提交
604 605
      if (interlace_type != NULL)
         *interlace_type = info_ptr->interlace_type;
606

607
      /* Check for potential overflow of rowbytes */
608
      if (*width == 0 || *width > PNG_UINT_31_MAX)
609
        png_error(png_ptr, "Invalid image width");
610

611
      if (*height == 0 || *height > PNG_UINT_31_MAX)
612
        png_error(png_ptr, "Invalid image height");
613

614 615 616 617 618 619
      if (info_ptr->width > (PNG_UINT_32_MAX
                 >> 3)      /* 8-byte RGBA pixels */
                 - 64       /* bigrowbuf hack */
                 - 1        /* filter byte */
                 - 7*8      /* rounding of width to multiple of 8 pixels */
                 - 8)       /* extra max_pixel_depth pad */
620
      {
621
         png_warning(png_ptr,
622
            "Width too large for libpng to process image data");
623
      }
624

A
Andreas Dilger 已提交
625 626 627 628 629
      return (1);
   }
   return (0);
}

630
#if defined(PNG_oFFs_SUPPORTED)
631
png_uint_32 PNGAPI
A
Andreas Dilger 已提交
632
png_get_oFFs(png_structp png_ptr, png_infop info_ptr,
633
   png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type)
A
Andreas Dilger 已提交
634
{
635 636
   png_debug1(1, "in %s retrieval function", "oFFs");

637 638
   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)
      && offset_x != NULL && offset_y != NULL && unit_type != NULL)
A
Andreas Dilger 已提交
639 640 641 642 643 644 645 646 647 648
   {
      *offset_x = info_ptr->x_offset;
      *offset_y = info_ptr->y_offset;
      *unit_type = (int)info_ptr->offset_unit_type;
      return (PNG_INFO_oFFs);
   }
   return (0);
}
#endif

649
#if defined(PNG_pCAL_SUPPORTED)
650
png_uint_32 PNGAPI
A
Andreas Dilger 已提交
651 652 653 654
png_get_pCAL(png_structp png_ptr, png_infop info_ptr,
   png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams,
   png_charp *units, png_charpp *params)
{
655 656
   png_debug1(1, "in %s retrieval function", "pCAL");

657
   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL)
658 659
       && purpose != NULL && X0 != NULL && X1 != NULL && type != NULL &&
       nparams != NULL && units != NULL && params != NULL)
A
Andreas Dilger 已提交
660 661 662 663 664 665 666 667 668 669 670 671 672 673
   {
      *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);
   }
   return (0);
}
#endif

674
#if defined(PNG_sCAL_SUPPORTED)
675
#ifdef PNG_FLOATING_POINT_SUPPORTED
676
png_uint_32 PNGAPI
677
png_get_sCAL(png_structp png_ptr, png_infop info_ptr,
678
             int *unit, double *width, double *height)
679
{
680
    if (png_ptr != NULL && info_ptr != NULL &&
681
        (info_ptr->valid & PNG_INFO_sCAL))
682 683 684 685 686 687 688 689
    {
        *unit = info_ptr->scal_unit;
        *width = info_ptr->scal_pixel_width;
        *height = info_ptr->scal_pixel_height;
        return (PNG_INFO_sCAL);
    }
    return(0);
}
690 691
#else
#ifdef PNG_FIXED_POINT_SUPPORTED
692
png_uint_32 PNGAPI
693
png_get_sCAL_s(png_structp png_ptr, png_infop info_ptr,
694
             int *unit, png_charpp width, png_charpp height)
695
{
696
    if (png_ptr != NULL && info_ptr != NULL &&
697
        (info_ptr->valid & PNG_INFO_sCAL))
698 699 700 701 702 703 704 705 706
    {
        *unit = info_ptr->scal_unit;
        *width = info_ptr->scal_s_width;
        *height = info_ptr->scal_s_height;
        return (PNG_INFO_sCAL);
    }
    return(0);
}
#endif
707 708
#endif
#endif
709

710
#if defined(PNG_pHYs_SUPPORTED)
711
png_uint_32 PNGAPI
A
Andreas Dilger 已提交
712 713 714
png_get_pHYs(png_structp png_ptr, png_infop info_ptr,
   png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)
{
715 716
   png_uint_32 retval = 0;

717 718
   png_debug1(1, "in %s retrieval function", "pHYs");

719 720
   if (png_ptr != NULL && info_ptr != NULL &&
      (info_ptr->valid & PNG_INFO_pHYs))
A
Andreas Dilger 已提交
721
   {
722
      if (res_x != NULL)
723 724
      {
         *res_x = info_ptr->x_pixels_per_unit;
725 726
         retval |= PNG_INFO_pHYs;
      }
727

728 729
      if (res_y != NULL)
      {
730 731 732
         *res_y = info_ptr->y_pixels_per_unit;
         retval |= PNG_INFO_pHYs;
      }
733

734 735 736 737 738
      if (unit_type != NULL)
      {
         *unit_type = (int)info_ptr->phys_unit_type;
         retval |= PNG_INFO_pHYs;
      }
A
Andreas Dilger 已提交
739
   }
740
   return (retval);
A
Andreas Dilger 已提交
741 742 743
}
#endif

744
png_uint_32 PNGAPI
A
Andreas Dilger 已提交
745 746 747
png_get_PLTE(png_structp png_ptr, png_infop info_ptr, png_colorp *palette,
   int *num_palette)
{
748 749
   png_debug1(1, "in %s retrieval function", "PLTE");

750 751
   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_PLTE)
       && palette != NULL)
A
Andreas Dilger 已提交
752 753 754
   {
      *palette = info_ptr->palette;
      *num_palette = info_ptr->num_palette;
755
      png_debug1(3, "num_palette = %d", *num_palette);
A
Andreas Dilger 已提交
756 757 758 759 760
      return (PNG_INFO_PLTE);
   }
   return (0);
}

761
#if defined(PNG_sBIT_SUPPORTED)
762
png_uint_32 PNGAPI
A
Andreas Dilger 已提交
763 764
png_get_sBIT(png_structp png_ptr, png_infop info_ptr, png_color_8p *sig_bit)
{
765 766
   png_debug1(1, "in %s retrieval function", "sBIT");

767 768
   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT)
      && sig_bit != NULL)
A
Andreas Dilger 已提交
769 770 771 772 773 774 775 776
   {
      *sig_bit = &(info_ptr->sig_bit);
      return (PNG_INFO_sBIT);
   }
   return (0);
}
#endif

777
#if defined(PNG_TEXT_SUPPORTED)
778
png_uint_32 PNGAPI
A
Andreas Dilger 已提交
779 780 781
png_get_text(png_structp png_ptr, png_infop info_ptr, png_textp *text_ptr,
   int *num_text)
{
782
   if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0)
A
Andreas Dilger 已提交
783
   {
784
      png_debug1(1, "in %s retrieval function",
785 786
         (png_ptr->chunk_name[0] == '\0' ? "text"
             : (png_const_charp)png_ptr->chunk_name));
787

A
Andreas Dilger 已提交
788 789
      if (text_ptr != NULL)
         *text_ptr = info_ptr->text;
790

A
Andreas Dilger 已提交
791 792
      if (num_text != NULL)
         *num_text = info_ptr->num_text;
793

794
      return ((png_uint_32)info_ptr->num_text);
A
Andreas Dilger 已提交
795
   }
796 797
   if (num_text != NULL)
     *num_text = 0;
A
Andreas Dilger 已提交
798 799 800 801
   return(0);
}
#endif

802
#if defined(PNG_tIME_SUPPORTED)
803
png_uint_32 PNGAPI
A
Andreas Dilger 已提交
804 805
png_get_tIME(png_structp png_ptr, png_infop info_ptr, png_timep *mod_time)
{
806 807
   png_debug1(1, "in %s retrieval function", "tIME");

808 809
   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME)
       && mod_time != NULL)
A
Andreas Dilger 已提交
810 811 812 813 814 815 816 817
   {
      *mod_time = &(info_ptr->mod_time);
      return (PNG_INFO_tIME);
   }
   return (0);
}
#endif

818
#if defined(PNG_tRNS_SUPPORTED)
819
png_uint_32 PNGAPI
A
Andreas Dilger 已提交
820
png_get_tRNS(png_structp png_ptr, png_infop info_ptr,
821
   png_bytep *trans_alpha, int *num_trans, png_color_16p *trans_color)
A
Andreas Dilger 已提交
822
{
823
   png_uint_32 retval = 0;
824
   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS))
A
Andreas Dilger 已提交
825
   {
826
      png_debug1(1, "in %s retrieval function", "tRNS");
827

828
      if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
A
Andreas Dilger 已提交
829
      {
830
          if (trans_alpha != NULL)
831
          {
832
             *trans_alpha = info_ptr->trans_alpha;
833 834
             retval |= PNG_INFO_tRNS;
          }
835

836 837
          if (trans_color != NULL)
             *trans_color = &(info_ptr->trans_color);
A
Andreas Dilger 已提交
838
      }
839
      else /* if (info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) */
A
Andreas Dilger 已提交
840
      {
841
          if (trans_color != NULL)
842
          {
843
             *trans_color = &(info_ptr->trans_color);
844 845
             retval |= PNG_INFO_tRNS;
          }
846

847 848
          if (trans_alpha != NULL)
             *trans_alpha = NULL;
A
Andreas Dilger 已提交
849
      }
850
      if (num_trans != NULL)
A
Andreas Dilger 已提交
851
      {
852 853
         *num_trans = info_ptr->num_trans;
         retval |= PNG_INFO_tRNS;
A
Andreas Dilger 已提交
854 855
      }
   }
856
   return (retval);
A
Andreas Dilger 已提交
857 858 859
}
#endif

860
#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
861
png_uint_32 PNGAPI
862 863 864 865
png_get_unknown_chunks(png_structp png_ptr, png_infop info_ptr,
             png_unknown_chunkpp unknowns)
{
   if (png_ptr != NULL && info_ptr != NULL && unknowns != NULL)
866
   {
867
     *unknowns = info_ptr->unknown_chunks;
868 869 870
     return ((png_uint_32)info_ptr->unknown_chunks_num);
   }
   return (0);
871 872 873
}
#endif

874
#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
875
png_byte PNGAPI
876 877
png_get_rgb_to_gray_status (png_structp png_ptr)
{
878
   return (png_byte)(png_ptr? png_ptr->rgb_to_gray_status : 0);
879 880
}
#endif
881

882
#if defined(PNG_USER_CHUNKS_SUPPORTED)
883
png_voidp PNGAPI
884 885
png_get_user_chunk_ptr(png_structp png_ptr)
{
886
   return (png_ptr? png_ptr->user_chunk_ptr : NULL);
887 888 889
}
#endif

890
#ifdef PNG_WRITE_SUPPORTED
891
png_size_t PNGAPI
892 893
png_get_compression_buffer_size(png_structp png_ptr)
{
894
   return (png_ptr ? png_ptr->zbuf_size : 0L);
895
}
896
#endif
897

898 899

#ifdef PNG_SET_USER_LIMITS_SUPPORTED
900
/* These functions were added to libpng 1.2.6 */
901 902 903 904 905 906 907 908 909 910
png_uint_32 PNGAPI
png_get_user_width_max (png_structp png_ptr)
{
    return (png_ptr? png_ptr->user_width_max : 0);
}
png_uint_32 PNGAPI
png_get_user_height_max (png_structp png_ptr)
{
    return (png_ptr? png_ptr->user_height_max : 0);
}
911 912 913 914 915 916 917
/* This function was added to libpng 1.4.0 */
png_uint_32 PNGAPI
png_get_chunk_cache_max (png_structp png_ptr)
{
    return (png_ptr? png_ptr->user_chunk_cache_max? 0x7fffffffL :
       png_ptr->user_chunk_cache_max - 1 : 0);
}
918
#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */
919

920 921 922 923 924 925 926 927 928 929 930 931 932 933
#ifdef PNG_IO_STATE_SUPPORTED
png_uint_32 PNGAPI
png_get_io_state (png_structp png_ptr)
{
    return png_ptr->io_state;
}

png_bytep PNGAPI
png_get_io_chunk_name (png_structp png_ptr)
{
   return png_ptr->chunk_name;
}
#endif /* ?PNG_IO_STATE_SUPPORTED */

934
#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */