Dependencies:   emwin_lib

Fork of DMemWin by Embedded Artists

Committer:
destinyXfate
Date:
Thu Jun 02 04:55:08 2016 +0000
Revision:
4:20387dbf7ecf
Parent:
2:0e2ef1edf01b
;

Who changed what in which revision?

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