pngget.c 22.8 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 30, 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
#ifdef 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
#ifdef 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
#ifdef 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
#ifdef 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
#ifdef 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
#ifdef 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
#ifdef 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
#ifdef 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
#ifdef 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
#ifdef 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
#ifdef 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
#ifdef 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
#ifdef 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
#ifdef 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
#ifdef 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
#ifdef 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
#ifdef 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 584
   int test_interlace_type = 0;
   int test_compression_type = 0;
   int test_filter_type = 0;
585

586
   png_debug1(1, "in %s retrieval function", "IHDR");
587

588 589 590
   if (png_ptr == NULL || info_ptr == NULL || width == NULL ||
       height == NULL || bit_depth == NULL || color_type == NULL)
      return (0);
591

592 593 594 595
   *width = info_ptr->width;
   *height = info_ptr->height;
   *bit_depth = info_ptr->bit_depth;
   *color_type = info_ptr->color_type;
596

597 598 599 600 601
   if (compression_type != NULL)
   {
      *compression_type = info_ptr->compression_type;
      test_compression_type=*compression_type;
   }
602

603 604 605 606 607
   if (filter_type != NULL)
   {
      *filter_type = info_ptr->filter_type;
      test_filter_type=*filter_type;
   }
608

609 610 611 612 613
   if (interlace_type != NULL)
   {
      *interlace_type = info_ptr->interlace_type;
      test_interlace_type=*interlace_type;
   }
614

615 616 617
   png_check_IHDR (png_ptr, *width, *height, *bit_depth, *color_type,
      info_ptr->interlace_type, info_ptr->compression_type,
      info_ptr->filter_type);
618

619
   return (1);
A
Andreas Dilger 已提交
620 621
}

622
#ifdef PNG_oFFs_SUPPORTED
623
png_uint_32 PNGAPI
A
Andreas Dilger 已提交
624
png_get_oFFs(png_structp png_ptr, png_infop info_ptr,
625
   png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type)
A
Andreas Dilger 已提交
626
{
627 628
   png_debug1(1, "in %s retrieval function", "oFFs");

629 630
   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 已提交
631 632 633 634 635 636 637 638 639 640
   {
      *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

641
#ifdef PNG_pCAL_SUPPORTED
642
png_uint_32 PNGAPI
A
Andreas Dilger 已提交
643 644 645 646
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)
{
647 648
   png_debug1(1, "in %s retrieval function", "pCAL");

649
   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL)
650 651
       && purpose != NULL && X0 != NULL && X1 != NULL && type != NULL &&
       nparams != NULL && units != NULL && params != NULL)
A
Andreas Dilger 已提交
652 653 654 655 656 657 658 659 660 661 662 663 664 665
   {
      *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

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

702
#ifdef PNG_pHYs_SUPPORTED
703
png_uint_32 PNGAPI
A
Andreas Dilger 已提交
704 705 706
png_get_pHYs(png_structp png_ptr, png_infop info_ptr,
   png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)
{
707 708
   png_uint_32 retval = 0;

709 710
   png_debug1(1, "in %s retrieval function", "pHYs");

711 712
   if (png_ptr != NULL && info_ptr != NULL &&
      (info_ptr->valid & PNG_INFO_pHYs))
A
Andreas Dilger 已提交
713
   {
714
      if (res_x != NULL)
715 716
      {
         *res_x = info_ptr->x_pixels_per_unit;
717 718
         retval |= PNG_INFO_pHYs;
      }
719

720 721
      if (res_y != NULL)
      {
722 723 724
         *res_y = info_ptr->y_pixels_per_unit;
         retval |= PNG_INFO_pHYs;
      }
725

726 727 728 729 730
      if (unit_type != NULL)
      {
         *unit_type = (int)info_ptr->phys_unit_type;
         retval |= PNG_INFO_pHYs;
      }
A
Andreas Dilger 已提交
731
   }
732
   return (retval);
A
Andreas Dilger 已提交
733 734 735
}
#endif

736
png_uint_32 PNGAPI
A
Andreas Dilger 已提交
737 738 739
png_get_PLTE(png_structp png_ptr, png_infop info_ptr, png_colorp *palette,
   int *num_palette)
{
740 741
   png_debug1(1, "in %s retrieval function", "PLTE");

742 743
   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_PLTE)
       && palette != NULL)
A
Andreas Dilger 已提交
744 745 746
   {
      *palette = info_ptr->palette;
      *num_palette = info_ptr->num_palette;
747
      png_debug1(3, "num_palette = %d", *num_palette);
A
Andreas Dilger 已提交
748 749 750 751 752
      return (PNG_INFO_PLTE);
   }
   return (0);
}

753
#ifdef PNG_sBIT_SUPPORTED
754
png_uint_32 PNGAPI
A
Andreas Dilger 已提交
755 756
png_get_sBIT(png_structp png_ptr, png_infop info_ptr, png_color_8p *sig_bit)
{
757 758
   png_debug1(1, "in %s retrieval function", "sBIT");

759 760
   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT)
      && sig_bit != NULL)
A
Andreas Dilger 已提交
761 762 763 764 765 766 767 768
   {
      *sig_bit = &(info_ptr->sig_bit);
      return (PNG_INFO_sBIT);
   }
   return (0);
}
#endif

769
#ifdef PNG_TEXT_SUPPORTED
770
png_uint_32 PNGAPI
A
Andreas Dilger 已提交
771 772 773
png_get_text(png_structp png_ptr, png_infop info_ptr, png_textp *text_ptr,
   int *num_text)
{
774
   if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0)
A
Andreas Dilger 已提交
775
   {
776
      png_debug1(1, "in %s retrieval function",
777 778
         (png_ptr->chunk_name[0] == '\0' ? "text"
             : (png_const_charp)png_ptr->chunk_name));
779

A
Andreas Dilger 已提交
780 781
      if (text_ptr != NULL)
         *text_ptr = info_ptr->text;
782

A
Andreas Dilger 已提交
783 784
      if (num_text != NULL)
         *num_text = info_ptr->num_text;
785

786
      return ((png_uint_32)info_ptr->num_text);
A
Andreas Dilger 已提交
787
   }
788 789
   if (num_text != NULL)
     *num_text = 0;
A
Andreas Dilger 已提交
790 791 792 793
   return(0);
}
#endif

794
#ifdef PNG_tIME_SUPPORTED
795
png_uint_32 PNGAPI
A
Andreas Dilger 已提交
796 797
png_get_tIME(png_structp png_ptr, png_infop info_ptr, png_timep *mod_time)
{
798 799
   png_debug1(1, "in %s retrieval function", "tIME");

800 801
   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME)
       && mod_time != NULL)
A
Andreas Dilger 已提交
802 803 804 805 806 807 808 809
   {
      *mod_time = &(info_ptr->mod_time);
      return (PNG_INFO_tIME);
   }
   return (0);
}
#endif

810
#ifdef PNG_tRNS_SUPPORTED
811
png_uint_32 PNGAPI
A
Andreas Dilger 已提交
812
png_get_tRNS(png_structp png_ptr, png_infop info_ptr,
813
   png_bytep *trans_alpha, int *num_trans, png_color_16p *trans_color)
A
Andreas Dilger 已提交
814
{
815
   png_uint_32 retval = 0;
816
   if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS))
A
Andreas Dilger 已提交
817
   {
818
      png_debug1(1, "in %s retrieval function", "tRNS");
819

820
      if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
A
Andreas Dilger 已提交
821
      {
822
          if (trans_alpha != NULL)
823
          {
824
             *trans_alpha = info_ptr->trans_alpha;
825 826
             retval |= PNG_INFO_tRNS;
          }
827

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

839 840
          if (trans_alpha != NULL)
             *trans_alpha = NULL;
A
Andreas Dilger 已提交
841
      }
842
      if (num_trans != NULL)
A
Andreas Dilger 已提交
843
      {
844 845
         *num_trans = info_ptr->num_trans;
         retval |= PNG_INFO_tRNS;
A
Andreas Dilger 已提交
846 847
      }
   }
848
   return (retval);
A
Andreas Dilger 已提交
849 850 851
}
#endif

852
#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
853
png_uint_32 PNGAPI
854 855 856 857
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)
858
   {
859
     *unknowns = info_ptr->unknown_chunks;
860 861 862
     return ((png_uint_32)info_ptr->unknown_chunks_num);
   }
   return (0);
863 864 865
}
#endif

866
#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
867
png_byte PNGAPI
868 869
png_get_rgb_to_gray_status (png_structp png_ptr)
{
870
   return (png_byte)(png_ptr? png_ptr->rgb_to_gray_status : 0);
871 872
}
#endif
873

874
#ifdef PNG_USER_CHUNKS_SUPPORTED
875
png_voidp PNGAPI
876 877
png_get_user_chunk_ptr(png_structp png_ptr)
{
878
   return (png_ptr? png_ptr->user_chunk_ptr : NULL);
879 880 881
}
#endif

882
#ifdef PNG_WRITE_SUPPORTED
883
png_size_t PNGAPI
884 885
png_get_compression_buffer_size(png_structp png_ptr)
{
886
   return (png_ptr ? png_ptr->zbuf_size : 0L);
887
}
888
#endif
889

890 891

#ifdef PNG_SET_USER_LIMITS_SUPPORTED
892
/* These functions were added to libpng 1.2.6 */
893 894 895 896 897 898 899 900 901 902
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);
}
903 904 905 906 907 908 909
/* 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);
}
910
#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */
911

912 913 914 915 916 917 918 919 920 921 922 923 924 925
#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 */

926
#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */