| OLD | NEW |
| 1 | 1 |
| 2 /* pngpread.c - read a png file in push mode | 2 /* pngpread.c - read a png file in push mode |
| 3 * | 3 * |
| 4 * Last changed in libpng 1.2.27 [April 29, 2008] | 4 * Last changed in libpng 1.2.32 [September 18, 2008] |
| 5 * For conditions of distribution and use, see copyright notice in png.h | 5 * For conditions of distribution and use, see copyright notice in png.h |
| 6 * Copyright (c) 1998-2008 Glenn Randers-Pehrson | 6 * Copyright (c) 1998-2008 Glenn Randers-Pehrson |
| 7 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) | 7 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) |
| 8 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) | 8 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #define PNG_INTERNAL | 11 #define PNG_INTERNAL |
| 12 #include "png.h" | 12 #include "png.h" |
| 13 | |
| 14 #ifdef PNG_PROGRESSIVE_READ_SUPPORTED | 13 #ifdef PNG_PROGRESSIVE_READ_SUPPORTED |
| 15 | 14 |
| 16 /* push model modes */ | 15 /* push model modes */ |
| 17 #define PNG_READ_SIG_MODE 0 | 16 #define PNG_READ_SIG_MODE 0 |
| 18 #define PNG_READ_CHUNK_MODE 1 | 17 #define PNG_READ_CHUNK_MODE 1 |
| 19 #define PNG_READ_IDAT_MODE 2 | 18 #define PNG_READ_IDAT_MODE 2 |
| 20 #define PNG_SKIP_MODE 3 | 19 #define PNG_SKIP_MODE 3 |
| 21 #define PNG_READ_tEXt_MODE 4 | 20 #define PNG_READ_tEXt_MODE 4 |
| 22 #define PNG_READ_zTXt_MODE 5 | 21 #define PNG_READ_zTXt_MODE 5 |
| 23 #define PNG_READ_DONE_MODE 6 | 22 #define PNG_READ_DONE_MODE 6 |
| 24 #define PNG_READ_iTXt_MODE 7 | 23 #define PNG_READ_iTXt_MODE 7 |
| 25 #define PNG_ERROR_MODE 8 | 24 #define PNG_ERROR_MODE 8 |
| 26 | 25 |
| 27 void PNGAPI | 26 void PNGAPI |
| 28 png_process_data(png_structp png_ptr, png_infop info_ptr, | 27 png_process_data(png_structp png_ptr, png_infop info_ptr, |
| 29 png_bytep buffer, png_size_t buffer_size) | 28 png_bytep buffer, png_size_t buffer_size) |
| 30 { | 29 { |
| 31 if(png_ptr == NULL || info_ptr == NULL) return; | 30 if (png_ptr == NULL || info_ptr == NULL) return; |
| 32 png_push_restore_buffer(png_ptr, buffer, buffer_size); | 31 png_push_restore_buffer(png_ptr, buffer, buffer_size); |
| 33 | 32 |
| 34 while (png_ptr->buffer_size) | 33 while (png_ptr->buffer_size) |
| 35 { | 34 { |
| 36 png_process_some_data(png_ptr, info_ptr); | 35 png_process_some_data(png_ptr, info_ptr); |
| 37 } | 36 } |
| 38 } | 37 } |
| 39 | 38 |
| 40 /* What we do with the incoming data depends on what we were previously | 39 /* What we do with the incoming data depends on what we were previously |
| 41 * doing before we ran out of data... | 40 * doing before we ran out of data... |
| 42 */ | 41 */ |
| 43 void /* PRIVATE */ | 42 void /* PRIVATE */ |
| 44 png_process_some_data(png_structp png_ptr, png_infop info_ptr) | 43 png_process_some_data(png_structp png_ptr, png_infop info_ptr) |
| 45 { | 44 { |
| 46 if(png_ptr == NULL) return; | 45 if (png_ptr == NULL) return; |
| 47 switch (png_ptr->process_mode) | 46 switch (png_ptr->process_mode) |
| 48 { | 47 { |
| 49 case PNG_READ_SIG_MODE: | 48 case PNG_READ_SIG_MODE: |
| 50 { | 49 { |
| 51 png_push_read_sig(png_ptr, info_ptr); | 50 png_push_read_sig(png_ptr, info_ptr); |
| 52 break; | 51 break; |
| 53 } | 52 } |
| 54 case PNG_READ_CHUNK_MODE: | 53 case PNG_READ_CHUNK_MODE: |
| 55 { | 54 { |
| 56 png_push_read_chunk(png_ptr, info_ptr); | 55 png_push_read_chunk(png_ptr, info_ptr); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 png_size_t num_checked = png_ptr->sig_bytes, | 106 png_size_t num_checked = png_ptr->sig_bytes, |
| 108 num_to_check = 8 - num_checked; | 107 num_to_check = 8 - num_checked; |
| 109 | 108 |
| 110 if (png_ptr->buffer_size < num_to_check) | 109 if (png_ptr->buffer_size < num_to_check) |
| 111 { | 110 { |
| 112 num_to_check = png_ptr->buffer_size; | 111 num_to_check = png_ptr->buffer_size; |
| 113 } | 112 } |
| 114 | 113 |
| 115 png_push_fill_buffer(png_ptr, &(info_ptr->signature[num_checked]), | 114 png_push_fill_buffer(png_ptr, &(info_ptr->signature[num_checked]), |
| 116 num_to_check); | 115 num_to_check); |
| 117 png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes+num_to_check); | 116 png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes + num_to_check); |
| 118 | 117 |
| 119 if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check)) | 118 if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check)) |
| 120 { | 119 { |
| 121 if (num_checked < 4 && | 120 if (num_checked < 4 && |
| 122 png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4)) | 121 png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4)) |
| 123 png_error(png_ptr, "Not a PNG file"); | 122 png_error(png_ptr, "Not a PNG file"); |
| 124 else | 123 else |
| 125 png_error(png_ptr, "PNG file corrupted by ASCII conversion"); | 124 png_error(png_ptr, "PNG file corrupted by ASCII conversion"); |
| 126 } | 125 } |
| 127 else | 126 else |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 203 { | 202 { |
| 204 png_byte chunk_length[4]; | 203 png_byte chunk_length[4]; |
| 205 | 204 |
| 206 if (png_ptr->buffer_size < 8) | 205 if (png_ptr->buffer_size < 8) |
| 207 { | 206 { |
| 208 png_push_save_buffer(png_ptr); | 207 png_push_save_buffer(png_ptr); |
| 209 return; | 208 return; |
| 210 } | 209 } |
| 211 | 210 |
| 212 png_push_fill_buffer(png_ptr, chunk_length, 4); | 211 png_push_fill_buffer(png_ptr, chunk_length, 4); |
| 213 png_ptr->push_length = png_get_uint_31(png_ptr,chunk_length); | 212 png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length); |
| 214 png_reset_crc(png_ptr); | 213 png_reset_crc(png_ptr); |
| 215 png_crc_read(png_ptr, png_ptr->chunk_name, 4); | 214 png_crc_read(png_ptr, png_ptr->chunk_name, 4); |
| 215 png_check_chunk_name(png_ptr, png_ptr->chunk_name); |
| 216 png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; | 216 png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; |
| 217 } | 217 } |
| 218 | 218 |
| 219 if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) | 219 if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) |
| 220 if(png_ptr->mode & PNG_AFTER_IDAT) | 220 if (png_ptr->mode & PNG_AFTER_IDAT) |
| 221 png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; | 221 png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; |
| 222 | 222 |
| 223 if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4)) | 223 if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4)) |
| 224 { | 224 { |
| 225 if (png_ptr->push_length != 13) |
| 226 png_error(png_ptr, "Invalid IHDR length"); |
| 225 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 227 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 226 { | 228 { |
| 227 if (png_ptr->push_length != 13) | |
| 228 png_error(png_ptr, "Invalid IHDR length"); | |
| 229 png_push_save_buffer(png_ptr); | 229 png_push_save_buffer(png_ptr); |
| 230 return; | 230 return; |
| 231 } | 231 } |
| 232 png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length); | 232 png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length); |
| 233 } | 233 } |
| 234 else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4)) | 234 else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4)) |
| 235 { | 235 { |
| 236 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 236 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 237 { | 237 { |
| 238 png_push_save_buffer(png_ptr); | 238 png_push_save_buffer(png_ptr); |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 558 png_crc_finish(png_ptr, 0); | 558 png_crc_finish(png_ptr, 0); |
| 559 png_ptr->process_mode = PNG_READ_CHUNK_MODE; | 559 png_ptr->process_mode = PNG_READ_CHUNK_MODE; |
| 560 } | 560 } |
| 561 } | 561 } |
| 562 | 562 |
| 563 void PNGAPI | 563 void PNGAPI |
| 564 png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) | 564 png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) |
| 565 { | 565 { |
| 566 png_bytep ptr; | 566 png_bytep ptr; |
| 567 | 567 |
| 568 if(png_ptr == NULL) return; | 568 if (png_ptr == NULL) return; |
| 569 ptr = buffer; | 569 ptr = buffer; |
| 570 if (png_ptr->save_buffer_size) | 570 if (png_ptr->save_buffer_size) |
| 571 { | 571 { |
| 572 png_size_t save_size; | 572 png_size_t save_size; |
| 573 | 573 |
| 574 if (length < png_ptr->save_buffer_size) | 574 if (length < png_ptr->save_buffer_size) |
| 575 save_size = length; | 575 save_size = length; |
| 576 else | 576 else |
| 577 save_size = png_ptr->save_buffer_size; | 577 save_size = png_ptr->save_buffer_size; |
| 578 | 578 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 599 } | 599 } |
| 600 } | 600 } |
| 601 | 601 |
| 602 void /* PRIVATE */ | 602 void /* PRIVATE */ |
| 603 png_push_save_buffer(png_structp png_ptr) | 603 png_push_save_buffer(png_structp png_ptr) |
| 604 { | 604 { |
| 605 if (png_ptr->save_buffer_size) | 605 if (png_ptr->save_buffer_size) |
| 606 { | 606 { |
| 607 if (png_ptr->save_buffer_ptr != png_ptr->save_buffer) | 607 if (png_ptr->save_buffer_ptr != png_ptr->save_buffer) |
| 608 { | 608 { |
| 609 png_size_t i,istop; | 609 png_size_t i, istop; |
| 610 png_bytep sp; | 610 png_bytep sp; |
| 611 png_bytep dp; | 611 png_bytep dp; |
| 612 | 612 |
| 613 istop = png_ptr->save_buffer_size; | 613 istop = png_ptr->save_buffer_size; |
| 614 for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer; | 614 for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer; |
| 615 i < istop; i++, sp++, dp++) | 615 i < istop; i++, sp++, dp++) |
| 616 { | 616 { |
| 617 *dp = *sp; | 617 *dp = *sp; |
| 618 } | 618 } |
| 619 } | 619 } |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 668 { | 668 { |
| 669 png_byte chunk_length[4]; | 669 png_byte chunk_length[4]; |
| 670 | 670 |
| 671 if (png_ptr->buffer_size < 8) | 671 if (png_ptr->buffer_size < 8) |
| 672 { | 672 { |
| 673 png_push_save_buffer(png_ptr); | 673 png_push_save_buffer(png_ptr); |
| 674 return; | 674 return; |
| 675 } | 675 } |
| 676 | 676 |
| 677 png_push_fill_buffer(png_ptr, chunk_length, 4); | 677 png_push_fill_buffer(png_ptr, chunk_length, 4); |
| 678 png_ptr->push_length = png_get_uint_31(png_ptr,chunk_length); | 678 png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length); |
| 679 png_reset_crc(png_ptr); | 679 png_reset_crc(png_ptr); |
| 680 png_crc_read(png_ptr, png_ptr->chunk_name, 4); | 680 png_crc_read(png_ptr, png_ptr->chunk_name, 4); |
| 681 png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; | 681 png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; |
| 682 | 682 |
| 683 if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) | 683 if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) |
| 684 { | 684 { |
| 685 png_ptr->process_mode = PNG_READ_CHUNK_MODE; | 685 png_ptr->process_mode = PNG_READ_CHUNK_MODE; |
| 686 if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) | 686 if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) |
| 687 png_error(png_ptr, "Not enough compressed data"); | 687 png_error(png_ptr, "Not enough compressed data"); |
| 688 return; | 688 return; |
| 689 } | 689 } |
| 690 | 690 |
| 691 png_ptr->idat_size = png_ptr->push_length; | 691 png_ptr->idat_size = png_ptr->push_length; |
| 692 } | 692 } |
| 693 if (png_ptr->idat_size && png_ptr->save_buffer_size) | 693 if (png_ptr->idat_size && png_ptr->save_buffer_size) |
| 694 { | 694 { |
| 695 png_size_t save_size; | 695 png_size_t save_size; |
| 696 | 696 |
| 697 if (png_ptr->idat_size < (png_uint_32)png_ptr->save_buffer_size) | 697 if (png_ptr->idat_size < (png_uint_32)png_ptr->save_buffer_size) |
| 698 { | 698 { |
| 699 save_size = (png_size_t)png_ptr->idat_size; | 699 save_size = (png_size_t)png_ptr->idat_size; |
| 700 /* check for overflow */ | 700 /* check for overflow */ |
| 701 if((png_uint_32)save_size != png_ptr->idat_size) | 701 if ((png_uint_32)save_size != png_ptr->idat_size) |
| 702 png_error(png_ptr, "save_size overflowed in pngpread"); | 702 png_error(png_ptr, "save_size overflowed in pngpread"); |
| 703 } | 703 } |
| 704 else | 704 else |
| 705 save_size = png_ptr->save_buffer_size; | 705 save_size = png_ptr->save_buffer_size; |
| 706 | 706 |
| 707 png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); | 707 png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); |
| 708 if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) | 708 if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) |
| 709 png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size); | 709 png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size); |
| 710 png_ptr->idat_size -= save_size; | 710 png_ptr->idat_size -= save_size; |
| 711 png_ptr->buffer_size -= save_size; | 711 png_ptr->buffer_size -= save_size; |
| 712 png_ptr->save_buffer_size -= save_size; | 712 png_ptr->save_buffer_size -= save_size; |
| 713 png_ptr->save_buffer_ptr += save_size; | 713 png_ptr->save_buffer_ptr += save_size; |
| 714 } | 714 } |
| 715 if (png_ptr->idat_size && png_ptr->current_buffer_size) | 715 if (png_ptr->idat_size && png_ptr->current_buffer_size) |
| 716 { | 716 { |
| 717 png_size_t save_size; | 717 png_size_t save_size; |
| 718 | 718 |
| 719 if (png_ptr->idat_size < (png_uint_32)png_ptr->current_buffer_size) | 719 if (png_ptr->idat_size < (png_uint_32)png_ptr->current_buffer_size) |
| 720 { | 720 { |
| 721 save_size = (png_size_t)png_ptr->idat_size; | 721 save_size = (png_size_t)png_ptr->idat_size; |
| 722 /* check for overflow */ | 722 /* check for overflow */ |
| 723 if((png_uint_32)save_size != png_ptr->idat_size) | 723 if ((png_uint_32)save_size != png_ptr->idat_size) |
| 724 png_error(png_ptr, "save_size overflowed in pngpread"); | 724 png_error(png_ptr, "save_size overflowed in pngpread"); |
| 725 } | 725 } |
| 726 else | 726 else |
| 727 save_size = png_ptr->current_buffer_size; | 727 save_size = png_ptr->current_buffer_size; |
| 728 | 728 |
| 729 png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); | 729 png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); |
| 730 if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) | 730 if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) |
| 731 png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size); | 731 png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size); |
| 732 | 732 |
| 733 png_ptr->idat_size -= save_size; | 733 png_ptr->idat_size -= save_size; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 753 png_process_IDAT_data(png_structp png_ptr, png_bytep buffer, | 753 png_process_IDAT_data(png_structp png_ptr, png_bytep buffer, |
| 754 png_size_t buffer_length) | 754 png_size_t buffer_length) |
| 755 { | 755 { |
| 756 int ret; | 756 int ret; |
| 757 | 757 |
| 758 if ((png_ptr->flags & PNG_FLAG_ZLIB_FINISHED) && buffer_length) | 758 if ((png_ptr->flags & PNG_FLAG_ZLIB_FINISHED) && buffer_length) |
| 759 png_error(png_ptr, "Extra compression data"); | 759 png_error(png_ptr, "Extra compression data"); |
| 760 | 760 |
| 761 png_ptr->zstream.next_in = buffer; | 761 png_ptr->zstream.next_in = buffer; |
| 762 png_ptr->zstream.avail_in = (uInt)buffer_length; | 762 png_ptr->zstream.avail_in = (uInt)buffer_length; |
| 763 for(;;) | 763 for (;;) |
| 764 { | 764 { |
| 765 ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); | 765 ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); |
| 766 if (ret != Z_OK) | 766 if (ret != Z_OK) |
| 767 { | 767 { |
| 768 if (ret == Z_STREAM_END) | 768 if (ret == Z_STREAM_END) |
| 769 { | 769 { |
| 770 if (png_ptr->zstream.avail_in) | 770 if (png_ptr->zstream.avail_in) |
| 771 png_error(png_ptr, "Extra compressed data"); | 771 png_error(png_ptr, "Extra compressed data"); |
| 772 if (!(png_ptr->zstream.avail_out)) | 772 if (!(png_ptr->zstream.avail_out)) |
| 773 { | 773 { |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1013 if (png_ptr->row_number < png_ptr->num_rows) | 1013 if (png_ptr->row_number < png_ptr->num_rows) |
| 1014 return; | 1014 return; |
| 1015 | 1015 |
| 1016 if (png_ptr->interlaced) | 1016 if (png_ptr->interlaced) |
| 1017 { | 1017 { |
| 1018 png_ptr->row_number = 0; | 1018 png_ptr->row_number = 0; |
| 1019 png_memset_check(png_ptr, png_ptr->prev_row, 0, | 1019 png_memset_check(png_ptr, png_ptr->prev_row, 0, |
| 1020 png_ptr->rowbytes + 1); | 1020 png_ptr->rowbytes + 1); |
| 1021 do | 1021 do |
| 1022 { | 1022 { |
| 1023 int pass; | 1023 png_ptr->pass++; |
| 1024 pass = png_ptr->pass; | 1024 if ((png_ptr->pass == 1 && png_ptr->width < 5) || |
| 1025 pass++; | 1025 (png_ptr->pass == 3 && png_ptr->width < 3) || |
| 1026 if ((pass == 1 && png_ptr->width < 5) || | 1026 (png_ptr->pass == 5 && png_ptr->width < 2)) |
| 1027 (pass == 3 && png_ptr->width < 3) || | 1027 png_ptr->pass++; |
| 1028 (pass == 5 && png_ptr->width < 2)) | |
| 1029 pass++; | |
| 1030 | 1028 |
| 1031 if (pass > 7) | 1029 if (png_ptr->pass > 7) |
| 1032 pass--; | 1030 png_ptr->pass--; |
| 1033 png_ptr->pass = (png_byte) pass; | 1031 if (png_ptr->pass >= 7) |
| 1034 if (pass < 7) | 1032 break; |
| 1035 { | |
| 1036 png_ptr->iwidth = (png_ptr->width + | |
| 1037 png_pass_inc[pass] - 1 - | |
| 1038 png_pass_start[pass]) / | |
| 1039 png_pass_inc[pass]; | |
| 1040 | 1033 |
| 1041 png_ptr->irowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, | 1034 png_ptr->iwidth = (png_ptr->width + |
| 1042 png_ptr->iwidth) + 1; | 1035 png_pass_inc[png_ptr->pass] - 1 - |
| 1036 png_pass_start[png_ptr->pass]) / |
| 1037 png_pass_inc[png_ptr->pass]; |
| 1043 | 1038 |
| 1044 if (png_ptr->transformations & PNG_INTERLACE) | 1039 png_ptr->irowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, |
| 1045 break; | 1040 png_ptr->iwidth) + 1; |
| 1046 | 1041 |
| 1047 png_ptr->num_rows = (png_ptr->height + | 1042 if (png_ptr->transformations & PNG_INTERLACE) |
| 1048 png_pass_yinc[pass] - 1 - | 1043 break; |
| 1049 png_pass_ystart[pass]) / | 1044 |
| 1050 png_pass_yinc[pass]; | 1045 png_ptr->num_rows = (png_ptr->height + |
| 1051 } | 1046 png_pass_yinc[png_ptr->pass] - 1 - |
| 1052 else | 1047 png_pass_ystart[png_ptr->pass]) / |
| 1053 break; | 1048 png_pass_yinc[png_ptr->pass]; |
| 1054 | 1049 |
| 1055 } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0); | 1050 } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0); |
| 1056 } | 1051 } |
| 1057 } | 1052 } |
| 1058 | 1053 |
| 1059 #if defined(PNG_READ_tEXt_SUPPORTED) | 1054 #if defined(PNG_READ_tEXt_SUPPORTED) |
| 1060 void /* PRIVATE */ | 1055 void /* PRIVATE */ |
| 1061 png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 | 1056 png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 |
| 1062 length) | 1057 length) |
| 1063 { | 1058 { |
| 1064 if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) | 1059 if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) |
| 1065 { | 1060 { |
| 1066 png_error(png_ptr, "Out of place tEXt"); | 1061 png_error(png_ptr, "Out of place tEXt"); |
| 1067 info_ptr = info_ptr; /* to quiet some compiler warnings */ | 1062 info_ptr = info_ptr; /* to quiet some compiler warnings */ |
| 1068 } | 1063 } |
| 1069 | 1064 |
| 1070 #ifdef PNG_MAX_MALLOC_64K | 1065 #ifdef PNG_MAX_MALLOC_64K |
| 1071 png_ptr->skip_length = 0; /* This may not be necessary */ | 1066 png_ptr->skip_length = 0; /* This may not be necessary */ |
| 1072 | 1067 |
| 1073 if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ | 1068 if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ |
| 1074 { | 1069 { |
| 1075 png_warning(png_ptr, "tEXt chunk too large to fit in memory"); | 1070 png_warning(png_ptr, "tEXt chunk too large to fit in memory"); |
| 1076 png_ptr->skip_length = length - (png_uint_32)65535L; | 1071 png_ptr->skip_length = length - (png_uint_32)65535L; |
| 1077 length = (png_uint_32)65535L; | 1072 length = (png_uint_32)65535L; |
| 1078 } | 1073 } |
| 1079 #endif | 1074 #endif |
| 1080 | 1075 |
| 1081 png_ptr->current_text = (png_charp)png_malloc(png_ptr, | 1076 png_ptr->current_text = (png_charp)png_malloc(png_ptr, |
| 1082 (png_uint_32)(length+1)); | 1077 (png_uint_32)(length + 1)); |
| 1083 png_ptr->current_text[length] = '\0'; | 1078 png_ptr->current_text[length] = '\0'; |
| 1084 png_ptr->current_text_ptr = png_ptr->current_text; | 1079 png_ptr->current_text_ptr = png_ptr->current_text; |
| 1085 png_ptr->current_text_size = (png_size_t)length; | 1080 png_ptr->current_text_size = (png_size_t)length; |
| 1086 png_ptr->current_text_left = (png_size_t)length; | 1081 png_ptr->current_text_left = (png_size_t)length; |
| 1087 png_ptr->process_mode = PNG_READ_tEXt_MODE; | 1082 png_ptr->process_mode = PNG_READ_tEXt_MODE; |
| 1088 } | 1083 } |
| 1089 | 1084 |
| 1090 void /* PRIVATE */ | 1085 void /* PRIVATE */ |
| 1091 png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr) | 1086 png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr) |
| 1092 { | 1087 { |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1170 */ | 1165 */ |
| 1171 if (length > (png_uint_32)65535L) | 1166 if (length > (png_uint_32)65535L) |
| 1172 { | 1167 { |
| 1173 png_warning(png_ptr, "zTXt chunk too large to fit in memory"); | 1168 png_warning(png_ptr, "zTXt chunk too large to fit in memory"); |
| 1174 png_push_crc_skip(png_ptr, length); | 1169 png_push_crc_skip(png_ptr, length); |
| 1175 return; | 1170 return; |
| 1176 } | 1171 } |
| 1177 #endif | 1172 #endif |
| 1178 | 1173 |
| 1179 png_ptr->current_text = (png_charp)png_malloc(png_ptr, | 1174 png_ptr->current_text = (png_charp)png_malloc(png_ptr, |
| 1180 (png_uint_32)(length+1)); | 1175 (png_uint_32)(length + 1)); |
| 1181 png_ptr->current_text[length] = '\0'; | 1176 png_ptr->current_text[length] = '\0'; |
| 1182 png_ptr->current_text_ptr = png_ptr->current_text; | 1177 png_ptr->current_text_ptr = png_ptr->current_text; |
| 1183 png_ptr->current_text_size = (png_size_t)length; | 1178 png_ptr->current_text_size = (png_size_t)length; |
| 1184 png_ptr->current_text_left = (png_size_t)length; | 1179 png_ptr->current_text_left = (png_size_t)length; |
| 1185 png_ptr->process_mode = PNG_READ_zTXt_MODE; | 1180 png_ptr->process_mode = PNG_READ_zTXt_MODE; |
| 1186 } | 1181 } |
| 1187 | 1182 |
| 1188 void /* PRIVATE */ | 1183 void /* PRIVATE */ |
| 1189 png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr) | 1184 png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr) |
| 1190 { | 1185 { |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1261 png_ptr->current_text = NULL; | 1256 png_ptr->current_text = NULL; |
| 1262 png_free(png_ptr, key); | 1257 png_free(png_ptr, key); |
| 1263 png_free(png_ptr, text); | 1258 png_free(png_ptr, text); |
| 1264 return; | 1259 return; |
| 1265 } | 1260 } |
| 1266 if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END) | 1261 if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END) |
| 1267 { | 1262 { |
| 1268 if (text == NULL) | 1263 if (text == NULL) |
| 1269 { | 1264 { |
| 1270 text = (png_charp)png_malloc(png_ptr, | 1265 text = (png_charp)png_malloc(png_ptr, |
| 1271 (png_uint_32)(png_ptr->zbuf_size - png_ptr->zstream.avail_out | 1266 (png_uint_32)(png_ptr->zbuf_size |
| 1272 + key_size + 1)); | 1267 - png_ptr->zstream.avail_out + key_size + 1)); |
| 1273 png_memcpy(text + key_size, png_ptr->zbuf, | 1268 png_memcpy(text + key_size, png_ptr->zbuf, |
| 1274 png_ptr->zbuf_size - png_ptr->zstream.avail_out); | 1269 png_ptr->zbuf_size - png_ptr->zstream.avail_out); |
| 1275 png_memcpy(text, key, key_size); | 1270 png_memcpy(text, key, key_size); |
| 1276 text_size = key_size + png_ptr->zbuf_size - | 1271 text_size = key_size + png_ptr->zbuf_size - |
| 1277 png_ptr->zstream.avail_out; | 1272 png_ptr->zstream.avail_out; |
| 1278 *(text + text_size) = '\0'; | 1273 *(text + text_size) = '\0'; |
| 1279 } | 1274 } |
| 1280 else | 1275 else |
| 1281 { | 1276 { |
| 1282 png_charp tmp; | 1277 png_charp tmp; |
| 1283 | 1278 |
| 1284 tmp = text; | 1279 tmp = text; |
| 1285 text = (png_charp)png_malloc(png_ptr, text_size + | 1280 text = (png_charp)png_malloc(png_ptr, text_size + |
| 1286 (png_uint_32)(png_ptr->zbuf_size - png_ptr->zstream.avail_out | 1281 (png_uint_32)(png_ptr->zbuf_size |
| 1287 + 1)); | 1282 - png_ptr->zstream.avail_out + 1)); |
| 1288 png_memcpy(text, tmp, text_size); | 1283 png_memcpy(text, tmp, text_size); |
| 1289 png_free(png_ptr, tmp); | 1284 png_free(png_ptr, tmp); |
| 1290 png_memcpy(text + text_size, png_ptr->zbuf, | 1285 png_memcpy(text + text_size, png_ptr->zbuf, |
| 1291 png_ptr->zbuf_size - png_ptr->zstream.avail_out); | 1286 png_ptr->zbuf_size - png_ptr->zstream.avail_out); |
| 1292 text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out; | 1287 text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out; |
| 1293 *(text + text_size) = '\0'; | 1288 *(text + text_size) = '\0'; |
| 1294 } | 1289 } |
| 1295 if (ret != Z_STREAM_END) | 1290 if (ret != Z_STREAM_END) |
| 1296 { | 1291 { |
| 1297 png_ptr->zstream.next_out = png_ptr->zbuf; | 1292 png_ptr->zstream.next_out = png_ptr->zbuf; |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1360 | 1355 |
| 1361 if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ | 1356 if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ |
| 1362 { | 1357 { |
| 1363 png_warning(png_ptr, "iTXt chunk too large to fit in memory"); | 1358 png_warning(png_ptr, "iTXt chunk too large to fit in memory"); |
| 1364 png_ptr->skip_length = length - (png_uint_32)65535L; | 1359 png_ptr->skip_length = length - (png_uint_32)65535L; |
| 1365 length = (png_uint_32)65535L; | 1360 length = (png_uint_32)65535L; |
| 1366 } | 1361 } |
| 1367 #endif | 1362 #endif |
| 1368 | 1363 |
| 1369 png_ptr->current_text = (png_charp)png_malloc(png_ptr, | 1364 png_ptr->current_text = (png_charp)png_malloc(png_ptr, |
| 1370 (png_uint_32)(length+1)); | 1365 (png_uint_32)(length + 1)); |
| 1371 png_ptr->current_text[length] = '\0'; | 1366 png_ptr->current_text[length] = '\0'; |
| 1372 png_ptr->current_text_ptr = png_ptr->current_text; | 1367 png_ptr->current_text_ptr = png_ptr->current_text; |
| 1373 png_ptr->current_text_size = (png_size_t)length; | 1368 png_ptr->current_text_size = (png_size_t)length; |
| 1374 png_ptr->current_text_left = (png_size_t)length; | 1369 png_ptr->current_text_left = (png_size_t)length; |
| 1375 png_ptr->process_mode = PNG_READ_iTXt_MODE; | 1370 png_ptr->process_mode = PNG_READ_iTXt_MODE; |
| 1376 } | 1371 } |
| 1377 | 1372 |
| 1378 void /* PRIVATE */ | 1373 void /* PRIVATE */ |
| 1379 png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr) | 1374 png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr) |
| 1380 { | 1375 { |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1461 #endif | 1456 #endif |
| 1462 | 1457 |
| 1463 /* This function is called when we haven't found a handler for this | 1458 /* This function is called when we haven't found a handler for this |
| 1464 * chunk. If there isn't a problem with the chunk itself (ie a bad chunk | 1459 * chunk. If there isn't a problem with the chunk itself (ie a bad chunk |
| 1465 * name or a critical chunk), the chunk is (currently) silently ignored. | 1460 * name or a critical chunk), the chunk is (currently) silently ignored. |
| 1466 */ | 1461 */ |
| 1467 void /* PRIVATE */ | 1462 void /* PRIVATE */ |
| 1468 png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 | 1463 png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 |
| 1469 length) | 1464 length) |
| 1470 { | 1465 { |
| 1471 png_uint_32 skip=0; | 1466 png_uint_32 skip = 0; |
| 1472 png_check_chunk_name(png_ptr, png_ptr->chunk_name); | |
| 1473 | 1467 |
| 1474 if (!(png_ptr->chunk_name[0] & 0x20)) | 1468 if (!(png_ptr->chunk_name[0] & 0x20)) |
| 1475 { | 1469 { |
| 1476 #if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) | 1470 #if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) |
| 1477 if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != | 1471 if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != |
| 1478 PNG_HANDLE_CHUNK_ALWAYS | 1472 PNG_HANDLE_CHUNK_ALWAYS |
| 1479 #if defined(PNG_READ_USER_CHUNKS_SUPPORTED) | 1473 #if defined(PNG_READ_USER_CHUNKS_SUPPORTED) |
| 1480 && png_ptr->read_user_chunk_fn == NULL | 1474 && png_ptr->read_user_chunk_fn == NULL |
| 1481 #endif | 1475 #endif |
| 1482 ) | 1476 ) |
| 1483 #endif | 1477 #endif |
| 1484 png_chunk_error(png_ptr, "unknown critical chunk"); | 1478 png_chunk_error(png_ptr, "unknown critical chunk"); |
| 1485 | 1479 |
| 1486 info_ptr = info_ptr; /* to quiet some compiler warnings */ | 1480 info_ptr = info_ptr; /* to quiet some compiler warnings */ |
| 1487 } | 1481 } |
| 1488 | 1482 |
| 1489 #if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) | 1483 #if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) |
| 1490 if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) | 1484 if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) |
| 1491 { | 1485 { |
| 1492 #ifdef PNG_MAX_MALLOC_64K | 1486 #ifdef PNG_MAX_MALLOC_64K |
| 1493 if (length > (png_uint_32)65535L) | 1487 if (length > (png_uint_32)65535L) |
| 1494 { | 1488 { |
| 1495 png_warning(png_ptr, "unknown chunk too large to fit in memory"); | 1489 png_warning(png_ptr, "unknown chunk too large to fit in memory"); |
| 1496 skip = length - (png_uint_32)65535L; | 1490 skip = length - (png_uint_32)65535L; |
| 1497 length = (png_uint_32)65535L; | 1491 length = (png_uint_32)65535L; |
| 1498 } | 1492 } |
| 1499 #endif | 1493 #endif |
| 1500 png_memcpy((png_charp)png_ptr->unknown_chunk.name, | 1494 png_memcpy((png_charp)png_ptr->unknown_chunk.name, |
| 1501 (png_charp)png_ptr->chunk_name, | 1495 (png_charp)png_ptr->chunk_name, |
| 1502 png_sizeof(png_ptr->unknown_chunk.name)); | 1496 png_sizeof(png_ptr->unknown_chunk.name)); |
| 1503 png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name)-1]='\0
'; | 1497 png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name) - 1] |
| 1498 = '\0'; |
| 1504 | 1499 |
| 1505 png_ptr->unknown_chunk.size = (png_size_t)length; | 1500 png_ptr->unknown_chunk.size = (png_size_t)length; |
| 1506 if (length == 0) | 1501 if (length == 0) |
| 1507 png_ptr->unknown_chunk.data = NULL; | 1502 png_ptr->unknown_chunk.data = NULL; |
| 1508 else | 1503 else |
| 1509 { | 1504 { |
| 1510 png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, length); | 1505 png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, |
| 1506 (png_uint_32)length); |
| 1511 png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length); | 1507 png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length); |
| 1512 } | 1508 } |
| 1513 #if defined(PNG_READ_USER_CHUNKS_SUPPORTED) | 1509 #if defined(PNG_READ_USER_CHUNKS_SUPPORTED) |
| 1514 if(png_ptr->read_user_chunk_fn != NULL) | 1510 if (png_ptr->read_user_chunk_fn != NULL) |
| 1515 { | 1511 { |
| 1516 /* callback to user unknown chunk handler */ | 1512 /* callback to user unknown chunk handler */ |
| 1517 int ret; | 1513 int ret; |
| 1518 ret = (*(png_ptr->read_user_chunk_fn)) | 1514 ret = (*(png_ptr->read_user_chunk_fn)) |
| 1519 (png_ptr, &png_ptr->unknown_chunk); | 1515 (png_ptr, &png_ptr->unknown_chunk); |
| 1520 if (ret < 0) | 1516 if (ret < 0) |
| 1521 png_chunk_error(png_ptr, "error in user chunk"); | 1517 png_chunk_error(png_ptr, "error in user chunk"); |
| 1522 if (ret == 0) | 1518 if (ret == 0) |
| 1523 { | 1519 { |
| 1524 if (!(png_ptr->chunk_name[0] & 0x20)) | 1520 if (!(png_ptr->chunk_name[0] & 0x20)) |
| 1525 if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != | 1521 if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != |
| 1526 PNG_HANDLE_CHUNK_ALWAYS) | 1522 PNG_HANDLE_CHUNK_ALWAYS) |
| 1527 png_chunk_error(png_ptr, "unknown critical chunk"); | 1523 png_chunk_error(png_ptr, "unknown critical chunk"); |
| 1528 png_set_unknown_chunks(png_ptr, info_ptr, | 1524 png_set_unknown_chunks(png_ptr, info_ptr, |
| 1529 &png_ptr->unknown_chunk, 1); | 1525 &png_ptr->unknown_chunk, 1); |
| 1530 } | 1526 } |
| 1531 } | 1527 } |
| 1532 else | 1528 else |
| 1533 #endif | 1529 #endif |
| 1534 png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); | 1530 png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); |
| 1535 png_free(png_ptr, png_ptr->unknown_chunk.data); | 1531 png_free(png_ptr, png_ptr->unknown_chunk.data); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1564 } | 1560 } |
| 1565 | 1561 |
| 1566 void PNGAPI | 1562 void PNGAPI |
| 1567 png_progressive_combine_row (png_structp png_ptr, | 1563 png_progressive_combine_row (png_structp png_ptr, |
| 1568 png_bytep old_row, png_bytep new_row) | 1564 png_bytep old_row, png_bytep new_row) |
| 1569 { | 1565 { |
| 1570 #ifdef PNG_USE_LOCAL_ARRAYS | 1566 #ifdef PNG_USE_LOCAL_ARRAYS |
| 1571 PNG_CONST int FARDATA png_pass_dsp_mask[7] = | 1567 PNG_CONST int FARDATA png_pass_dsp_mask[7] = |
| 1572 {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff}; | 1568 {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff}; |
| 1573 #endif | 1569 #endif |
| 1574 if(png_ptr == NULL) return; | 1570 if (png_ptr == NULL) return; |
| 1575 if (new_row != NULL) /* new_row must == png_ptr->row_buf here. */ | 1571 if (new_row != NULL) /* new_row must == png_ptr->row_buf here. */ |
| 1576 png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]); | 1572 png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]); |
| 1577 } | 1573 } |
| 1578 | 1574 |
| 1579 void PNGAPI | 1575 void PNGAPI |
| 1580 png_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr, | 1576 png_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr, |
| 1581 png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, | 1577 png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, |
| 1582 png_progressive_end_ptr end_fn) | 1578 png_progressive_end_ptr end_fn) |
| 1583 { | 1579 { |
| 1584 if(png_ptr == NULL) return; | 1580 if (png_ptr == NULL) return; |
| 1585 png_ptr->info_fn = info_fn; | 1581 png_ptr->info_fn = info_fn; |
| 1586 png_ptr->row_fn = row_fn; | 1582 png_ptr->row_fn = row_fn; |
| 1587 png_ptr->end_fn = end_fn; | 1583 png_ptr->end_fn = end_fn; |
| 1588 | 1584 |
| 1589 png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer); | 1585 png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer); |
| 1590 } | 1586 } |
| 1591 | 1587 |
| 1592 png_voidp PNGAPI | 1588 png_voidp PNGAPI |
| 1593 png_get_progressive_ptr(png_structp png_ptr) | 1589 png_get_progressive_ptr(png_structp png_ptr) |
| 1594 { | 1590 { |
| 1595 if(png_ptr == NULL) return (NULL); | 1591 if (png_ptr == NULL) return (NULL); |
| 1596 return png_ptr->io_ptr; | 1592 return png_ptr->io_ptr; |
| 1597 } | 1593 } |
| 1598 #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ | 1594 #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ |
| OLD | NEW |