15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* pngread.c - read a PNG file
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Last changed in libpng 1.2.44 [June 26, 2010]
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 1998-2010 Glenn Randers-Pehrson
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This code is released under the libpng license.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * For conditions of distribution and use, see the disclaimer
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and license in png.h
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This file contains routines that an application calls directly to
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * read a PNG file or stream.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_INTERNAL
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_NO_PEDANTIC_WARNINGS
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "png.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_SUPPORTED
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Create a PNG structure for reading, and allocate any memory needed. */
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_structp PNGAPI
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_create_read_struct(png_const_charp user_png_ver, png_voidp error_ptr,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_error_ptr error_fn, png_error_ptr warn_fn)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (png_create_read_struct_2(user_png_ver, error_ptr, error_fn,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      warn_fn, png_voidp_NULL, png_malloc_ptr_NULL, png_free_ptr_NULL));
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Alternate create PNG structure for reading, and allocate any memory
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * needed.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_structp PNGAPI
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_malloc_ptr malloc_fn, png_free_ptr free_fn)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USER_MEM_SUPPORTED */
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SETJMP_SUPPORTED
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   volatile
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_structp png_ptr;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SETJMP_SUPPORTED
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef USE_FAR_KEYWORD
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   jmp_buf jmpbuf;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int i;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_create_read_struct");
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return (NULL);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Added at libpng-1.2.6 */
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_LIMITS_SUPPORTED
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->user_width_max = PNG_USER_WIDTH_MAX;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->user_height_max = PNG_USER_HEIGHT_MAX;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  ifdef PNG_USER_CHUNK_CACHE_MAX
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Added at libpng-1.2.43 and 1.4.0 */
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->user_chunk_cache_max = PNG_USER_CHUNK_CACHE_MAX;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  endif
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  ifdef PNG_SET_USER_CHUNK_MALLOC_MAX
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Added at libpng-1.2.43 and 1.4.1 */
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->user_chunk_malloc_max = PNG_USER_CHUNK_MALLOC_MAX;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  endif
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SETJMP_SUPPORTED
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef USE_FAR_KEYWORD
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (setjmp(jmpbuf))
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (setjmp(png_ptr->jmpbuf))
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_free(png_ptr, png_ptr->zbuf);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->zbuf = NULL;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_destroy_struct_2((png_voidp)png_ptr,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (png_free_ptr)free_fn, (png_voidp)mem_ptr);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_destroy_struct((png_voidp)png_ptr);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return (NULL);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef USE_FAR_KEYWORD
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf));
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_SETJMP_SUPPORTED */
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (user_png_ver)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      i = 0;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      do
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (user_png_ver[i] != png_libpng_ver[i])
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } while (png_libpng_ver[i++]);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * we must recompile any applications that use any older library version.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * For versions after libpng 1.0, we will be compatible, so we need
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * only check the first digit.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       */
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] ||
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) ||
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (user_png_ver[0] == '0' && user_png_ver[2] < '9'))
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_STDIO_SUPPORTED) && !defined(_WIN32_WCE)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         char msg[80];
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (user_png_ver)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           png_snprintf(msg, 80,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              "Application was compiled with png.h from libpng-%.20s",
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              user_png_ver);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           png_warning(png_ptr, msg);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_snprintf(msg, 80,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "Application  is  running with png.c from libpng-%.20s",
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             png_libpng_ver);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_warning(png_ptr, msg);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_ERROR_NUMBERS_SUPPORTED
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->flags = 0;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_error(png_ptr,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "Incompatible libpng version in application and library");
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Initialize zbuf - compression buffer */
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->zbuf_size = PNG_ZBUF_SIZE;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->zbuf = (png_bytep)png_malloc(png_ptr,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     (png_uint_32)png_ptr->zbuf_size);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->zstream.zalloc = png_zalloc;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->zstream.zfree = png_zfree;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->zstream.opaque = (voidpf)png_ptr;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (inflateInit(&png_ptr->zstream))
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         case Z_OK: /* Do nothing */ break;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         case Z_MEM_ERROR:
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory error");
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         case Z_VERSION_ERROR: png_error(png_ptr, "zlib version error");
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         default: png_error(png_ptr, "Unknown zlib error");
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->zstream.next_out = png_ptr->zbuf;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SETJMP_SUPPORTED
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Applications that neglect to set up their own setjmp() and then
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   encounter a png_error() will longjmp here.  Since the jmpbuf is
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   then meaningless we abort instead of returning. */
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef USE_FAR_KEYWORD
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (setjmp(jmpbuf))
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       PNG_ABORT();
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (setjmp(png_ptr->jmpbuf))
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       PNG_ABORT();
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_SETJMP_SUPPORTED */
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (png_ptr);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_1_0_X) || defined(PNG_1_2_X)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Initialize PNG structure for reading, and allocate any memory needed.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This interface is deprecated in favour of the png_create_read_struct(),
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and it will disappear as of libpng-1.3.0.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef png_read_init
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_read_init(png_structp png_ptr)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* We only come here via pre-1.0.7-compiled applications */
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_read_init_2(png_ptr, "1.0.6 or earlier", 0, 0);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_read_init_2(png_structp png_ptr, png_const_charp user_png_ver,
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_size_t png_struct_size, png_size_t png_info_size)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* We only come here via pre-1.0.12-compiled applications */
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_STDIO_SUPPORTED) && !defined(_WIN32_WCE)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_sizeof(png_struct) > png_struct_size ||
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_sizeof(png_info) > png_info_size)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      char msg[80];
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->warning_fn = NULL;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (user_png_ver)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        png_snprintf(msg, 80,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           "Application was compiled with png.h from libpng-%.20s",
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           user_png_ver);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        png_warning(png_ptr, msg);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_snprintf(msg, 80,
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "Application  is  running with png.c from libpng-%.20s",
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_libpng_ver);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_warning(png_ptr, msg);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_sizeof(png_struct) > png_struct_size)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->error_fn = NULL;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_ERROR_NUMBERS_SUPPORTED
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->flags = 0;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_error(png_ptr,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "The png struct allocated by the application for reading is"
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " too small.");
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_sizeof(png_info) > png_info_size)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->error_fn = NULL;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_ERROR_NUMBERS_SUPPORTED
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->flags = 0;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_error(png_ptr,
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "The info struct allocated by application for reading is"
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        " too small.");
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_read_init_3(&png_ptr, user_png_ver, png_struct_size);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_1_0_X || PNG_1_2_X */
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_read_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver,
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_size_t png_struct_size)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SETJMP_SUPPORTED
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   jmp_buf tmp_jmp;  /* to save current jump buffer */
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int i = 0;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_structp png_ptr=*ptr_ptr;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (user_png_ver[i] != png_libpng_ver[i])
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_LEGACY_SUPPORTED
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        png_ptr->warning_fn = NULL;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        png_warning(png_ptr,
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "Application uses deprecated png_read_init() and should be"
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         " recompiled.");
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (png_libpng_ver[i++]);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_read_init_3");
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SETJMP_SUPPORTED
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Save jump buffer and error functions */
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf));
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_sizeof(png_struct) > png_struct_size)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_destroy_struct(png_ptr);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *ptr_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr = *ptr_ptr;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Reset all variables to 0 */
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_memset(png_ptr, 0, png_sizeof(png_struct));
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SETJMP_SUPPORTED
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Restore jump buffer */
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf));
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Added at libpng-1.2.6 */
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SET_USER_LIMITS_SUPPORTED
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->user_width_max = PNG_USER_WIDTH_MAX;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->user_height_max = PNG_USER_HEIGHT_MAX;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Initialize zbuf - compression buffer */
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->zbuf_size = PNG_ZBUF_SIZE;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->zstream.zalloc = png_zalloc;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->zbuf = (png_bytep)png_malloc(png_ptr,
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     (png_uint_32)png_ptr->zbuf_size);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->zstream.zalloc = png_zalloc;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->zstream.zfree = png_zfree;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->zstream.opaque = (voidpf)png_ptr;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch (inflateInit(&png_ptr->zstream))
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case Z_OK: /* Do nothing */ break;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory error"); break;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case Z_VERSION_ERROR: png_error(png_ptr, "zlib version error");
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default: png_error(png_ptr, "Unknown zlib error");
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->zstream.next_out = png_ptr->zbuf;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Read the information before the actual image data.  This has been
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * changed in v0.90 to allow reading a file that already has the magic
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * bytes read from the stream.  You can tell libpng how many bytes have
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * been read from the beginning of the stream (up to the maximum of 8)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * via png_set_sig_bytes(), and we will only check the remaining bytes
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * here.  The application can then have access to the signature bytes we
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * read if it is determined that this isn't a valid PNG file.
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_read_info(png_structp png_ptr, png_infop info_ptr)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_read_info");
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL || info_ptr == NULL)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* If we haven't checked all of the PNG signature bytes, do so now. */
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->sig_bytes < 8)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_size_t num_checked = png_ptr->sig_bytes,
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 num_to_check = 8 - num_checked;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_read_data(png_ptr, &(info_ptr->signature[num_checked]), num_to_check);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->sig_bytes = 8;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check))
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (num_checked < 4 &&
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4))
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_error(png_ptr, "Not a PNG file");
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         else
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_error(png_ptr, "PNG file corrupted by ASCII conversion");
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (num_checked < 3)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE;
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for (;;)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USE_LOCAL_ARRAYS
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_IHDR;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_IDAT;
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_IEND;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_PLTE;
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_bKGD_SUPPORTED
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_bKGD;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_cHRM_SUPPORTED
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_cHRM;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_gAMA_SUPPORTED
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_gAMA;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_hIST_SUPPORTED
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_hIST;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iCCP_SUPPORTED
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_iCCP;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iTXt_SUPPORTED
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_iTXt;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_oFFs_SUPPORTED
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_oFFs;
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_pCAL_SUPPORTED
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_pCAL;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_pHYs_SUPPORTED
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_pHYs;
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sBIT_SUPPORTED
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_sBIT;
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sCAL_SUPPORTED
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_sCAL;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sPLT_SUPPORTED
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_sPLT;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sRGB_SUPPORTED
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_sRGB;
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tEXt_SUPPORTED
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_tEXt;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tIME_SUPPORTED
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_tIME;
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tRNS_SUPPORTED
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_tRNS;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_zTXt_SUPPORTED
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_zTXt;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USE_LOCAL_ARRAYS */
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_uint_32 length = png_read_chunk_header(png_ptr);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST png_bytep chunk_name = png_ptr->chunk_name;
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* This should be a binary subdivision search or a hash for
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * matching the chunk name rather than a linear search.
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       */
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!png_memcmp(chunk_name, png_IDAT, 4))
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (png_ptr->mode & PNG_AFTER_IDAT)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!png_memcmp(chunk_name, png_IHDR, 4))
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_IHDR(png_ptr, info_ptr, length);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_IEND, 4))
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_IEND(png_ptr, info_ptr, length);
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (png_handle_as_unknown(png_ptr, chunk_name))
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (!png_memcmp(chunk_name, png_IDAT, 4))
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_ptr->mode |= PNG_HAVE_IDAT;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_unknown(png_ptr, info_ptr, length);
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (!png_memcmp(chunk_name, png_PLTE, 4))
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_ptr->mode |= PNG_HAVE_PLTE;
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         else if (!png_memcmp(chunk_name, png_IDAT, 4))
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!(png_ptr->mode & PNG_HAVE_IHDR))
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_error(png_ptr, "Missing IHDR before IDAT");
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     !(png_ptr->mode & PNG_HAVE_PLTE))
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_error(png_ptr, "Missing PLTE before IDAT");
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_PLTE, 4))
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_PLTE(png_ptr, info_ptr, length);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_IDAT, 4))
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (!(png_ptr->mode & PNG_HAVE_IHDR))
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_error(png_ptr, "Missing IHDR before IDAT");
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  !(png_ptr->mode & PNG_HAVE_PLTE))
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_error(png_ptr, "Missing PLTE before IDAT");
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->idat_size = length;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->mode |= PNG_HAVE_IDAT;
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         break;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_bKGD_SUPPORTED
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_bKGD, 4))
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_bKGD(png_ptr, info_ptr, length);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_cHRM_SUPPORTED
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_cHRM, 4))
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_cHRM(png_ptr, info_ptr, length);
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_gAMA_SUPPORTED
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_gAMA, 4))
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_gAMA(png_ptr, info_ptr, length);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_hIST_SUPPORTED
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_hIST, 4))
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_hIST(png_ptr, info_ptr, length);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_oFFs_SUPPORTED
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_oFFs, 4))
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_oFFs(png_ptr, info_ptr, length);
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_pCAL_SUPPORTED
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_pCAL, 4))
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_pCAL(png_ptr, info_ptr, length);
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sCAL_SUPPORTED
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_sCAL, 4))
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_sCAL(png_ptr, info_ptr, length);
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_pHYs_SUPPORTED
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_pHYs, 4))
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_pHYs(png_ptr, info_ptr, length);
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sBIT_SUPPORTED
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_sBIT, 4))
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_sBIT(png_ptr, info_ptr, length);
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sRGB_SUPPORTED
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_sRGB, 4))
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_sRGB(png_ptr, info_ptr, length);
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iCCP_SUPPORTED
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_iCCP, 4))
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_iCCP(png_ptr, info_ptr, length);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sPLT_SUPPORTED
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_sPLT, 4))
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_sPLT(png_ptr, info_ptr, length);
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tEXt_SUPPORTED
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_tEXt, 4))
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_tEXt(png_ptr, info_ptr, length);
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tIME_SUPPORTED
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_tIME, 4))
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_tIME(png_ptr, info_ptr, length);
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tRNS_SUPPORTED
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_tRNS, 4))
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_tRNS(png_ptr, info_ptr, length);
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_zTXt_SUPPORTED
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_zTXt, 4))
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_zTXt(png_ptr, info_ptr, length);
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iTXt_SUPPORTED
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_iTXt, 4))
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_iTXt(png_ptr, info_ptr, length);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_unknown(png_ptr, info_ptr, length);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Optional call to update the users info_ptr structure */
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_read_update_info(png_structp png_ptr, png_infop info_ptr)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_read_update_info");
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_read_start_row(png_ptr);
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_warning(png_ptr,
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Ignoring extra png_read_update_info() call; row buffer not reallocated");
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_read_transform_info(png_ptr, info_ptr);
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Initialize palette, background, etc, after transformations
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * are set, but before any reading takes place.  This allows
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the user to obtain a gamma-corrected palette, for example.
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If the user doesn't call this, we will do it ourselves.
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_start_read_image(png_structp png_ptr)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_start_read_image");
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_read_start_row(png_ptr);
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PNG_CONST PNG_IDAT;
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PNG_CONST int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55,
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xff};
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PNG_CONST int png_pass_mask[7] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff};
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int ret;
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug2(1, "in png_read_row (row %lu, pass %d)",
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->row_number, png_ptr->pass);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_read_start_row(png_ptr);
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->row_number == 0 && png_ptr->pass == 0)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Check for transforms that have been set but were defined out */
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_WRITE_INVERT_SUPPORTED) && !defined(PNG_READ_INVERT_SUPPORTED)
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->transformations & PNG_INVERT_MONO)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_warning(png_ptr, "PNG_READ_INVERT_SUPPORTED is not defined.");
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_WRITE_FILLER_SUPPORTED) && !defined(PNG_READ_FILLER_SUPPORTED)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->transformations & PNG_FILLER)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_warning(png_ptr, "PNG_READ_FILLER_SUPPORTED is not defined.");
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_WRITE_PACKSWAP_SUPPORTED) && \
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    !defined(PNG_READ_PACKSWAP_SUPPORTED)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->transformations & PNG_PACKSWAP)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_warning(png_ptr, "PNG_READ_PACKSWAP_SUPPORTED is not defined.");
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_WRITE_PACK_SUPPORTED) && !defined(PNG_READ_PACK_SUPPORTED)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->transformations & PNG_PACK)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_warning(png_ptr, "PNG_READ_PACK_SUPPORTED is not defined.");
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_WRITE_SHIFT_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->transformations & PNG_SHIFT)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_warning(png_ptr, "PNG_READ_SHIFT_SUPPORTED is not defined.");
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_WRITE_BGR_SUPPORTED) && !defined(PNG_READ_BGR_SUPPORTED)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->transformations & PNG_BGR)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_warning(png_ptr, "PNG_READ_BGR_SUPPORTED is not defined.");
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_WRITE_SWAP_SUPPORTED) && !defined(PNG_READ_SWAP_SUPPORTED)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->transformations & PNG_SWAP_BYTES)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_warning(png_ptr, "PNG_READ_SWAP_SUPPORTED is not defined.");
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_INTERLACING_SUPPORTED
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* If interlaced and we do not need a new row, combine row and return */
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (png_ptr->pass)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         case 0:
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (png_ptr->row_number & 0x07)
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               if (dsp_row != NULL)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_combine_row(png_ptr, dsp_row,
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     png_pass_dsp_mask[png_ptr->pass]);
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_read_finish_row(png_ptr);
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               return;
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         case 1:
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if ((png_ptr->row_number & 0x07) || png_ptr->width < 5)
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               if (dsp_row != NULL)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_combine_row(png_ptr, dsp_row,
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     png_pass_dsp_mask[png_ptr->pass]);
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_read_finish_row(png_ptr);
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               return;
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         case 2:
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if ((png_ptr->row_number & 0x07) != 4)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               if (dsp_row != NULL && (png_ptr->row_number & 4))
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_combine_row(png_ptr, dsp_row,
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     png_pass_dsp_mask[png_ptr->pass]);
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_read_finish_row(png_ptr);
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               return;
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         case 3:
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if ((png_ptr->row_number & 3) || png_ptr->width < 3)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               if (dsp_row != NULL)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_combine_row(png_ptr, dsp_row,
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     png_pass_dsp_mask[png_ptr->pass]);
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_read_finish_row(png_ptr);
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               return;
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         case 4:
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if ((png_ptr->row_number & 3) != 2)
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               if (dsp_row != NULL && (png_ptr->row_number & 2))
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_combine_row(png_ptr, dsp_row,
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     png_pass_dsp_mask[png_ptr->pass]);
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_read_finish_row(png_ptr);
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               return;
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         case 5:
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if ((png_ptr->row_number & 1) || png_ptr->width < 2)
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               if (dsp_row != NULL)
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_combine_row(png_ptr, dsp_row,
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     png_pass_dsp_mask[png_ptr->pass]);
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_read_finish_row(png_ptr);
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               return;
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         case 6:
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!(png_ptr->row_number & 1))
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_read_finish_row(png_ptr);
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               return;
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!(png_ptr->mode & PNG_HAVE_IDAT))
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_error(png_ptr, "Invalid attempt to read row data");
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->zstream.next_out = png_ptr->row_buf;
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->zstream.avail_out =
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       (uInt)(PNG_ROWBYTES(png_ptr->pixel_depth,
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       png_ptr->iwidth) + 1);
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!(png_ptr->zstream.avail_in))
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         while (!png_ptr->idat_size)
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_crc_finish(png_ptr, 0);
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_ptr->idat_size = png_read_chunk_header(png_ptr);
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_error(png_ptr, "Not enough image data");
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size;
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->zstream.next_in = png_ptr->zbuf;
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (png_ptr->zbuf_size > png_ptr->idat_size)
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size;
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_crc_read(png_ptr, png_ptr->zbuf,
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (png_size_t)png_ptr->zstream.avail_in);
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->idat_size -= png_ptr->zstream.avail_in;
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (ret == Z_STREAM_END)
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (png_ptr->zstream.avail_out || png_ptr->zstream.avail_in ||
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_ptr->idat_size)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_error(png_ptr, "Extra compressed data");
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->mode |= PNG_AFTER_IDAT;
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         break;
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (ret != Z_OK)
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg :
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   "Decompression error");
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (png_ptr->zstream.avail_out);
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->row_info.color_type = png_ptr->color_type;
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->row_info.width = png_ptr->iwidth;
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->row_info.channels = png_ptr->channels;
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->row_info.bit_depth = png_ptr->bit_depth;
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->row_info.pixel_depth = png_ptr->pixel_depth;
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       png_ptr->row_info.width);
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->row_buf[0])
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_read_filter_row(png_ptr, &(png_ptr->row_info),
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->row_buf + 1, png_ptr->prev_row + 1,
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (int)(png_ptr->row_buf[0]));
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf,
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->rowbytes + 1);
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_MNG_FEATURES_SUPPORTED
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING))
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Intrapixel differencing */
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_do_read_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1);
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA))
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_do_read_transformations(png_ptr);
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_INTERLACING_SUPPORTED
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Blow up interlaced rows to full size */
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->interlaced &&
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (png_ptr->transformations & PNG_INTERLACE))
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (png_ptr->pass < 6)
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* Old interface (pre-1.0.9):
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          * png_do_read_interlace(&(png_ptr->row_info),
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          *    png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations);
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          */
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_do_read_interlace(png_ptr);
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (dsp_row != NULL)
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_combine_row(png_ptr, dsp_row,
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_pass_dsp_mask[png_ptr->pass]);
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (row != NULL)
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_combine_row(png_ptr, row,
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_pass_mask[png_ptr->pass]);
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (row != NULL)
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_combine_row(png_ptr, row, 0xff);
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (dsp_row != NULL)
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_combine_row(png_ptr, dsp_row, 0xff);
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_read_finish_row(png_ptr);
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->read_row_fn != NULL)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (*(png_ptr->read_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass);
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Read one or more rows of image data.  If the image is interlaced,
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and png_set_interlace_handling() has been called, the rows need to
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * contain the contents of the rows from the previous pass.  If the
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * image has alpha or transparency, and png_handle_alpha()[*] has been
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * called, the rows contents must be initialized to the contents of the
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * screen.
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "row" holds the actual image, and pixels are placed in it
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * as they arrive.  If the image is displayed after each pass, it will
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * appear to "sparkle" in.  "display_row" can be used to display a
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "chunky" progressive image, with finer detail added as it becomes
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * available.  If you do not want this "chunky" display, you may pass
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NULL for display_row.  If you do not want the sparkle display, and
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * you have not called png_handle_alpha(), you may pass NULL for rows.
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If you have called png_handle_alpha(), and the image has either an
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * alpha channel or a transparency chunk, you must provide a buffer for
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * rows.  In this case, you do not have to provide a display_row buffer
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * also, but you may.  If the image is not interlaced, or if you have
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * not called png_set_interlace_handling(), the display_row buffer will
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * be ignored, so pass NULL to it.
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * [*] png_handle_alpha() does not exist yet, as of this version of libpng
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_read_rows(png_structp png_ptr, png_bytepp row,
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_bytepp display_row, png_uint_32 num_rows)
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_uint_32 i;
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_bytepp rp;
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_bytepp dp;
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_read_rows");
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   rp = row;
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   dp = display_row;
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (rp != NULL && dp != NULL)
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (i = 0; i < num_rows; i++)
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_bytep rptr = *rp++;
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_bytep dptr = *dp++;
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_read_row(png_ptr, rptr, dptr);
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (rp != NULL)
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (i = 0; i < num_rows; i++)
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_bytep rptr = *rp;
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_read_row(png_ptr, rptr, png_bytep_NULL);
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         rp++;
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (dp != NULL)
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (i = 0; i < num_rows; i++)
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_bytep dptr = *dp;
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_read_row(png_ptr, png_bytep_NULL, dptr);
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         dp++;
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Read the entire image.  If the image has an alpha channel or a tRNS
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * chunk, and you have called png_handle_alpha()[*], you will need to
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * initialize the image to the current image that PNG will be overlaying.
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * We set the num_rows again here, in case it was incorrectly set in
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * png_read_start_row() by a call to png_read_update_info() or
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * png_start_read_image() if png_set_interlace_handling() wasn't called
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * prior to either of these functions like it should have been.  You can
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * only call this function once.  If you desire to have an image for
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * each pass of a interlaced image, use png_read_rows() instead.
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * [*] png_handle_alpha() does not exist yet, as of this version of libpng
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_read_image(png_structp png_ptr, png_bytepp image)
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_uint_32 i, image_height;
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int pass, j;
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_bytepp rp;
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_read_image");
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_INTERLACING_SUPPORTED
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pass = png_set_interlace_handling(png_ptr);
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->interlaced)
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_error(png_ptr,
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Cannot read interlaced image -- interlace handler disabled.");
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pass = 1;
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   image_height=png_ptr->height;
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->num_rows = image_height; /* Make sure this is set correctly */
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for (j = 0; j < pass; j++)
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rp = image;
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (i = 0; i < image_height; i++)
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_read_row(png_ptr, *rp, png_bytep_NULL);
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         rp++;
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Read the end of the PNG file.  Will not read past the end of the
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * file, will verify the end is accurate, and will read any comments
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or time information at the end of the file, if info is not NULL.
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_read_end(png_structp png_ptr, png_infop info_ptr)
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_read_end");
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_crc_finish(png_ptr, 0); /* Finish off CRC from last IDAT chunk */
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   do
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USE_LOCAL_ARRAYS
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_IHDR;
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_IDAT;
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_IEND;
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_PLTE;
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_bKGD_SUPPORTED
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_bKGD;
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_cHRM_SUPPORTED
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_cHRM;
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_gAMA_SUPPORTED
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_gAMA;
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_hIST_SUPPORTED
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_hIST;
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iCCP_SUPPORTED
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_iCCP;
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iTXt_SUPPORTED
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_iTXt;
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_oFFs_SUPPORTED
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_oFFs;
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_pCAL_SUPPORTED
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_pCAL;
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_pHYs_SUPPORTED
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_pHYs;
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sBIT_SUPPORTED
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_sBIT;
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sCAL_SUPPORTED
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_sCAL;
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sPLT_SUPPORTED
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_sPLT;
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sRGB_SUPPORTED
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_sRGB;
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tEXt_SUPPORTED
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_tEXt;
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tIME_SUPPORTED
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_tIME;
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tRNS_SUPPORTED
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_tRNS;
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_zTXt_SUPPORTED
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST PNG_zTXt;
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_USE_LOCAL_ARRAYS */
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_uint_32 length = png_read_chunk_header(png_ptr);
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PNG_CONST png_bytep chunk_name = png_ptr->chunk_name;
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!png_memcmp(chunk_name, png_IHDR, 4))
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_IHDR(png_ptr, info_ptr, length);
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_IEND, 4))
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_IEND(png_ptr, info_ptr, length);
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (png_handle_as_unknown(png_ptr, chunk_name))
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (!png_memcmp(chunk_name, png_IDAT, 4))
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT))
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_error(png_ptr, "Too many IDAT's found");
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_unknown(png_ptr, info_ptr, length);
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (!png_memcmp(chunk_name, png_PLTE, 4))
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_ptr->mode |= PNG_HAVE_PLTE;
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_IDAT, 4))
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         /* Zero length IDATs are legal after the last IDAT has been
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          * read, but not after other chunks have been read.
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          */
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT))
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_error(png_ptr, "Too many IDAT's found");
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_crc_finish(png_ptr, length);
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_PLTE, 4))
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_PLTE(png_ptr, info_ptr, length);
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_bKGD_SUPPORTED
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_bKGD, 4))
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_bKGD(png_ptr, info_ptr, length);
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_cHRM_SUPPORTED
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_cHRM, 4))
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_cHRM(png_ptr, info_ptr, length);
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_gAMA_SUPPORTED
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_gAMA, 4))
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_gAMA(png_ptr, info_ptr, length);
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_hIST_SUPPORTED
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_hIST, 4))
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_hIST(png_ptr, info_ptr, length);
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_oFFs_SUPPORTED
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_oFFs, 4))
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_oFFs(png_ptr, info_ptr, length);
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_pCAL_SUPPORTED
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_pCAL, 4))
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_pCAL(png_ptr, info_ptr, length);
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sCAL_SUPPORTED
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_sCAL, 4))
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_sCAL(png_ptr, info_ptr, length);
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_pHYs_SUPPORTED
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_pHYs, 4))
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_pHYs(png_ptr, info_ptr, length);
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sBIT_SUPPORTED
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_sBIT, 4))
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_sBIT(png_ptr, info_ptr, length);
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sRGB_SUPPORTED
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_sRGB, 4))
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_sRGB(png_ptr, info_ptr, length);
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iCCP_SUPPORTED
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_iCCP, 4))
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_iCCP(png_ptr, info_ptr, length);
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_sPLT_SUPPORTED
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_sPLT, 4))
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_sPLT(png_ptr, info_ptr, length);
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tEXt_SUPPORTED
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_tEXt, 4))
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_tEXt(png_ptr, info_ptr, length);
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tIME_SUPPORTED
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_tIME, 4))
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_tIME(png_ptr, info_ptr, length);
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_tRNS_SUPPORTED
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_tRNS, 4))
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_tRNS(png_ptr, info_ptr, length);
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_zTXt_SUPPORTED
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_zTXt, 4))
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_zTXt(png_ptr, info_ptr, length);
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_iTXt_SUPPORTED
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!png_memcmp(chunk_name, png_iTXt, 4))
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_iTXt(png_ptr, info_ptr, length);
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_handle_unknown(png_ptr, info_ptr, length);
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } while (!(png_ptr->mode & PNG_HAVE_IEND));
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Free all memory used by the read */
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr,
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_infopp end_info_ptr_ptr)
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_structp png_ptr = NULL;
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_infop info_ptr = NULL, end_info_ptr = NULL;
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_free_ptr free_fn = NULL;
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_voidp mem_ptr = NULL;
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_destroy_read_struct");
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr_ptr != NULL)
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr = *png_ptr_ptr;
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   free_fn = png_ptr->free_fn;
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   mem_ptr = png_ptr->mem_ptr;
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (info_ptr_ptr != NULL)
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      info_ptr = *info_ptr_ptr;
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (end_info_ptr_ptr != NULL)
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      end_info_ptr = *end_info_ptr_ptr;
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_read_destroy(png_ptr, info_ptr, end_info_ptr);
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (info_ptr != NULL)
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_TEXT_SUPPORTED
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, -1);
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn,
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (png_voidp)mem_ptr);
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_destroy_struct((png_voidp)info_ptr);
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *info_ptr_ptr = NULL;
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (end_info_ptr != NULL)
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_TEXT_SUPPORTED
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_free_data(png_ptr, end_info_ptr, PNG_FREE_TEXT, -1);
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_destroy_struct_2((png_voidp)end_info_ptr, (png_free_ptr)free_fn,
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (png_voidp)mem_ptr);
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_destroy_struct((png_voidp)end_info_ptr);
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *end_info_ptr_ptr = NULL;
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr != NULL)
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn,
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (png_voidp)mem_ptr);
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_destroy_struct((png_voidp)png_ptr);
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *png_ptr_ptr = NULL;
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Free all memory used by the read (old method) */
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_read_destroy(png_structp png_ptr, png_infop info_ptr,
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    png_infop end_info_ptr)
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SETJMP_SUPPORTED
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   jmp_buf tmp_jmp;
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_error_ptr error_fn;
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_error_ptr warning_fn;
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_voidp error_ptr;
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_free_ptr free_fn;
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_read_destroy");
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (info_ptr != NULL)
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_info_destroy(png_ptr, info_ptr);
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (end_info_ptr != NULL)
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_info_destroy(png_ptr, end_info_ptr);
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_free(png_ptr, png_ptr->zbuf);
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_free(png_ptr, png_ptr->big_row_buf);
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_free(png_ptr, png_ptr->prev_row);
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_free(png_ptr, png_ptr->chunkdata);
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_DITHER_SUPPORTED
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_free(png_ptr, png_ptr->palette_lookup);
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_free(png_ptr, png_ptr->dither_index);
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_GAMMA_SUPPORTED
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_free(png_ptr, png_ptr->gamma_table);
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_BACKGROUND_SUPPORTED
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_free(png_ptr, png_ptr->gamma_from_1);
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_free(png_ptr, png_ptr->gamma_to_1);
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_FREE_ME_SUPPORTED
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->free_me & PNG_FREE_PLTE)
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_zfree(png_ptr, png_ptr->palette);
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->free_me &= ~PNG_FREE_PLTE;
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->flags & PNG_FLAG_FREE_PLTE)
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_zfree(png_ptr, png_ptr->palette);
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->flags &= ~PNG_FLAG_FREE_PLTE;
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_tRNS_SUPPORTED) || \
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_FREE_ME_SUPPORTED
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->free_me & PNG_FREE_TRNS)
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_free(png_ptr, png_ptr->trans);
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->free_me &= ~PNG_FREE_TRNS;
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->flags & PNG_FLAG_FREE_TRNS)
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_free(png_ptr, png_ptr->trans);
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->flags &= ~PNG_FLAG_FREE_TRNS;
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_hIST_SUPPORTED
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_FREE_ME_SUPPORTED
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->free_me & PNG_FREE_HIST)
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_free(png_ptr, png_ptr->hist);
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->free_me &= ~PNG_FREE_HIST;
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->flags & PNG_FLAG_FREE_HIST)
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_free(png_ptr, png_ptr->hist);
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->flags &= ~PNG_FLAG_FREE_HIST;
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_GAMMA_SUPPORTED
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->gamma_16_table != NULL)
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int i;
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int istop = (1 << (8 - png_ptr->gamma_shift));
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (i = 0; i < istop; i++)
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_free(png_ptr, png_ptr->gamma_16_table[i]);
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_free(png_ptr, png_ptr->gamma_16_table);
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_BACKGROUND_SUPPORTED
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->gamma_16_from_1 != NULL)
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int i;
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int istop = (1 << (8 - png_ptr->gamma_shift));
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (i = 0; i < istop; i++)
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_free(png_ptr, png_ptr->gamma_16_from_1[i]);
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_free(png_ptr, png_ptr->gamma_16_from_1);
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->gamma_16_to_1 != NULL)
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int i;
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int istop = (1 << (8 - png_ptr->gamma_shift));
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (i = 0; i < istop; i++)
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_free(png_ptr, png_ptr->gamma_16_to_1[i]);
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_free(png_ptr, png_ptr->gamma_16_to_1);
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_TIME_RFC1123_SUPPORTED
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_free(png_ptr, png_ptr->time_buffer);
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   inflateEnd(&png_ptr->zstream);
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_free(png_ptr, png_ptr->save_buffer);
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_TEXT_SUPPORTED
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_free(png_ptr, png_ptr->current_text);
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_TEXT_SUPPORTED */
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Save the important info out of the png_struct, in case it is
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * being used again.
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SETJMP_SUPPORTED
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf));
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   error_fn = png_ptr->error_fn;
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   warning_fn = png_ptr->warning_fn;
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   error_ptr = png_ptr->error_ptr;
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   free_fn = png_ptr->free_fn;
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_memset(png_ptr, 0, png_sizeof(png_struct));
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->error_fn = error_fn;
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->warning_fn = warning_fn;
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->error_ptr = error_ptr;
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_MEM_SUPPORTED
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->free_fn = free_fn;
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SETJMP_SUPPORTED
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf));
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_read_status_fn(png_structp png_ptr, png_read_status_ptr read_row_fn)
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->read_row_fn = read_row_fn;
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_INFO_IMAGE_SUPPORTED
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_read_png(png_structp png_ptr, png_infop info_ptr,
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int transforms,
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           voidp params)
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int row;
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Invert the alpha channel from opacity to transparency
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (transforms & PNG_TRANSFORM_INVERT_ALPHA)
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       png_set_invert_alpha(png_ptr);
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* png_read_info() gives us all of the information from the
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * PNG file before the first IDAT (image data chunk).
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_read_info(png_ptr, info_ptr);
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (info_ptr->height > PNG_UINT_32_MAX/png_sizeof(png_bytep))
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_error(png_ptr, "Image is too high to process with png_read_png()");
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* -------------- image transformations start here ------------------- */
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_16_TO_8_SUPPORTED
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Tell libpng to strip 16 bit/color files down to 8 bits per color.
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (transforms & PNG_TRANSFORM_STRIP_16)
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_set_strip_16(png_ptr);
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Strip alpha bytes from the input data without combining with
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * the background (not recommended).
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (transforms & PNG_TRANSFORM_STRIP_ALPHA)
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_set_strip_alpha(png_ptr);
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_PACK_SUPPORTED) && !defined(PNG_READ_EXPAND_SUPPORTED)
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Extract multiple pixels with bit depths of 1, 2, or 4 from a single
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * byte into separate bytes (useful for paletted and grayscale images).
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (transforms & PNG_TRANSFORM_PACKING)
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_set_packing(png_ptr);
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_PACKSWAP_SUPPORTED
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Change the order of packed pixels to least significant bit first
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * (not useful if you are using png_set_packing).
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (transforms & PNG_TRANSFORM_PACKSWAP)
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_set_packswap(png_ptr);
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_EXPAND_SUPPORTED
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Expand paletted colors into true RGB triplets
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Expand grayscale images to full 8 bits from 1, 2, or 4 bits/pixel
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Expand paletted or RGB images with transparency to full alpha
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * channels so the data will be available as RGBA quartets.
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (transforms & PNG_TRANSFORM_EXPAND)
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((png_ptr->bit_depth < 8) ||
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ||
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)))
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_set_expand(png_ptr);
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* We don't handle background color or gamma transformation or dithering.
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_INVERT_SUPPORTED
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Invert monochrome files to have 0 as white and 1 as black
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (transforms & PNG_TRANSFORM_INVERT_MONO)
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_set_invert_mono(png_ptr);
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_SHIFT_SUPPORTED
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* If you want to shift the pixel values from the range [0,255] or
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * [0,65535] to the original [0,7] or [0,31], or whatever range the
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * colors were originally in:
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ((transforms & PNG_TRANSFORM_SHIFT)
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       && png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT))
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_color_8p sig_bit;
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_get_sBIT(png_ptr, info_ptr, &sig_bit);
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_set_shift(png_ptr, sig_bit);
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_BGR_SUPPORTED
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Flip the RGB pixels to BGR (or RGBA to BGRA)
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (transforms & PNG_TRANSFORM_BGR)
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_set_bgr(png_ptr);
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_SWAP_ALPHA_SUPPORTED
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR)
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (transforms & PNG_TRANSFORM_SWAP_ALPHA)
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       png_set_swap_alpha(png_ptr);
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_SWAP_SUPPORTED
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Swap bytes of 16 bit files to least significant byte first
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (transforms & PNG_TRANSFORM_SWAP_ENDIAN)
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_set_swap(png_ptr);
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Added at libpng-1.2.41 */
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Invert the alpha channel from opacity to transparency
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (transforms & PNG_TRANSFORM_INVERT_ALPHA)
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       png_set_invert_alpha(png_ptr);
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Added at libpng-1.2.41 */
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Expand grayscale image to RGB
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (transforms & PNG_TRANSFORM_GRAY_TO_RGB)
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       png_set_gray_to_rgb(png_ptr);
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* We don't handle adding filler bytes */
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Optional call to gamma correct and add the background to the palette
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * and update info structure.  REQUIRED if you are expecting libpng to
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * update the palette for you (i.e., you selected such a transform above).
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_read_update_info(png_ptr, info_ptr);
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* -------------- image transformations end here ------------------- */
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_FREE_ME_SUPPORTED
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0);
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (info_ptr->row_pointers == NULL)
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      info_ptr->row_pointers = (png_bytepp)png_malloc(png_ptr,
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         info_ptr->height * png_sizeof(png_bytep));
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_memset(info_ptr->row_pointers, 0, info_ptr->height
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * png_sizeof(png_bytep));
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_FREE_ME_SUPPORTED
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      info_ptr->free_me |= PNG_FREE_ROWS;
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (row = 0; row < (int)info_ptr->height; row++)
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         info_ptr->row_pointers[row] = (png_bytep)png_malloc(png_ptr,
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_get_rowbytes(png_ptr, info_ptr));
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_read_image(png_ptr, info_ptr->row_pointers);
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   info_ptr->valid |= PNG_INFO_IDAT;
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Read rest of file, and get additional chunks in info_ptr - REQUIRED */
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_read_end(png_ptr, info_ptr);
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   transforms = transforms; /* Quiet compiler warnings */
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   params = params;
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_INFO_IMAGE_SUPPORTED */
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_READ_SUPPORTED */
1529