| OLD | NEW |
| 1 | 1 |
| 2 /* pngerror.c - stub functions for i/o and memory allocation | 2 /* pngerror.c - stub functions for i/o and memory allocation |
| 3 * | 3 * |
| 4 * Last changed in libpng 1.2.37 [June 4, 2009] | 4 * Last changed in libpng 1.2.41 [December 3, 2009] |
| 5 * For conditions of distribution and use, see copyright notice in png.h | |
| 6 * Copyright (c) 1998-2009 Glenn Randers-Pehrson | 5 * Copyright (c) 1998-2009 Glenn Randers-Pehrson |
| 7 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) | 6 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) |
| 8 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) | 7 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) |
| 9 * | 8 * |
| 9 * This code is released under the libpng license. |
| 10 * For conditions of distribution and use, see the disclaimer |
| 11 * and license in png.h |
| 12 * |
| 10 * This file provides a location for all error handling. Users who | 13 * This file provides a location for all error handling. Users who |
| 11 * need special error handling are expected to write replacement functions | 14 * need special error handling are expected to write replacement functions |
| 12 * and use png_set_error_fn() to use those functions. See the instructions | 15 * and use png_set_error_fn() to use those functions. See the instructions |
| 13 * at each function. | 16 * at each function. |
| 14 */ | 17 */ |
| 15 | 18 |
| 16 #define PNG_INTERNAL | 19 #define PNG_INTERNAL |
| 20 #define PNG_NO_PEDANTIC_WARNINGS |
| 17 #include "png.h" | 21 #include "png.h" |
| 18 #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) | 22 #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) |
| 19 | 23 |
| 20 static void /* PRIVATE */ | 24 static void /* PRIVATE */ |
| 21 png_default_error PNGARG((png_structp png_ptr, | 25 png_default_error PNGARG((png_structp png_ptr, |
| 22 png_const_charp error_message)); | 26 png_const_charp error_message)) PNG_NORETURN; |
| 23 #ifndef PNG_NO_WARNINGS | 27 #ifdef PNG_WARNINGS_SUPPORTED |
| 24 static void /* PRIVATE */ | 28 static void /* PRIVATE */ |
| 25 png_default_warning PNGARG((png_structp png_ptr, | 29 png_default_warning PNGARG((png_structp png_ptr, |
| 26 png_const_charp warning_message)); | 30 png_const_charp warning_message)); |
| 27 #endif /* PNG_NO_WARNINGS */ | 31 #endif /* PNG_WARNINGS_SUPPORTED */ |
| 28 | 32 |
| 29 /* This function is called whenever there is a fatal error. This function | 33 /* This function is called whenever there is a fatal error. This function |
| 30 * should not be changed. If there is a need to handle errors differently, | 34 * should not be changed. If there is a need to handle errors differently, |
| 31 * you should supply a replacement error function and use png_set_error_fn() | 35 * you should supply a replacement error function and use png_set_error_fn() |
| 32 * to replace the error function at run-time. | 36 * to replace the error function at run-time. |
| 33 */ | 37 */ |
| 34 #ifndef PNG_NO_ERROR_TEXT | 38 #ifdef PNG_ERROR_TEXT_SUPPORTED |
| 35 void PNGAPI | 39 void PNGAPI |
| 36 png_error(png_structp png_ptr, png_const_charp error_message) | 40 png_error(png_structp png_ptr, png_const_charp error_message) |
| 37 { | 41 { |
| 38 #ifdef PNG_ERROR_NUMBERS_SUPPORTED | 42 #ifdef PNG_ERROR_NUMBERS_SUPPORTED |
| 39 char msg[16]; | 43 char msg[16]; |
| 40 if (png_ptr != NULL) | 44 if (png_ptr != NULL) |
| 41 { | 45 { |
| 42 if (png_ptr->flags& | 46 if (png_ptr->flags& |
| 43 (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) | 47 (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) |
| 44 { | 48 { |
| 45 if (*error_message == '#') | 49 if (*error_message == PNG_LITERAL_SHARP) |
| 46 { | 50 { |
| 47 /* Strip "#nnnn " from beginning of error message. */ | 51 /* Strip "#nnnn " from beginning of error message. */ |
| 48 int offset; | 52 int offset; |
| 49 for (offset = 1; offset<15; offset++) | 53 for (offset = 1; offset<15; offset++) |
| 50 if (error_message[offset] == ' ') | 54 if (error_message[offset] == ' ') |
| 51 break; | 55 break; |
| 52 if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT) | 56 if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT) |
| 53 { | 57 { |
| 54 int i; | 58 int i; |
| 55 for (i = 0; i < offset - 1; i++) | 59 for (i = 0; i < offset - 1; i++) |
| (...skipping 27 matching lines...) Expand all Loading... |
| 83 void PNGAPI | 87 void PNGAPI |
| 84 png_err(png_structp png_ptr) | 88 png_err(png_structp png_ptr) |
| 85 { | 89 { |
| 86 if (png_ptr != NULL && png_ptr->error_fn != NULL) | 90 if (png_ptr != NULL && png_ptr->error_fn != NULL) |
| 87 (*(png_ptr->error_fn))(png_ptr, '\0'); | 91 (*(png_ptr->error_fn))(png_ptr, '\0'); |
| 88 | 92 |
| 89 /* If the custom handler doesn't exist, or if it returns, | 93 /* If the custom handler doesn't exist, or if it returns, |
| 90 use the default handler, which will not return. */ | 94 use the default handler, which will not return. */ |
| 91 png_default_error(png_ptr, '\0'); | 95 png_default_error(png_ptr, '\0'); |
| 92 } | 96 } |
| 93 #endif /* PNG_NO_ERROR_TEXT */ | 97 #endif /* PNG_ERROR_TEXT_SUPPORTED */ |
| 94 | 98 |
| 95 #ifndef PNG_NO_WARNINGS | 99 #ifdef PNG_WARNINGS_SUPPORTED |
| 96 /* This function is called whenever there is a non-fatal error. This function | 100 /* This function is called whenever there is a non-fatal error. This function |
| 97 * should not be changed. If there is a need to handle warnings differently, | 101 * should not be changed. If there is a need to handle warnings differently, |
| 98 * you should supply a replacement warning function and use | 102 * you should supply a replacement warning function and use |
| 99 * png_set_error_fn() to replace the warning function at run-time. | 103 * png_set_error_fn() to replace the warning function at run-time. |
| 100 */ | 104 */ |
| 101 void PNGAPI | 105 void PNGAPI |
| 102 png_warning(png_structp png_ptr, png_const_charp warning_message) | 106 png_warning(png_structp png_ptr, png_const_charp warning_message) |
| 103 { | 107 { |
| 104 int offset = 0; | 108 int offset = 0; |
| 105 if (png_ptr != NULL) | 109 if (png_ptr != NULL) |
| 106 { | 110 { |
| 107 #ifdef PNG_ERROR_NUMBERS_SUPPORTED | 111 #ifdef PNG_ERROR_NUMBERS_SUPPORTED |
| 108 if (png_ptr->flags& | 112 if (png_ptr->flags& |
| 109 (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) | 113 (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) |
| 110 #endif | 114 #endif |
| 111 { | 115 { |
| 112 if (*warning_message == '#') | 116 if (*warning_message == PNG_LITERAL_SHARP) |
| 113 { | 117 { |
| 114 for (offset = 1; offset < 15; offset++) | 118 for (offset = 1; offset < 15; offset++) |
| 115 if (warning_message[offset] == ' ') | 119 if (warning_message[offset] == ' ') |
| 116 break; | 120 break; |
| 117 } | 121 } |
| 118 } | 122 } |
| 119 } | 123 } |
| 120 if (png_ptr != NULL && png_ptr->warning_fn != NULL) | 124 if (png_ptr != NULL && png_ptr->warning_fn != NULL) |
| 121 (*(png_ptr->warning_fn))(png_ptr, warning_message + offset); | 125 (*(png_ptr->warning_fn))(png_ptr, warning_message + offset); |
| 122 else | 126 else |
| 123 png_default_warning(png_ptr, warning_message + offset); | 127 png_default_warning(png_ptr, warning_message + offset); |
| 124 } | 128 } |
| 125 #endif /* PNG_NO_WARNINGS */ | 129 #endif /* PNG_WARNINGS_SUPPORTED */ |
| 126 | 130 |
| 131 #ifdef PNG_BENIGN_ERRORS_SUPPORTED |
| 132 void PNGAPI |
| 133 png_benign_error(png_structp png_ptr, png_const_charp error_message) |
| 134 { |
| 135 if (png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN) |
| 136 png_warning(png_ptr, error_message); |
| 137 else |
| 138 png_error(png_ptr, error_message); |
| 139 } |
| 140 #endif |
| 127 | 141 |
| 128 /* These utilities are used internally to build an error message that relates | 142 /* These utilities are used internally to build an error message that relates |
| 129 * to the current chunk. The chunk name comes from png_ptr->chunk_name, | 143 * to the current chunk. The chunk name comes from png_ptr->chunk_name, |
| 130 * this is used to prefix the message. The message is limited in length | 144 * this is used to prefix the message. The message is limited in length |
| 131 * to 63 bytes, the name characters are output as hex digits wrapped in [] | 145 * to 63 bytes, the name characters are output as hex digits wrapped in [] |
| 132 * if the character is invalid. | 146 * if the character is invalid. |
| 133 */ | 147 */ |
| 134 #define isnonalpha(c) ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97)) | 148 #define isnonalpha(c) ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97)) |
| 135 static PNG_CONST char png_digit[16] = { | 149 static PNG_CONST char png_digit[16] = { |
| 136 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', | 150 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', |
| 137 'A', 'B', 'C', 'D', 'E', 'F' | 151 'A', 'B', 'C', 'D', 'E', 'F' |
| 138 }; | 152 }; |
| 139 | 153 |
| 140 #define PNG_MAX_ERROR_TEXT 64 | 154 #define PNG_MAX_ERROR_TEXT 64 |
| 141 | 155 #if defined(PNG_WARNINGS_SUPPORTED) || defined(PNG_ERROR_TEXT_SUPPORTED) |
| 142 #if !defined(PNG_NO_WARNINGS) || !defined(PNG_NO_ERROR_TEXT) | |
| 143 static void /* PRIVATE */ | 156 static void /* PRIVATE */ |
| 144 png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp | 157 png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp |
| 145 error_message) | 158 error_message) |
| 146 { | 159 { |
| 147 int iout = 0, iin = 0; | 160 int iout = 0, iin = 0; |
| 148 | 161 |
| 149 while (iin < 4) | 162 while (iin < 4) |
| 150 { | 163 { |
| 151 int c = png_ptr->chunk_name[iin++]; | 164 int c = png_ptr->chunk_name[iin++]; |
| 152 if (isnonalpha(c)) | 165 if (isnonalpha(c)) |
| 153 { | 166 { |
| 154 buffer[iout++] = '['; | 167 buffer[iout++] = PNG_LITERAL_LEFT_SQUARE_BRACKET; |
| 155 buffer[iout++] = png_digit[(c & 0xf0) >> 4]; | 168 buffer[iout++] = png_digit[(c & 0xf0) >> 4]; |
| 156 buffer[iout++] = png_digit[c & 0x0f]; | 169 buffer[iout++] = png_digit[c & 0x0f]; |
| 157 buffer[iout++] = ']'; | 170 buffer[iout++] = PNG_LITERAL_RIGHT_SQUARE_BRACKET; |
| 158 } | 171 } |
| 159 else | 172 else |
| 160 { | 173 { |
| 161 buffer[iout++] = (png_byte)c; | 174 buffer[iout++] = (png_byte)c; |
| 162 } | 175 } |
| 163 } | 176 } |
| 164 | 177 |
| 165 if (error_message == NULL) | 178 if (error_message == NULL) |
| 166 buffer[iout] = '\0'; | 179 buffer[iout] = '\0'; |
| 167 else | 180 else |
| (...skipping 12 matching lines...) Expand all Loading... |
| 180 char msg[18+PNG_MAX_ERROR_TEXT]; | 193 char msg[18+PNG_MAX_ERROR_TEXT]; |
| 181 if (png_ptr == NULL) | 194 if (png_ptr == NULL) |
| 182 png_error(png_ptr, error_message); | 195 png_error(png_ptr, error_message); |
| 183 else | 196 else |
| 184 { | 197 { |
| 185 png_format_buffer(png_ptr, msg, error_message); | 198 png_format_buffer(png_ptr, msg, error_message); |
| 186 png_error(png_ptr, msg); | 199 png_error(png_ptr, msg); |
| 187 } | 200 } |
| 188 } | 201 } |
| 189 #endif /* PNG_READ_SUPPORTED */ | 202 #endif /* PNG_READ_SUPPORTED */ |
| 190 #endif /* !defined(PNG_NO_WARNINGS) || !defined(PNG_NO_ERROR_TEXT) */ | 203 #endif /* PNG_WARNINGS_SUPPORTED || PNG_ERROR_TEXT_SUPPORTED */ |
| 191 | 204 |
| 192 #ifndef PNG_NO_WARNINGS | 205 #ifdef PNG_WARNINGS_SUPPORTED |
| 193 void PNGAPI | 206 void PNGAPI |
| 194 png_chunk_warning(png_structp png_ptr, png_const_charp warning_message) | 207 png_chunk_warning(png_structp png_ptr, png_const_charp warning_message) |
| 195 { | 208 { |
| 196 char msg[18+PNG_MAX_ERROR_TEXT]; | 209 char msg[18+PNG_MAX_ERROR_TEXT]; |
| 197 if (png_ptr == NULL) | 210 if (png_ptr == NULL) |
| 198 png_warning(png_ptr, warning_message); | 211 png_warning(png_ptr, warning_message); |
| 199 else | 212 else |
| 200 { | 213 { |
| 201 png_format_buffer(png_ptr, msg, warning_message); | 214 png_format_buffer(png_ptr, msg, warning_message); |
| 202 png_warning(png_ptr, msg); | 215 png_warning(png_ptr, msg); |
| 203 } | 216 } |
| 204 } | 217 } |
| 205 #endif /* PNG_NO_WARNINGS */ | 218 #endif /* PNG_WARNINGS_SUPPORTED */ |
| 206 | 219 |
| 220 #ifdef PNG_READ_SUPPORTED |
| 221 #ifdef PNG_BENIGN_ERRORS_SUPPORTED |
| 222 void PNGAPI |
| 223 png_chunk_benign_error(png_structp png_ptr, png_const_charp error_message) |
| 224 { |
| 225 if (png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN) |
| 226 png_chunk_warning(png_ptr, error_message); |
| 227 else |
| 228 png_chunk_error(png_ptr, error_message); |
| 229 } |
| 230 #endif |
| 231 #endif /* PNG_READ_SUPPORTED */ |
| 207 | 232 |
| 208 /* This is the default error handling function. Note that replacements for | 233 /* This is the default error handling function. Note that replacements for |
| 209 * this function MUST NOT RETURN, or the program will likely crash. This | 234 * this function MUST NOT RETURN, or the program will likely crash. This |
| 210 * function is used by default, or if the program supplies NULL for the | 235 * function is used by default, or if the program supplies NULL for the |
| 211 * error function pointer in png_set_error_fn(). | 236 * error function pointer in png_set_error_fn(). |
| 212 */ | 237 */ |
| 213 static void /* PRIVATE */ | 238 static void /* PRIVATE */ |
| 214 png_default_error(png_structp png_ptr, png_const_charp error_message) | 239 png_default_error(png_structp png_ptr, png_const_charp error_message) |
| 215 { | 240 { |
| 216 #ifndef PNG_NO_CONSOLE_IO | 241 #ifdef PNG_CONSOLE_IO_SUPPORTED |
| 217 #ifdef PNG_ERROR_NUMBERS_SUPPORTED | 242 #ifdef PNG_ERROR_NUMBERS_SUPPORTED |
| 218 if (*error_message == '#') | 243 if (*error_message == PNG_LITERAL_SHARP) |
| 219 { | 244 { |
| 220 /* Strip "#nnnn " from beginning of error message. */ | 245 /* Strip "#nnnn " from beginning of error message. */ |
| 221 int offset; | 246 int offset; |
| 222 char error_number[16]; | 247 char error_number[16]; |
| 223 for (offset = 0; offset<15; offset++) | 248 for (offset = 0; offset<15; offset++) |
| 224 { | 249 { |
| 225 error_number[offset] = error_message[offset + 1]; | 250 error_number[offset] = error_message[offset + 1]; |
| 226 if (error_message[offset] == ' ') | 251 if (error_message[offset] == ' ') |
| 227 break; | 252 break; |
| 228 } | 253 } |
| (...skipping 19 matching lines...) Expand all Loading... |
| 248 } | 273 } |
| 249 #endif | 274 #endif |
| 250 | 275 |
| 251 #ifdef PNG_SETJMP_SUPPORTED | 276 #ifdef PNG_SETJMP_SUPPORTED |
| 252 if (png_ptr) | 277 if (png_ptr) |
| 253 { | 278 { |
| 254 # ifdef USE_FAR_KEYWORD | 279 # ifdef USE_FAR_KEYWORD |
| 255 { | 280 { |
| 256 jmp_buf jmpbuf; | 281 jmp_buf jmpbuf; |
| 257 png_memcpy(jmpbuf, png_ptr->jmpbuf, png_sizeof(jmp_buf)); | 282 png_memcpy(jmpbuf, png_ptr->jmpbuf, png_sizeof(jmp_buf)); |
| 258 longjmp(jmpbuf, 1); | 283 longjmp(jmpbuf,1); |
| 259 } | 284 } |
| 260 # else | 285 # else |
| 261 longjmp(png_ptr->jmpbuf, 1); | 286 longjmp(png_ptr->jmpbuf, 1); |
| 262 # endif | 287 # endif |
| 263 } | 288 } |
| 264 #else | 289 #endif |
| 290 /* Here if not setjmp support or if png_ptr is null. */ |
| 265 PNG_ABORT(); | 291 PNG_ABORT(); |
| 266 #endif | 292 #ifndef PNG_CONSOLE_IO_SUPPORTED |
| 267 #ifdef PNG_NO_CONSOLE_IO | |
| 268 error_message = error_message; /* Make compiler happy */ | 293 error_message = error_message; /* Make compiler happy */ |
| 269 #endif | 294 #endif |
| 270 } | 295 } |
| 271 | 296 |
| 272 #ifndef PNG_NO_WARNINGS | 297 #ifdef PNG_WARNINGS_SUPPORTED |
| 273 /* This function is called when there is a warning, but the library thinks | 298 /* This function is called when there is a warning, but the library thinks |
| 274 * it can continue anyway. Replacement functions don't have to do anything | 299 * it can continue anyway. Replacement functions don't have to do anything |
| 275 * here if you don't want them to. In the default configuration, png_ptr is | 300 * here if you don't want them to. In the default configuration, png_ptr is |
| 276 * not used, but it is passed in case it may be useful. | 301 * not used, but it is passed in case it may be useful. |
| 277 */ | 302 */ |
| 278 static void /* PRIVATE */ | 303 static void /* PRIVATE */ |
| 279 png_default_warning(png_structp png_ptr, png_const_charp warning_message) | 304 png_default_warning(png_structp png_ptr, png_const_charp warning_message) |
| 280 { | 305 { |
| 281 #ifndef PNG_NO_CONSOLE_IO | 306 #ifdef PNG_CONSOLE_IO_SUPPORTED |
| 282 # ifdef PNG_ERROR_NUMBERS_SUPPORTED | 307 # ifdef PNG_ERROR_NUMBERS_SUPPORTED |
| 283 if (*warning_message == '#') | 308 if (*warning_message == PNG_LITERAL_SHARP) |
| 284 { | 309 { |
| 285 int offset; | 310 int offset; |
| 286 char warning_number[16]; | 311 char warning_number[16]; |
| 287 for (offset = 0; offset < 15; offset++) | 312 for (offset = 0; offset < 15; offset++) |
| 288 { | 313 { |
| 289 warning_number[offset] = warning_message[offset + 1]; | 314 warning_number[offset] = warning_message[offset + 1]; |
| 290 if (warning_message[offset] == ' ') | 315 if (warning_message[offset] == ' ') |
| 291 break; | 316 break; |
| 292 } | 317 } |
| 293 if ((offset > 1) && (offset < 15)) | 318 if ((offset > 1) && (offset < 15)) |
| (...skipping 14 matching lines...) Expand all Loading... |
| 308 # endif | 333 # endif |
| 309 { | 334 { |
| 310 fprintf(stderr, "libpng warning: %s", warning_message); | 335 fprintf(stderr, "libpng warning: %s", warning_message); |
| 311 fprintf(stderr, PNG_STRING_NEWLINE); | 336 fprintf(stderr, PNG_STRING_NEWLINE); |
| 312 } | 337 } |
| 313 #else | 338 #else |
| 314 warning_message = warning_message; /* Make compiler happy */ | 339 warning_message = warning_message; /* Make compiler happy */ |
| 315 #endif | 340 #endif |
| 316 png_ptr = png_ptr; /* Make compiler happy */ | 341 png_ptr = png_ptr; /* Make compiler happy */ |
| 317 } | 342 } |
| 318 #endif /* PNG_NO_WARNINGS */ | 343 #endif /* PNG_WARNINGS_SUPPORTED */ |
| 319 | 344 |
| 320 /* This function is called when the application wants to use another method | 345 /* This function is called when the application wants to use another method |
| 321 * of handling errors and warnings. Note that the error function MUST NOT | 346 * of handling errors and warnings. Note that the error function MUST NOT |
| 322 * return to the calling routine or serious problems will occur. The return | 347 * return to the calling routine or serious problems will occur. The return |
| 323 * method used in the default routine calls longjmp(png_ptr->jmpbuf, 1) | 348 * method used in the default routine calls longjmp(png_ptr->jmpbuf, 1) |
| 324 */ | 349 */ |
| 325 void PNGAPI | 350 void PNGAPI |
| 326 png_set_error_fn(png_structp png_ptr, png_voidp error_ptr, | 351 png_set_error_fn(png_structp png_ptr, png_voidp error_ptr, |
| 327 png_error_ptr error_fn, png_error_ptr warning_fn) | 352 png_error_ptr error_fn, png_error_ptr warning_fn) |
| 328 { | 353 { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 352 png_set_strip_error_numbers(png_structp png_ptr, png_uint_32 strip_mode) | 377 png_set_strip_error_numbers(png_structp png_ptr, png_uint_32 strip_mode) |
| 353 { | 378 { |
| 354 if (png_ptr != NULL) | 379 if (png_ptr != NULL) |
| 355 { | 380 { |
| 356 png_ptr->flags &= | 381 png_ptr->flags &= |
| 357 ((~(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT))&strip_mode); | 382 ((~(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT))&strip_mode); |
| 358 } | 383 } |
| 359 } | 384 } |
| 360 #endif | 385 #endif |
| 361 #endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ | 386 #endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ |
| OLD | NEW |