zenilib  0.5.3.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
pngpread.c
Go to the documentation of this file.
1 
2 /* pngpread.c - read a png file in push mode
3  *
4  * Last changed in libpng 1.5.9 [February 18, 2012]
5  * Copyright (c) 1998-2011 Glenn Randers-Pehrson
6  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
7  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
8  *
9  * This code is released under the libpng license.
10  * For conditions of distribution and use, see the disclaimer
11  * and license in png.h
12  */
13 
14 #include "pngpriv.h"
15 
16 #ifdef PNG_PROGRESSIVE_READ_SUPPORTED
17 
18 /* Push model modes */
19 #define PNG_READ_SIG_MODE 0
20 #define PNG_READ_CHUNK_MODE 1
21 #define PNG_READ_IDAT_MODE 2
22 #define PNG_SKIP_MODE 3
23 #define PNG_READ_tEXt_MODE 4
24 #define PNG_READ_zTXt_MODE 5
25 #define PNG_READ_DONE_MODE 6
26 #define PNG_READ_iTXt_MODE 7
27 #define PNG_ERROR_MODE 8
28 
29 void PNGAPI
31  png_bytep buffer, png_size_t buffer_size)
32 {
33  if (png_ptr == NULL || info_ptr == NULL)
34  return;
35 
36  png_push_restore_buffer(png_ptr, buffer, buffer_size);
37 
38  while (png_ptr->buffer_size)
39  {
40  png_process_some_data(png_ptr, info_ptr);
41  }
42 }
43 
46 {
47  if (png_ptr != NULL)
48  {
49  /* It's easiest for the caller if we do the save, then the caller doesn't
50  * have to supply the same data again:
51  */
52  if (save)
53  png_push_save_buffer(png_ptr);
54  else
55  {
56  /* This includes any pending saved bytes: */
57  png_size_t remaining = png_ptr->buffer_size;
58  png_ptr->buffer_size = 0;
59 
60  /* So subtract the saved buffer size, unless all the data
61  * is actually 'saved', in which case we just return 0
62  */
63  if (png_ptr->save_buffer_size < remaining)
64  return remaining - png_ptr->save_buffer_size;
65  }
66  }
67 
68  return 0;
69 }
70 
73 {
74  png_uint_32 remaining = 0;
75 
76  if (png_ptr != NULL && png_ptr->process_mode == PNG_SKIP_MODE &&
77  png_ptr->skip_length > 0)
78  {
79  /* At the end of png_process_data the buffer size must be 0 (see the loop
80  * above) so we can detect a broken call here:
81  */
82  if (png_ptr->buffer_size != 0)
83  png_error(png_ptr,
84  "png_process_data_skip called inside png_process_data");
85 
86  /* If is impossible for there to be a saved buffer at this point -
87  * otherwise we could not be in SKIP mode. This will also happen if
88  * png_process_skip is called inside png_process_data (but only very
89  * rarely.)
90  */
91  if (png_ptr->save_buffer_size != 0)
92  png_error(png_ptr, "png_process_data_skip called with saved data");
93 
94  remaining = png_ptr->skip_length;
95  png_ptr->skip_length = 0;
96  png_ptr->process_mode = PNG_READ_CHUNK_MODE;
97  }
98 
99  return remaining;
100 }
101 
102 /* What we do with the incoming data depends on what we were previously
103  * doing before we ran out of data...
104  */
105 void /* PRIVATE */
107 {
108  if (png_ptr == NULL)
109  return;
110 
111  switch (png_ptr->process_mode)
112  {
113  case PNG_READ_SIG_MODE:
114  {
115  png_push_read_sig(png_ptr, info_ptr);
116  break;
117  }
118 
119  case PNG_READ_CHUNK_MODE:
120  {
121  png_push_read_chunk(png_ptr, info_ptr);
122  break;
123  }
124 
125  case PNG_READ_IDAT_MODE:
126  {
127  png_push_read_IDAT(png_ptr);
128  break;
129  }
130 
131 #ifdef PNG_READ_tEXt_SUPPORTED
132  case PNG_READ_tEXt_MODE:
133  {
134  png_push_read_tEXt(png_ptr, info_ptr);
135  break;
136  }
137 
138 #endif
139 #ifdef PNG_READ_zTXt_SUPPORTED
140  case PNG_READ_zTXt_MODE:
141  {
142  png_push_read_zTXt(png_ptr, info_ptr);
143  break;
144  }
145 
146 #endif
147 #ifdef PNG_READ_iTXt_SUPPORTED
148  case PNG_READ_iTXt_MODE:
149  {
150  png_push_read_iTXt(png_ptr, info_ptr);
151  break;
152  }
153 
154 #endif
155  case PNG_SKIP_MODE:
156  {
157  png_push_crc_finish(png_ptr);
158  break;
159  }
160 
161  default:
162  {
163  png_ptr->buffer_size = 0;
164  break;
165  }
166  }
167 }
168 
169 /* Read any remaining signature bytes from the stream and compare them with
170  * the correct PNG signature. It is possible that this routine is called
171  * with bytes already read from the signature, either because they have been
172  * checked by the calling application, or because of multiple calls to this
173  * routine.
174  */
175 void /* PRIVATE */
177 {
178  png_size_t num_checked = png_ptr->sig_bytes,
179  num_to_check = 8 - num_checked;
180 
181  if (png_ptr->buffer_size < num_to_check)
182  {
183  num_to_check = png_ptr->buffer_size;
184  }
185 
186  png_push_fill_buffer(png_ptr, &(info_ptr->signature[num_checked]),
187  num_to_check);
188  png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes + num_to_check);
189 
190  if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check))
191  {
192  if (num_checked < 4 &&
193  png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4))
194  png_error(png_ptr, "Not a PNG file");
195 
196  else
197  png_error(png_ptr, "PNG file corrupted by ASCII conversion");
198  }
199  else
200  {
201  if (png_ptr->sig_bytes >= 8)
202  {
203  png_ptr->process_mode = PNG_READ_CHUNK_MODE;
204  }
205  }
206 }
207 
208 void /* PRIVATE */
210 {
211  png_uint_32 chunk_name;
212 
213  /* First we make sure we have enough data for the 4 byte chunk name
214  * and the 4 byte chunk length before proceeding with decoding the
215  * chunk data. To fully decode each of these chunks, we also make
216  * sure we have enough data in the buffer for the 4 byte CRC at the
217  * end of every chunk (except IDAT, which is handled separately).
218  */
219  if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
220  {
221  png_byte chunk_length[4];
222  png_byte chunk_tag[4];
223 
224  if (png_ptr->buffer_size < 8)
225  {
226  png_push_save_buffer(png_ptr);
227  return;
228  }
229 
230  png_push_fill_buffer(png_ptr, chunk_length, 4);
231  png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length);
232  png_reset_crc(png_ptr);
233  png_crc_read(png_ptr, chunk_tag, 4);
234  png_ptr->chunk_name = PNG_CHUNK_FROM_STRING(chunk_tag);
235  png_check_chunk_name(png_ptr, png_ptr->chunk_name);
236  png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
237  }
238 
239  chunk_name = png_ptr->chunk_name;
240 
241  if (chunk_name == png_IDAT)
242  {
243  /* This is here above the if/else case statement below because if the
244  * unknown handling marks 'IDAT' as unknown then the IDAT handling case is
245  * completely skipped.
246  *
247  * TODO: there must be a better way of doing this.
248  */
249  if (png_ptr->mode & PNG_AFTER_IDAT)
250  png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
251  }
252 
253  if (chunk_name == png_IHDR)
254  {
255  if (png_ptr->push_length != 13)
256  png_error(png_ptr, "Invalid IHDR length");
257 
258  if (png_ptr->push_length + 4 > png_ptr->buffer_size)
259  {
260  png_push_save_buffer(png_ptr);
261  return;
262  }
263 
264  png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length);
265  }
266 
267  else if (chunk_name == png_IEND)
268  {
269  if (png_ptr->push_length + 4 > png_ptr->buffer_size)
270  {
271  png_push_save_buffer(png_ptr);
272  return;
273  }
274 
275  png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length);
276 
277  png_ptr->process_mode = PNG_READ_DONE_MODE;
278  png_push_have_end(png_ptr, info_ptr);
279  }
280 
281 #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
282  else if (png_chunk_unknown_handling(png_ptr, chunk_name))
283  {
284  if (png_ptr->push_length + 4 > png_ptr->buffer_size)
285  {
286  png_push_save_buffer(png_ptr);
287  return;
288  }
289 
290  if (chunk_name == png_IDAT)
291  png_ptr->mode |= PNG_HAVE_IDAT;
292 
293  png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length);
294 
295  if (chunk_name == png_PLTE)
296  png_ptr->mode |= PNG_HAVE_PLTE;
297 
298  else if (chunk_name == png_IDAT)
299  {
300  if (!(png_ptr->mode & PNG_HAVE_IHDR))
301  png_error(png_ptr, "Missing IHDR before IDAT");
302 
303  else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
304  !(png_ptr->mode & PNG_HAVE_PLTE))
305  png_error(png_ptr, "Missing PLTE before IDAT");
306  }
307  }
308 
309 #endif
310  else if (chunk_name == png_PLTE)
311  {
312  if (png_ptr->push_length + 4 > png_ptr->buffer_size)
313  {
314  png_push_save_buffer(png_ptr);
315  return;
316  }
317  png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length);
318  }
319 
320  else if (chunk_name == png_IDAT)
321  {
322  /* If we reach an IDAT chunk, this means we have read all of the
323  * header chunks, and we can start reading the image (or if this
324  * is called after the image has been read - we have an error).
325  */
326 
327  if (!(png_ptr->mode & PNG_HAVE_IHDR))
328  png_error(png_ptr, "Missing IHDR before IDAT");
329 
330  else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
331  !(png_ptr->mode & PNG_HAVE_PLTE))
332  png_error(png_ptr, "Missing PLTE before IDAT");
333 
334  if (png_ptr->mode & PNG_HAVE_IDAT)
335  {
336  if (!(png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT))
337  if (png_ptr->push_length == 0)
338  return;
339 
340  if (png_ptr->mode & PNG_AFTER_IDAT)
341  png_benign_error(png_ptr, "Too many IDATs found");
342  }
343 
344  png_ptr->idat_size = png_ptr->push_length;
345  png_ptr->mode |= PNG_HAVE_IDAT;
346  png_ptr->process_mode = PNG_READ_IDAT_MODE;
347  png_push_have_info(png_ptr, info_ptr);
348  png_ptr->zstream.avail_out =
349  (uInt) PNG_ROWBYTES(png_ptr->pixel_depth,
350  png_ptr->iwidth) + 1;
351  png_ptr->zstream.next_out = png_ptr->row_buf;
352  return;
353  }
354 
355 #ifdef PNG_READ_gAMA_SUPPORTED
356  else if (png_ptr->chunk_name == png_gAMA)
357  {
358  if (png_ptr->push_length + 4 > png_ptr->buffer_size)
359  {
360  png_push_save_buffer(png_ptr);
361  return;
362  }
363 
364  png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length);
365  }
366 
367 #endif
368 #ifdef PNG_READ_sBIT_SUPPORTED
369  else if (png_ptr->chunk_name == png_sBIT)
370  {
371  if (png_ptr->push_length + 4 > png_ptr->buffer_size)
372  {
373  png_push_save_buffer(png_ptr);
374  return;
375  }
376 
377  png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length);
378  }
379 
380 #endif
381 #ifdef PNG_READ_cHRM_SUPPORTED
382  else if (png_ptr->chunk_name == png_cHRM)
383  {
384  if (png_ptr->push_length + 4 > png_ptr->buffer_size)
385  {
386  png_push_save_buffer(png_ptr);
387  return;
388  }
389 
390  png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length);
391  }
392 
393 #endif
394 #ifdef PNG_READ_sRGB_SUPPORTED
395  else if (chunk_name == png_sRGB)
396  {
397  if (png_ptr->push_length + 4 > png_ptr->buffer_size)
398  {
399  png_push_save_buffer(png_ptr);
400  return;
401  }
402 
403  png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length);
404  }
405 
406 #endif
407 #ifdef PNG_READ_iCCP_SUPPORTED
408  else if (png_ptr->chunk_name == png_iCCP)
409  {
410  if (png_ptr->push_length + 4 > png_ptr->buffer_size)
411  {
412  png_push_save_buffer(png_ptr);
413  return;
414  }
415 
416  png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length);
417  }
418 
419 #endif
420 #ifdef PNG_READ_sPLT_SUPPORTED
421  else if (chunk_name == png_sPLT)
422  {
423  if (png_ptr->push_length + 4 > png_ptr->buffer_size)
424  {
425  png_push_save_buffer(png_ptr);
426  return;
427  }
428 
429  png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length);
430  }
431 
432 #endif
433 #ifdef PNG_READ_tRNS_SUPPORTED
434  else if (chunk_name == png_tRNS)
435  {
436  if (png_ptr->push_length + 4 > png_ptr->buffer_size)
437  {
438  png_push_save_buffer(png_ptr);
439  return;
440  }
441 
442  png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length);
443  }
444 
445 #endif
446 #ifdef PNG_READ_bKGD_SUPPORTED
447  else if (chunk_name == png_bKGD)
448  {
449  if (png_ptr->push_length + 4 > png_ptr->buffer_size)
450  {
451  png_push_save_buffer(png_ptr);
452  return;
453  }
454 
455  png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length);
456  }
457 
458 #endif
459 #ifdef PNG_READ_hIST_SUPPORTED
460  else if (chunk_name == png_hIST)
461  {
462  if (png_ptr->push_length + 4 > png_ptr->buffer_size)
463  {
464  png_push_save_buffer(png_ptr);
465  return;
466  }
467 
468  png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length);
469  }
470 
471 #endif
472 #ifdef PNG_READ_pHYs_SUPPORTED
473  else if (chunk_name == png_pHYs)
474  {
475  if (png_ptr->push_length + 4 > png_ptr->buffer_size)
476  {
477  png_push_save_buffer(png_ptr);
478  return;
479  }
480 
481  png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length);
482  }
483 
484 #endif
485 #ifdef PNG_READ_oFFs_SUPPORTED
486  else if (chunk_name == png_oFFs)
487  {
488  if (png_ptr->push_length + 4 > png_ptr->buffer_size)
489  {
490  png_push_save_buffer(png_ptr);
491  return;
492  }
493 
494  png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length);
495  }
496 #endif
497 
498 #ifdef PNG_READ_pCAL_SUPPORTED
499  else if (chunk_name == png_pCAL)
500  {
501  if (png_ptr->push_length + 4 > png_ptr->buffer_size)
502  {
503  png_push_save_buffer(png_ptr);
504  return;
505  }
506 
507  png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length);
508  }
509 
510 #endif
511 #ifdef PNG_READ_sCAL_SUPPORTED
512  else if (chunk_name == png_sCAL)
513  {
514  if (png_ptr->push_length + 4 > png_ptr->buffer_size)
515  {
516  png_push_save_buffer(png_ptr);
517  return;
518  }
519 
520  png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length);
521  }
522 
523 #endif
524 #ifdef PNG_READ_tIME_SUPPORTED
525  else if (chunk_name == png_tIME)
526  {
527  if (png_ptr->push_length + 4 > png_ptr->buffer_size)
528  {
529  png_push_save_buffer(png_ptr);
530  return;
531  }
532 
533  png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length);
534  }
535 
536 #endif
537 #ifdef PNG_READ_tEXt_SUPPORTED
538  else if (chunk_name == png_tEXt)
539  {
540  if (png_ptr->push_length + 4 > png_ptr->buffer_size)
541  {
542  png_push_save_buffer(png_ptr);
543  return;
544  }
545 
546  png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length);
547  }
548 
549 #endif
550 #ifdef PNG_READ_zTXt_SUPPORTED
551  else if (chunk_name == png_zTXt)
552  {
553  if (png_ptr->push_length + 4 > png_ptr->buffer_size)
554  {
555  png_push_save_buffer(png_ptr);
556  return;
557  }
558 
559  png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length);
560  }
561 
562 #endif
563 #ifdef PNG_READ_iTXt_SUPPORTED
564  else if (chunk_name == png_iTXt)
565  {
566  if (png_ptr->push_length + 4 > png_ptr->buffer_size)
567  {
568  png_push_save_buffer(png_ptr);
569  return;
570  }
571 
572  png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length);
573  }
574 
575 #endif
576  else
577  {
578  if (png_ptr->push_length + 4 > png_ptr->buffer_size)
579  {
580  png_push_save_buffer(png_ptr);
581  return;
582  }
583  png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length);
584  }
585 
586  png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
587 }
588 
589 void /* PRIVATE */
591 {
592  png_ptr->process_mode = PNG_SKIP_MODE;
593  png_ptr->skip_length = skip;
594 }
595 
596 void /* PRIVATE */
598 {
599  if (png_ptr->skip_length && png_ptr->save_buffer_size)
600  {
601  png_size_t save_size = png_ptr->save_buffer_size;
602  png_uint_32 skip_length = png_ptr->skip_length;
603 
604  /* We want the smaller of 'skip_length' and 'save_buffer_size', but
605  * they are of different types and we don't know which variable has the
606  * fewest bits. Carefully select the smaller and cast it to the type of
607  * the larger - this cannot overflow. Do not cast in the following test
608  * - it will break on either 16 or 64 bit platforms.
609  */
610  if (skip_length < save_size)
611  save_size = (png_size_t)skip_length;
612 
613  else
614  skip_length = (png_uint_32)save_size;
615 
616  png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size);
617 
618  png_ptr->skip_length -= skip_length;
619  png_ptr->buffer_size -= save_size;
620  png_ptr->save_buffer_size -= save_size;
621  png_ptr->save_buffer_ptr += save_size;
622  }
623  if (png_ptr->skip_length && png_ptr->current_buffer_size)
624  {
625  png_size_t save_size = png_ptr->current_buffer_size;
626  png_uint_32 skip_length = png_ptr->skip_length;
627 
628  /* We want the smaller of 'skip_length' and 'current_buffer_size', here,
629  * the same problem exists as above and the same solution.
630  */
631  if (skip_length < save_size)
632  save_size = (png_size_t)skip_length;
633 
634  else
635  skip_length = (png_uint_32)save_size;
636 
637  png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size);
638 
639  png_ptr->skip_length -= skip_length;
640  png_ptr->buffer_size -= save_size;
641  png_ptr->current_buffer_size -= save_size;
642  png_ptr->current_buffer_ptr += save_size;
643  }
644  if (!png_ptr->skip_length)
645  {
646  if (png_ptr->buffer_size < 4)
647  {
648  png_push_save_buffer(png_ptr);
649  return;
650  }
651 
652  png_crc_finish(png_ptr, 0);
653  png_ptr->process_mode = PNG_READ_CHUNK_MODE;
654  }
655 }
656 
657 void PNGCBAPI
659 {
660  png_bytep ptr;
661 
662  if (png_ptr == NULL)
663  return;
664 
665  ptr = buffer;
666  if (png_ptr->save_buffer_size)
667  {
668  png_size_t save_size;
669 
670  if (length < png_ptr->save_buffer_size)
671  save_size = length;
672 
673  else
674  save_size = png_ptr->save_buffer_size;
675 
676  png_memcpy(ptr, png_ptr->save_buffer_ptr, save_size);
677  length -= save_size;
678  ptr += save_size;
679  png_ptr->buffer_size -= save_size;
680  png_ptr->save_buffer_size -= save_size;
681  png_ptr->save_buffer_ptr += save_size;
682  }
683  if (length && png_ptr->current_buffer_size)
684  {
685  png_size_t save_size;
686 
687  if (length < png_ptr->current_buffer_size)
688  save_size = length;
689 
690  else
691  save_size = png_ptr->current_buffer_size;
692 
693  png_memcpy(ptr, png_ptr->current_buffer_ptr, save_size);
694  png_ptr->buffer_size -= save_size;
695  png_ptr->current_buffer_size -= save_size;
696  png_ptr->current_buffer_ptr += save_size;
697  }
698 }
699 
700 void /* PRIVATE */
702 {
703  if (png_ptr->save_buffer_size)
704  {
705  if (png_ptr->save_buffer_ptr != png_ptr->save_buffer)
706  {
707  png_size_t i, istop;
708  png_bytep sp;
709  png_bytep dp;
710 
711  istop = png_ptr->save_buffer_size;
712  for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer;
713  i < istop; i++, sp++, dp++)
714  {
715  *dp = *sp;
716  }
717  }
718  }
719  if (png_ptr->save_buffer_size + png_ptr->current_buffer_size >
720  png_ptr->save_buffer_max)
721  {
722  png_size_t new_max;
723  png_bytep old_buffer;
724 
725  if (png_ptr->save_buffer_size > PNG_SIZE_MAX -
726  (png_ptr->current_buffer_size + 256))
727  {
728  png_error(png_ptr, "Potential overflow of save_buffer");
729  }
730 
731  new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256;
732  old_buffer = png_ptr->save_buffer;
733  png_ptr->save_buffer = (png_bytep)png_malloc_warn(png_ptr, new_max);
734 
735  if (png_ptr->save_buffer == NULL)
736  {
737  png_free(png_ptr, old_buffer);
738  png_error(png_ptr, "Insufficient memory for save_buffer");
739  }
740 
741  png_memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size);
742  png_free(png_ptr, old_buffer);
743  png_ptr->save_buffer_max = new_max;
744  }
745  if (png_ptr->current_buffer_size)
746  {
747  png_memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size,
748  png_ptr->current_buffer_ptr, png_ptr->current_buffer_size);
749  png_ptr->save_buffer_size += png_ptr->current_buffer_size;
750  png_ptr->current_buffer_size = 0;
751  }
752  png_ptr->save_buffer_ptr = png_ptr->save_buffer;
753  png_ptr->buffer_size = 0;
754 }
755 
756 void /* PRIVATE */
758  png_size_t buffer_length)
759 {
760  png_ptr->current_buffer = buffer;
761  png_ptr->current_buffer_size = buffer_length;
762  png_ptr->buffer_size = buffer_length + png_ptr->save_buffer_size;
763  png_ptr->current_buffer_ptr = png_ptr->current_buffer;
764 }
765 
766 void /* PRIVATE */
768 {
769  if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
770  {
771  png_byte chunk_length[4];
772  png_byte chunk_tag[4];
773 
774  /* TODO: this code can be commoned up with the same code in push_read */
775  if (png_ptr->buffer_size < 8)
776  {
777  png_push_save_buffer(png_ptr);
778  return;
779  }
780 
781  png_push_fill_buffer(png_ptr, chunk_length, 4);
782  png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length);
783  png_reset_crc(png_ptr);
784  png_crc_read(png_ptr, chunk_tag, 4);
785  png_ptr->chunk_name = PNG_CHUNK_FROM_STRING(chunk_tag);
786  png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
787 
788  if (png_ptr->chunk_name != png_IDAT)
789  {
790  png_ptr->process_mode = PNG_READ_CHUNK_MODE;
791 
792  if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
793  png_error(png_ptr, "Not enough compressed data");
794 
795  return;
796  }
797 
798  png_ptr->idat_size = png_ptr->push_length;
799  }
800 
801  if (png_ptr->idat_size && png_ptr->save_buffer_size)
802  {
803  png_size_t save_size = png_ptr->save_buffer_size;
804  png_uint_32 idat_size = png_ptr->idat_size;
805 
806  /* We want the smaller of 'idat_size' and 'current_buffer_size', but they
807  * are of different types and we don't know which variable has the fewest
808  * bits. Carefully select the smaller and cast it to the type of the
809  * larger - this cannot overflow. Do not cast in the following test - it
810  * will break on either 16 or 64 bit platforms.
811  */
812  if (idat_size < save_size)
813  save_size = (png_size_t)idat_size;
814 
815  else
816  idat_size = (png_uint_32)save_size;
817 
818  png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size);
819 
820  png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size);
821 
822  png_ptr->idat_size -= idat_size;
823  png_ptr->buffer_size -= save_size;
824  png_ptr->save_buffer_size -= save_size;
825  png_ptr->save_buffer_ptr += save_size;
826  }
827 
828  if (png_ptr->idat_size && png_ptr->current_buffer_size)
829  {
830  png_size_t save_size = png_ptr->current_buffer_size;
831  png_uint_32 idat_size = png_ptr->idat_size;
832 
833  /* We want the smaller of 'idat_size' and 'current_buffer_size', but they
834  * are of different types and we don't know which variable has the fewest
835  * bits. Carefully select the smaller and cast it to the type of the
836  * larger - this cannot overflow.
837  */
838  if (idat_size < save_size)
839  save_size = (png_size_t)idat_size;
840 
841  else
842  idat_size = (png_uint_32)save_size;
843 
844  png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size);
845 
846  png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size);
847 
848  png_ptr->idat_size -= idat_size;
849  png_ptr->buffer_size -= save_size;
850  png_ptr->current_buffer_size -= save_size;
851  png_ptr->current_buffer_ptr += save_size;
852  }
853  if (!png_ptr->idat_size)
854  {
855  if (png_ptr->buffer_size < 4)
856  {
857  png_push_save_buffer(png_ptr);
858  return;
859  }
860 
861  png_crc_finish(png_ptr, 0);
862  png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
863  png_ptr->mode |= PNG_AFTER_IDAT;
864  }
865 }
866 
867 void /* PRIVATE */
869  png_size_t buffer_length)
870 {
871  /* The caller checks for a non-zero buffer length. */
872  if (!(buffer_length > 0) || buffer == NULL)
873  png_error(png_ptr, "No IDAT data (internal error)");
874 
875  /* This routine must process all the data it has been given
876  * before returning, calling the row callback as required to
877  * handle the uncompressed results.
878  */
879  png_ptr->zstream.next_in = buffer;
880  png_ptr->zstream.avail_in = (uInt)buffer_length;
881 
882  /* Keep going until the decompressed data is all processed
883  * or the stream marked as finished.
884  */
885  while (png_ptr->zstream.avail_in > 0 &&
886  !(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
887  {
888  int ret;
889 
890  /* We have data for zlib, but we must check that zlib
891  * has someplace to put the results. It doesn't matter
892  * if we don't expect any results -- it may be the input
893  * data is just the LZ end code.
894  */
895  if (!(png_ptr->zstream.avail_out > 0))
896  {
897  png_ptr->zstream.avail_out =
898  (uInt) PNG_ROWBYTES(png_ptr->pixel_depth,
899  png_ptr->iwidth) + 1;
900 
901  png_ptr->zstream.next_out = png_ptr->row_buf;
902  }
903 
904  /* Using Z_SYNC_FLUSH here means that an unterminated
905  * LZ stream (a stream with a missing end code) can still
906  * be handled, otherwise (Z_NO_FLUSH) a future zlib
907  * implementation might defer output and therefore
908  * change the current behavior (see comments in inflate.c
909  * for why this doesn't happen at present with zlib 1.2.5).
910  */
911  ret = inflate(&png_ptr->zstream, Z_SYNC_FLUSH);
912 
913  /* Check for any failure before proceeding. */
914  if (ret != Z_OK && ret != Z_STREAM_END)
915  {
916  /* Terminate the decompression. */
917  png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
918 
919  /* This may be a truncated stream (missing or
920  * damaged end code). Treat that as a warning.
921  */
922  if (png_ptr->row_number >= png_ptr->num_rows ||
923  png_ptr->pass > 6)
924  png_warning(png_ptr, "Truncated compressed data in IDAT");
925 
926  else
927  png_error(png_ptr, "Decompression error in IDAT");
928 
929  /* Skip the check on unprocessed input */
930  return;
931  }
932 
933  /* Did inflate output any data? */
934  if (png_ptr->zstream.next_out != png_ptr->row_buf)
935  {
936  /* Is this unexpected data after the last row?
937  * If it is, artificially terminate the LZ output
938  * here.
939  */
940  if (png_ptr->row_number >= png_ptr->num_rows ||
941  png_ptr->pass > 6)
942  {
943  /* Extra data. */
944  png_warning(png_ptr, "Extra compressed data in IDAT");
945  png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
946 
947  /* Do no more processing; skip the unprocessed
948  * input check below.
949  */
950  return;
951  }
952 
953  /* Do we have a complete row? */
954  if (png_ptr->zstream.avail_out == 0)
955  png_push_process_row(png_ptr);
956  }
957 
958  /* And check for the end of the stream. */
959  if (ret == Z_STREAM_END)
960  png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
961  }
962 
963  /* All the data should have been processed, if anything
964  * is left at this point we have bytes of IDAT data
965  * after the zlib end code.
966  */
967  if (png_ptr->zstream.avail_in > 0)
968  png_warning(png_ptr, "Extra compression data in IDAT");
969 }
970 
971 void /* PRIVATE */
973 {
974  /* 1.5.6: row_info moved out of png_struct to a local here. */
975  png_row_info row_info;
976 
977  row_info.width = png_ptr->iwidth; /* NOTE: width of current interlaced row */
978  row_info.color_type = png_ptr->color_type;
979  row_info.bit_depth = png_ptr->bit_depth;
980  row_info.channels = png_ptr->channels;
981  row_info.pixel_depth = png_ptr->pixel_depth;
982  row_info.rowbytes = PNG_ROWBYTES(row_info.pixel_depth, row_info.width);
983 
984  if (png_ptr->row_buf[0] > PNG_FILTER_VALUE_NONE)
985  {
986  if (png_ptr->row_buf[0] < PNG_FILTER_VALUE_LAST)
987  png_read_filter_row(png_ptr, &row_info, png_ptr->row_buf + 1,
988  png_ptr->prev_row + 1, png_ptr->row_buf[0]);
989  else
990  png_error(png_ptr, "bad adaptive filter value");
991  }
992 
993  /* libpng 1.5.6: the following line was copying png_ptr->rowbytes before
994  * 1.5.6, while the buffer really is this big in current versions of libpng
995  * it may not be in the future, so this was changed just to copy the
996  * interlaced row count:
997  */
998  png_memcpy(png_ptr->prev_row, png_ptr->row_buf, row_info.rowbytes + 1);
999 
1000 #ifdef PNG_READ_TRANSFORMS_SUPPORTED
1001  if (png_ptr->transformations)
1002  png_do_read_transformations(png_ptr, &row_info);
1003 #endif
1004 
1005  /* The transformed pixel depth should match the depth now in row_info. */
1006  if (png_ptr->transformed_pixel_depth == 0)
1007  {
1008  png_ptr->transformed_pixel_depth = row_info.pixel_depth;
1009  if (row_info.pixel_depth > png_ptr->maximum_pixel_depth)
1010  png_error(png_ptr, "progressive row overflow");
1011  }
1012 
1013  else if (png_ptr->transformed_pixel_depth != row_info.pixel_depth)
1014  png_error(png_ptr, "internal progressive row size calculation error");
1015 
1016 
1017 #ifdef PNG_READ_INTERLACING_SUPPORTED
1018  /* Blow up interlaced rows to full size */
1019  if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
1020  {
1021  if (png_ptr->pass < 6)
1022  png_do_read_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass,
1023  png_ptr->transformations);
1024 
1025  switch (png_ptr->pass)
1026  {
1027  case 0:
1028  {
1029  int i;
1030  for (i = 0; i < 8 && png_ptr->pass == 0; i++)
1031  {
1032  png_push_have_row(png_ptr, png_ptr->row_buf + 1);
1033  png_read_push_finish_row(png_ptr); /* Updates png_ptr->pass */
1034  }
1035 
1036  if (png_ptr->pass == 2) /* Pass 1 might be empty */
1037  {
1038  for (i = 0; i < 4 && png_ptr->pass == 2; i++)
1039  {
1040  png_push_have_row(png_ptr, NULL);
1041  png_read_push_finish_row(png_ptr);
1042  }
1043  }
1044 
1045  if (png_ptr->pass == 4 && png_ptr->height <= 4)
1046  {
1047  for (i = 0; i < 2 && png_ptr->pass == 4; i++)
1048  {
1049  png_push_have_row(png_ptr, NULL);
1050  png_read_push_finish_row(png_ptr);
1051  }
1052  }
1053 
1054  if (png_ptr->pass == 6 && png_ptr->height <= 4)
1055  {
1056  png_push_have_row(png_ptr, NULL);
1057  png_read_push_finish_row(png_ptr);
1058  }
1059 
1060  break;
1061  }
1062 
1063  case 1:
1064  {
1065  int i;
1066  for (i = 0; i < 8 && png_ptr->pass == 1; i++)
1067  {
1068  png_push_have_row(png_ptr, png_ptr->row_buf + 1);
1069  png_read_push_finish_row(png_ptr);
1070  }
1071 
1072  if (png_ptr->pass == 2) /* Skip top 4 generated rows */
1073  {
1074  for (i = 0; i < 4 && png_ptr->pass == 2; i++)
1075  {
1076  png_push_have_row(png_ptr, NULL);
1077  png_read_push_finish_row(png_ptr);
1078  }
1079  }
1080 
1081  break;
1082  }
1083 
1084  case 2:
1085  {
1086  int i;
1087 
1088  for (i = 0; i < 4 && png_ptr->pass == 2; i++)
1089  {
1090  png_push_have_row(png_ptr, png_ptr->row_buf + 1);
1091  png_read_push_finish_row(png_ptr);
1092  }
1093 
1094  for (i = 0; i < 4 && png_ptr->pass == 2; i++)
1095  {
1096  png_push_have_row(png_ptr, NULL);
1097  png_read_push_finish_row(png_ptr);
1098  }
1099 
1100  if (png_ptr->pass == 4) /* Pass 3 might be empty */
1101  {
1102  for (i = 0; i < 2 && png_ptr->pass == 4; i++)
1103  {
1104  png_push_have_row(png_ptr, NULL);
1105  png_read_push_finish_row(png_ptr);
1106  }
1107  }
1108 
1109  break;
1110  }
1111 
1112  case 3:
1113  {
1114  int i;
1115 
1116  for (i = 0; i < 4 && png_ptr->pass == 3; i++)
1117  {
1118  png_push_have_row(png_ptr, png_ptr->row_buf + 1);
1119  png_read_push_finish_row(png_ptr);
1120  }
1121 
1122  if (png_ptr->pass == 4) /* Skip top two generated rows */
1123  {
1124  for (i = 0; i < 2 && png_ptr->pass == 4; i++)
1125  {
1126  png_push_have_row(png_ptr, NULL);
1127  png_read_push_finish_row(png_ptr);
1128  }
1129  }
1130 
1131  break;
1132  }
1133 
1134  case 4:
1135  {
1136  int i;
1137 
1138  for (i = 0; i < 2 && png_ptr->pass == 4; i++)
1139  {
1140  png_push_have_row(png_ptr, png_ptr->row_buf + 1);
1141  png_read_push_finish_row(png_ptr);
1142  }
1143 
1144  for (i = 0; i < 2 && png_ptr->pass == 4; i++)
1145  {
1146  png_push_have_row(png_ptr, NULL);
1147  png_read_push_finish_row(png_ptr);
1148  }
1149 
1150  if (png_ptr->pass == 6) /* Pass 5 might be empty */
1151  {
1152  png_push_have_row(png_ptr, NULL);
1153  png_read_push_finish_row(png_ptr);
1154  }
1155 
1156  break;
1157  }
1158 
1159  case 5:
1160  {
1161  int i;
1162 
1163  for (i = 0; i < 2 && png_ptr->pass == 5; i++)
1164  {
1165  png_push_have_row(png_ptr, png_ptr->row_buf + 1);
1166  png_read_push_finish_row(png_ptr);
1167  }
1168 
1169  if (png_ptr->pass == 6) /* Skip top generated row */
1170  {
1171  png_push_have_row(png_ptr, NULL);
1172  png_read_push_finish_row(png_ptr);
1173  }
1174 
1175  break;
1176  }
1177 
1178  default:
1179  case 6:
1180  {
1181  png_push_have_row(png_ptr, png_ptr->row_buf + 1);
1182  png_read_push_finish_row(png_ptr);
1183 
1184  if (png_ptr->pass != 6)
1185  break;
1186 
1187  png_push_have_row(png_ptr, NULL);
1188  png_read_push_finish_row(png_ptr);
1189  }
1190  }
1191  }
1192  else
1193 #endif
1194  {
1195  png_push_have_row(png_ptr, png_ptr->row_buf + 1);
1196  png_read_push_finish_row(png_ptr);
1197  }
1198 }
1199 
1200 void /* PRIVATE */
1202 {
1203 #ifdef PNG_READ_INTERLACING_SUPPORTED
1204  /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
1205 
1206  /* Start of interlace block */
1207  static PNG_CONST png_byte FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
1208 
1209  /* Offset to next interlace block */
1210  static PNG_CONST png_byte FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
1211 
1212  /* Start of interlace block in the y direction */
1213  static PNG_CONST png_byte FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
1214 
1215  /* Offset to next interlace block in the y direction */
1216  static PNG_CONST png_byte FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
1217 
1218  /* Height of interlace block. This is not currently used - if you need
1219  * it, uncomment it here and in png.h
1220  static PNG_CONST png_byte FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1};
1221  */
1222 #endif
1223 
1224  png_ptr->row_number++;
1225  if (png_ptr->row_number < png_ptr->num_rows)
1226  return;
1227 
1228 #ifdef PNG_READ_INTERLACING_SUPPORTED
1229  if (png_ptr->interlaced)
1230  {
1231  png_ptr->row_number = 0;
1232  png_memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1);
1233 
1234  do
1235  {
1236  png_ptr->pass++;
1237  if ((png_ptr->pass == 1 && png_ptr->width < 5) ||
1238  (png_ptr->pass == 3 && png_ptr->width < 3) ||
1239  (png_ptr->pass == 5 && png_ptr->width < 2))
1240  png_ptr->pass++;
1241 
1242  if (png_ptr->pass > 7)
1243  png_ptr->pass--;
1244 
1245  if (png_ptr->pass >= 7)
1246  break;
1247 
1248  png_ptr->iwidth = (png_ptr->width +
1249  png_pass_inc[png_ptr->pass] - 1 -
1250  png_pass_start[png_ptr->pass]) /
1251  png_pass_inc[png_ptr->pass];
1252 
1253  if (png_ptr->transformations & PNG_INTERLACE)
1254  break;
1255 
1256  png_ptr->num_rows = (png_ptr->height +
1257  png_pass_yinc[png_ptr->pass] - 1 -
1258  png_pass_ystart[png_ptr->pass]) /
1259  png_pass_yinc[png_ptr->pass];
1260 
1261  } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0);
1262  }
1263 #endif /* PNG_READ_INTERLACING_SUPPORTED */
1264 }
1265 
1266 #ifdef PNG_READ_tEXt_SUPPORTED
1267 void /* PRIVATE */
1269  length)
1270 {
1271  if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
1272  {
1273  PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */
1274  png_error(png_ptr, "Out of place tEXt");
1275  /* NOT REACHED */
1276  }
1277 
1278 #ifdef PNG_MAX_MALLOC_64K
1279  png_ptr->skip_length = 0; /* This may not be necessary */
1280 
1281  if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */
1282  {
1283  png_warning(png_ptr, "tEXt chunk too large to fit in memory");
1284  png_ptr->skip_length = length - (png_uint_32)65535L;
1285  length = (png_uint_32)65535L;
1286  }
1287 #endif
1288 
1289  png_ptr->current_text = (png_charp)png_malloc(png_ptr, length + 1);
1290  png_ptr->current_text[length] = '\0';
1291  png_ptr->current_text_ptr = png_ptr->current_text;
1292  png_ptr->current_text_size = (png_size_t)length;
1293  png_ptr->current_text_left = (png_size_t)length;
1294  png_ptr->process_mode = PNG_READ_tEXt_MODE;
1295 }
1296 
1297 void /* PRIVATE */
1299 {
1300  if (png_ptr->buffer_size && png_ptr->current_text_left)
1301  {
1302  png_size_t text_size;
1303 
1304  if (png_ptr->buffer_size < png_ptr->current_text_left)
1305  text_size = png_ptr->buffer_size;
1306 
1307  else
1308  text_size = png_ptr->current_text_left;
1309 
1310  png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
1311  png_ptr->current_text_left -= text_size;
1312  png_ptr->current_text_ptr += text_size;
1313  }
1314  if (!(png_ptr->current_text_left))
1315  {
1316  png_textp text_ptr;
1317  png_charp text;
1318  png_charp key;
1319  int ret;
1320 
1321  if (png_ptr->buffer_size < 4)
1322  {
1323  png_push_save_buffer(png_ptr);
1324  return;
1325  }
1326 
1327  png_push_crc_finish(png_ptr);
1328 
1329 #ifdef PNG_MAX_MALLOC_64K
1330  if (png_ptr->skip_length)
1331  return;
1332 #endif
1333 
1334  key = png_ptr->current_text;
1335 
1336  for (text = key; *text; text++)
1337  /* Empty loop */ ;
1338 
1339  if (text < key + png_ptr->current_text_size)
1340  text++;
1341 
1342  text_ptr = (png_textp)png_malloc(png_ptr, png_sizeof(png_text));
1343  text_ptr->compression = PNG_TEXT_COMPRESSION_NONE;
1344  text_ptr->key = key;
1345  text_ptr->itxt_length = 0;
1346  text_ptr->lang = NULL;
1347  text_ptr->lang_key = NULL;
1348  text_ptr->text = text;
1349 
1350  ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
1351 
1352  png_free(png_ptr, key);
1353  png_free(png_ptr, text_ptr);
1354  png_ptr->current_text = NULL;
1355 
1356  if (ret)
1357  png_warning(png_ptr, "Insufficient memory to store text chunk");
1358  }
1359 }
1360 #endif
1361 
1362 #ifdef PNG_READ_zTXt_SUPPORTED
1363 void /* PRIVATE */
1365  length)
1366 {
1367  if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
1368  {
1369  PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */
1370  png_error(png_ptr, "Out of place zTXt");
1371  /* NOT REACHED */
1372  }
1373 
1374 #ifdef PNG_MAX_MALLOC_64K
1375  /* We can't handle zTXt chunks > 64K, since we don't have enough space
1376  * to be able to store the uncompressed data. Actually, the threshold
1377  * is probably around 32K, but it isn't as definite as 64K is.
1378  */
1379  if (length > (png_uint_32)65535L)
1380  {
1381  png_warning(png_ptr, "zTXt chunk too large to fit in memory");
1382  png_push_crc_skip(png_ptr, length);
1383  return;
1384  }
1385 #endif
1386 
1387  png_ptr->current_text = (png_charp)png_malloc(png_ptr, length + 1);
1388  png_ptr->current_text[length] = '\0';
1389  png_ptr->current_text_ptr = png_ptr->current_text;
1390  png_ptr->current_text_size = (png_size_t)length;
1391  png_ptr->current_text_left = (png_size_t)length;
1392  png_ptr->process_mode = PNG_READ_zTXt_MODE;
1393 }
1394 
1395 void /* PRIVATE */
1397 {
1398  if (png_ptr->buffer_size && png_ptr->current_text_left)
1399  {
1400  png_size_t text_size;
1401 
1402  if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left)
1403  text_size = png_ptr->buffer_size;
1404 
1405  else
1406  text_size = png_ptr->current_text_left;
1407 
1408  png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
1409  png_ptr->current_text_left -= text_size;
1410  png_ptr->current_text_ptr += text_size;
1411  }
1412  if (!(png_ptr->current_text_left))
1413  {
1414  png_textp text_ptr;
1415  png_charp text;
1416  png_charp key;
1417  int ret;
1418  png_size_t text_size, key_size;
1419 
1420  if (png_ptr->buffer_size < 4)
1421  {
1422  png_push_save_buffer(png_ptr);
1423  return;
1424  }
1425 
1426  png_push_crc_finish(png_ptr);
1427 
1428  key = png_ptr->current_text;
1429 
1430  for (text = key; *text; text++)
1431  /* Empty loop */ ;
1432 
1433  /* zTXt can't have zero text */
1434  if (text >= key + png_ptr->current_text_size)
1435  {
1436  png_ptr->current_text = NULL;
1437  png_free(png_ptr, key);
1438  return;
1439  }
1440 
1441  text++;
1442 
1443  if (*text != PNG_TEXT_COMPRESSION_zTXt) /* Check compression byte */
1444  {
1445  png_ptr->current_text = NULL;
1446  png_free(png_ptr, key);
1447  return;
1448  }
1449 
1450  text++;
1451 
1452  png_ptr->zstream.next_in = (png_bytep)text;
1453  png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size -
1454  (text - key));
1455  png_ptr->zstream.next_out = png_ptr->zbuf;
1456  png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
1457 
1458  key_size = text - key;
1459  text_size = 0;
1460  text = NULL;
1461  ret = Z_STREAM_END;
1462 
1463  while (png_ptr->zstream.avail_in)
1464  {
1465  ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
1466  if (ret != Z_OK && ret != Z_STREAM_END)
1467  {
1468  inflateReset(&png_ptr->zstream);
1469  png_ptr->zstream.avail_in = 0;
1470  png_ptr->current_text = NULL;
1471  png_free(png_ptr, key);
1472  png_free(png_ptr, text);
1473  return;
1474  }
1475 
1476  if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END)
1477  {
1478  if (text == NULL)
1479  {
1480  text = (png_charp)png_malloc(png_ptr,
1481  (png_ptr->zbuf_size
1482  - png_ptr->zstream.avail_out + key_size + 1));
1483 
1484  png_memcpy(text + key_size, png_ptr->zbuf,
1485  png_ptr->zbuf_size - png_ptr->zstream.avail_out);
1486 
1487  png_memcpy(text, key, key_size);
1488 
1489  text_size = key_size + png_ptr->zbuf_size -
1490  png_ptr->zstream.avail_out;
1491 
1492  *(text + text_size) = '\0';
1493  }
1494 
1495  else
1496  {
1497  png_charp tmp;
1498 
1499  tmp = text;
1500  text = (png_charp)png_malloc(png_ptr, text_size +
1501  (png_ptr->zbuf_size
1502  - png_ptr->zstream.avail_out + 1));
1503 
1504  png_memcpy(text, tmp, text_size);
1505  png_free(png_ptr, tmp);
1506 
1507  png_memcpy(text + text_size, png_ptr->zbuf,
1508  png_ptr->zbuf_size - png_ptr->zstream.avail_out);
1509 
1510  text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out;
1511  *(text + text_size) = '\0';
1512  }
1513 
1514  if (ret != Z_STREAM_END)
1515  {
1516  png_ptr->zstream.next_out = png_ptr->zbuf;
1517  png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
1518  }
1519  }
1520  else
1521  {
1522  break;
1523  }
1524 
1525  if (ret == Z_STREAM_END)
1526  break;
1527  }
1528 
1529  inflateReset(&png_ptr->zstream);
1530  png_ptr->zstream.avail_in = 0;
1531 
1532  if (ret != Z_STREAM_END)
1533  {
1534  png_ptr->current_text = NULL;
1535  png_free(png_ptr, key);
1536  png_free(png_ptr, text);
1537  return;
1538  }
1539 
1540  png_ptr->current_text = NULL;
1541  png_free(png_ptr, key);
1542  key = text;
1543  text += key_size;
1544 
1545  text_ptr = (png_textp)png_malloc(png_ptr,
1546  png_sizeof(png_text));
1547  text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt;
1548  text_ptr->key = key;
1549  text_ptr->itxt_length = 0;
1550  text_ptr->lang = NULL;
1551  text_ptr->lang_key = NULL;
1552  text_ptr->text = text;
1553 
1554  ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
1555 
1556  png_free(png_ptr, key);
1557  png_free(png_ptr, text_ptr);
1558 
1559  if (ret)
1560  png_warning(png_ptr, "Insufficient memory to store text chunk");
1561  }
1562 }
1563 #endif
1564 
1565 #ifdef PNG_READ_iTXt_SUPPORTED
1566 void /* PRIVATE */
1568  length)
1569 {
1570  if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
1571  {
1572  PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */
1573  png_error(png_ptr, "Out of place iTXt");
1574  /* NOT REACHED */
1575  }
1576 
1577 #ifdef PNG_MAX_MALLOC_64K
1578  png_ptr->skip_length = 0; /* This may not be necessary */
1579 
1580  if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */
1581  {
1582  png_warning(png_ptr, "iTXt chunk too large to fit in memory");
1583  png_ptr->skip_length = length - (png_uint_32)65535L;
1584  length = (png_uint_32)65535L;
1585  }
1586 #endif
1587 
1588  png_ptr->current_text = (png_charp)png_malloc(png_ptr, length + 1);
1589  png_ptr->current_text[length] = '\0';
1590  png_ptr->current_text_ptr = png_ptr->current_text;
1591  png_ptr->current_text_size = (png_size_t)length;
1592  png_ptr->current_text_left = (png_size_t)length;
1593  png_ptr->process_mode = PNG_READ_iTXt_MODE;
1594 }
1595 
1596 void /* PRIVATE */
1598 {
1599 
1600  if (png_ptr->buffer_size && png_ptr->current_text_left)
1601  {
1602  png_size_t text_size;
1603 
1604  if (png_ptr->buffer_size < png_ptr->current_text_left)
1605  text_size = png_ptr->buffer_size;
1606 
1607  else
1608  text_size = png_ptr->current_text_left;
1609 
1610  png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
1611  png_ptr->current_text_left -= text_size;
1612  png_ptr->current_text_ptr += text_size;
1613  }
1614 
1615  if (!(png_ptr->current_text_left))
1616  {
1617  png_textp text_ptr;
1618  png_charp key;
1619  int comp_flag;
1620  png_charp lang;
1621  png_charp lang_key;
1622  png_charp text;
1623  int ret;
1624 
1625  if (png_ptr->buffer_size < 4)
1626  {
1627  png_push_save_buffer(png_ptr);
1628  return;
1629  }
1630 
1631  png_push_crc_finish(png_ptr);
1632 
1633 #ifdef PNG_MAX_MALLOC_64K
1634  if (png_ptr->skip_length)
1635  return;
1636 #endif
1637 
1638  key = png_ptr->current_text;
1639 
1640  for (lang = key; *lang; lang++)
1641  /* Empty loop */ ;
1642 
1643  if (lang < key + png_ptr->current_text_size - 3)
1644  lang++;
1645 
1646  comp_flag = *lang++;
1647  lang++; /* Skip comp_type, always zero */
1648 
1649  for (lang_key = lang; *lang_key; lang_key++)
1650  /* Empty loop */ ;
1651 
1652  lang_key++; /* Skip NUL separator */
1653 
1654  text=lang_key;
1655 
1656  if (lang_key < key + png_ptr->current_text_size - 1)
1657  {
1658  for (; *text; text++)
1659  /* Empty loop */ ;
1660  }
1661 
1662  if (text < key + png_ptr->current_text_size)
1663  text++;
1664 
1665  text_ptr = (png_textp)png_malloc(png_ptr,
1666  png_sizeof(png_text));
1667 
1668  text_ptr->compression = comp_flag + 2;
1669  text_ptr->key = key;
1670  text_ptr->lang = lang;
1671  text_ptr->lang_key = lang_key;
1672  text_ptr->text = text;
1673  text_ptr->text_length = 0;
1674  text_ptr->itxt_length = png_strlen(text);
1675 
1676  ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
1677 
1678  png_ptr->current_text = NULL;
1679 
1680  png_free(png_ptr, text_ptr);
1681  if (ret)
1682  png_warning(png_ptr, "Insufficient memory to store iTXt chunk");
1683  }
1684 }
1685 #endif
1686 
1687 /* This function is called when we haven't found a handler for this
1688  * chunk. If there isn't a problem with the chunk itself (ie a bad chunk
1689  * name or a critical chunk), the chunk is (currently) silently ignored.
1690  */
1691 void /* PRIVATE */
1693  length)
1694 {
1695  png_uint_32 skip = 0;
1696  png_uint_32 chunk_name = png_ptr->chunk_name;
1697 
1698  if (PNG_CHUNK_CRITICAL(chunk_name))
1699  {
1700 #ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
1701  if (png_chunk_unknown_handling(png_ptr, chunk_name) !=
1704  && png_ptr->read_user_chunk_fn == NULL
1705 #endif
1706  )
1707 #endif
1708  png_chunk_error(png_ptr, "unknown critical chunk");
1709 
1710  PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */
1711  }
1712 
1713 #ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
1714  /* TODO: the code below is apparently just using the
1715  * png_struct::unknown_chunk member as a temporarily variable, it should be
1716  * possible to eliminate both it and the temporary buffer.
1717  */
1718  if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS)
1719  {
1720 #ifdef PNG_MAX_MALLOC_64K
1721  if (length > 65535)
1722  {
1723  png_warning(png_ptr, "unknown chunk too large to fit in memory");
1724  skip = length - 65535;
1725  length = 65535;
1726  }
1727 #endif
1728  /* This is just a record for the user; libpng doesn't use the character
1729  * form of the name.
1730  */
1731  PNG_CSTRING_FROM_CHUNK(png_ptr->unknown_chunk.name, png_ptr->chunk_name);
1732 
1733  png_ptr->unknown_chunk.size = length;
1734 
1735  if (length == 0)
1736  png_ptr->unknown_chunk.data = NULL;
1737 
1738  else
1739  {
1740  png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr,
1741  png_ptr->unknown_chunk.size);
1742  png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data,
1743  png_ptr->unknown_chunk.size);
1744  }
1745 
1746 #ifdef PNG_READ_USER_CHUNKS_SUPPORTED
1747  if (png_ptr->read_user_chunk_fn != NULL)
1748  {
1749  /* Callback to user unknown chunk handler */
1750  int ret;
1751  ret = (*(png_ptr->read_user_chunk_fn))
1752  (png_ptr, &png_ptr->unknown_chunk);
1753 
1754  if (ret < 0)
1755  png_chunk_error(png_ptr, "error in user chunk");
1756 
1757  if (ret == 0)
1758  {
1759  if (PNG_CHUNK_CRITICAL(png_ptr->chunk_name))
1760  if (png_chunk_unknown_handling(png_ptr, chunk_name) !=
1762  png_chunk_error(png_ptr, "unknown critical chunk");
1763  png_set_unknown_chunks(png_ptr, info_ptr,
1764  &png_ptr->unknown_chunk, 1);
1765  }
1766  }
1767 
1768  else
1769 #endif
1770  png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1);
1771  png_free(png_ptr, png_ptr->unknown_chunk.data);
1772  png_ptr->unknown_chunk.data = NULL;
1773  }
1774 
1775  else
1776 #endif
1777  skip=length;
1778  png_push_crc_skip(png_ptr, skip);
1779 }
1780 
1781 void /* PRIVATE */
1783 {
1784  if (png_ptr->info_fn != NULL)
1785  (*(png_ptr->info_fn))(png_ptr, info_ptr);
1786 }
1787 
1788 void /* PRIVATE */
1790 {
1791  if (png_ptr->end_fn != NULL)
1792  (*(png_ptr->end_fn))(png_ptr, info_ptr);
1793 }
1794 
1795 void /* PRIVATE */
1797 {
1798  if (png_ptr->row_fn != NULL)
1799  (*(png_ptr->row_fn))(png_ptr, row, png_ptr->row_number,
1800  (int)png_ptr->pass);
1801 }
1802 
1803 #ifdef PNG_READ_INTERLACING_SUPPORTED
1804 void PNGAPI
1806  png_const_bytep new_row)
1807 {
1808  if (png_ptr == NULL)
1809  return;
1810 
1811  /* new_row is a flag here - if it is NULL then the app callback was called
1812  * from an empty row (see the calls to png_struct::row_fn below), otherwise
1813  * it must be png_ptr->row_buf+1
1814  */
1815  if (new_row != NULL)
1816  png_combine_row(png_ptr, old_row, 1/*display*/);
1817 }
1818 #endif /* PNG_READ_INTERLACING_SUPPORTED */
1819 
1820 void PNGAPI
1822  png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn,
1823  png_progressive_end_ptr end_fn)
1824 {
1825  if (png_ptr == NULL)
1826  return;
1827 
1828  png_ptr->info_fn = info_fn;
1829  png_ptr->row_fn = row_fn;
1830  png_ptr->end_fn = end_fn;
1831 
1832  png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer);
1833 }
1834 
1837 {
1838  if (png_ptr == NULL)
1839  return (NULL);
1840 
1841  return png_ptr->io_ptr;
1842 }
1843 #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
void png_push_read_IDAT(png_structp png_ptr)
Definition: pngpread.c:767
void PNGCBAPI png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length)
Definition: pngpread.c:658
void png_read_filter_row(png_structp pp, png_row_infop row_info, png_bytep row, png_const_bytep prev_row, int filter)
Definition: pngrutil.c:3743
#define png_memcpy
Definition: pngpriv.h:353
void png_push_have_row(png_structp png_ptr, png_bytep row)
Definition: pngpread.c:1796
#define PNG_FILTER_VALUE_LAST
Definition: png.h:1630
#define PNG_READ_USER_CHUNKS_SUPPORTED
Definition: pnglibconf.h:118
void png_handle_IEND(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
Definition: pngrutil.c:746
#define png_PLTE
Definition: pngpriv.h:604
#define PNG_READ_DONE_MODE
Definition: pngpread.c:25
#define png_sCAL
Definition: pngpriv.h:613
#define png_iTXt
Definition: pngpriv.h:610
void PNGAPI png_process_data(png_structp png_ptr, png_infop info_ptr, png_bytep buffer, png_size_t buffer_size)
Definition: pngpread.c:30
void PNGAPI png_progressive_combine_row(png_structp png_ptr, png_bytep old_row, png_const_bytep new_row)
Definition: pngpread.c:1805
#define PNG_UNUSED(param)
Definition: pngpriv.h:181
#define png_bKGD
Definition: pngpriv.h:605
#define NULL
Definition: ftobjs.h:61
void png_push_read_sig(png_structp png_ptr, png_infop info_ptr)
Definition: pngpread.c:176
PNG_CONST png_struct FAR * png_const_structp
Definition: png.h:848
#define png_tRNS
Definition: pngpriv.h:621
#define png_sRGB
Definition: pngpriv.h:617
#define PNG_HAVE_CHUNK_HEADER
Definition: pngpriv.h:423
void png_push_have_end(png_structp png_ptr, png_infop info_ptr)
Definition: pngpread.c:1789
png_uint_32 PNGAPI png_process_data_skip(png_structp png_ptr)
Definition: pngpread.c:72
#define png_iCCP
Definition: pngpriv.h:609
#define PNGCBAPI
Definition: pngconf.h:257
char FAR * png_charp
Definition: pngconf.h:536
#define PNG_COLOR_TYPE_PALETTE
Definition: png.h:746
void png_handle_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
Definition: pngrutil.c:523
void png_check_chunk_name(png_structp png_ptr, png_uint_32 chunk_name)
Definition: pngrutil.c:2759
#define png_IEND
Definition: pngpriv.h:603
void png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr)
Definition: pngpread.c:1597
png_error(png_ptr,"Missing IHDR before iCCP")
void PNGAPI png_set_unknown_chunks(png_structp png_ptr, png_infop info_ptr, png_const_unknown_chunkp unknowns, int num_unknowns)
Definition: pngset.c:1018
#define png_sPLT
Definition: pngpriv.h:616
unsigned int png_uint_32
Definition: pngconf.h:441
png_size_t PNGAPI png_process_data_pause(png_structp png_ptr, int save)
Definition: pngpread.c:45
#define PNG_HAVE_PLTE
Definition: png.h:713
#define png_memset
Definition: pngpriv.h:354
#define PNG_FLAG_KEEP_UNKNOWN_CHUNKS
Definition: pngpriv.h:487
void png_crc_read(png_structp png_ptr, png_bytep buf, png_size_t length)
Definition: pngrutil.c:189
void png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
Definition: pngrutil.c:2062
if(!yyg->yy_init)
unsigned int uInt
Definition: zconf.h:221
png_text FAR * png_textp
Definition: png.h:652
#define PNG_READ_IDAT_MODE
Definition: pngpread.c:21
ret
Definition: glew_str_glx.c:2
void png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
Definition: pngpread.c:209
#define Z_OK
Definition: zlib.h:132
#define PNG_READ_zTXt_MODE
Definition: pngpread.c:24
#define PNG_CHUNK_CRITICAL(c)
Definition: pngpriv.h:644
#define PNG_HAVE_IDAT
Definition: pngpriv.h:417
png_uint_32 width
Definition: png.h:832
#define PNG_TEXT_COMPRESSION_zTXt
Definition: png.h:662
void png_do_read_transformations(png_structp png_ptr, png_row_infop row_info)
Definition: pngrtran.c:2077
void png_handle_cHRM(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
Definition: pngrutil.c:922
#define PNG_HAVE_IHDR
Definition: png.h:712
EGLContext EGLenum EGLClientBuffer buffer
Definition: eglext.h:87
#define png_IHDR
Definition: pngpriv.h:601
void png_handle_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
Definition: pngrutil.c:1767
void png_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
Definition: pngpread.c:1364
void png_push_save_buffer(png_structp png_ptr)
Definition: pngpread.c:701
png_byte color_type
Definition: png.h:834
#define Z_SYNC_FLUSH
Definition: zlib.h:127
#define PNG_TEXT_COMPRESSION_NONE
Definition: png.h:661
png_byte channels
Definition: png.h:836
GLenum GLenum GLvoid * row
Definition: glew.h:4447
#define PNGAPI
Definition: pngconf.h:260
png_struct FAR * png_structp
Definition: png.h:849
#define PNG_HANDLE_CHUNK_ALWAYS
Definition: png.h:2401
#define PNG_SKIP_MODE
Definition: pngpread.c:22
png_voidp PNGAPI png_get_progressive_ptr(png_const_structp png_ptr)
Definition: pngpread.c:1836
#define png_tEXt
Definition: pngpriv.h:619
#define PNG_CONST
Definition: pngconf.h:426
png_info FAR * png_infop
Definition: png.h:721
int
Definition: SDL_systhread.c:37
GLsizei GLsizei * length
Definition: gl2ext.h:792
#define PNG_CHUNK_FROM_STRING(s)
Definition: pngpriv.h:627
void png_push_crc_finish(png_structp png_ptr)
Definition: pngpread.c:597
unsigned char png_byte
Definition: pngconf.h:449
#define PNG_READ_iTXt_MODE
Definition: pngpread.c:26
#define PNG_HAVE_CHUNK_AFTER_IDAT
Definition: pngpriv.h:428
void png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
Definition: pngrutil.c:1918
#define PNG_SIZE_MAX
Definition: png.h:728
void png_combine_row(png_structp png_ptr, png_bytep dp, int display)
Definition: pngrutil.c:2784
void PNGAPI png_warning(png_structp png_ptr, png_const_charp warning_message)
Definition: pngerror.c:214
void png_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
Definition: pngpread.c:1567
PNG_CONST png_byte FAR * png_const_bytep
Definition: pngconf.h:527
png_byte pixel_depth
Definition: png.h:837
void png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
Definition: pngpread.c:1268
void png_push_crc_skip(png_structp png_ptr, png_uint_32 skip)
Definition: pngpread.c:590
#define png_IDAT
Definition: pngpriv.h:602
int ZEXPORT inflate(z_streamp strm, int flush)
Definition: inflate.c:589
void png_process_IDAT_data(png_structp png_ptr, png_bytep buffer, png_size_t buffer_length)
Definition: pngpread.c:868
void png_read_push_finish_row(png_structp png_ptr)
Definition: pngpread.c:1201
void png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
Definition: pngrutil.c:2623
#define png_strlen
Definition: pngpriv.h:351
#define PNG_READ_CHUNK_MODE
Definition: pngpread.c:20
#define PNG_AFTER_IDAT
Definition: png.h:714
#define PNG_FLAG_ZLIB_FINISHED
Definition: pngpriv.h:477
int png_crc_finish(png_structp png_ptr, png_uint_32 skip)
Definition: pngrutil.c:204
#define png_oFFs
Definition: pngpriv.h:611
void PNGAPI png_set_read_fn(png_structp png_ptr, png_voidp io_ptr, png_rw_ptr read_data_fn)
Definition: pngrio.c:145
int ZEXPORT inflateReset(z_streamp strm)
Definition: inflate.c:103
png_uint_32 PNGAPI png_get_uint_31(png_structp png_ptr, png_const_bytep buf)
Definition: pngrutil.c:24
int png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_const_textp text_ptr, int num_text)
Definition: pngset.c:679
#define png_gAMA
Definition: pngpriv.h:607
#define png_pCAL
Definition: pngpriv.h:612
png_size_t rowbytes
Definition: png.h:833
#define PNG_INTERLACE
Definition: pngpriv.h:432
png_byte FAR * png_bytep
Definition: pngconf.h:526
#define FARDATA
Definition: pngconf.h:515
void png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
Definition: pngrutil.c:1557
void png_push_restore_buffer(png_structp png_ptr, png_bytep buffer, png_size_t buffer_length)
Definition: pngpread.c:757
void png_handle_sRGB(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
Definition: pngrutil.c:1107
#define PNG_READ_tEXt_MODE
Definition: pngpread.c:23
#define Z_STREAM_END
Definition: zlib.h:133
#define png_cHRM
Definition: pngpriv.h:606
#define PNG_HAVE_IEND
Definition: pngpriv.h:419
void png_handle_tIME(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
Definition: pngrutil.c:2166
void png_handle_oFFs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
Definition: pngrutil.c:1871
void png_process_some_data(png_structp png_ptr, png_infop info_ptr)
Definition: pngpread.c:106
void FAR * png_voidp
Definition: pngconf.h:524
void png_handle_bKGD(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
Definition: pngrutil.c:1661
void png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass, png_uint_32 transformations)
Definition: pngrutil.c:3264
#define PNG_FILTER_VALUE_NONE
Definition: png.h:1625
void png_calculate_crc(png_structp png_ptr, png_const_bytep ptr, png_size_t length)
Definition: png.c:120
void png_handle_gAMA(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
Definition: pngrutil.c:769
size_t png_size_t
Definition: pngconf.h:454
void png_handle_sBIT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
Definition: pngrutil.c:849
void png_push_process_row(png_structp png_ptr)
Definition: pngpread.c:972
png_uint_32 skip
Definition: pngrutil.c:1241
void png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
Definition: pngpread.c:1692
#define png_sBIT
Definition: pngpriv.h:615
#define png_hIST
Definition: pngpriv.h:608
void PNGAPI png_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr, png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, png_progressive_end_ptr end_fn)
Definition: pngpread.c:1821
int i
Definition: pngrutil.c:1377
while(1)
#define PNG_READ_SIG_MODE
Definition: pngpread.c:19
void png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
Definition: pngrutil.c:598
#define png_pHYs
Definition: pngpriv.h:614
void PNGAPI png_free(png_structp png_ptr, png_voidp ptr)
Definition: pngmem.c:578
#define PNG_ROWBYTES(pixel_bits, width)
Definition: pngpriv.h:532
void png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr)
Definition: pngpread.c:1298
int png_chunk_unknown_handling(png_structp png_ptr, png_uint_32 chunk_name)
Definition: png.c:740
void png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr)
Definition: pngpread.c:1396
#define png_tIME
Definition: pngpriv.h:620
#define Z_PARTIAL_FLUSH
Definition: zlib.h:126
void png_push_have_info(png_structp png_ptr, png_infop info_ptr)
Definition: pngpread.c:1782
void png_handle_pHYs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
Definition: pngrutil.c:1825
int PNGAPI png_sig_cmp(png_const_bytep sig, png_size_t start, png_size_t num_to_check)
Definition: png.c:49
void png_reset_crc(png_structp png_ptr)
Definition: png.c:108
#define PNG_CSTRING_FROM_CHUNK(s, c)
Definition: pngpriv.h:639
#define png_zTXt
Definition: pngpriv.h:622
void PNGAPI png_benign_error(png_structp png_ptr, png_const_charp error_message)
Definition: pngerror.c:359
png_byte bit_depth
Definition: png.h:835
#define png_sizeof(x)
Definition: pngconf.h:456