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

/* pngget.c - retrieval of values from info struct
3
 *
4
 * libpng 0.99d
5 6 7
 * For conditions of distribution and use, see copyright notice in png.h
 * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
 * Copyright (c) 1996, 1997 Andreas Dilger
8
 * Copyright (c) 1998, Glenn Randers-Pehrson
9
 * February 8, 1998
10
 */
A
Andreas Dilger 已提交
11 12 13 14 15 16 17

#define PNG_INTERNAL
#include "png.h"

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

png_uint_32
png_get_rowbytes(png_structp png_ptr, png_infop info_ptr)
{
27
   if (png_ptr != NULL && info_ptr != NULL)
A
Andreas Dilger 已提交
28 29 30 31 32
      return(info_ptr->rowbytes);
   else
      return(0);
}

33 34 35 36 37
#ifdef PNG_EASY_ACCESS_SUPPORTED
/* easy access to info, added in libpng-0.99 */
png_uint_32
png_get_image_width(png_structp png_ptr, png_infop info_ptr)
{
38
   if (png_ptr != NULL && info_ptr != NULL)
39 40 41 42 43 44 45 46 47
   {
      return info_ptr->width;
   }
   return (0);
}

png_uint_32
png_get_image_height(png_structp png_ptr, png_infop info_ptr)
{
48
   if (png_ptr != NULL && info_ptr != NULL)
49 50 51 52 53 54 55 56 57
   {
      return info_ptr->height;
   }
   return (0);
}

png_byte
png_get_bit_depth(png_structp png_ptr, png_infop info_ptr)
{
58
   if (png_ptr != NULL && info_ptr != NULL)
59 60 61 62 63 64 65 66 67
   {
      return info_ptr->bit_depth;
   }
   return (0);
}

png_byte
png_get_color_type(png_structp png_ptr, png_infop info_ptr)
{
68
   if (png_ptr != NULL && info_ptr != NULL)
69 70 71 72 73 74 75 76 77
   {
      return info_ptr->color_type;
   }
   return (0);
}

png_byte
png_get_filter_type(png_structp png_ptr, png_infop info_ptr)
{
78
   if (png_ptr != NULL && info_ptr != NULL)
79 80 81 82 83 84 85 86 87
   {
      return info_ptr->filter_type;
   }
   return (0);
}

png_byte
png_get_interlace_type(png_structp png_ptr, png_infop info_ptr)
{
88
   if (png_ptr != NULL && info_ptr != NULL)
89 90 91 92 93 94 95 96 97
   {
      return info_ptr->interlace_type;
   }
   return (0);
}

png_byte
png_get_compression_type(png_structp png_ptr, png_infop info_ptr)
{
98
   if (png_ptr != NULL && info_ptr != NULL)
99 100 101 102 103 104 105 106 107 108
   {
      return info_ptr->compression_type;
   }
   return (0);
}

png_uint_32
png_get_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
{
#if defined(PNG_READ_pHYs_SUPPORTED) || defined(PNG_WRITE_pHYs_SUPPORTED)
109
   if (png_ptr != NULL && info_ptr != NULL && info_ptr->valid & PNG_INFO_pHYs)
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
   {
      png_debug1(1, "in %s retrieval function\n", "png_get_pixels_per_meter");
      if(info_ptr->phys_unit_type != PNG_RESOLUTION_METER)
          return (0);
      else return (info_ptr->x_pixels_per_unit);
   }
   else
#endif
   return (0);
}

float
png_get_pixel_aspect_ratio(png_structp png_ptr, png_infop info_ptr)
   {
#if defined(PNG_READ_pHYs_SUPPORTED) || defined(PNG_WRITE_pHYs_SUPPORTED)
125
   if (png_ptr != NULL && info_ptr != NULL && info_ptr->valid & PNG_INFO_pHYs)
126 127 128
   {
      png_debug1(1, "in %s retrieval function\n", "png_get_aspect_ratio");
      if (info_ptr->x_pixels_per_unit == 0)
129
         return ((float)0.0);
130
      else
131 132
         return ((float)info_ptr->y_pixels_per_unit
            /(float)info_ptr->x_pixels_per_unit);
133 134 135
   }
   else
#endif
136
      return ((float)0.0);
137 138 139 140 141 142
}

png_uint_32
png_get_x_offset_microns(png_structp png_ptr, png_infop info_ptr)
{
#if defined(PNG_READ_oFFs_SUPPORTED) || defined(PNG_WRITE_oFFs_SUPPORTED)
143
   if (png_ptr != NULL && info_ptr != NULL && info_ptr->valid & PNG_INFO_oFFs)
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
   {
      png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns");
      if(info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER)
          return (0);
      else return (info_ptr->x_offset);
   }
   else
#endif
   return (0);
}

png_uint_32
png_get_y_offset_microns(png_structp png_ptr, png_infop info_ptr)
{
#if defined(PNG_READ_oFFs_SUPPORTED) || defined(PNG_WRITE_oFFs_SUPPORTED)
159
   if (png_ptr != NULL && info_ptr != NULL && info_ptr->valid & PNG_INFO_oFFs)
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
   {
      png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns");
      if(info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER)
          return (0);
      else return (info_ptr->y_offset);
   }
   else
#endif
   return (0);
}

png_uint_32
png_get_x_offset_pixels(png_structp png_ptr, png_infop info_ptr)
{
#if defined(PNG_READ_oFFs_SUPPORTED) || defined(PNG_WRITE_oFFs_SUPPORTED)
175
   if (png_ptr != NULL && info_ptr != NULL && info_ptr->valid & PNG_INFO_oFFs)
176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
   {
      png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns");
      if(info_ptr->offset_unit_type != PNG_OFFSET_PIXEL)
          return (0);
      else return (info_ptr->x_offset);
   }
   else
#endif
   return (0);
}

png_uint_32
png_get_y_offset_pixels(png_structp png_ptr, png_infop info_ptr)
{
#if defined(PNG_READ_oFFs_SUPPORTED) || defined(PNG_WRITE_oFFs_SUPPORTED)
191
   if (png_ptr != NULL && info_ptr != NULL && info_ptr->valid & PNG_INFO_oFFs)
192 193 194 195 196 197 198 199 200 201 202 203 204 205
   {
      png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns");
      if(info_ptr->offset_unit_type != PNG_OFFSET_PIXEL)
          return (0);
      else return (info_ptr->y_offset);
   }
   else
#endif
   return (0);
}

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

A
Andreas Dilger 已提交
206 207 208
png_byte
png_get_channels(png_structp png_ptr, png_infop info_ptr)
{
209
   if (png_ptr != NULL && info_ptr != NULL)
A
Andreas Dilger 已提交
210 211
      return(info_ptr->channels);
   else
212
      return (0);
A
Andreas Dilger 已提交
213 214 215 216 217
}

png_bytep
png_get_signature(png_structp png_ptr, png_infop info_ptr)
{
218
   if (png_ptr != NULL && info_ptr != NULL)
A
Andreas Dilger 已提交
219 220
      return(info_ptr->signature);
   else
221
      return (NULL);
A
Andreas Dilger 已提交
222 223 224 225 226 227 228
}

#if defined(PNG_READ_bKGD_SUPPORTED)
png_uint_32
png_get_bKGD(png_structp png_ptr, png_infop info_ptr,
   png_color_16p *background)
{
229
   if (png_ptr != NULL && info_ptr != NULL && info_ptr->valid & PNG_INFO_bKGD &&
A
Andreas Dilger 已提交
230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245
      background != NULL)
   {
      png_debug1(1, "in %s retrieval function\n", "bKGD");
      *background = &(info_ptr->background);
      return (PNG_INFO_bKGD);
   }
   return (0);
}
#endif

#if defined(PNG_READ_cHRM_SUPPORTED)
png_uint_32
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)
{
246
   if (png_ptr != NULL && info_ptr != NULL && info_ptr->valid & PNG_INFO_cHRM)
A
Andreas Dilger 已提交
247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274
   {
      png_debug1(1, "in %s retrieval function\n", "cHRM");
      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

#if defined(PNG_READ_gAMA_SUPPORTED)
png_uint_32
png_get_gAMA(png_structp png_ptr, png_infop info_ptr, double *file_gamma)
{
275
   if (png_ptr != NULL && info_ptr != NULL && info_ptr->valid & PNG_INFO_gAMA &&
A
Andreas Dilger 已提交
276 277 278 279 280 281 282 283 284 285
      file_gamma != NULL)
   {
      png_debug1(1, "in %s retrieval function\n", "gAMA");
      *file_gamma = (double)info_ptr->gamma;
      return (PNG_INFO_gAMA);
   }
   return (0);
}
#endif

286 287
#if defined(PNG_READ_sRGB_SUPPORTED)
png_uint_32
288
png_get_sRGB(png_structp png_ptr, png_infop info_ptr, int *file_srgb_intent)
289
{
290
   if (png_ptr != NULL && info_ptr != NULL && info_ptr->valid & PNG_INFO_sRGB &&
291
      file_srgb_intent != NULL)
292 293
   {
      png_debug1(1, "in %s retrieval function\n", "sRGB");
294
      *file_srgb_intent = (int)info_ptr->srgb_intent;
295 296 297 298 299 300
      return (PNG_INFO_sRGB);
   }
   return (0);
}
#endif

A
Andreas Dilger 已提交
301 302 303 304
#if defined(PNG_READ_hIST_SUPPORTED)
png_uint_32
png_get_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p *hist)
{
305 306
   if (png_ptr != NULL && info_ptr != NULL && info_ptr->valid & PNG_INFO_hIST &&
      hist != NULL)
A
Andreas Dilger 已提交
307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322
   {
      png_debug1(1, "in %s retrieval function\n", "hIST");
      *hist = info_ptr->hist;
      return (PNG_INFO_hIST);
   }
   return (0);
}
#endif

png_uint_32
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)
   
{
323
   if (png_ptr != NULL && info_ptr != NULL && width != NULL && height != NULL &&
A
Andreas Dilger 已提交
324 325
      bit_depth != NULL && color_type != NULL)
   {
326 327 328
      int pixel_depth, channels;
      png_uint_32 rowbytes_per_pixel;

A
Andreas Dilger 已提交
329 330 331 332 333 334 335 336 337 338 339
      png_debug1(1, "in %s retrieval function\n", "IHDR");
      *width = info_ptr->width;
      *height = info_ptr->height;
      *bit_depth = info_ptr->bit_depth;
      *color_type = info_ptr->color_type;
      if (compression_type != NULL)
         *compression_type = info_ptr->compression_type;
      if (filter_type != NULL)
         *filter_type = info_ptr->filter_type;
      if (interlace_type != NULL)
         *interlace_type = info_ptr->interlace_type;
340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356

      /* check for potential overflow of rowbytes */
      if (*color_type == PNG_COLOR_TYPE_PALETTE)
         channels = 1;
      else if (*color_type & PNG_COLOR_MASK_COLOR)
         channels = 3;
      else
         channels = 1;
      if (*color_type & PNG_COLOR_MASK_ALPHA)
         channels++;
      pixel_depth = *bit_depth * channels;
      rowbytes_per_pixel = (pixel_depth + 7) >> 3;
      if ((*width > (png_uint_32)2147483647L/rowbytes_per_pixel))
      {
         png_warning(png_ptr,
            "Width too large for libpng to process image data.");
      }
A
Andreas Dilger 已提交
357 358 359 360 361 362 363 364 365 366
      return (1);
   }
   return (0);
}

#if defined(PNG_READ_oFFs_SUPPORTED)
png_uint_32
png_get_oFFs(png_structp png_ptr, png_infop info_ptr,
   png_uint_32 *offset_x, png_uint_32 *offset_y, int *unit_type)
{
367
   if (png_ptr != NULL && info_ptr != NULL && info_ptr->valid & PNG_INFO_oFFs &&
A
Andreas Dilger 已提交
368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385
      offset_x != NULL && offset_y != NULL && unit_type != NULL)
   {
      png_debug1(1, "in %s retrieval function\n", "oFFs");
      *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

#if defined(PNG_READ_pCAL_SUPPORTED)
png_uint_32
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)
{
386
   if (png_ptr != NULL && info_ptr != NULL && info_ptr->valid & PNG_INFO_pCAL &&
A
Andreas Dilger 已提交
387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408
      purpose != NULL && X0 != NULL && X1 != NULL && type != NULL &&
      nparams != NULL && units != NULL && params != NULL)
   {
      png_debug1(1, "in %s retrieval function\n", "pCAL");
      *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

#if defined(PNG_READ_pHYs_SUPPORTED)
png_uint_32
png_get_pHYs(png_structp png_ptr, png_infop info_ptr,
   png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)
{
409 410
   png_uint_32 retval = 0;

411
   if (png_ptr != NULL && info_ptr != NULL && info_ptr->valid & PNG_INFO_pHYs)
A
Andreas Dilger 已提交
412 413
   {
      png_debug1(1, "in %s retrieval function\n", "pHYs");
414 415 416 417 418 419 420 421 422 423 424 425
      if (res_x != NULL && res_y != NULL)
      {
         *res_x = info_ptr->x_pixels_per_unit;
         *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;
      }
      return (retval);
A
Andreas Dilger 已提交
426 427 428 429 430 431 432 433 434
   }
   return (0);
}
#endif

png_uint_32
png_get_PLTE(png_structp png_ptr, png_infop info_ptr, png_colorp *palette,
   int *num_palette)
{
435 436
   if (png_ptr != NULL && info_ptr != NULL && info_ptr->valid & PNG_INFO_PLTE &&
       palette != NULL)
A
Andreas Dilger 已提交
437 438 439 440 441 442 443 444 445 446 447 448 449 450
   {
      png_debug1(1, "in %s retrieval function\n", "PLTE");
      *palette = info_ptr->palette;
      *num_palette = info_ptr->num_palette;
      png_debug1(3, "num_palette = %d\n", *num_palette);
      return (PNG_INFO_PLTE);
   }
   return (0);
}

#if defined(PNG_READ_sBIT_SUPPORTED)
png_uint_32
png_get_sBIT(png_structp png_ptr, png_infop info_ptr, png_color_8p *sig_bit)
{
451 452
   if (png_ptr != NULL && info_ptr != NULL && info_ptr->valid & PNG_INFO_sBIT &&
       sig_bit != NULL)
A
Andreas Dilger 已提交
453 454 455 456 457 458 459 460 461 462 463 464 465 466
   {
      png_debug1(1, "in %s retrieval function\n", "sBIT");
      *sig_bit = &(info_ptr->sig_bit);
      return (PNG_INFO_sBIT);
   }
   return (0);
}
#endif

#if defined(PNG_READ_tEXt_SUPPORTED) || defined(PNG_READ_zTXt_SUPPORTED)
png_uint_32
png_get_text(png_structp png_ptr, png_infop info_ptr, png_textp *text_ptr,
   int *num_text)
{
467
   if (png_ptr != NULL && info_ptr != NULL || info_ptr->num_text > 0)
A
Andreas Dilger 已提交
468 469
   {
      png_debug1(1, "in %s retrieval function\n",
470 471
         (png_ptr->chunk_name[0] == '\0' ? "text"
             : (png_const_charp)png_ptr->chunk_name));
A
Andreas Dilger 已提交
472 473 474 475
      if (text_ptr != NULL)
         *text_ptr = info_ptr->text;
      if (num_text != NULL)
         *num_text = info_ptr->num_text;
476
      return ((png_uint_32)info_ptr->num_text);
A
Andreas Dilger 已提交
477 478 479 480 481 482 483 484 485
   }
   return(0);
}
#endif

#if defined(PNG_READ_tIME_SUPPORTED)
png_uint_32
png_get_tIME(png_structp png_ptr, png_infop info_ptr, png_timep *mod_time)
{
486 487
   if (png_ptr != NULL && info_ptr != NULL && info_ptr->valid & PNG_INFO_tIME &&
       mod_time != NULL)
A
Andreas Dilger 已提交
488 489 490 491 492 493 494 495 496 497 498 499 500 501
   {
      png_debug1(1, "in %s retrieval function\n", "tIME");
      *mod_time = &(info_ptr->mod_time);
      return (PNG_INFO_tIME);
   }
   return (0);
}
#endif

#if defined(PNG_READ_tRNS_SUPPORTED)
png_uint_32
png_get_tRNS(png_structp png_ptr, png_infop info_ptr,
   png_bytep *trans, int *num_trans, png_color_16p *trans_values)
{
502
   if (png_ptr != NULL && info_ptr != NULL && info_ptr->valid & PNG_INFO_tRNS)
A
Andreas Dilger 已提交
503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523
   {
      png_debug1(1, "in %s retrieval function\n", "tRNS");
      if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE && trans != NULL)
      {
          *trans = info_ptr->trans;
      }
      else if (trans_values != NULL)
      {
         *trans_values = &(info_ptr->trans_values);
      }
      else
      {
         return (0);
      }
      *num_trans = info_ptr->num_trans;
      return (PNG_INFO_tRNS);
   }
   return (0);
}
#endif