1 2 /* pngget.c - retrieval of values from info struct 3 * 4 * Last changed in libpng 1.2.15 January 5, 2007 5 * For conditions of distribution and use, see copyright notice in png.h 6 * Copyright (c) 1998-2007 Glenn Randers-Pehrson 7 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) 8 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) 9 */ 10 11 #define PNG_INTERNAL 12 #include "png.h" 13 14 #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) 15 16 png_uint_32 PNGAPI 17 png_get_valid(png_structp png_ptr, png_infop info_ptr, png_uint_32 flag) 18 { 19 if (png_ptr != NULL && info_ptr != NULL) 20 return(info_ptr->valid & flag); 21 else 22 return(0); 23 } 24 25 png_uint_32 PNGAPI 26 png_get_rowbytes(png_structp png_ptr, png_infop info_ptr) 27 { 28 if (png_ptr != NULL && info_ptr != NULL) 29 return(info_ptr->rowbytes); 30 else 31 return(0); 32 } 33 34 #if defined(PNG_INFO_IMAGE_SUPPORTED) 35 png_bytepp PNGAPI 36 png_get_rows(png_structp png_ptr, png_infop info_ptr) 37 { 38 if (png_ptr != NULL && info_ptr != NULL) 39 return(info_ptr->row_pointers); 40 else 41 return(0); 42 } 43 #endif 44 45 #ifdef PNG_EASY_ACCESS_SUPPORTED 46 /* easy access to info, added in libpng-0.99 */ 47 png_uint_32 PNGAPI 48 png_get_image_width(png_structp png_ptr, png_infop info_ptr) 49 { 50 if (png_ptr != NULL && info_ptr != NULL) 51 { 52 return info_ptr->width; 53 } 54 return (0); 55 } 56 57 png_uint_32 PNGAPI 58 png_get_image_height(png_structp png_ptr, png_infop info_ptr) 59 { 60 if (png_ptr != NULL && info_ptr != NULL) 61 { 62 return info_ptr->height; 63 } 64 return (0); 65 } 66 67 png_byte PNGAPI 68 png_get_bit_depth(png_structp png_ptr, png_infop info_ptr) 69 { 70 if (png_ptr != NULL && info_ptr != NULL) 71 { 72 return info_ptr->bit_depth; 73 } 74 return (0); 75 } 76 77 png_byte PNGAPI 78 png_get_color_type(png_structp png_ptr, png_infop info_ptr) 79 { 80 if (png_ptr != NULL && info_ptr != NULL) 81 { 82 return info_ptr->color_type; 83 } 84 return (0); 85 } 86 87 png_byte PNGAPI 88 png_get_filter_type(png_structp png_ptr, png_infop info_ptr) 89 { 90 if (png_ptr != NULL && info_ptr != NULL) 91 { 92 return info_ptr->filter_type; 93 } 94 return (0); 95 } 96 97 png_byte PNGAPI 98 png_get_interlace_type(png_structp png_ptr, png_infop info_ptr) 99 { 100 if (png_ptr != NULL && info_ptr != NULL) 101 { 102 return info_ptr->interlace_type; 103 } 104 return (0); 105 } 106 107 png_byte PNGAPI 108 png_get_compression_type(png_structp png_ptr, png_infop info_ptr) 109 { 110 if (png_ptr != NULL && info_ptr != NULL) 111 { 112 return info_ptr->compression_type; 113 } 114 return (0); 115 } 116 117 png_uint_32 PNGAPI 118 png_get_x_pixels_per_meter(png_structp png_ptr, png_infop info_ptr) 119 { 120 if (png_ptr != NULL && info_ptr != NULL) 121 #if defined(PNG_pHYs_SUPPORTED) 122 if (info_ptr->valid & PNG_INFO_pHYs) 123 { 124 png_debug1(1, "in %s retrieval function\n", "png_get_x_pixels_per_meter"); 125 if(info_ptr->phys_unit_type != PNG_RESOLUTION_METER) 126 return (0); 127 else return (info_ptr->x_pixels_per_unit); 128 } 129 #else 130 return (0); 131 #endif 132 return (0); 133 } 134 135 png_uint_32 PNGAPI 136 png_get_y_pixels_per_meter(png_structp png_ptr, png_infop info_ptr) 137 { 138 if (png_ptr != NULL && info_ptr != NULL) 139 #if defined(PNG_pHYs_SUPPORTED) 140 if (info_ptr->valid & PNG_INFO_pHYs) 141 { 142 png_debug1(1, "in %s retrieval function\n", "png_get_y_pixels_per_meter"); 143 if(info_ptr->phys_unit_type != PNG_RESOLUTION_METER) 144 return (0); 145 else return (info_ptr->y_pixels_per_unit); 146 } 147 #else 148 return (0); 149 #endif 150 return (0); 151 } 152 153 png_uint_32 PNGAPI 154 png_get_pixels_per_meter(png_structp png_ptr, png_infop info_ptr) 155 { 156 if (png_ptr != NULL && info_ptr != NULL) 157 #if defined(PNG_pHYs_SUPPORTED) 158 if (info_ptr->valid & PNG_INFO_pHYs) 159 { 160 png_debug1(1, "in %s retrieval function\n", "png_get_pixels_per_meter"); 161 if(info_ptr->phys_unit_type != PNG_RESOLUTION_METER || 162 info_ptr->x_pixels_per_unit != info_ptr->y_pixels_per_unit) 163 return (0); 164 else return (info_ptr->x_pixels_per_unit); 165 } 166 #else 167 return (0); 168 #endif 169 return (0); 170 } 171 172 #ifdef PNG_FLOATING_POINT_SUPPORTED 173 float PNGAPI 174 png_get_pixel_aspect_ratio(png_structp png_ptr, png_infop info_ptr) 175 { 176 if (png_ptr != NULL && info_ptr != NULL) 177 #if defined(PNG_pHYs_SUPPORTED) 178 if (info_ptr->valid & PNG_INFO_pHYs) 179 { 180 png_debug1(1, "in %s retrieval function\n", "png_get_aspect_ratio"); 181 if (info_ptr->x_pixels_per_unit == 0) 182 return ((float)0.0); 183 else 184 return ((float)((float)info_ptr->y_pixels_per_unit 185 /(float)info_ptr->x_pixels_per_unit)); 186 } 187 #else 188 return (0.0); 189 #endif 190 return ((float)0.0); 191 } 192 #endif 193 194 png_int_32 PNGAPI 195 png_get_x_offset_microns(png_structp png_ptr, png_infop info_ptr) 196 { 197 if (png_ptr != NULL && info_ptr != NULL) 198 #if defined(PNG_oFFs_SUPPORTED) 199 if (info_ptr->valid & PNG_INFO_oFFs) 200 { 201 png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns"); 202 if(info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER) 203 return (0); 204 else return (info_ptr->x_offset); 205 } 206 #else 207 return (0); 208 #endif 209 return (0); 210 } 211 212 png_int_32 PNGAPI 213 png_get_y_offset_microns(png_structp png_ptr, png_infop info_ptr) 214 { 215 if (png_ptr != NULL && info_ptr != NULL) 216 #if defined(PNG_oFFs_SUPPORTED) 217 if (info_ptr->valid & PNG_INFO_oFFs) 218 { 219 png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns"); 220 if(info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER) 221 return (0); 222 else return (info_ptr->y_offset); 223 } 224 #else 225 return (0); 226 #endif 227 return (0); 228 } 229 230 png_int_32 PNGAPI 231 png_get_x_offset_pixels(png_structp png_ptr, png_infop info_ptr) 232 { 233 if (png_ptr != NULL && info_ptr != NULL) 234 #if defined(PNG_oFFs_SUPPORTED) 235 if (info_ptr->valid & PNG_INFO_oFFs) 236 { 237 png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns"); 238 if(info_ptr->offset_unit_type != PNG_OFFSET_PIXEL) 239 return (0); 240 else return (info_ptr->x_offset); 241 } 242 #else 243 return (0); 244 #endif 245 return (0); 246 } 247 248 png_int_32 PNGAPI 249 png_get_y_offset_pixels(png_structp png_ptr, png_infop info_ptr) 250 { 251 if (png_ptr != NULL && info_ptr != NULL) 252 #if defined(PNG_oFFs_SUPPORTED) 253 if (info_ptr->valid & PNG_INFO_oFFs) 254 { 255 png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns"); 256 if(info_ptr->offset_unit_type != PNG_OFFSET_PIXEL) 257 return (0); 258 else return (info_ptr->y_offset); 259 } 260 #else 261 return (0); 262 #endif 263 return (0); 264 } 265 266 #if defined(PNG_INCH_CONVERSIONS) && defined(PNG_FLOATING_POINT_SUPPORTED) 267 png_uint_32 PNGAPI 268 png_get_pixels_per_inch(png_structp png_ptr, png_infop info_ptr) 269 { 270 return ((png_uint_32)((float)png_get_pixels_per_meter(png_ptr, info_ptr) 271 *.0254 +.5)); 272 } 273 274 png_uint_32 PNGAPI 275 png_get_x_pixels_per_inch(png_structp png_ptr, png_infop info_ptr) 276 { 277 return ((png_uint_32)((float)png_get_x_pixels_per_meter(png_ptr, info_ptr) 278 *.0254 +.5)); 279 } 280 281 png_uint_32 PNGAPI 282 png_get_y_pixels_per_inch(png_structp png_ptr, png_infop info_ptr) 283 { 284 return ((png_uint_32)((float)png_get_y_pixels_per_meter(png_ptr, info_ptr) 285 *.0254 +.5)); 286 } 287 288 float PNGAPI 289 png_get_x_offset_inches(png_structp png_ptr, png_infop info_ptr) 290 { 291 return ((float)png_get_x_offset_microns(png_ptr, info_ptr) 292 *.00003937); 293 } 294 295 float PNGAPI 296 png_get_y_offset_inches(png_structp png_ptr, png_infop info_ptr) 297 { 298 return ((float)png_get_y_offset_microns(png_ptr, info_ptr) 299 *.00003937); 300 } 301 302 #if defined(PNG_pHYs_SUPPORTED) 303 png_uint_32 PNGAPI 304 png_get_pHYs_dpi(png_structp png_ptr, png_infop info_ptr, 305 png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type) 306 { 307 png_uint_32 retval = 0; 308 309 if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) 310 { 311 png_debug1(1, "in %s retrieval function\n", "pHYs"); 312 if (res_x != NULL) 313 { 314 *res_x = info_ptr->x_pixels_per_unit; 315 retval |= PNG_INFO_pHYs; 316 } 317 if (res_y != NULL) 318 { 319 *res_y = info_ptr->y_pixels_per_unit; 320 retval |= PNG_INFO_pHYs; 321 } 322 if (unit_type != NULL) 323 { 324 *unit_type = (int)info_ptr->phys_unit_type; 325 retval |= PNG_INFO_pHYs; 326 if(*unit_type == 1) 327 { 328 if (res_x != NULL) *res_x = (png_uint_32)(*res_x * .0254 + .50); 329 if (res_y != NULL) *res_y = (png_uint_32)(*res_y * .0254 + .50); 330 } 331 } 332 } 333 return (retval); 334 } 335 #endif /* PNG_pHYs_SUPPORTED */ 336 #endif /* PNG_INCH_CONVERSIONS && PNG_FLOATING_POINT_SUPPORTED */ 337 338 /* png_get_channels really belongs in here, too, but it's been around longer */ 339 340 #endif /* PNG_EASY_ACCESS_SUPPORTED */ 341 342 png_byte PNGAPI 343 png_get_channels(png_structp png_ptr, png_infop info_ptr) 344 { 345 if (png_ptr != NULL && info_ptr != NULL) 346 return(info_ptr->channels); 347 else 348 return (0); 349 } 350 351 png_bytep PNGAPI 352 png_get_signature(png_structp png_ptr, png_infop info_ptr) 353 { 354 if (png_ptr != NULL && info_ptr != NULL) 355 return(info_ptr->signature); 356 else 357 return (NULL); 358 } 359 360 #if defined(PNG_bKGD_SUPPORTED) 361 png_uint_32 PNGAPI 362 png_get_bKGD(png_structp png_ptr, png_infop info_ptr, 363 png_color_16p *background) 364 { 365 if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD) 366 && background != NULL) 367 { 368 png_debug1(1, "in %s retrieval function\n", "bKGD"); 369 *background = &(info_ptr->background); 370 return (PNG_INFO_bKGD); 371 } 372 return (0); 373 } 374 #endif 375 376 #if defined(PNG_cHRM_SUPPORTED) 377 #ifdef PNG_FLOATING_POINT_SUPPORTED 378 png_uint_32 PNGAPI 379 png_get_cHRM(png_structp png_ptr, png_infop info_ptr, 380 double *white_x, double *white_y, double *red_x, double *red_y, 381 double *green_x, double *green_y, double *blue_x, double *blue_y) 382 { 383 if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)) 384 { 385 png_debug1(1, "in %s retrieval function\n", "cHRM"); 386 if (white_x != NULL) 387 *white_x = (double)info_ptr->x_white; 388 if (white_y != NULL) 389 *white_y = (double)info_ptr->y_white; 390 if (red_x != NULL) 391 *red_x = (double)info_ptr->x_red; 392 if (red_y != NULL) 393 *red_y = (double)info_ptr->y_red; 394 if (green_x != NULL) 395 *green_x = (double)info_ptr->x_green; 396 if (green_y != NULL) 397 *green_y = (double)info_ptr->y_green; 398 if (blue_x != NULL) 399 *blue_x = (double)info_ptr->x_blue; 400 if (blue_y != NULL) 401 *blue_y = (double)info_ptr->y_blue; 402 return (PNG_INFO_cHRM); 403 } 404 return (0); 405 } 406 #endif 407 #ifdef PNG_FIXED_POINT_SUPPORTED 408 png_uint_32 PNGAPI 409 png_get_cHRM_fixed(png_structp png_ptr, png_infop info_ptr, 410 png_fixed_point *white_x, png_fixed_point *white_y, png_fixed_point *red_x, 411 png_fixed_point *red_y, png_fixed_point *green_x, png_fixed_point *green_y, 412 png_fixed_point *blue_x, png_fixed_point *blue_y) 413 { 414 if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)) 415 { 416 png_debug1(1, "in %s retrieval function\n", "cHRM"); 417 if (white_x != NULL) 418 *white_x = info_ptr->int_x_white; 419 if (white_y != NULL) 420 *white_y = info_ptr->int_y_white; 421 if (red_x != NULL) 422 *red_x = info_ptr->int_x_red; 423 if (red_y != NULL) 424 *red_y = info_ptr->int_y_red; 425 if (green_x != NULL) 426 *green_x = info_ptr->int_x_green; 427 if (green_y != NULL) 428 *green_y = info_ptr->int_y_green; 429 if (blue_x != NULL) 430 *blue_x = info_ptr->int_x_blue; 431 if (blue_y != NULL) 432 *blue_y = info_ptr->int_y_blue; 433 return (PNG_INFO_cHRM); 434 } 435 return (0); 436 } 437 #endif 438 #endif 439 440 #if defined(PNG_gAMA_SUPPORTED) 441 #ifdef PNG_FLOATING_POINT_SUPPORTED 442 png_uint_32 PNGAPI 443 png_get_gAMA(png_structp png_ptr, png_infop info_ptr, double *file_gamma) 444 { 445 if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA) 446 && file_gamma != NULL) 447 { 448 png_debug1(1, "in %s retrieval function\n", "gAMA"); 449 *file_gamma = (double)info_ptr->gamma; 450 return (PNG_INFO_gAMA); 451 } 452 return (0); 453 } 454 #endif 455 #ifdef PNG_FIXED_POINT_SUPPORTED 456 png_uint_32 PNGAPI 457 png_get_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, 458 png_fixed_point *int_file_gamma) 459 { 460 if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA) 461 && int_file_gamma != NULL) 462 { 463 png_debug1(1, "in %s retrieval function\n", "gAMA"); 464 *int_file_gamma = info_ptr->int_gamma; 465 return (PNG_INFO_gAMA); 466 } 467 return (0); 468 } 469 #endif 470 #endif 471 472 #if defined(PNG_sRGB_SUPPORTED) 473 png_uint_32 PNGAPI 474 png_get_sRGB(png_structp png_ptr, png_infop info_ptr, int *file_srgb_intent) 475 { 476 if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB) 477 && file_srgb_intent != NULL) 478 { 479 png_debug1(1, "in %s retrieval function\n", "sRGB"); 480 *file_srgb_intent = (int)info_ptr->srgb_intent; 481 return (PNG_INFO_sRGB); 482 } 483 return (0); 484 } 485 #endif 486 487 #if defined(PNG_iCCP_SUPPORTED) 488 png_uint_32 PNGAPI 489 png_get_iCCP(png_structp png_ptr, png_infop info_ptr, 490 png_charpp name, int *compression_type, 491 png_charpp profile, png_uint_32 *proflen) 492 { 493 if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP) 494 && name != NULL && profile != NULL && proflen != NULL) 495 { 496 png_debug1(1, "in %s retrieval function\n", "iCCP"); 497 *name = info_ptr->iccp_name; 498 *profile = info_ptr->iccp_profile; 499 /* compression_type is a dummy so the API won't have to change 500 if we introduce multiple compression types later. */ 501 *proflen = (int)info_ptr->iccp_proflen; 502 *compression_type = (int)info_ptr->iccp_compression; 503 return (PNG_INFO_iCCP); 504 } 505 return (0); 506 } 507 #endif 508 509 #if defined(PNG_sPLT_SUPPORTED) 510 png_uint_32 PNGAPI 511 png_get_sPLT(png_structp png_ptr, png_infop info_ptr, 512 png_sPLT_tpp spalettes) 513 { 514 if (png_ptr != NULL && info_ptr != NULL && spalettes != NULL) 515 { 516 *spalettes = info_ptr->splt_palettes; 517 return ((png_uint_32)info_ptr->splt_palettes_num); 518 } 519 return (0); 520 } 521 #endif 522 523 #if defined(PNG_hIST_SUPPORTED) 524 png_uint_32 PNGAPI 525 png_get_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p *hist) 526 { 527 if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST) 528 && hist != NULL) 529 { 530 png_debug1(1, "in %s retrieval function\n", "hIST"); 531 *hist = info_ptr->hist; 532 return (PNG_INFO_hIST); 533 } 534 return (0); 535 } 536 #endif 537 538 png_uint_32 PNGAPI 539 png_get_IHDR(png_structp png_ptr, png_infop info_ptr, 540 png_uint_32 *width, png_uint_32 *height, int *bit_depth, 541 int *color_type, int *interlace_type, int *compression_type, 542 int *filter_type) 543 544 { 545 if (png_ptr != NULL && info_ptr != NULL && width != NULL && height != NULL && 546 bit_depth != NULL && color_type != NULL) 547 { 548 png_debug1(1, "in %s retrieval function\n", "IHDR"); 549 *width = info_ptr->width; 550 *height = info_ptr->height; 551 *bit_depth = info_ptr->bit_depth; 552 if (info_ptr->bit_depth < 1 || info_ptr->bit_depth > 16) 553 png_error(png_ptr, "Invalid bit depth"); 554 *color_type = info_ptr->color_type; 555 if (info_ptr->color_type > 6) 556 png_error(png_ptr, "Invalid color type"); 557 if (compression_type != NULL) 558 *compression_type = info_ptr->compression_type; 559 if (filter_type != NULL) 560 *filter_type = info_ptr->filter_type; 561 if (interlace_type != NULL) 562 *interlace_type = info_ptr->interlace_type; 563 564 /* check for potential overflow of rowbytes */ 565 if (*width == 0 || *width > PNG_UINT_31_MAX) 566 png_error(png_ptr, "Invalid image width"); 567 if (*height == 0 || *height > PNG_UINT_31_MAX) 568 png_error(png_ptr, "Invalid image height"); 569 if (info_ptr->width > (PNG_UINT_32_MAX 570 >> 3) /* 8-byte RGBA pixels */ 571 - 64 /* bigrowbuf hack */ 572 - 1 /* filter byte */ 573 - 7*8 /* rounding of width to multiple of 8 pixels */ 574 - 8) /* extra max_pixel_depth pad */ 575 { 576 png_warning(png_ptr, 577 "Width too large for libpng to process image data."); 578 } 579 return (1); 580 } 581 return (0); 582 } 583 584 #if defined(PNG_oFFs_SUPPORTED) 585 png_uint_32 PNGAPI 586 png_get_oFFs(png_structp png_ptr, png_infop info_ptr, 587 png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type) 588 { 589 if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs) 590 && offset_x != NULL && offset_y != NULL && unit_type != NULL) 591 { 592 png_debug1(1, "in %s retrieval function\n", "oFFs"); 593 *offset_x = info_ptr->x_offset; 594 *offset_y = info_ptr->y_offset; 595 *unit_type = (int)info_ptr->offset_unit_type; 596 return (PNG_INFO_oFFs); 597 } 598 return (0); 599 } 600 #endif 601 602 #if defined(PNG_pCAL_SUPPORTED) 603 png_uint_32 PNGAPI 604 png_get_pCAL(png_structp png_ptr, png_infop info_ptr, 605 png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams, 606 png_charp *units, png_charpp *params) 607 { 608 if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL) 609 && purpose != NULL && X0 != NULL && X1 != NULL && type != NULL && 610 nparams != NULL && units != NULL && params != NULL) 611 { 612 png_debug1(1, "in %s retrieval function\n", "pCAL"); 613 *purpose = info_ptr->pcal_purpose; 614 *X0 = info_ptr->pcal_X0; 615 *X1 = info_ptr->pcal_X1; 616 *type = (int)info_ptr->pcal_type; 617 *nparams = (int)info_ptr->pcal_nparams; 618 *units = info_ptr->pcal_units; 619 *params = info_ptr->pcal_params; 620 return (PNG_INFO_pCAL); 621 } 622 return (0); 623 } 624 #endif 625 626 #if defined(PNG_sCAL_SUPPORTED) 627 #ifdef PNG_FLOATING_POINT_SUPPORTED 628 png_uint_32 PNGAPI 629 png_get_sCAL(png_structp png_ptr, png_infop info_ptr, 630 int *unit, double *width, double *height) 631 { 632 if (png_ptr != NULL && info_ptr != NULL && 633 (info_ptr->valid & PNG_INFO_sCAL)) 634 { 635 *unit = info_ptr->scal_unit; 636 *width = info_ptr->scal_pixel_width; 637 *height = info_ptr->scal_pixel_height; 638 return (PNG_INFO_sCAL); 639 } 640 return(0); 641 } 642 #else 643 #ifdef PNG_FIXED_POINT_SUPPORTED 644 png_uint_32 PNGAPI 645 png_get_sCAL_s(png_structp png_ptr, png_infop info_ptr, 646 int *unit, png_charpp width, png_charpp height) 647 { 648 if (png_ptr != NULL && info_ptr != NULL && 649 (info_ptr->valid & PNG_INFO_sCAL)) 650 { 651 *unit = info_ptr->scal_unit; 652 *width = info_ptr->scal_s_width; 653 *height = info_ptr->scal_s_height; 654 return (PNG_INFO_sCAL); 655 } 656 return(0); 657 } 658 #endif 659 #endif 660 #endif 661 662 #if defined(PNG_pHYs_SUPPORTED) 663 png_uint_32 PNGAPI 664 png_get_pHYs(png_structp png_ptr, png_infop info_ptr, 665 png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type) 666 { 667 png_uint_32 retval = 0; 668 669 if (png_ptr != NULL && info_ptr != NULL && 670 (info_ptr->valid & PNG_INFO_pHYs)) 671 { 672 png_debug1(1, "in %s retrieval function\n", "pHYs"); 673 if (res_x != NULL) 674 { 675 *res_x = info_ptr->x_pixels_per_unit; 676 retval |= PNG_INFO_pHYs; 677 } 678 if (res_y != NULL) 679 { 680 *res_y = info_ptr->y_pixels_per_unit; 681 retval |= PNG_INFO_pHYs; 682 } 683 if (unit_type != NULL) 684 { 685 *unit_type = (int)info_ptr->phys_unit_type; 686 retval |= PNG_INFO_pHYs; 687 } 688 } 689 return (retval); 690 } 691 #endif 692 693 png_uint_32 PNGAPI 694 png_get_PLTE(png_structp png_ptr, png_infop info_ptr, png_colorp *palette, 695 int *num_palette) 696 { 697 if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_PLTE) 698 && palette != NULL) 699 { 700 png_debug1(1, "in %s retrieval function\n", "PLTE"); 701 *palette = info_ptr->palette; 702 *num_palette = info_ptr->num_palette; 703 png_debug1(3, "num_palette = %d\n", *num_palette); 704 return (PNG_INFO_PLTE); 705 } 706 return (0); 707 } 708 709 #if defined(PNG_sBIT_SUPPORTED) 710 png_uint_32 PNGAPI 711 png_get_sBIT(png_structp png_ptr, png_infop info_ptr, png_color_8p *sig_bit) 712 { 713 if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT) 714 && sig_bit != NULL) 715 { 716 png_debug1(1, "in %s retrieval function\n", "sBIT"); 717 *sig_bit = &(info_ptr->sig_bit); 718 return (PNG_INFO_sBIT); 719 } 720 return (0); 721 } 722 #endif 723 724 #if defined(PNG_TEXT_SUPPORTED) 725 png_uint_32 PNGAPI 726 png_get_text(png_structp png_ptr, png_infop info_ptr, png_textp *text_ptr, 727 int *num_text) 728 { 729 if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0) 730 { 731 png_debug1(1, "in %s retrieval function\n", 732 (png_ptr->chunk_name[0] == '\0' ? "text" 733 : (png_const_charp)png_ptr->chunk_name)); 734 if (text_ptr != NULL) 735 *text_ptr = info_ptr->text; 736 if (num_text != NULL) 737 *num_text = info_ptr->num_text; 738 return ((png_uint_32)info_ptr->num_text); 739 } 740 if (num_text != NULL) 741 *num_text = 0; 742 return(0); 743 } 744 #endif 745 746 #if defined(PNG_tIME_SUPPORTED) 747 png_uint_32 PNGAPI 748 png_get_tIME(png_structp png_ptr, png_infop info_ptr, png_timep *mod_time) 749 { 750 if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME) 751 && mod_time != NULL) 752 { 753 png_debug1(1, "in %s retrieval function\n", "tIME"); 754 *mod_time = &(info_ptr->mod_time); 755 return (PNG_INFO_tIME); 756 } 757 return (0); 758 } 759 #endif 760 761 #if defined(PNG_tRNS_SUPPORTED) 762 png_uint_32 PNGAPI 763 png_get_tRNS(png_structp png_ptr, png_infop info_ptr, 764 png_bytep *trans, int *num_trans, png_color_16p *trans_values) 765 { 766 png_uint_32 retval = 0; 767 if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) 768 { 769 png_debug1(1, "in %s retrieval function\n", "tRNS"); 770 if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) 771 { 772 if (trans != NULL) 773 { 774 *trans = info_ptr->trans; 775 retval |= PNG_INFO_tRNS; 776 } 777 if (trans_values != NULL) 778 *trans_values = &(info_ptr->trans_values); 779 } 780 else /* if (info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) */ 781 { 782 if (trans_values != NULL) 783 { 784 *trans_values = &(info_ptr->trans_values); 785 retval |= PNG_INFO_tRNS; 786 } 787 if(trans != NULL) 788 *trans = NULL; 789 } 790 if(num_trans != NULL) 791 { 792 *num_trans = info_ptr->num_trans; 793 retval |= PNG_INFO_tRNS; 794 } 795 } 796 return (retval); 797 } 798 #endif 799 800 #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) 801 png_uint_32 PNGAPI 802 png_get_unknown_chunks(png_structp png_ptr, png_infop info_ptr, 803 png_unknown_chunkpp unknowns) 804 { 805 if (png_ptr != NULL && info_ptr != NULL && unknowns != NULL) 806 { 807 *unknowns = info_ptr->unknown_chunks; 808 return ((png_uint_32)info_ptr->unknown_chunks_num); 809 } 810 return (0); 811 } 812 #endif 813 814 #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) 815 png_byte PNGAPI 816 png_get_rgb_to_gray_status (png_structp png_ptr) 817 { 818 return (png_byte)(png_ptr? png_ptr->rgb_to_gray_status : 0); 819 } 820 #endif 821 822 #if defined(PNG_USER_CHUNKS_SUPPORTED) 823 png_voidp PNGAPI 824 png_get_user_chunk_ptr(png_structp png_ptr) 825 { 826 return (png_ptr? png_ptr->user_chunk_ptr : NULL); 827 } 828 #endif 829 830 #ifdef PNG_WRITE_SUPPORTED 831 png_uint_32 PNGAPI 832 png_get_compression_buffer_size(png_structp png_ptr) 833 { 834 return (png_uint_32)(png_ptr? png_ptr->zbuf_size : 0L); 835 } 836 #endif 837 838 #ifdef PNG_ASSEMBLER_CODE_SUPPORTED 839 #ifndef PNG_1_0_X 840 /* this function was added to libpng 1.2.0 and should exist by default */ 841 png_uint_32 PNGAPI 842 png_get_asm_flags (png_structp png_ptr) 843 { 844 #ifdef PNG_MMX_CODE_SUPPORTED 845 return (png_uint_32)(png_ptr? png_ptr->asm_flags : 0L); 846 #else 847 return (png_ptr? 0L: 0L); 848 #endif 849 } 850 851 /* this function was added to libpng 1.2.0 and should exist by default */ 852 png_uint_32 PNGAPI 853 png_get_asm_flagmask (int flag_select) 854 { 855 #ifdef PNG_MMX_CODE_SUPPORTED 856 png_uint_32 settable_asm_flags = 0; 857 858 if (flag_select & PNG_SELECT_READ) 859 settable_asm_flags |= 860 PNG_ASM_FLAG_MMX_READ_COMBINE_ROW | 861 PNG_ASM_FLAG_MMX_READ_INTERLACE | 862 PNG_ASM_FLAG_MMX_READ_FILTER_SUB | 863 PNG_ASM_FLAG_MMX_READ_FILTER_UP | 864 PNG_ASM_FLAG_MMX_READ_FILTER_AVG | 865 PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ; 866 /* no non-MMX flags yet */ 867 868 #if 0 869 /* GRR: no write-flags yet, either, but someday... */ 870 if (flag_select & PNG_SELECT_WRITE) 871 settable_asm_flags |= 872 PNG_ASM_FLAG_MMX_WRITE_ [whatever] ; 873 #endif /* 0 */ 874 875 return settable_asm_flags; /* _theoretically_ settable capabilities only */ 876 #else 877 return (0L); 878 #endif /* PNG_MMX_CODE_SUPPORTED */ 879 } 880 881 882 /* GRR: could add this: && defined(PNG_MMX_CODE_SUPPORTED) */ 883 /* this function was added to libpng 1.2.0 */ 884 png_uint_32 PNGAPI 885 png_get_mmx_flagmask (int flag_select, int *compilerID) 886 { 887 #if defined(PNG_MMX_CODE_SUPPORTED) 888 png_uint_32 settable_mmx_flags = 0; 889 890 if (flag_select & PNG_SELECT_READ) 891 settable_mmx_flags |= 892 PNG_ASM_FLAG_MMX_READ_COMBINE_ROW | 893 PNG_ASM_FLAG_MMX_READ_INTERLACE | 894 PNG_ASM_FLAG_MMX_READ_FILTER_SUB | 895 PNG_ASM_FLAG_MMX_READ_FILTER_UP | 896 PNG_ASM_FLAG_MMX_READ_FILTER_AVG | 897 PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ; 898 #if 0 899 /* GRR: no MMX write support yet, but someday... */ 900 if (flag_select & PNG_SELECT_WRITE) 901 settable_mmx_flags |= 902 PNG_ASM_FLAG_MMX_WRITE_ [whatever] ; 903 #endif /* 0 */ 904 905 if (compilerID != NULL) { 906 #ifdef PNG_USE_PNGVCRD 907 *compilerID = 1; /* MSVC */ 908 #else 909 #ifdef PNG_USE_PNGGCCRD 910 *compilerID = 2; /* gcc/gas */ 911 #else 912 *compilerID = -1; /* unknown (i.e., no asm/MMX code compiled) */ 913 #endif 914 #endif 915 } 916 917 return settable_mmx_flags; /* _theoretically_ settable capabilities only */ 918 #else 919 return (0L); 920 #endif /* ?PNG_MMX_CODE_SUPPORTED */ 921 } 922 923 /* this function was added to libpng 1.2.0 */ 924 png_byte PNGAPI 925 png_get_mmx_bitdepth_threshold (png_structp png_ptr) 926 { 927 #if defined(PNG_MMX_CODE_SUPPORTED) 928 return (png_byte)(png_ptr? png_ptr->mmx_bitdepth_threshold : 0); 929 #else 930 return (png_ptr? 0: 0); 931 #endif /* ?PNG_MMX_CODE_SUPPORTED */ 932 } 933 934 /* this function was added to libpng 1.2.0 */ 935 png_uint_32 PNGAPI 936 png_get_mmx_rowbytes_threshold (png_structp png_ptr) 937 { 938 #if defined(PNG_MMX_CODE_SUPPORTED) 939 return (png_uint_32)(png_ptr? png_ptr->mmx_rowbytes_threshold : 0L); 940 #else 941 return (png_ptr? 0L: 0L); 942 #endif /* ?PNG_MMX_CODE_SUPPORTED */ 943 } 944 #endif /* ?PNG_1_0_X */ 945 #endif /* ?PNG_ASSEMBLER_CODE_SUPPORTED */ 946 947 #ifdef PNG_SET_USER_LIMITS_SUPPORTED 948 /* these functions were added to libpng 1.2.6 */ 949 png_uint_32 PNGAPI 950 png_get_user_width_max (png_structp png_ptr) 951 { 952 return (png_ptr? png_ptr->user_width_max : 0); 953 } 954 png_uint_32 PNGAPI 955 png_get_user_height_max (png_structp png_ptr) 956 { 957 return (png_ptr? png_ptr->user_height_max : 0); 958 } 959 #endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */ 960 961 962 #endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ 963