16#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
19#define PNG_READ_SIG_MODE 0
20#define PNG_READ_CHUNK_MODE 1
21#define PNG_READ_IDAT_MODE 2
22#define PNG_READ_tEXt_MODE 4
23#define PNG_READ_zTXt_MODE 5
24#define PNG_READ_DONE_MODE 6
25#define PNG_READ_iTXt_MODE 7
26#define PNG_ERROR_MODE 8
28#define PNG_PUSH_SAVE_BUFFER_IF_FULL \
29if (png_ptr->push_length + 4 > png_ptr->buffer_size) \
30 { png_push_save_buffer(png_ptr); return; }
31#define PNG_PUSH_SAVE_BUFFER_IF_LT(N) \
32if (png_ptr->buffer_size < N) \
33 { png_push_save_buffer(png_ptr); return; }
63 size_t remaining =
png_ptr->buffer_size;
69 if (
png_ptr->save_buffer_size < remaining)
70 return remaining -
png_ptr->save_buffer_size;
86"png_process_data_skip is not implemented in any current version of libpng");
101 case PNG_READ_SIG_MODE:
107 case PNG_READ_CHUNK_MODE:
113 case PNG_READ_IDAT_MODE:
136 size_t num_checked =
png_ptr->sig_bytes;
137 size_t num_to_check = 8 - num_checked;
139 if (
png_ptr->buffer_size < num_to_check)
141 num_to_check =
png_ptr->buffer_size;
146 png_ptr->sig_bytes = (png_byte)(
png_ptr->sig_bytes + num_to_check);
148 if (png_sig_cmp(
info_ptr->signature, num_checked, num_to_check))
150 if (num_checked < 4 &&
151 png_sig_cmp(
info_ptr->signature, num_checked, num_to_check - 4))
152 png_error(
png_ptr,
"Not a PNG file");
155 png_error(
png_ptr,
"PNG file corrupted by ASCII conversion");
161 png_ptr->process_mode = PNG_READ_CHUNK_MODE;
170#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
182 png_byte chunk_length[4];
183 png_byte chunk_tag[4];
185 PNG_PUSH_SAVE_BUFFER_IF_LT(8)
186 png_push_fill_buffer(
png_ptr, chunk_length, 4);
189 png_crc_read(
png_ptr, chunk_tag, 4);
196 chunk_name =
png_ptr->chunk_name;
208 png_error(
png_ptr,
"Missing IHDR before IDAT");
212 png_error(
png_ptr,
"Missing PLTE before IDAT");
214 png_ptr->process_mode = PNG_READ_IDAT_MODE;
224 png_benign_error(
png_ptr,
"Too many IDATs found");
229 if (
png_ptr->push_length != 13)
230 png_error(
png_ptr,
"Invalid IHDR length");
232 PNG_PUSH_SAVE_BUFFER_IF_FULL
238 PNG_PUSH_SAVE_BUFFER_IF_FULL
241 png_ptr->process_mode = PNG_READ_DONE_MODE;
245#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
246 else if ((keep = png_chunk_unknown_handling(
png_ptr, chunk_name)) != 0)
248 PNG_PUSH_SAVE_BUFFER_IF_FULL
258 PNG_PUSH_SAVE_BUFFER_IF_FULL
265 png_ptr->process_mode = PNG_READ_IDAT_MODE;
274#ifdef PNG_READ_gAMA_SUPPORTED
277 PNG_PUSH_SAVE_BUFFER_IF_FULL
282#ifdef PNG_READ_sBIT_SUPPORTED
285 PNG_PUSH_SAVE_BUFFER_IF_FULL
290#ifdef PNG_READ_cHRM_SUPPORTED
293 PNG_PUSH_SAVE_BUFFER_IF_FULL
298#ifdef PNG_READ_sRGB_SUPPORTED
301 PNG_PUSH_SAVE_BUFFER_IF_FULL
306#ifdef PNG_READ_iCCP_SUPPORTED
309 PNG_PUSH_SAVE_BUFFER_IF_FULL
314#ifdef PNG_READ_sPLT_SUPPORTED
317 PNG_PUSH_SAVE_BUFFER_IF_FULL
322#ifdef PNG_READ_tRNS_SUPPORTED
325 PNG_PUSH_SAVE_BUFFER_IF_FULL
330#ifdef PNG_READ_bKGD_SUPPORTED
333 PNG_PUSH_SAVE_BUFFER_IF_FULL
338#ifdef PNG_READ_hIST_SUPPORTED
341 PNG_PUSH_SAVE_BUFFER_IF_FULL
346#ifdef PNG_READ_pHYs_SUPPORTED
349 PNG_PUSH_SAVE_BUFFER_IF_FULL
354#ifdef PNG_READ_oFFs_SUPPORTED
357 PNG_PUSH_SAVE_BUFFER_IF_FULL
362#ifdef PNG_READ_pCAL_SUPPORTED
365 PNG_PUSH_SAVE_BUFFER_IF_FULL
370#ifdef PNG_READ_sCAL_SUPPORTED
373 PNG_PUSH_SAVE_BUFFER_IF_FULL
378#ifdef PNG_READ_tIME_SUPPORTED
381 PNG_PUSH_SAVE_BUFFER_IF_FULL
386#ifdef PNG_READ_tEXt_SUPPORTED
389 PNG_PUSH_SAVE_BUFFER_IF_FULL
394#ifdef PNG_READ_zTXt_SUPPORTED
397 PNG_PUSH_SAVE_BUFFER_IF_FULL
402#ifdef PNG_READ_iTXt_SUPPORTED
405 PNG_PUSH_SAVE_BUFFER_IF_FULL
412 PNG_PUSH_SAVE_BUFFER_IF_FULL
417 png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
429 if (
png_ptr->save_buffer_size != 0)
433 if (length < png_ptr->save_buffer_size)
437 save_size =
png_ptr->save_buffer_size;
442 png_ptr->buffer_size -= save_size;
443 png_ptr->save_buffer_size -= save_size;
444 png_ptr->save_buffer_ptr += save_size;
450 if (length < png_ptr->current_buffer_size)
454 save_size =
png_ptr->current_buffer_size;
457 png_ptr->buffer_size -= save_size;
458 png_ptr->current_buffer_size -= save_size;
459 png_ptr->current_buffer_ptr += save_size;
466 if (
png_ptr->save_buffer_size != 0)
474 istop =
png_ptr->save_buffer_size;
476 i < istop;
i++,
sp++, dp++)
489 (
png_ptr->current_buffer_size + 256))
491 png_error(
png_ptr,
"Potential overflow of save_buffer");
494 new_max =
png_ptr->save_buffer_size +
png_ptr->current_buffer_size + 256;
495 old_buffer =
png_ptr->save_buffer;
502 png_error(
png_ptr,
"Insufficient memory for save_buffer");
507 else if (
png_ptr->save_buffer_size)
508 png_error(
png_ptr,
"save_buffer error");
510 png_ptr->save_buffer_max = new_max;
512 if (
png_ptr->current_buffer_size)
517 png_ptr->current_buffer_size = 0;
525 size_t buffer_length)
528 png_ptr->current_buffer_size = buffer_length;
538 png_byte chunk_length[4];
539 png_byte chunk_tag[4];
542 PNG_PUSH_SAVE_BUFFER_IF_LT(8)
543 png_push_fill_buffer(
png_ptr, chunk_length, 4);
546 png_crc_read(
png_ptr, chunk_tag, 4);
552 png_ptr->process_mode = PNG_READ_CHUNK_MODE;
555 png_error(
png_ptr,
"Not enough compressed data");
565 size_t save_size =
png_ptr->save_buffer_size;
574 if (idat_size < save_size)
575 save_size = (
size_t)idat_size;
582 png_process_IDAT_data(
png_ptr,
png_ptr->save_buffer_ptr, save_size);
584 png_ptr->idat_size -= idat_size;
585 png_ptr->buffer_size -= save_size;
586 png_ptr->save_buffer_size -= save_size;
587 png_ptr->save_buffer_ptr += save_size;
592 size_t save_size =
png_ptr->current_buffer_size;
600 if (idat_size < save_size)
601 save_size = (
size_t)idat_size;
606 png_calculate_crc(
png_ptr,
png_ptr->current_buffer_ptr, save_size);
608 png_process_IDAT_data(
png_ptr,
png_ptr->current_buffer_ptr, save_size);
610 png_ptr->idat_size -= idat_size;
611 png_ptr->buffer_size -= save_size;
612 png_ptr->current_buffer_size -= save_size;
613 png_ptr->current_buffer_ptr += save_size;
618 PNG_PUSH_SAVE_BUFFER_IF_LT(4)
628 size_t buffer_length)
632 png_error(
png_ptr,
"No IDAT data (internal error)");
645 while (
png_ptr->zstream.avail_in > 0 &&
655 if (!(
png_ptr->zstream.avail_out > 0))
685 png_warning(
png_ptr,
"Truncated compressed data in IDAT");
690 png_benign_error(
png_ptr,
"IDAT: ADLER32 checksum mismatch");
692 png_error(
png_ptr,
"Decompression error in IDAT");
710 png_warning(
png_ptr,
"Extra compressed data in IDAT");
721 if (
png_ptr->zstream.avail_out == 0)
734 if (
png_ptr->zstream.avail_in > 0)
735 png_warning(
png_ptr,
"Extra compression data in IDAT");
757 png_error(
png_ptr,
"bad adaptive filter value");
767#ifdef PNG_READ_TRANSFORMS_SUPPORTED
768 if (
png_ptr->transformations != 0)
769 png_do_read_transformations(
png_ptr, &row_info);
773 if (
png_ptr->transformed_pixel_depth == 0)
777 png_error(
png_ptr,
"progressive row overflow");
781 png_error(
png_ptr,
"internal progressive row size calculation error");
784#ifdef PNG_READ_INTERLACING_SUPPORTED
786 if (
png_ptr->interlaced != 0 &&
790 png_do_read_interlace(&row_info,
png_ptr->row_buf + 1,
png_ptr->pass,
801 png_read_push_finish_row(
png_ptr);
809 png_read_push_finish_row(
png_ptr);
818 png_read_push_finish_row(
png_ptr);
825 png_read_push_finish_row(
png_ptr);
837 png_read_push_finish_row(
png_ptr);
845 png_read_push_finish_row(
png_ptr);
859 png_read_push_finish_row(
png_ptr);
865 png_read_push_finish_row(
png_ptr);
873 png_read_push_finish_row(
png_ptr);
887 png_read_push_finish_row(
png_ptr);
895 png_read_push_finish_row(
png_ptr);
909 png_read_push_finish_row(
png_ptr);
915 png_read_push_finish_row(
png_ptr);
921 png_read_push_finish_row(
png_ptr);
934 png_read_push_finish_row(
png_ptr);
940 png_read_push_finish_row(
png_ptr);
950 png_read_push_finish_row(
png_ptr);
956 png_read_push_finish_row(
png_ptr);
964 png_read_push_finish_row(
png_ptr);
971#ifdef PNG_READ_INTERLACING_SUPPORTED
975 static const png_byte png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
978 static const png_byte png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
981 static const png_byte png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
984 static const png_byte png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
996#ifdef PNG_READ_INTERLACING_SUPPORTED
1017 png_pass_inc[
png_ptr->pass] - 1 -
1018 png_pass_start[
png_ptr->pass]) /
1025 png_pass_yinc[
png_ptr->pass] - 1 -
1026 png_pass_ystart[
png_ptr->pass]) /
1056#ifdef PNG_READ_INTERLACING_SUPPORTED
1068 if (new_row !=
NULL)
1069 png_combine_row(
png_ptr, old_row, 1);
1075 png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn,
1076 png_progressive_end_ptr end_fn)
1085 png_set_read_fn(
png_ptr, progressive_ptr, png_push_fill_buffer);
struct png_info_def *typedef unsigned char **typedef struct png_info_def *typedef struct png_info_def *typedef struct png_info_def *typedef unsigned char ** row
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
GLuint GLsizei GLsizei * length
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define memcpy(s1, s2, n)
#define PNG_COLOR_TYPE_PALETTE
#define PNG_FILTER_VALUE_LAST
const png_struct *PNG_RESTRICT png_const_structrp
#define PNG_FILTER_VALUE_NONE
png_info *PNG_RESTRICT png_inforp
#define PNG_HANDLE_CHUNK_AS_DEFAULT
png_struct *PNG_RESTRICT png_structrp
png_const_structrp png_const_inforp info_ptr
const png_byte * png_const_bytep
#define PNG_ROWBYTES(pixel_bits, width)
#define PNG_HAVE_CHUNK_HEADER
#define png_app_warning(pp, s)
#define PNG_INFLATE(pp, flush)
#define PNG_HAVE_CHUNK_AFTER_IDAT
#define PNG_CHUNK_FROM_STRING(s)
#define PNG_FLAG_ZSTREAM_ENDED
wchar_t const *const size_t const buffer_size