1 2 /* pngread.c - read a PNG file 3 * 4 * Last changed in libpng 1.2.19 August 18, 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 * This file contains routines that an application calls directly to 11 * read a PNG file or stream. 12 */ 13 14 #define PNG_INTERNAL 15 #include "png.h" 16 17 #if defined(PNG_READ_SUPPORTED) 18 19 /* Create a PNG structure for reading, and allocate any memory needed. */ 20 png_structp PNGAPI 21 png_create_read_struct(png_const_charp user_png_ver, png_voidp error_ptr, 22 png_error_ptr error_fn, png_error_ptr warn_fn) 23 { 24 25 #ifdef PNG_USER_MEM_SUPPORTED 26 return (png_create_read_struct_2(user_png_ver, error_ptr, error_fn, 27 warn_fn, png_voidp_NULL, png_malloc_ptr_NULL, png_free_ptr_NULL)); 28 } 29 30 /* Alternate create PNG structure for reading, and allocate any memory needed. */ 31 png_structp PNGAPI 32 png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, 33 png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, 34 png_malloc_ptr malloc_fn, png_free_ptr free_fn) 35 { 36 #endif /* PNG_USER_MEM_SUPPORTED */ 37 38 png_structp png_ptr; 39 40 #ifdef PNG_SETJMP_SUPPORTED 41 #ifdef USE_FAR_KEYWORD 42 jmp_buf jmpbuf; 43 #endif 44 #endif 45 46 int i; 47 48 png_debug(1, "in png_create_read_struct\n"); 49 #ifdef PNG_USER_MEM_SUPPORTED 50 png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG, 51 (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr); 52 #else 53 png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); 54 #endif 55 if (png_ptr == NULL) 56 return (NULL); 57 58 #if !defined(PNG_1_0_X) 59 #ifdef PNG_MMX_CODE_SUPPORTED 60 png_init_mmx_flags(png_ptr); /* 1.2.0 addition */ 61 #endif 62 #endif /* PNG_1_0_X */ 63 64 /* added at libpng-1.2.6 */ 65 #ifdef PNG_SET_USER_LIMITS_SUPPORTED 66 png_ptr->user_width_max=PNG_USER_WIDTH_MAX; 67 png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; 68 #endif 69 70 #ifdef PNG_SETJMP_SUPPORTED 71 #ifdef USE_FAR_KEYWORD 72 if (setjmp(jmpbuf)) 73 #else 74 if (setjmp(png_ptr->jmpbuf)) 75 #endif 76 { 77 png_free(png_ptr, png_ptr->zbuf); 78 png_ptr->zbuf=NULL; 79 #ifdef PNG_USER_MEM_SUPPORTED 80 png_destroy_struct_2((png_voidp)png_ptr, 81 (png_free_ptr)free_fn, (png_voidp)mem_ptr); 82 #else 83 png_destroy_struct((png_voidp)png_ptr); 84 #endif 85 return (NULL); 86 } 87 #ifdef USE_FAR_KEYWORD 88 png_memcpy(png_ptr->jmpbuf,jmpbuf,png_sizeof(jmp_buf)); 89 #endif 90 #endif 91 92 #ifdef PNG_USER_MEM_SUPPORTED 93 png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn); 94 #endif 95 96 png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn); 97 98 i=0; 99 do 100 { 101 if(user_png_ver[i] != png_libpng_ver[i]) 102 png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; 103 } while (png_libpng_ver[i++]); 104 105 if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) 106 { 107 /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so 108 * we must recompile any applications that use any older library version. 109 * For versions after libpng 1.0, we will be compatible, so we need 110 * only check the first digit. 111 */ 112 if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] || 113 (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) || 114 (user_png_ver[0] == '0' && user_png_ver[2] < '9')) 115 { 116 #if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) 117 char msg[80]; 118 if (user_png_ver) 119 { 120 png_snprintf(msg, 80, 121 "Application was compiled with png.h from libpng-%.20s", 122 user_png_ver); 123 png_warning(png_ptr, msg); 124 } 125 png_snprintf(msg, 80, 126 "Application is running with png.c from libpng-%.20s", 127 png_libpng_ver); 128 png_warning(png_ptr, msg); 129 #endif 130 #ifdef PNG_ERROR_NUMBERS_SUPPORTED 131 png_ptr->flags=0; 132 #endif 133 png_error(png_ptr, 134 "Incompatible libpng version in application and library"); 135 } 136 } 137 138 /* initialize zbuf - compression buffer */ 139 png_ptr->zbuf_size = PNG_ZBUF_SIZE; 140 png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, 141 (png_uint_32)png_ptr->zbuf_size); 142 png_ptr->zstream.zalloc = png_zalloc; 143 png_ptr->zstream.zfree = png_zfree; 144 png_ptr->zstream.opaque = (voidpf)png_ptr; 145 146 switch (inflateInit(&png_ptr->zstream)) 147 { 148 case Z_OK: /* Do nothing */ break; 149 case Z_MEM_ERROR: 150 case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory error"); break; 151 case Z_VERSION_ERROR: png_error(png_ptr, "zlib version error"); break; 152 default: png_error(png_ptr, "Unknown zlib error"); 153 } 154 155 png_ptr->zstream.next_out = png_ptr->zbuf; 156 png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; 157 158 png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL); 159 160 #ifdef PNG_SETJMP_SUPPORTED 161 /* Applications that neglect to set up their own setjmp() and then encounter 162 a png_error() will longjmp here. Since the jmpbuf is then meaningless we 163 abort instead of returning. */ 164 #ifdef USE_FAR_KEYWORD 165 if (setjmp(jmpbuf)) 166 PNG_ABORT(); 167 png_memcpy(png_ptr->jmpbuf,jmpbuf,png_sizeof(jmp_buf)); 168 #else 169 if (setjmp(png_ptr->jmpbuf)) 170 PNG_ABORT(); 171 #endif 172 #endif 173 return (png_ptr); 174 } 175 176 #if defined(PNG_1_0_X) || defined(PNG_1_2_X) 177 /* Initialize PNG structure for reading, and allocate any memory needed. 178 This interface is deprecated in favour of the png_create_read_struct(), 179 and it will disappear as of libpng-1.3.0. */ 180 #undef png_read_init 181 void PNGAPI 182 png_read_init(png_structp png_ptr) 183 { 184 /* We only come here via pre-1.0.7-compiled applications */ 185 png_read_init_2(png_ptr, "1.0.6 or earlier", 0, 0); 186 } 187 188 void PNGAPI 189 png_read_init_2(png_structp png_ptr, png_const_charp user_png_ver, 190 png_size_t png_struct_size, png_size_t png_info_size) 191 { 192 /* We only come here via pre-1.0.12-compiled applications */ 193 if(png_ptr == NULL) return; 194 #if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) 195 if(png_sizeof(png_struct) > png_struct_size || 196 png_sizeof(png_info) > png_info_size) 197 { 198 char msg[80]; 199 png_ptr->warning_fn=NULL; 200 if (user_png_ver) 201 { 202 png_snprintf(msg, 80, 203 "Application was compiled with png.h from libpng-%.20s", 204 user_png_ver); 205 png_warning(png_ptr, msg); 206 } 207 png_snprintf(msg, 80, 208 "Application is running with png.c from libpng-%.20s", 209 png_libpng_ver); 210 png_warning(png_ptr, msg); 211 } 212 #endif 213 if(png_sizeof(png_struct) > png_struct_size) 214 { 215 png_ptr->error_fn=NULL; 216 #ifdef PNG_ERROR_NUMBERS_SUPPORTED 217 png_ptr->flags=0; 218 #endif 219 png_error(png_ptr, 220 "The png struct allocated by the application for reading is too small."); 221 } 222 if(png_sizeof(png_info) > png_info_size) 223 { 224 png_ptr->error_fn=NULL; 225 #ifdef PNG_ERROR_NUMBERS_SUPPORTED 226 png_ptr->flags=0; 227 #endif 228 png_error(png_ptr, 229 "The info struct allocated by application for reading is too small."); 230 } 231 png_read_init_3(&png_ptr, user_png_ver, png_struct_size); 232 } 233 #endif /* PNG_1_0_X || PNG_1_2_X */ 234 235 void PNGAPI 236 png_read_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver, 237 png_size_t png_struct_size) 238 { 239 #ifdef PNG_SETJMP_SUPPORTED 240 jmp_buf tmp_jmp; /* to save current jump buffer */ 241 #endif 242 243 int i=0; 244 245 png_structp png_ptr=*ptr_ptr; 246 247 if(png_ptr == NULL) return; 248 249 do 250 { 251 if(user_png_ver[i] != png_libpng_ver[i]) 252 { 253 #ifdef PNG_LEGACY_SUPPORTED 254 png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; 255 #else 256 png_ptr->warning_fn=NULL; 257 png_warning(png_ptr, 258 "Application uses deprecated png_read_init() and should be recompiled."); 259 break; 260 #endif 261 } 262 } while (png_libpng_ver[i++]); 263 264 png_debug(1, "in png_read_init_3\n"); 265 266 #ifdef PNG_SETJMP_SUPPORTED 267 /* save jump buffer and error functions */ 268 png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof (jmp_buf)); 269 #endif 270 271 if(png_sizeof(png_struct) > png_struct_size) 272 { 273 png_destroy_struct(png_ptr); 274 *ptr_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); 275 png_ptr = *ptr_ptr; 276 } 277 278 /* reset all variables to 0 */ 279 png_memset(png_ptr, 0, png_sizeof (png_struct)); 280 281 #ifdef PNG_SETJMP_SUPPORTED 282 /* restore jump buffer */ 283 png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof (jmp_buf)); 284 #endif 285 286 /* added at libpng-1.2.6 */ 287 #ifdef PNG_SET_USER_LIMITS_SUPPORTED 288 png_ptr->user_width_max=PNG_USER_WIDTH_MAX; 289 png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; 290 #endif 291 292 /* initialize zbuf - compression buffer */ 293 png_ptr->zbuf_size = PNG_ZBUF_SIZE; 294 png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, 295 (png_uint_32)png_ptr->zbuf_size); 296 png_ptr->zstream.zalloc = png_zalloc; 297 png_ptr->zstream.zfree = png_zfree; 298 png_ptr->zstream.opaque = (voidpf)png_ptr; 299 300 switch (inflateInit(&png_ptr->zstream)) 301 { 302 case Z_OK: /* Do nothing */ break; 303 case Z_MEM_ERROR: 304 case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory"); break; 305 case Z_VERSION_ERROR: png_error(png_ptr, "zlib version"); break; 306 default: png_error(png_ptr, "Unknown zlib error"); 307 } 308 309 png_ptr->zstream.next_out = png_ptr->zbuf; 310 png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; 311 312 png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL); 313 } 314 315 #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED 316 /* Read the information before the actual image data. This has been 317 * changed in v0.90 to allow reading a file that already has the magic 318 * bytes read from the stream. You can tell libpng how many bytes have 319 * been read from the beginning of the stream (up to the maximum of 8) 320 * via png_set_sig_bytes(), and we will only check the remaining bytes 321 * here. The application can then have access to the signature bytes we 322 * read if it is determined that this isn't a valid PNG file. 323 */ 324 void PNGAPI 325 png_read_info(png_structp png_ptr, png_infop info_ptr) 326 { 327 if(png_ptr == NULL) return; 328 png_debug(1, "in png_read_info\n"); 329 /* If we haven't checked all of the PNG signature bytes, do so now. */ 330 if (png_ptr->sig_bytes < 8) 331 { 332 png_size_t num_checked = png_ptr->sig_bytes, 333 num_to_check = 8 - num_checked; 334 335 png_read_data(png_ptr, &(info_ptr->signature[num_checked]), num_to_check); 336 png_ptr->sig_bytes = 8; 337 338 if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check)) 339 { 340 if (num_checked < 4 && 341 png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4)) 342 png_error(png_ptr, "Not a PNG file"); 343 else 344 png_error(png_ptr, "PNG file corrupted by ASCII conversion"); 345 } 346 if (num_checked < 3) 347 png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE; 348 } 349 350 for(;;) 351 { 352 #ifdef PNG_USE_LOCAL_ARRAYS 353 PNG_CONST PNG_IHDR; 354 PNG_CONST PNG_IDAT; 355 PNG_CONST PNG_IEND; 356 PNG_CONST PNG_PLTE; 357 #if defined(PNG_READ_bKGD_SUPPORTED) 358 PNG_CONST PNG_bKGD; 359 #endif 360 #if defined(PNG_READ_cHRM_SUPPORTED) 361 PNG_CONST PNG_cHRM; 362 #endif 363 #if defined(PNG_READ_gAMA_SUPPORTED) 364 PNG_CONST PNG_gAMA; 365 #endif 366 #if defined(PNG_READ_hIST_SUPPORTED) 367 PNG_CONST PNG_hIST; 368 #endif 369 #if defined(PNG_READ_iCCP_SUPPORTED) 370 PNG_CONST PNG_iCCP; 371 #endif 372 #if defined(PNG_READ_iTXt_SUPPORTED) 373 PNG_CONST PNG_iTXt; 374 #endif 375 #if defined(PNG_READ_oFFs_SUPPORTED) 376 PNG_CONST PNG_oFFs; 377 #endif 378 #if defined(PNG_READ_pCAL_SUPPORTED) 379 PNG_CONST PNG_pCAL; 380 #endif 381 #if defined(PNG_READ_pHYs_SUPPORTED) 382 PNG_CONST PNG_pHYs; 383 #endif 384 #if defined(PNG_READ_sBIT_SUPPORTED) 385 PNG_CONST PNG_sBIT; 386 #endif 387 #if defined(PNG_READ_sCAL_SUPPORTED) 388 PNG_CONST PNG_sCAL; 389 #endif 390 #if defined(PNG_READ_sPLT_SUPPORTED) 391 PNG_CONST PNG_sPLT; 392 #endif 393 #if defined(PNG_READ_sRGB_SUPPORTED) 394 PNG_CONST PNG_sRGB; 395 #endif 396 #if defined(PNG_READ_tEXt_SUPPORTED) 397 PNG_CONST PNG_tEXt; 398 #endif 399 #if defined(PNG_READ_tIME_SUPPORTED) 400 PNG_CONST PNG_tIME; 401 #endif 402 #if defined(PNG_READ_tRNS_SUPPORTED) 403 PNG_CONST PNG_tRNS; 404 #endif 405 #if defined(PNG_READ_zTXt_SUPPORTED) 406 PNG_CONST PNG_zTXt; 407 #endif 408 #endif /* PNG_USE_LOCAL_ARRAYS */ 409 png_byte chunk_length[4]; 410 png_uint_32 length; 411 412 png_read_data(png_ptr, chunk_length, 4); 413 length = png_get_uint_31(png_ptr,chunk_length); 414 415 png_reset_crc(png_ptr); 416 png_crc_read(png_ptr, png_ptr->chunk_name, 4); 417 418 png_debug2(0, "Reading %s chunk, length=%lu.\n", png_ptr->chunk_name, 419 length); 420 421 /* This should be a binary subdivision search or a hash for 422 * matching the chunk name rather than a linear search. 423 */ 424 if (!png_memcmp(png_ptr->chunk_name, (png_bytep)png_IDAT, 4)) 425 if(png_ptr->mode & PNG_AFTER_IDAT) 426 png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; 427 428 if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4)) 429 png_handle_IHDR(png_ptr, info_ptr, length); 430 else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4)) 431 png_handle_IEND(png_ptr, info_ptr, length); 432 #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED 433 else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name)) 434 { 435 if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 436 png_ptr->mode |= PNG_HAVE_IDAT; 437 png_handle_unknown(png_ptr, info_ptr, length); 438 if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) 439 png_ptr->mode |= PNG_HAVE_PLTE; 440 else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 441 { 442 if (!(png_ptr->mode & PNG_HAVE_IHDR)) 443 png_error(png_ptr, "Missing IHDR before IDAT"); 444 else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && 445 !(png_ptr->mode & PNG_HAVE_PLTE)) 446 png_error(png_ptr, "Missing PLTE before IDAT"); 447 break; 448 } 449 } 450 #endif 451 else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) 452 png_handle_PLTE(png_ptr, info_ptr, length); 453 else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 454 { 455 if (!(png_ptr->mode & PNG_HAVE_IHDR)) 456 png_error(png_ptr, "Missing IHDR before IDAT"); 457 else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && 458 !(png_ptr->mode & PNG_HAVE_PLTE)) 459 png_error(png_ptr, "Missing PLTE before IDAT"); 460 461 png_ptr->idat_size = length; 462 png_ptr->mode |= PNG_HAVE_IDAT; 463 break; 464 } 465 #if defined(PNG_READ_bKGD_SUPPORTED) 466 else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4)) 467 png_handle_bKGD(png_ptr, info_ptr, length); 468 #endif 469 #if defined(PNG_READ_cHRM_SUPPORTED) 470 else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4)) 471 png_handle_cHRM(png_ptr, info_ptr, length); 472 #endif 473 #if defined(PNG_READ_gAMA_SUPPORTED) 474 else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4)) 475 png_handle_gAMA(png_ptr, info_ptr, length); 476 #endif 477 #if defined(PNG_READ_hIST_SUPPORTED) 478 else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4)) 479 png_handle_hIST(png_ptr, info_ptr, length); 480 #endif 481 #if defined(PNG_READ_oFFs_SUPPORTED) 482 else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4)) 483 png_handle_oFFs(png_ptr, info_ptr, length); 484 #endif 485 #if defined(PNG_READ_pCAL_SUPPORTED) 486 else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4)) 487 png_handle_pCAL(png_ptr, info_ptr, length); 488 #endif 489 #if defined(PNG_READ_sCAL_SUPPORTED) 490 else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4)) 491 png_handle_sCAL(png_ptr, info_ptr, length); 492 #endif 493 #if defined(PNG_READ_pHYs_SUPPORTED) 494 else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4)) 495 png_handle_pHYs(png_ptr, info_ptr, length); 496 #endif 497 #if defined(PNG_READ_sBIT_SUPPORTED) 498 else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4)) 499 png_handle_sBIT(png_ptr, info_ptr, length); 500 #endif 501 #if defined(PNG_READ_sRGB_SUPPORTED) 502 else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4)) 503 png_handle_sRGB(png_ptr, info_ptr, length); 504 #endif 505 #if defined(PNG_READ_iCCP_SUPPORTED) 506 else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4)) 507 png_handle_iCCP(png_ptr, info_ptr, length); 508 #endif 509 #if defined(PNG_READ_sPLT_SUPPORTED) 510 else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4)) 511 png_handle_sPLT(png_ptr, info_ptr, length); 512 #endif 513 #if defined(PNG_READ_tEXt_SUPPORTED) 514 else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) 515 png_handle_tEXt(png_ptr, info_ptr, length); 516 #endif 517 #if defined(PNG_READ_tIME_SUPPORTED) 518 else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4)) 519 png_handle_tIME(png_ptr, info_ptr, length); 520 #endif 521 #if defined(PNG_READ_tRNS_SUPPORTED) 522 else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4)) 523 png_handle_tRNS(png_ptr, info_ptr, length); 524 #endif 525 #if defined(PNG_READ_zTXt_SUPPORTED) 526 else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) 527 png_handle_zTXt(png_ptr, info_ptr, length); 528 #endif 529 #if defined(PNG_READ_iTXt_SUPPORTED) 530 else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) 531 png_handle_iTXt(png_ptr, info_ptr, length); 532 #endif 533 else 534 png_handle_unknown(png_ptr, info_ptr, length); 535 } 536 } 537 #endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ 538 539 /* optional call to update the users info_ptr structure */ 540 void PNGAPI 541 png_read_update_info(png_structp png_ptr, png_infop info_ptr) 542 { 543 png_debug(1, "in png_read_update_info\n"); 544 if(png_ptr == NULL) return; 545 if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) 546 png_read_start_row(png_ptr); 547 else 548 png_warning(png_ptr, 549 "Ignoring extra png_read_update_info() call; row buffer not reallocated"); 550 png_read_transform_info(png_ptr, info_ptr); 551 } 552 553 #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED 554 /* Initialize palette, background, etc, after transformations 555 * are set, but before any reading takes place. This allows 556 * the user to obtain a gamma-corrected palette, for example. 557 * If the user doesn't call this, we will do it ourselves. 558 */ 559 void PNGAPI 560 png_start_read_image(png_structp png_ptr) 561 { 562 png_debug(1, "in png_start_read_image\n"); 563 if(png_ptr == NULL) return; 564 if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) 565 png_read_start_row(png_ptr); 566 } 567 #endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ 568 569 #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED 570 void PNGAPI 571 png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row) 572 { 573 #ifdef PNG_USE_LOCAL_ARRAYS 574 PNG_CONST PNG_IDAT; 575 PNG_CONST int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 576 0xff}; 577 PNG_CONST int png_pass_mask[7] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff}; 578 #endif 579 int ret; 580 if(png_ptr == NULL) return; 581 png_debug2(1, "in png_read_row (row %lu, pass %d)\n", 582 png_ptr->row_number, png_ptr->pass); 583 if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) 584 png_read_start_row(png_ptr); 585 if (png_ptr->row_number == 0 && png_ptr->pass == 0) 586 { 587 /* check for transforms that have been set but were defined out */ 588 #if defined(PNG_WRITE_INVERT_SUPPORTED) && !defined(PNG_READ_INVERT_SUPPORTED) 589 if (png_ptr->transformations & PNG_INVERT_MONO) 590 png_warning(png_ptr, "PNG_READ_INVERT_SUPPORTED is not defined."); 591 #endif 592 #if defined(PNG_WRITE_FILLER_SUPPORTED) && !defined(PNG_READ_FILLER_SUPPORTED) 593 if (png_ptr->transformations & PNG_FILLER) 594 png_warning(png_ptr, "PNG_READ_FILLER_SUPPORTED is not defined."); 595 #endif 596 #if defined(PNG_WRITE_PACKSWAP_SUPPORTED) && !defined(PNG_READ_PACKSWAP_SUPPORTED) 597 if (png_ptr->transformations & PNG_PACKSWAP) 598 png_warning(png_ptr, "PNG_READ_PACKSWAP_SUPPORTED is not defined."); 599 #endif 600 #if defined(PNG_WRITE_PACK_SUPPORTED) && !defined(PNG_READ_PACK_SUPPORTED) 601 if (png_ptr->transformations & PNG_PACK) 602 png_warning(png_ptr, "PNG_READ_PACK_SUPPORTED is not defined."); 603 #endif 604 #if defined(PNG_WRITE_SHIFT_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED) 605 if (png_ptr->transformations & PNG_SHIFT) 606 png_warning(png_ptr, "PNG_READ_SHIFT_SUPPORTED is not defined."); 607 #endif 608 #if defined(PNG_WRITE_BGR_SUPPORTED) && !defined(PNG_READ_BGR_SUPPORTED) 609 if (png_ptr->transformations & PNG_BGR) 610 png_warning(png_ptr, "PNG_READ_BGR_SUPPORTED is not defined."); 611 #endif 612 #if defined(PNG_WRITE_SWAP_SUPPORTED) && !defined(PNG_READ_SWAP_SUPPORTED) 613 if (png_ptr->transformations & PNG_SWAP_BYTES) 614 png_warning(png_ptr, "PNG_READ_SWAP_SUPPORTED is not defined."); 615 #endif 616 } 617 618 #if defined(PNG_READ_INTERLACING_SUPPORTED) 619 /* if interlaced and we do not need a new row, combine row and return */ 620 if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) 621 { 622 switch (png_ptr->pass) 623 { 624 case 0: 625 if (png_ptr->row_number & 0x07) 626 { 627 if (dsp_row != NULL) 628 png_combine_row(png_ptr, dsp_row, 629 png_pass_dsp_mask[png_ptr->pass]); 630 png_read_finish_row(png_ptr); 631 return; 632 } 633 break; 634 case 1: 635 if ((png_ptr->row_number & 0x07) || png_ptr->width < 5) 636 { 637 if (dsp_row != NULL) 638 png_combine_row(png_ptr, dsp_row, 639 png_pass_dsp_mask[png_ptr->pass]); 640 png_read_finish_row(png_ptr); 641 return; 642 } 643 break; 644 case 2: 645 if ((png_ptr->row_number & 0x07) != 4) 646 { 647 if (dsp_row != NULL && (png_ptr->row_number & 4)) 648 png_combine_row(png_ptr, dsp_row, 649 png_pass_dsp_mask[png_ptr->pass]); 650 png_read_finish_row(png_ptr); 651 return; 652 } 653 break; 654 case 3: 655 if ((png_ptr->row_number & 3) || png_ptr->width < 3) 656 { 657 if (dsp_row != NULL) 658 png_combine_row(png_ptr, dsp_row, 659 png_pass_dsp_mask[png_ptr->pass]); 660 png_read_finish_row(png_ptr); 661 return; 662 } 663 break; 664 case 4: 665 if ((png_ptr->row_number & 3) != 2) 666 { 667 if (dsp_row != NULL && (png_ptr->row_number & 2)) 668 png_combine_row(png_ptr, dsp_row, 669 png_pass_dsp_mask[png_ptr->pass]); 670 png_read_finish_row(png_ptr); 671 return; 672 } 673 break; 674 case 5: 675 if ((png_ptr->row_number & 1) || png_ptr->width < 2) 676 { 677 if (dsp_row != NULL) 678 png_combine_row(png_ptr, dsp_row, 679 png_pass_dsp_mask[png_ptr->pass]); 680 png_read_finish_row(png_ptr); 681 return; 682 } 683 break; 684 case 6: 685 if (!(png_ptr->row_number & 1)) 686 { 687 png_read_finish_row(png_ptr); 688 return; 689 } 690 break; 691 } 692 } 693 #endif 694 695 if (!(png_ptr->mode & PNG_HAVE_IDAT)) 696 png_error(png_ptr, "Invalid attempt to read row data"); 697 698 png_ptr->zstream.next_out = png_ptr->row_buf; 699 png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes; 700 do 701 { 702 if (!(png_ptr->zstream.avail_in)) 703 { 704 while (!png_ptr->idat_size) 705 { 706 png_byte chunk_length[4]; 707 708 png_crc_finish(png_ptr, 0); 709 710 png_read_data(png_ptr, chunk_length, 4); 711 png_ptr->idat_size = png_get_uint_31(png_ptr,chunk_length); 712 713 png_reset_crc(png_ptr); 714 png_crc_read(png_ptr, png_ptr->chunk_name, 4); 715 if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 716 png_error(png_ptr, "Not enough image data"); 717 } 718 png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size; 719 png_ptr->zstream.next_in = png_ptr->zbuf; 720 if (png_ptr->zbuf_size > png_ptr->idat_size) 721 png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size; 722 png_crc_read(png_ptr, png_ptr->zbuf, 723 (png_size_t)png_ptr->zstream.avail_in); 724 png_ptr->idat_size -= png_ptr->zstream.avail_in; 725 } 726 ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); 727 if (ret == Z_STREAM_END) 728 { 729 if (png_ptr->zstream.avail_out || png_ptr->zstream.avail_in || 730 png_ptr->idat_size) 731 png_error(png_ptr, "Extra compressed data"); 732 png_ptr->mode |= PNG_AFTER_IDAT; 733 png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; 734 break; 735 } 736 if (ret != Z_OK) 737 png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg : 738 "Decompression error"); 739 740 } while (png_ptr->zstream.avail_out); 741 742 png_ptr->row_info.color_type = png_ptr->color_type; 743 png_ptr->row_info.width = png_ptr->iwidth; 744 png_ptr->row_info.channels = png_ptr->channels; 745 png_ptr->row_info.bit_depth = png_ptr->bit_depth; 746 png_ptr->row_info.pixel_depth = png_ptr->pixel_depth; 747 png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, 748 png_ptr->row_info.width); 749 750 if(png_ptr->row_buf[0]) 751 png_read_filter_row(png_ptr, &(png_ptr->row_info), 752 png_ptr->row_buf + 1, png_ptr->prev_row + 1, 753 (int)(png_ptr->row_buf[0])); 754 755 png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf, 756 png_ptr->rowbytes + 1); 757 758 #if defined(PNG_MNG_FEATURES_SUPPORTED) 759 if((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && 760 (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING)) 761 { 762 /* Intrapixel differencing */ 763 png_do_read_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1); 764 } 765 #endif 766 767 768 if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA)) 769 png_do_read_transformations(png_ptr); 770 771 #if defined(PNG_READ_INTERLACING_SUPPORTED) 772 /* blow up interlaced rows to full size */ 773 if (png_ptr->interlaced && 774 (png_ptr->transformations & PNG_INTERLACE)) 775 { 776 if (png_ptr->pass < 6) 777 /* old interface (pre-1.0.9): 778 png_do_read_interlace(&(png_ptr->row_info), 779 png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations); 780 */ 781 png_do_read_interlace(png_ptr); 782 783 if (dsp_row != NULL) 784 png_combine_row(png_ptr, dsp_row, 785 png_pass_dsp_mask[png_ptr->pass]); 786 if (row != NULL) 787 png_combine_row(png_ptr, row, 788 png_pass_mask[png_ptr->pass]); 789 } 790 else 791 #endif 792 { 793 if (row != NULL) 794 png_combine_row(png_ptr, row, 0xff); 795 if (dsp_row != NULL) 796 png_combine_row(png_ptr, dsp_row, 0xff); 797 } 798 png_read_finish_row(png_ptr); 799 800 if (png_ptr->read_row_fn != NULL) 801 (*(png_ptr->read_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass); 802 } 803 #endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ 804 805 #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED 806 /* Read one or more rows of image data. If the image is interlaced, 807 * and png_set_interlace_handling() has been called, the rows need to 808 * contain the contents of the rows from the previous pass. If the 809 * image has alpha or transparency, and png_handle_alpha()[*] has been 810 * called, the rows contents must be initialized to the contents of the 811 * screen. 812 * 813 * "row" holds the actual image, and pixels are placed in it 814 * as they arrive. If the image is displayed after each pass, it will 815 * appear to "sparkle" in. "display_row" can be used to display a 816 * "chunky" progressive image, with finer detail added as it becomes 817 * available. If you do not want this "chunky" display, you may pass 818 * NULL for display_row. If you do not want the sparkle display, and 819 * you have not called png_handle_alpha(), you may pass NULL for rows. 820 * If you have called png_handle_alpha(), and the image has either an 821 * alpha channel or a transparency chunk, you must provide a buffer for 822 * rows. In this case, you do not have to provide a display_row buffer 823 * also, but you may. If the image is not interlaced, or if you have 824 * not called png_set_interlace_handling(), the display_row buffer will 825 * be ignored, so pass NULL to it. 826 * 827 * [*] png_handle_alpha() does not exist yet, as of this version of libpng 828 */ 829 830 void PNGAPI 831 png_read_rows(png_structp png_ptr, png_bytepp row, 832 png_bytepp display_row, png_uint_32 num_rows) 833 { 834 png_uint_32 i; 835 png_bytepp rp; 836 png_bytepp dp; 837 838 png_debug(1, "in png_read_rows\n"); 839 if(png_ptr == NULL) return; 840 rp = row; 841 dp = display_row; 842 if (rp != NULL && dp != NULL) 843 for (i = 0; i < num_rows; i++) 844 { 845 png_bytep rptr = *rp++; 846 png_bytep dptr = *dp++; 847 848 png_read_row(png_ptr, rptr, dptr); 849 } 850 else if(rp != NULL) 851 for (i = 0; i < num_rows; i++) 852 { 853 png_bytep rptr = *rp; 854 png_read_row(png_ptr, rptr, png_bytep_NULL); 855 rp++; 856 } 857 else if(dp != NULL) 858 for (i = 0; i < num_rows; i++) 859 { 860 png_bytep dptr = *dp; 861 png_read_row(png_ptr, png_bytep_NULL, dptr); 862 dp++; 863 } 864 } 865 #endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ 866 867 #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED 868 /* Read the entire image. If the image has an alpha channel or a tRNS 869 * chunk, and you have called png_handle_alpha()[*], you will need to 870 * initialize the image to the current image that PNG will be overlaying. 871 * We set the num_rows again here, in case it was incorrectly set in 872 * png_read_start_row() by a call to png_read_update_info() or 873 * png_start_read_image() if png_set_interlace_handling() wasn't called 874 * prior to either of these functions like it should have been. You can 875 * only call this function once. If you desire to have an image for 876 * each pass of a interlaced image, use png_read_rows() instead. 877 * 878 * [*] png_handle_alpha() does not exist yet, as of this version of libpng 879 */ 880 void PNGAPI 881 png_read_image(png_structp png_ptr, png_bytepp image) 882 { 883 png_uint_32 i,image_height; 884 int pass, j; 885 png_bytepp rp; 886 887 png_debug(1, "in png_read_image\n"); 888 if(png_ptr == NULL) return; 889 890 #ifdef PNG_READ_INTERLACING_SUPPORTED 891 pass = png_set_interlace_handling(png_ptr); 892 #else 893 if (png_ptr->interlaced) 894 png_error(png_ptr, 895 "Cannot read interlaced image -- interlace handler disabled."); 896 pass = 1; 897 #endif 898 899 900 image_height=png_ptr->height; 901 png_ptr->num_rows = image_height; /* Make sure this is set correctly */ 902 903 for (j = 0; j < pass; j++) 904 { 905 rp = image; 906 for (i = 0; i < image_height; i++) 907 { 908 png_read_row(png_ptr, *rp, png_bytep_NULL); 909 rp++; 910 } 911 } 912 } 913 #endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ 914 915 #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED 916 /* Read the end of the PNG file. Will not read past the end of the 917 * file, will verify the end is accurate, and will read any comments 918 * or time information at the end of the file, if info is not NULL. 919 */ 920 void PNGAPI 921 png_read_end(png_structp png_ptr, png_infop info_ptr) 922 { 923 png_byte chunk_length[4]; 924 png_uint_32 length; 925 926 png_debug(1, "in png_read_end\n"); 927 if(png_ptr == NULL) return; 928 png_crc_finish(png_ptr, 0); /* Finish off CRC from last IDAT chunk */ 929 930 do 931 { 932 #ifdef PNG_USE_LOCAL_ARRAYS 933 PNG_CONST PNG_IHDR; 934 PNG_CONST PNG_IDAT; 935 PNG_CONST PNG_IEND; 936 PNG_CONST PNG_PLTE; 937 #if defined(PNG_READ_bKGD_SUPPORTED) 938 PNG_CONST PNG_bKGD; 939 #endif 940 #if defined(PNG_READ_cHRM_SUPPORTED) 941 PNG_CONST PNG_cHRM; 942 #endif 943 #if defined(PNG_READ_gAMA_SUPPORTED) 944 PNG_CONST PNG_gAMA; 945 #endif 946 #if defined(PNG_READ_hIST_SUPPORTED) 947 PNG_CONST PNG_hIST; 948 #endif 949 #if defined(PNG_READ_iCCP_SUPPORTED) 950 PNG_CONST PNG_iCCP; 951 #endif 952 #if defined(PNG_READ_iTXt_SUPPORTED) 953 PNG_CONST PNG_iTXt; 954 #endif 955 #if defined(PNG_READ_oFFs_SUPPORTED) 956 PNG_CONST PNG_oFFs; 957 #endif 958 #if defined(PNG_READ_pCAL_SUPPORTED) 959 PNG_CONST PNG_pCAL; 960 #endif 961 #if defined(PNG_READ_pHYs_SUPPORTED) 962 PNG_CONST PNG_pHYs; 963 #endif 964 #if defined(PNG_READ_sBIT_SUPPORTED) 965 PNG_CONST PNG_sBIT; 966 #endif 967 #if defined(PNG_READ_sCAL_SUPPORTED) 968 PNG_CONST PNG_sCAL; 969 #endif 970 #if defined(PNG_READ_sPLT_SUPPORTED) 971 PNG_CONST PNG_sPLT; 972 #endif 973 #if defined(PNG_READ_sRGB_SUPPORTED) 974 PNG_CONST PNG_sRGB; 975 #endif 976 #if defined(PNG_READ_tEXt_SUPPORTED) 977 PNG_CONST PNG_tEXt; 978 #endif 979 #if defined(PNG_READ_tIME_SUPPORTED) 980 PNG_CONST PNG_tIME; 981 #endif 982 #if defined(PNG_READ_tRNS_SUPPORTED) 983 PNG_CONST PNG_tRNS; 984 #endif 985 #if defined(PNG_READ_zTXt_SUPPORTED) 986 PNG_CONST PNG_zTXt; 987 #endif 988 #endif /* PNG_USE_LOCAL_ARRAYS */ 989 990 png_read_data(png_ptr, chunk_length, 4); 991 length = png_get_uint_31(png_ptr,chunk_length); 992 993 png_reset_crc(png_ptr); 994 png_crc_read(png_ptr, png_ptr->chunk_name, 4); 995 996 png_debug1(0, "Reading %s chunk.\n", png_ptr->chunk_name); 997 998 if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4)) 999 png_handle_IHDR(png_ptr, info_ptr, length); 1000 else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4)) 1001 png_handle_IEND(png_ptr, info_ptr, length); 1002 #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED 1003 else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name)) 1004 { 1005 if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 1006 { 1007 if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) 1008 png_error(png_ptr, "Too many IDAT's found"); 1009 } 1010 png_handle_unknown(png_ptr, info_ptr, length); 1011 if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) 1012 png_ptr->mode |= PNG_HAVE_PLTE; 1013 } 1014 #endif 1015 else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) 1016 { 1017 /* Zero length IDATs are legal after the last IDAT has been 1018 * read, but not after other chunks have been read. 1019 */ 1020 if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) 1021 png_error(png_ptr, "Too many IDAT's found"); 1022 png_crc_finish(png_ptr, length); 1023 } 1024 else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) 1025 png_handle_PLTE(png_ptr, info_ptr, length); 1026 #if defined(PNG_READ_bKGD_SUPPORTED) 1027 else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4)) 1028 png_handle_bKGD(png_ptr, info_ptr, length); 1029 #endif 1030 #if defined(PNG_READ_cHRM_SUPPORTED) 1031 else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4)) 1032 png_handle_cHRM(png_ptr, info_ptr, length); 1033 #endif 1034 #if defined(PNG_READ_gAMA_SUPPORTED) 1035 else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4)) 1036 png_handle_gAMA(png_ptr, info_ptr, length); 1037 #endif 1038 #if defined(PNG_READ_hIST_SUPPORTED) 1039 else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4)) 1040 png_handle_hIST(png_ptr, info_ptr, length); 1041 #endif 1042 #if defined(PNG_READ_oFFs_SUPPORTED) 1043 else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4)) 1044 png_handle_oFFs(png_ptr, info_ptr, length); 1045 #endif 1046 #if defined(PNG_READ_pCAL_SUPPORTED) 1047 else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4)) 1048 png_handle_pCAL(png_ptr, info_ptr, length); 1049 #endif 1050 #if defined(PNG_READ_sCAL_SUPPORTED) 1051 else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4)) 1052 png_handle_sCAL(png_ptr, info_ptr, length); 1053 #endif 1054 #if defined(PNG_READ_pHYs_SUPPORTED) 1055 else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4)) 1056 png_handle_pHYs(png_ptr, info_ptr, length); 1057 #endif 1058 #if defined(PNG_READ_sBIT_SUPPORTED) 1059 else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4)) 1060 png_handle_sBIT(png_ptr, info_ptr, length); 1061 #endif 1062 #if defined(PNG_READ_sRGB_SUPPORTED) 1063 else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4)) 1064 png_handle_sRGB(png_ptr, info_ptr, length); 1065 #endif 1066 #if defined(PNG_READ_iCCP_SUPPORTED) 1067 else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4)) 1068 png_handle_iCCP(png_ptr, info_ptr, length); 1069 #endif 1070 #if defined(PNG_READ_sPLT_SUPPORTED) 1071 else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4)) 1072 png_handle_sPLT(png_ptr, info_ptr, length); 1073 #endif 1074 #if defined(PNG_READ_tEXt_SUPPORTED) 1075 else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) 1076 png_handle_tEXt(png_ptr, info_ptr, length); 1077 #endif 1078 #if defined(PNG_READ_tIME_SUPPORTED) 1079 else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4)) 1080 png_handle_tIME(png_ptr, info_ptr, length); 1081 #endif 1082 #if defined(PNG_READ_tRNS_SUPPORTED) 1083 else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4)) 1084 png_handle_tRNS(png_ptr, info_ptr, length); 1085 #endif 1086 #if defined(PNG_READ_zTXt_SUPPORTED) 1087 else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) 1088 png_handle_zTXt(png_ptr, info_ptr, length); 1089 #endif 1090 #if defined(PNG_READ_iTXt_SUPPORTED) 1091 else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) 1092 png_handle_iTXt(png_ptr, info_ptr, length); 1093 #endif 1094 else 1095 png_handle_unknown(png_ptr, info_ptr, length); 1096 } while (!(png_ptr->mode & PNG_HAVE_IEND)); 1097 } 1098 #endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ 1099 1100 /* free all memory used by the read */ 1101 void PNGAPI 1102 png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr, 1103 png_infopp end_info_ptr_ptr) 1104 { 1105 png_structp png_ptr = NULL; 1106 png_infop info_ptr = NULL, end_info_ptr = NULL; 1107 #ifdef PNG_USER_MEM_SUPPORTED 1108 png_free_ptr free_fn; 1109 png_voidp mem_ptr; 1110 #endif 1111 1112 png_debug(1, "in png_destroy_read_struct\n"); 1113 if (png_ptr_ptr != NULL) 1114 png_ptr = *png_ptr_ptr; 1115 1116 if (info_ptr_ptr != NULL) 1117 info_ptr = *info_ptr_ptr; 1118 1119 if (end_info_ptr_ptr != NULL) 1120 end_info_ptr = *end_info_ptr_ptr; 1121 1122 #ifdef PNG_USER_MEM_SUPPORTED 1123 free_fn = png_ptr->free_fn; 1124 mem_ptr = png_ptr->mem_ptr; 1125 #endif 1126 1127 png_read_destroy(png_ptr, info_ptr, end_info_ptr); 1128 1129 if (info_ptr != NULL) 1130 { 1131 #if defined(PNG_TEXT_SUPPORTED) 1132 png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, -1); 1133 #endif 1134 1135 #ifdef PNG_USER_MEM_SUPPORTED 1136 png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn, 1137 (png_voidp)mem_ptr); 1138 #else 1139 png_destroy_struct((png_voidp)info_ptr); 1140 #endif 1141 *info_ptr_ptr = NULL; 1142 } 1143 1144 if (end_info_ptr != NULL) 1145 { 1146 #if defined(PNG_READ_TEXT_SUPPORTED) 1147 png_free_data(png_ptr, end_info_ptr, PNG_FREE_TEXT, -1); 1148 #endif 1149 #ifdef PNG_USER_MEM_SUPPORTED 1150 png_destroy_struct_2((png_voidp)end_info_ptr, (png_free_ptr)free_fn, 1151 (png_voidp)mem_ptr); 1152 #else 1153 png_destroy_struct((png_voidp)end_info_ptr); 1154 #endif 1155 *end_info_ptr_ptr = NULL; 1156 } 1157 1158 if (png_ptr != NULL) 1159 { 1160 #ifdef PNG_USER_MEM_SUPPORTED 1161 png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn, 1162 (png_voidp)mem_ptr); 1163 #else 1164 png_destroy_struct((png_voidp)png_ptr); 1165 #endif 1166 *png_ptr_ptr = NULL; 1167 } 1168 } 1169 1170 /* free all memory used by the read (old method) */ 1171 void /* PRIVATE */ 1172 png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr) 1173 { 1174 #ifdef PNG_SETJMP_SUPPORTED 1175 jmp_buf tmp_jmp; 1176 #endif 1177 png_error_ptr error_fn; 1178 png_error_ptr warning_fn; 1179 png_voidp error_ptr; 1180 #ifdef PNG_USER_MEM_SUPPORTED 1181 png_free_ptr free_fn; 1182 #endif 1183 1184 png_debug(1, "in png_read_destroy\n"); 1185 if (info_ptr != NULL) 1186 png_info_destroy(png_ptr, info_ptr); 1187 1188 if (end_info_ptr != NULL) 1189 png_info_destroy(png_ptr, end_info_ptr); 1190 1191 png_free(png_ptr, png_ptr->zbuf); 1192 png_free(png_ptr, png_ptr->big_row_buf); 1193 png_free(png_ptr, png_ptr->prev_row); 1194 #if defined(PNG_READ_DITHER_SUPPORTED) 1195 png_free(png_ptr, png_ptr->palette_lookup); 1196 png_free(png_ptr, png_ptr->dither_index); 1197 #endif 1198 #if defined(PNG_READ_GAMMA_SUPPORTED) 1199 png_free(png_ptr, png_ptr->gamma_table); 1200 #endif 1201 #if defined(PNG_READ_BACKGROUND_SUPPORTED) 1202 png_free(png_ptr, png_ptr->gamma_from_1); 1203 png_free(png_ptr, png_ptr->gamma_to_1); 1204 #endif 1205 #ifdef PNG_FREE_ME_SUPPORTED 1206 if (png_ptr->free_me & PNG_FREE_PLTE) 1207 png_zfree(png_ptr, png_ptr->palette); 1208 png_ptr->free_me &= ~PNG_FREE_PLTE; 1209 #else 1210 if (png_ptr->flags & PNG_FLAG_FREE_PLTE) 1211 png_zfree(png_ptr, png_ptr->palette); 1212 png_ptr->flags &= ~PNG_FLAG_FREE_PLTE; 1213 #endif 1214 #if defined(PNG_tRNS_SUPPORTED) || \ 1215 defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) 1216 #ifdef PNG_FREE_ME_SUPPORTED 1217 if (png_ptr->free_me & PNG_FREE_TRNS) 1218 png_free(png_ptr, png_ptr->trans); 1219 png_ptr->free_me &= ~PNG_FREE_TRNS; 1220 #else 1221 if (png_ptr->flags & PNG_FLAG_FREE_TRNS) 1222 png_free(png_ptr, png_ptr->trans); 1223 png_ptr->flags &= ~PNG_FLAG_FREE_TRNS; 1224 #endif 1225 #endif 1226 #if defined(PNG_READ_hIST_SUPPORTED) 1227 #ifdef PNG_FREE_ME_SUPPORTED 1228 if (png_ptr->free_me & PNG_FREE_HIST) 1229 png_free(png_ptr, png_ptr->hist); 1230 png_ptr->free_me &= ~PNG_FREE_HIST; 1231 #else 1232 if (png_ptr->flags & PNG_FLAG_FREE_HIST) 1233 png_free(png_ptr, png_ptr->hist); 1234 png_ptr->flags &= ~PNG_FLAG_FREE_HIST; 1235 #endif 1236 #endif 1237 #if defined(PNG_READ_GAMMA_SUPPORTED) 1238 if (png_ptr->gamma_16_table != NULL) 1239 { 1240 int i; 1241 int istop = (1 << (8 - png_ptr->gamma_shift)); 1242 for (i = 0; i < istop; i++) 1243 { 1244 png_free(png_ptr, png_ptr->gamma_16_table[i]); 1245 } 1246 png_free(png_ptr, png_ptr->gamma_16_table); 1247 } 1248 #if defined(PNG_READ_BACKGROUND_SUPPORTED) 1249 if (png_ptr->gamma_16_from_1 != NULL) 1250 { 1251 int i; 1252 int istop = (1 << (8 - png_ptr->gamma_shift)); 1253 for (i = 0; i < istop; i++) 1254 { 1255 png_free(png_ptr, png_ptr->gamma_16_from_1[i]); 1256 } 1257 png_free(png_ptr, png_ptr->gamma_16_from_1); 1258 } 1259 if (png_ptr->gamma_16_to_1 != NULL) 1260 { 1261 int i; 1262 int istop = (1 << (8 - png_ptr->gamma_shift)); 1263 for (i = 0; i < istop; i++) 1264 { 1265 png_free(png_ptr, png_ptr->gamma_16_to_1[i]); 1266 } 1267 png_free(png_ptr, png_ptr->gamma_16_to_1); 1268 } 1269 #endif 1270 #endif 1271 #if defined(PNG_TIME_RFC1123_SUPPORTED) 1272 png_free(png_ptr, png_ptr->time_buffer); 1273 #endif 1274 1275 inflateEnd(&png_ptr->zstream); 1276 #ifdef PNG_PROGRESSIVE_READ_SUPPORTED 1277 png_free(png_ptr, png_ptr->save_buffer); 1278 #endif 1279 1280 #ifdef PNG_PROGRESSIVE_READ_SUPPORTED 1281 #ifdef PNG_TEXT_SUPPORTED 1282 png_free(png_ptr, png_ptr->current_text); 1283 #endif /* PNG_TEXT_SUPPORTED */ 1284 #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ 1285 1286 /* Save the important info out of the png_struct, in case it is 1287 * being used again. 1288 */ 1289 #ifdef PNG_SETJMP_SUPPORTED 1290 png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof (jmp_buf)); 1291 #endif 1292 1293 error_fn = png_ptr->error_fn; 1294 warning_fn = png_ptr->warning_fn; 1295 error_ptr = png_ptr->error_ptr; 1296 #ifdef PNG_USER_MEM_SUPPORTED 1297 free_fn = png_ptr->free_fn; 1298 #endif 1299 1300 png_memset(png_ptr, 0, png_sizeof (png_struct)); 1301 1302 png_ptr->error_fn = error_fn; 1303 png_ptr->warning_fn = warning_fn; 1304 png_ptr->error_ptr = error_ptr; 1305 #ifdef PNG_USER_MEM_SUPPORTED 1306 png_ptr->free_fn = free_fn; 1307 #endif 1308 1309 #ifdef PNG_SETJMP_SUPPORTED 1310 png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof (jmp_buf)); 1311 #endif 1312 1313 } 1314 1315 void PNGAPI 1316 png_set_read_status_fn(png_structp png_ptr, png_read_status_ptr read_row_fn) 1317 { 1318 if(png_ptr == NULL) return; 1319 png_ptr->read_row_fn = read_row_fn; 1320 } 1321 1322 1323 #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED 1324 #if defined(PNG_INFO_IMAGE_SUPPORTED) 1325 void PNGAPI 1326 png_read_png(png_structp png_ptr, png_infop info_ptr, 1327 int transforms, 1328 voidp params) 1329 { 1330 int row; 1331 1332 if(png_ptr == NULL) return; 1333 #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) 1334 /* invert the alpha channel from opacity to transparency 1335 */ 1336 if (transforms & PNG_TRANSFORM_INVERT_ALPHA) 1337 png_set_invert_alpha(png_ptr); 1338 #endif 1339 1340 /* png_read_info() gives us all of the information from the 1341 * PNG file before the first IDAT (image data chunk). 1342 */ 1343 png_read_info(png_ptr, info_ptr); 1344 if (info_ptr->height > PNG_UINT_32_MAX/png_sizeof(png_bytep)) 1345 png_error(png_ptr,"Image is too high to process with png_read_png()"); 1346 1347 /* -------------- image transformations start here ------------------- */ 1348 1349 #if defined(PNG_READ_16_TO_8_SUPPORTED) 1350 /* tell libpng to strip 16 bit/color files down to 8 bits per color 1351 */ 1352 if (transforms & PNG_TRANSFORM_STRIP_16) 1353 png_set_strip_16(png_ptr); 1354 #endif 1355 1356 #if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) 1357 /* Strip alpha bytes from the input data without combining with 1358 * the background (not recommended). 1359 */ 1360 if (transforms & PNG_TRANSFORM_STRIP_ALPHA) 1361 png_set_strip_alpha(png_ptr); 1362 #endif 1363 1364 #if defined(PNG_READ_PACK_SUPPORTED) && !defined(PNG_READ_EXPAND_SUPPORTED) 1365 /* Extract multiple pixels with bit depths of 1, 2, or 4 from a single 1366 * byte into separate bytes (useful for paletted and grayscale images). 1367 */ 1368 if (transforms & PNG_TRANSFORM_PACKING) 1369 png_set_packing(png_ptr); 1370 #endif 1371 1372 #if defined(PNG_READ_PACKSWAP_SUPPORTED) 1373 /* Change the order of packed pixels to least significant bit first 1374 * (not useful if you are using png_set_packing). 1375 */ 1376 if (transforms & PNG_TRANSFORM_PACKSWAP) 1377 png_set_packswap(png_ptr); 1378 #endif 1379 1380 #if defined(PNG_READ_EXPAND_SUPPORTED) 1381 /* Expand paletted colors into true RGB triplets 1382 * Expand grayscale images to full 8 bits from 1, 2, or 4 bits/pixel 1383 * Expand paletted or RGB images with transparency to full alpha 1384 * channels so the data will be available as RGBA quartets. 1385 */ 1386 if (transforms & PNG_TRANSFORM_EXPAND) 1387 if ((png_ptr->bit_depth < 8) || 1388 (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) || 1389 (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))) 1390 png_set_expand(png_ptr); 1391 #endif 1392 1393 /* We don't handle background color or gamma transformation or dithering. 1394 */ 1395 1396 #if defined(PNG_READ_INVERT_SUPPORTED) 1397 /* invert monochrome files to have 0 as white and 1 as black 1398 */ 1399 if (transforms & PNG_TRANSFORM_INVERT_MONO) 1400 png_set_invert_mono(png_ptr); 1401 #endif 1402 1403 #if defined(PNG_READ_SHIFT_SUPPORTED) 1404 /* If you want to shift the pixel values from the range [0,255] or 1405 * [0,65535] to the original [0,7] or [0,31], or whatever range the 1406 * colors were originally in: 1407 */ 1408 if ((transforms & PNG_TRANSFORM_SHIFT) 1409 && png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT)) 1410 { 1411 png_color_8p sig_bit; 1412 1413 png_get_sBIT(png_ptr, info_ptr, &sig_bit); 1414 png_set_shift(png_ptr, sig_bit); 1415 } 1416 #endif 1417 1418 #if defined(PNG_READ_BGR_SUPPORTED) 1419 /* flip the RGB pixels to BGR (or RGBA to BGRA) 1420 */ 1421 if (transforms & PNG_TRANSFORM_BGR) 1422 png_set_bgr(png_ptr); 1423 #endif 1424 1425 #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) 1426 /* swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR) 1427 */ 1428 if (transforms & PNG_TRANSFORM_SWAP_ALPHA) 1429 png_set_swap_alpha(png_ptr); 1430 #endif 1431 1432 #if defined(PNG_READ_SWAP_SUPPORTED) 1433 /* swap bytes of 16 bit files to least significant byte first 1434 */ 1435 if (transforms & PNG_TRANSFORM_SWAP_ENDIAN) 1436 png_set_swap(png_ptr); 1437 #endif 1438 1439 /* We don't handle adding filler bytes */ 1440 1441 /* Optional call to gamma correct and add the background to the palette 1442 * and update info structure. REQUIRED if you are expecting libpng to 1443 * update the palette for you (i.e., you selected such a transform above). 1444 */ 1445 png_read_update_info(png_ptr, info_ptr); 1446 1447 /* -------------- image transformations end here ------------------- */ 1448 1449 #ifdef PNG_FREE_ME_SUPPORTED 1450 png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0); 1451 #endif 1452 if(info_ptr->row_pointers == NULL) 1453 { 1454 info_ptr->row_pointers = (png_bytepp)png_malloc(png_ptr, 1455 info_ptr->height * png_sizeof(png_bytep)); 1456 #ifdef PNG_FREE_ME_SUPPORTED 1457 info_ptr->free_me |= PNG_FREE_ROWS; 1458 #endif 1459 for (row = 0; row < (int)info_ptr->height; row++) 1460 { 1461 info_ptr->row_pointers[row] = (png_bytep)png_malloc(png_ptr, 1462 png_get_rowbytes(png_ptr, info_ptr)); 1463 } 1464 } 1465 1466 png_read_image(png_ptr, info_ptr->row_pointers); 1467 info_ptr->valid |= PNG_INFO_IDAT; 1468 1469 /* read rest of file, and get additional chunks in info_ptr - REQUIRED */ 1470 png_read_end(png_ptr, info_ptr); 1471 1472 transforms = transforms; /* quiet compiler warnings */ 1473 params = params; 1474 1475 } 1476 #endif /* PNG_INFO_IMAGE_SUPPORTED */ 1477 #endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ 1478 #endif /* PNG_READ_SUPPORTED */ 1479