| OLD | NEW |
| 1 | 1 |
| 2 /* pngpread.c - read a png file in push mode | 2 /* pngpread.c - read a png file in push mode |
| 3 * | 3 * |
| 4 * Last changed in libpng 1.2.32 [September 18, 2008] | 4 * Last changed in libpng 1.2.37 [June 4, 2009] |
| 5 * For conditions of distribution and use, see copyright notice in png.h | 5 * For conditions of distribution and use, see copyright notice in png.h |
| 6 * Copyright (c) 1998-2008 Glenn Randers-Pehrson | 6 * Copyright (c) 1998-2009 Glenn Randers-Pehrson |
| 7 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) | 7 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) |
| 8 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) | 8 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #define PNG_INTERNAL | 11 #define PNG_INTERNAL |
| 12 #include "png.h" | 12 #include "png.h" |
| 13 #ifdef PNG_PROGRESSIVE_READ_SUPPORTED | 13 #ifdef PNG_PROGRESSIVE_READ_SUPPORTED |
| 14 | 14 |
| 15 /* push model modes */ | 15 /* Push model modes */ |
| 16 #define PNG_READ_SIG_MODE 0 | 16 #define PNG_READ_SIG_MODE 0 |
| 17 #define PNG_READ_CHUNK_MODE 1 | 17 #define PNG_READ_CHUNK_MODE 1 |
| 18 #define PNG_READ_IDAT_MODE 2 | 18 #define PNG_READ_IDAT_MODE 2 |
| 19 #define PNG_SKIP_MODE 3 | 19 #define PNG_SKIP_MODE 3 |
| 20 #define PNG_READ_tEXt_MODE 4 | 20 #define PNG_READ_tEXt_MODE 4 |
| 21 #define PNG_READ_zTXt_MODE 5 | 21 #define PNG_READ_zTXt_MODE 5 |
| 22 #define PNG_READ_DONE_MODE 6 | 22 #define PNG_READ_DONE_MODE 6 |
| 23 #define PNG_READ_iTXt_MODE 7 | 23 #define PNG_READ_iTXt_MODE 7 |
| 24 #define PNG_ERROR_MODE 8 | 24 #define PNG_ERROR_MODE 8 |
| 25 | 25 |
| 26 void PNGAPI | 26 void PNGAPI |
| 27 png_process_data(png_structp png_ptr, png_infop info_ptr, | 27 png_process_data(png_structp png_ptr, png_infop info_ptr, |
| 28 png_bytep buffer, png_size_t buffer_size) | 28 png_bytep buffer, png_size_t buffer_size) |
| 29 { | 29 { |
| 30 if (png_ptr == NULL || info_ptr == NULL) return; | 30 if (png_ptr == NULL || info_ptr == NULL) |
| 31 return; |
| 32 |
| 31 png_push_restore_buffer(png_ptr, buffer, buffer_size); | 33 png_push_restore_buffer(png_ptr, buffer, buffer_size); |
| 32 | 34 |
| 33 while (png_ptr->buffer_size) | 35 while (png_ptr->buffer_size) |
| 34 { | 36 { |
| 35 png_process_some_data(png_ptr, info_ptr); | 37 png_process_some_data(png_ptr, info_ptr); |
| 36 } | 38 } |
| 37 } | 39 } |
| 38 | 40 |
| 39 /* What we do with the incoming data depends on what we were previously | 41 /* What we do with the incoming data depends on what we were previously |
| 40 * doing before we ran out of data... | 42 * doing before we ran out of data... |
| 41 */ | 43 */ |
| 42 void /* PRIVATE */ | 44 void /* PRIVATE */ |
| 43 png_process_some_data(png_structp png_ptr, png_infop info_ptr) | 45 png_process_some_data(png_structp png_ptr, png_infop info_ptr) |
| 44 { | 46 { |
| 45 if (png_ptr == NULL) return; | 47 if (png_ptr == NULL) |
| 48 return; |
| 49 |
| 46 switch (png_ptr->process_mode) | 50 switch (png_ptr->process_mode) |
| 47 { | 51 { |
| 48 case PNG_READ_SIG_MODE: | 52 case PNG_READ_SIG_MODE: |
| 49 { | 53 { |
| 50 png_push_read_sig(png_ptr, info_ptr); | 54 png_push_read_sig(png_ptr, info_ptr); |
| 51 break; | 55 break; |
| 52 } | 56 } |
| 57 |
| 53 case PNG_READ_CHUNK_MODE: | 58 case PNG_READ_CHUNK_MODE: |
| 54 { | 59 { |
| 55 png_push_read_chunk(png_ptr, info_ptr); | 60 png_push_read_chunk(png_ptr, info_ptr); |
| 56 break; | 61 break; |
| 57 } | 62 } |
| 63 |
| 58 case PNG_READ_IDAT_MODE: | 64 case PNG_READ_IDAT_MODE: |
| 59 { | 65 { |
| 60 png_push_read_IDAT(png_ptr); | 66 png_push_read_IDAT(png_ptr); |
| 61 break; | 67 break; |
| 62 } | 68 } |
| 69 |
| 63 #if defined(PNG_READ_tEXt_SUPPORTED) | 70 #if defined(PNG_READ_tEXt_SUPPORTED) |
| 64 case PNG_READ_tEXt_MODE: | 71 case PNG_READ_tEXt_MODE: |
| 65 { | 72 { |
| 66 png_push_read_tEXt(png_ptr, info_ptr); | 73 png_push_read_tEXt(png_ptr, info_ptr); |
| 67 break; | 74 break; |
| 68 } | 75 } |
| 76 |
| 69 #endif | 77 #endif |
| 70 #if defined(PNG_READ_zTXt_SUPPORTED) | 78 #if defined(PNG_READ_zTXt_SUPPORTED) |
| 71 case PNG_READ_zTXt_MODE: | 79 case PNG_READ_zTXt_MODE: |
| 72 { | 80 { |
| 73 png_push_read_zTXt(png_ptr, info_ptr); | 81 png_push_read_zTXt(png_ptr, info_ptr); |
| 74 break; | 82 break; |
| 75 } | 83 } |
| 84 |
| 76 #endif | 85 #endif |
| 77 #if defined(PNG_READ_iTXt_SUPPORTED) | 86 #if defined(PNG_READ_iTXt_SUPPORTED) |
| 78 case PNG_READ_iTXt_MODE: | 87 case PNG_READ_iTXt_MODE: |
| 79 { | 88 { |
| 80 png_push_read_iTXt(png_ptr, info_ptr); | 89 png_push_read_iTXt(png_ptr, info_ptr); |
| 81 break; | 90 break; |
| 82 } | 91 } |
| 92 |
| 83 #endif | 93 #endif |
| 84 case PNG_SKIP_MODE: | 94 case PNG_SKIP_MODE: |
| 85 { | 95 { |
| 86 png_push_crc_finish(png_ptr); | 96 png_push_crc_finish(png_ptr); |
| 87 break; | 97 break; |
| 88 } | 98 } |
| 99 |
| 89 default: | 100 default: |
| 90 { | 101 { |
| 91 png_ptr->buffer_size = 0; | 102 png_ptr->buffer_size = 0; |
| 92 break; | 103 break; |
| 93 } | 104 } |
| 94 } | 105 } |
| 95 } | 106 } |
| 96 | 107 |
| 97 /* Read any remaining signature bytes from the stream and compare them with | 108 /* Read any remaining signature bytes from the stream and compare them with |
| 98 * the correct PNG signature. It is possible that this routine is called | 109 * the correct PNG signature. It is possible that this routine is called |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 217 } | 228 } |
| 218 | 229 |
| 219 if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) | 230 if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) |
| 220 if (png_ptr->mode & PNG_AFTER_IDAT) | 231 if (png_ptr->mode & PNG_AFTER_IDAT) |
| 221 png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; | 232 png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; |
| 222 | 233 |
| 223 if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4)) | 234 if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4)) |
| 224 { | 235 { |
| 225 if (png_ptr->push_length != 13) | 236 if (png_ptr->push_length != 13) |
| 226 png_error(png_ptr, "Invalid IHDR length"); | 237 png_error(png_ptr, "Invalid IHDR length"); |
| 238 |
| 227 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 239 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 228 { | 240 { |
| 229 png_push_save_buffer(png_ptr); | 241 png_push_save_buffer(png_ptr); |
| 230 return; | 242 return; |
| 231 } | 243 } |
| 244 |
| 232 png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length); | 245 png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length); |
| 233 } | 246 } |
| 247 |
| 234 else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4)) | 248 else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4)) |
| 235 { | 249 { |
| 236 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 250 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 237 { | 251 { |
| 238 png_push_save_buffer(png_ptr); | 252 png_push_save_buffer(png_ptr); |
| 239 return; | 253 return; |
| 240 } | 254 } |
| 255 |
| 241 png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length); | 256 png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length); |
| 242 | 257 |
| 243 png_ptr->process_mode = PNG_READ_DONE_MODE; | 258 png_ptr->process_mode = PNG_READ_DONE_MODE; |
| 244 png_push_have_end(png_ptr, info_ptr); | 259 png_push_have_end(png_ptr, info_ptr); |
| 245 } | 260 } |
| 261 |
| 246 #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED | 262 #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED |
| 247 else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name)) | 263 else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name)) |
| 248 { | 264 { |
| 249 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 265 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 250 { | 266 { |
| 251 png_push_save_buffer(png_ptr); | 267 png_push_save_buffer(png_ptr); |
| 252 return; | 268 return; |
| 253 } | 269 } |
| 270 |
| 254 if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) | 271 if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) |
| 255 png_ptr->mode |= PNG_HAVE_IDAT; | 272 png_ptr->mode |= PNG_HAVE_IDAT; |
| 273 |
| 256 png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); | 274 png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); |
| 275 |
| 257 if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) | 276 if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) |
| 258 png_ptr->mode |= PNG_HAVE_PLTE; | 277 png_ptr->mode |= PNG_HAVE_PLTE; |
| 278 |
| 259 else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) | 279 else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) |
| 260 { | 280 { |
| 261 if (!(png_ptr->mode & PNG_HAVE_IHDR)) | 281 if (!(png_ptr->mode & PNG_HAVE_IHDR)) |
| 262 png_error(png_ptr, "Missing IHDR before IDAT"); | 282 png_error(png_ptr, "Missing IHDR before IDAT"); |
| 283 |
| 263 else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && | 284 else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && |
| 264 !(png_ptr->mode & PNG_HAVE_PLTE)) | 285 !(png_ptr->mode & PNG_HAVE_PLTE)) |
| 265 png_error(png_ptr, "Missing PLTE before IDAT"); | 286 png_error(png_ptr, "Missing PLTE before IDAT"); |
| 266 } | 287 } |
| 267 } | 288 } |
| 289 |
| 268 #endif | 290 #endif |
| 269 else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) | 291 else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) |
| 270 { | 292 { |
| 271 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 293 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 272 { | 294 { |
| 273 png_push_save_buffer(png_ptr); | 295 png_push_save_buffer(png_ptr); |
| 274 return; | 296 return; |
| 275 } | 297 } |
| 276 png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length); | 298 png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length); |
| 277 } | 299 } |
| 300 |
| 278 else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) | 301 else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) |
| 279 { | 302 { |
| 280 /* If we reach an IDAT chunk, this means we have read all of the | 303 /* If we reach an IDAT chunk, this means we have read all of the |
| 281 * header chunks, and we can start reading the image (or if this | 304 * header chunks, and we can start reading the image (or if this |
| 282 * is called after the image has been read - we have an error). | 305 * is called after the image has been read - we have an error). |
| 283 */ | 306 */ |
| 284 if (!(png_ptr->mode & PNG_HAVE_IHDR)) | 307 |
| 285 png_error(png_ptr, "Missing IHDR before IDAT"); | 308 if (!(png_ptr->mode & PNG_HAVE_IHDR)) |
| 286 else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && | 309 png_error(png_ptr, "Missing IHDR before IDAT"); |
| 287 !(png_ptr->mode & PNG_HAVE_PLTE)) | 310 |
| 288 png_error(png_ptr, "Missing PLTE before IDAT"); | 311 else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && |
| 312 !(png_ptr->mode & PNG_HAVE_PLTE)) |
| 313 png_error(png_ptr, "Missing PLTE before IDAT"); |
| 289 | 314 |
| 290 if (png_ptr->mode & PNG_HAVE_IDAT) | 315 if (png_ptr->mode & PNG_HAVE_IDAT) |
| 291 { | 316 { |
| 292 if (!(png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) | 317 if (!(png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) |
| 293 if (png_ptr->push_length == 0) | 318 if (png_ptr->push_length == 0) |
| 294 return; | 319 return; |
| 295 | 320 |
| 296 if (png_ptr->mode & PNG_AFTER_IDAT) | 321 if (png_ptr->mode & PNG_AFTER_IDAT) |
| 297 png_error(png_ptr, "Too many IDAT's found"); | 322 png_error(png_ptr, "Too many IDAT's found"); |
| 298 } | 323 } |
| 299 | 324 |
| 300 png_ptr->idat_size = png_ptr->push_length; | 325 png_ptr->idat_size = png_ptr->push_length; |
| 301 png_ptr->mode |= PNG_HAVE_IDAT; | 326 png_ptr->mode |= PNG_HAVE_IDAT; |
| 302 png_ptr->process_mode = PNG_READ_IDAT_MODE; | 327 png_ptr->process_mode = PNG_READ_IDAT_MODE; |
| 303 png_push_have_info(png_ptr, info_ptr); | 328 png_push_have_info(png_ptr, info_ptr); |
| 304 png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes; | 329 png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes; |
| 305 png_ptr->zstream.next_out = png_ptr->row_buf; | 330 png_ptr->zstream.next_out = png_ptr->row_buf; |
| 306 return; | 331 return; |
| 307 } | 332 } |
| 333 |
| 308 #if defined(PNG_READ_gAMA_SUPPORTED) | 334 #if defined(PNG_READ_gAMA_SUPPORTED) |
| 309 else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4)) | 335 else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4)) |
| 310 { | 336 { |
| 311 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 337 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 312 { | 338 { |
| 313 png_push_save_buffer(png_ptr); | 339 png_push_save_buffer(png_ptr); |
| 314 return; | 340 return; |
| 315 } | 341 } |
| 342 |
| 316 png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length); | 343 png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length); |
| 317 } | 344 } |
| 345 |
| 318 #endif | 346 #endif |
| 319 #if defined(PNG_READ_sBIT_SUPPORTED) | 347 #if defined(PNG_READ_sBIT_SUPPORTED) |
| 320 else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4)) | 348 else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4)) |
| 321 { | 349 { |
| 322 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 350 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 323 { | 351 { |
| 324 png_push_save_buffer(png_ptr); | 352 png_push_save_buffer(png_ptr); |
| 325 return; | 353 return; |
| 326 } | 354 } |
| 355 |
| 327 png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length); | 356 png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length); |
| 328 } | 357 } |
| 358 |
| 329 #endif | 359 #endif |
| 330 #if defined(PNG_READ_cHRM_SUPPORTED) | 360 #if defined(PNG_READ_cHRM_SUPPORTED) |
| 331 else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4)) | 361 else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4)) |
| 332 { | 362 { |
| 333 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 363 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 334 { | 364 { |
| 335 png_push_save_buffer(png_ptr); | 365 png_push_save_buffer(png_ptr); |
| 336 return; | 366 return; |
| 337 } | 367 } |
| 368 |
| 338 png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length); | 369 png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length); |
| 339 } | 370 } |
| 371 |
| 340 #endif | 372 #endif |
| 341 #if defined(PNG_READ_sRGB_SUPPORTED) | 373 #if defined(PNG_READ_sRGB_SUPPORTED) |
| 342 else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4)) | 374 else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4)) |
| 343 { | 375 { |
| 344 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 376 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 345 { | 377 { |
| 346 png_push_save_buffer(png_ptr); | 378 png_push_save_buffer(png_ptr); |
| 347 return; | 379 return; |
| 348 } | 380 } |
| 381 |
| 349 png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length); | 382 png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length); |
| 350 } | 383 } |
| 384 |
| 351 #endif | 385 #endif |
| 352 #if defined(PNG_READ_iCCP_SUPPORTED) | 386 #if defined(PNG_READ_iCCP_SUPPORTED) |
| 353 else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4)) | 387 else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4)) |
| 354 { | 388 { |
| 355 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 389 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 356 { | 390 { |
| 357 png_push_save_buffer(png_ptr); | 391 png_push_save_buffer(png_ptr); |
| 358 return; | 392 return; |
| 359 } | 393 } |
| 394 |
| 360 png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length); | 395 png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length); |
| 361 } | 396 } |
| 397 |
| 362 #endif | 398 #endif |
| 363 #if defined(PNG_READ_sPLT_SUPPORTED) | 399 #if defined(PNG_READ_sPLT_SUPPORTED) |
| 364 else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4)) | 400 else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4)) |
| 365 { | 401 { |
| 366 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 402 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 367 { | 403 { |
| 368 png_push_save_buffer(png_ptr); | 404 png_push_save_buffer(png_ptr); |
| 369 return; | 405 return; |
| 370 } | 406 } |
| 407 |
| 371 png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length); | 408 png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length); |
| 372 } | 409 } |
| 410 |
| 373 #endif | 411 #endif |
| 374 #if defined(PNG_READ_tRNS_SUPPORTED) | 412 #if defined(PNG_READ_tRNS_SUPPORTED) |
| 375 else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4)) | 413 else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4)) |
| 376 { | 414 { |
| 377 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 415 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 378 { | 416 { |
| 379 png_push_save_buffer(png_ptr); | 417 png_push_save_buffer(png_ptr); |
| 380 return; | 418 return; |
| 381 } | 419 } |
| 420 |
| 382 png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length); | 421 png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length); |
| 383 } | 422 } |
| 423 |
| 384 #endif | 424 #endif |
| 385 #if defined(PNG_READ_bKGD_SUPPORTED) | 425 #if defined(PNG_READ_bKGD_SUPPORTED) |
| 386 else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4)) | 426 else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4)) |
| 387 { | 427 { |
| 388 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 428 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 389 { | 429 { |
| 390 png_push_save_buffer(png_ptr); | 430 png_push_save_buffer(png_ptr); |
| 391 return; | 431 return; |
| 392 } | 432 } |
| 433 |
| 393 png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length); | 434 png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length); |
| 394 } | 435 } |
| 436 |
| 395 #endif | 437 #endif |
| 396 #if defined(PNG_READ_hIST_SUPPORTED) | 438 #if defined(PNG_READ_hIST_SUPPORTED) |
| 397 else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4)) | 439 else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4)) |
| 398 { | 440 { |
| 399 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 441 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 400 { | 442 { |
| 401 png_push_save_buffer(png_ptr); | 443 png_push_save_buffer(png_ptr); |
| 402 return; | 444 return; |
| 403 } | 445 } |
| 446 |
| 404 png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length); | 447 png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length); |
| 405 } | 448 } |
| 449 |
| 406 #endif | 450 #endif |
| 407 #if defined(PNG_READ_pHYs_SUPPORTED) | 451 #if defined(PNG_READ_pHYs_SUPPORTED) |
| 408 else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4)) | 452 else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4)) |
| 409 { | 453 { |
| 410 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 454 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 411 { | 455 { |
| 412 png_push_save_buffer(png_ptr); | 456 png_push_save_buffer(png_ptr); |
| 413 return; | 457 return; |
| 414 } | 458 } |
| 459 |
| 415 png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length); | 460 png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length); |
| 416 } | 461 } |
| 462 |
| 417 #endif | 463 #endif |
| 418 #if defined(PNG_READ_oFFs_SUPPORTED) | 464 #if defined(PNG_READ_oFFs_SUPPORTED) |
| 419 else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4)) | 465 else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4)) |
| 420 { | 466 { |
| 421 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 467 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 422 { | 468 { |
| 423 png_push_save_buffer(png_ptr); | 469 png_push_save_buffer(png_ptr); |
| 424 return; | 470 return; |
| 425 } | 471 } |
| 472 |
| 426 png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length); | 473 png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length); |
| 427 } | 474 } |
| 428 #endif | 475 #endif |
| 476 |
| 429 #if defined(PNG_READ_pCAL_SUPPORTED) | 477 #if defined(PNG_READ_pCAL_SUPPORTED) |
| 430 else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4)) | 478 else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4)) |
| 431 { | 479 { |
| 432 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 480 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 433 { | 481 { |
| 434 png_push_save_buffer(png_ptr); | 482 png_push_save_buffer(png_ptr); |
| 435 return; | 483 return; |
| 436 } | 484 } |
| 485 |
| 437 png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length); | 486 png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length); |
| 438 } | 487 } |
| 488 |
| 439 #endif | 489 #endif |
| 440 #if defined(PNG_READ_sCAL_SUPPORTED) | 490 #if defined(PNG_READ_sCAL_SUPPORTED) |
| 441 else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4)) | 491 else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4)) |
| 442 { | 492 { |
| 443 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 493 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 444 { | 494 { |
| 445 png_push_save_buffer(png_ptr); | 495 png_push_save_buffer(png_ptr); |
| 446 return; | 496 return; |
| 447 } | 497 } |
| 498 |
| 448 png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length); | 499 png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length); |
| 449 } | 500 } |
| 501 |
| 450 #endif | 502 #endif |
| 451 #if defined(PNG_READ_tIME_SUPPORTED) | 503 #if defined(PNG_READ_tIME_SUPPORTED) |
| 452 else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4)) | 504 else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4)) |
| 453 { | 505 { |
| 454 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 506 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 455 { | 507 { |
| 456 png_push_save_buffer(png_ptr); | 508 png_push_save_buffer(png_ptr); |
| 457 return; | 509 return; |
| 458 } | 510 } |
| 511 |
| 459 png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length); | 512 png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length); |
| 460 } | 513 } |
| 514 |
| 461 #endif | 515 #endif |
| 462 #if defined(PNG_READ_tEXt_SUPPORTED) | 516 #if defined(PNG_READ_tEXt_SUPPORTED) |
| 463 else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) | 517 else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) |
| 464 { | 518 { |
| 465 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 519 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 466 { | 520 { |
| 467 png_push_save_buffer(png_ptr); | 521 png_push_save_buffer(png_ptr); |
| 468 return; | 522 return; |
| 469 } | 523 } |
| 524 |
| 470 png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length); | 525 png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length); |
| 471 } | 526 } |
| 527 |
| 472 #endif | 528 #endif |
| 473 #if defined(PNG_READ_zTXt_SUPPORTED) | 529 #if defined(PNG_READ_zTXt_SUPPORTED) |
| 474 else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) | 530 else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) |
| 475 { | 531 { |
| 476 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 532 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 477 { | 533 { |
| 478 png_push_save_buffer(png_ptr); | 534 png_push_save_buffer(png_ptr); |
| 479 return; | 535 return; |
| 480 } | 536 } |
| 537 |
| 481 png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length); | 538 png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length); |
| 482 } | 539 } |
| 540 |
| 483 #endif | 541 #endif |
| 484 #if defined(PNG_READ_iTXt_SUPPORTED) | 542 #if defined(PNG_READ_iTXt_SUPPORTED) |
| 485 else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) | 543 else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) |
| 486 { | 544 { |
| 487 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 545 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 488 { | 546 { |
| 489 png_push_save_buffer(png_ptr); | 547 png_push_save_buffer(png_ptr); |
| 490 return; | 548 return; |
| 491 } | 549 } |
| 550 |
| 492 png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); | 551 png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); |
| 493 } | 552 } |
| 553 |
| 494 #endif | 554 #endif |
| 495 else | 555 else |
| 496 { | 556 { |
| 497 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 557 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 498 { | 558 { |
| 499 png_push_save_buffer(png_ptr); | 559 png_push_save_buffer(png_ptr); |
| 500 return; | 560 return; |
| 501 } | 561 } |
| 502 png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); | 562 png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); |
| 503 } | 563 } |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 558 png_crc_finish(png_ptr, 0); | 618 png_crc_finish(png_ptr, 0); |
| 559 png_ptr->process_mode = PNG_READ_CHUNK_MODE; | 619 png_ptr->process_mode = PNG_READ_CHUNK_MODE; |
| 560 } | 620 } |
| 561 } | 621 } |
| 562 | 622 |
| 563 void PNGAPI | 623 void PNGAPI |
| 564 png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) | 624 png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) |
| 565 { | 625 { |
| 566 png_bytep ptr; | 626 png_bytep ptr; |
| 567 | 627 |
| 568 if (png_ptr == NULL) return; | 628 if (png_ptr == NULL) |
| 629 return; |
| 630 |
| 569 ptr = buffer; | 631 ptr = buffer; |
| 570 if (png_ptr->save_buffer_size) | 632 if (png_ptr->save_buffer_size) |
| 571 { | 633 { |
| 572 png_size_t save_size; | 634 png_size_t save_size; |
| 573 | 635 |
| 574 if (length < png_ptr->save_buffer_size) | 636 if (length < png_ptr->save_buffer_size) |
| 575 save_size = length; | 637 save_size = length; |
| 576 else | 638 else |
| 577 save_size = png_ptr->save_buffer_size; | 639 save_size = png_ptr->save_buffer_size; |
| 578 | 640 |
| 579 png_memcpy(ptr, png_ptr->save_buffer_ptr, save_size); | 641 png_memcpy(ptr, png_ptr->save_buffer_ptr, save_size); |
| 580 length -= save_size; | 642 length -= save_size; |
| 581 ptr += save_size; | 643 ptr += save_size; |
| 582 png_ptr->buffer_size -= save_size; | 644 png_ptr->buffer_size -= save_size; |
| 583 png_ptr->save_buffer_size -= save_size; | 645 png_ptr->save_buffer_size -= save_size; |
| 584 png_ptr->save_buffer_ptr += save_size; | 646 png_ptr->save_buffer_ptr += save_size; |
| 585 } | 647 } |
| 586 if (length && png_ptr->current_buffer_size) | 648 if (length && png_ptr->current_buffer_size) |
| 587 { | 649 { |
| 588 png_size_t save_size; | 650 png_size_t save_size; |
| 589 | 651 |
| 590 if (length < png_ptr->current_buffer_size) | 652 if (length < png_ptr->current_buffer_size) |
| 591 save_size = length; | 653 save_size = length; |
| 654 |
| 592 else | 655 else |
| 593 save_size = png_ptr->current_buffer_size; | 656 save_size = png_ptr->current_buffer_size; |
| 594 | 657 |
| 595 png_memcpy(ptr, png_ptr->current_buffer_ptr, save_size); | 658 png_memcpy(ptr, png_ptr->current_buffer_ptr, save_size); |
| 596 png_ptr->buffer_size -= save_size; | 659 png_ptr->buffer_size -= save_size; |
| 597 png_ptr->current_buffer_size -= save_size; | 660 png_ptr->current_buffer_size -= save_size; |
| 598 png_ptr->current_buffer_ptr += save_size; | 661 png_ptr->current_buffer_ptr += save_size; |
| 599 } | 662 } |
| 600 } | 663 } |
| 601 | 664 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 622 png_ptr->save_buffer_max) | 685 png_ptr->save_buffer_max) |
| 623 { | 686 { |
| 624 png_size_t new_max; | 687 png_size_t new_max; |
| 625 png_bytep old_buffer; | 688 png_bytep old_buffer; |
| 626 | 689 |
| 627 if (png_ptr->save_buffer_size > PNG_SIZE_MAX - | 690 if (png_ptr->save_buffer_size > PNG_SIZE_MAX - |
| 628 (png_ptr->current_buffer_size + 256)) | 691 (png_ptr->current_buffer_size + 256)) |
| 629 { | 692 { |
| 630 png_error(png_ptr, "Potential overflow of save_buffer"); | 693 png_error(png_ptr, "Potential overflow of save_buffer"); |
| 631 } | 694 } |
| 695 |
| 632 new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256; | 696 new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256; |
| 633 old_buffer = png_ptr->save_buffer; | 697 old_buffer = png_ptr->save_buffer; |
| 634 png_ptr->save_buffer = (png_bytep)png_malloc(png_ptr, | 698 png_ptr->save_buffer = (png_bytep)png_malloc(png_ptr, |
| 635 (png_uint_32)new_max); | 699 (png_uint_32)new_max); |
| 636 png_memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size); | 700 png_memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size); |
| 637 png_free(png_ptr, old_buffer); | 701 png_free(png_ptr, old_buffer); |
| 638 png_ptr->save_buffer_max = new_max; | 702 png_ptr->save_buffer_max = new_max; |
| 639 } | 703 } |
| 640 if (png_ptr->current_buffer_size) | 704 if (png_ptr->current_buffer_size) |
| 641 { | 705 { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 690 | 754 |
| 691 png_ptr->idat_size = png_ptr->push_length; | 755 png_ptr->idat_size = png_ptr->push_length; |
| 692 } | 756 } |
| 693 if (png_ptr->idat_size && png_ptr->save_buffer_size) | 757 if (png_ptr->idat_size && png_ptr->save_buffer_size) |
| 694 { | 758 { |
| 695 png_size_t save_size; | 759 png_size_t save_size; |
| 696 | 760 |
| 697 if (png_ptr->idat_size < (png_uint_32)png_ptr->save_buffer_size) | 761 if (png_ptr->idat_size < (png_uint_32)png_ptr->save_buffer_size) |
| 698 { | 762 { |
| 699 save_size = (png_size_t)png_ptr->idat_size; | 763 save_size = (png_size_t)png_ptr->idat_size; |
| 700 /* check for overflow */ | 764 |
| 765 /* Check for overflow */ |
| 701 if ((png_uint_32)save_size != png_ptr->idat_size) | 766 if ((png_uint_32)save_size != png_ptr->idat_size) |
| 702 png_error(png_ptr, "save_size overflowed in pngpread"); | 767 png_error(png_ptr, "save_size overflowed in pngpread"); |
| 703 } | 768 } |
| 704 else | 769 else |
| 705 save_size = png_ptr->save_buffer_size; | 770 save_size = png_ptr->save_buffer_size; |
| 706 | 771 |
| 707 png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); | 772 png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); |
| 773 |
| 708 if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) | 774 if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) |
| 709 png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size); | 775 png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size); |
| 776 |
| 710 png_ptr->idat_size -= save_size; | 777 png_ptr->idat_size -= save_size; |
| 711 png_ptr->buffer_size -= save_size; | 778 png_ptr->buffer_size -= save_size; |
| 712 png_ptr->save_buffer_size -= save_size; | 779 png_ptr->save_buffer_size -= save_size; |
| 713 png_ptr->save_buffer_ptr += save_size; | 780 png_ptr->save_buffer_ptr += save_size; |
| 714 } | 781 } |
| 715 if (png_ptr->idat_size && png_ptr->current_buffer_size) | 782 if (png_ptr->idat_size && png_ptr->current_buffer_size) |
| 716 { | 783 { |
| 717 png_size_t save_size; | 784 png_size_t save_size; |
| 718 | 785 |
| 719 if (png_ptr->idat_size < (png_uint_32)png_ptr->current_buffer_size) | 786 if (png_ptr->idat_size < (png_uint_32)png_ptr->current_buffer_size) |
| 720 { | 787 { |
| 721 save_size = (png_size_t)png_ptr->idat_size; | 788 save_size = (png_size_t)png_ptr->idat_size; |
| 722 /* check for overflow */ | 789 |
| 790 /* Check for overflow */ |
| 723 if ((png_uint_32)save_size != png_ptr->idat_size) | 791 if ((png_uint_32)save_size != png_ptr->idat_size) |
| 724 png_error(png_ptr, "save_size overflowed in pngpread"); | 792 png_error(png_ptr, "save_size overflowed in pngpread"); |
| 725 } | 793 } |
| 726 else | 794 else |
| 727 save_size = png_ptr->current_buffer_size; | 795 save_size = png_ptr->current_buffer_size; |
| 728 | 796 |
| 729 png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); | 797 png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); |
| 730 if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) | 798 if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) |
| 731 png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size); | 799 png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size); |
| 732 | 800 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 762 png_ptr->zstream.avail_in = (uInt)buffer_length; | 830 png_ptr->zstream.avail_in = (uInt)buffer_length; |
| 763 for (;;) | 831 for (;;) |
| 764 { | 832 { |
| 765 ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); | 833 ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); |
| 766 if (ret != Z_OK) | 834 if (ret != Z_OK) |
| 767 { | 835 { |
| 768 if (ret == Z_STREAM_END) | 836 if (ret == Z_STREAM_END) |
| 769 { | 837 { |
| 770 if (png_ptr->zstream.avail_in) | 838 if (png_ptr->zstream.avail_in) |
| 771 png_error(png_ptr, "Extra compressed data"); | 839 png_error(png_ptr, "Extra compressed data"); |
| 840 |
| 772 if (!(png_ptr->zstream.avail_out)) | 841 if (!(png_ptr->zstream.avail_out)) |
| 773 { | 842 { |
| 774 png_push_process_row(png_ptr); | 843 png_push_process_row(png_ptr); |
| 775 } | 844 } |
| 776 | 845 |
| 777 png_ptr->mode |= PNG_AFTER_IDAT; | 846 png_ptr->mode |= PNG_AFTER_IDAT; |
| 778 png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; | 847 png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; |
| 779 break; | 848 break; |
| 780 } | 849 } |
| 781 else if (ret == Z_BUF_ERROR) | 850 else if (ret == Z_BUF_ERROR) |
| 782 break; | 851 break; |
| 852 |
| 783 else | 853 else |
| 784 png_error(png_ptr, "Decompression Error"); | 854 png_error(png_ptr, "Decompression Error"); |
| 785 } | 855 } |
| 786 if (!(png_ptr->zstream.avail_out)) | 856 if (!(png_ptr->zstream.avail_out)) |
| 787 { | 857 { |
| 788 if (( | 858 if (( |
| 789 #if defined(PNG_READ_INTERLACING_SUPPORTED) | 859 #if defined(PNG_READ_INTERLACING_SUPPORTED) |
| 790 png_ptr->interlaced && png_ptr->pass > 6) || | 860 png_ptr->interlaced && png_ptr->pass > 6) || |
| 791 (!png_ptr->interlaced && | 861 (!png_ptr->interlaced && |
| 792 #endif | 862 #endif |
| 793 png_ptr->row_number == png_ptr->num_rows)) | 863 png_ptr->row_number == png_ptr->num_rows)) |
| 794 { | 864 { |
| 795 if (png_ptr->zstream.avail_in) | 865 if (png_ptr->zstream.avail_in) |
| 796 png_warning(png_ptr, "Too much data in IDAT chunks"); | 866 png_warning(png_ptr, "Too much data in IDAT chunks"); |
| 797 png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; | 867 png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; |
| 798 break; | 868 break; |
| 799 } | 869 } |
| 800 png_push_process_row(png_ptr); | 870 png_push_process_row(png_ptr); |
| 801 png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes; | 871 png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes; |
| 802 png_ptr->zstream.next_out = png_ptr->row_buf; | 872 png_ptr->zstream.next_out = png_ptr->row_buf; |
| 803 } | 873 } |
| 874 |
| 804 else | 875 else |
| 805 break; | 876 break; |
| 806 } | 877 } |
| 807 } | 878 } |
| 808 | 879 |
| 809 void /* PRIVATE */ | 880 void /* PRIVATE */ |
| 810 png_push_process_row(png_structp png_ptr) | 881 png_push_process_row(png_structp png_ptr) |
| 811 { | 882 { |
| 812 png_ptr->row_info.color_type = png_ptr->color_type; | 883 png_ptr->row_info.color_type = png_ptr->color_type; |
| 813 png_ptr->row_info.width = png_ptr->iwidth; | 884 png_ptr->row_info.width = png_ptr->iwidth; |
| 814 png_ptr->row_info.channels = png_ptr->channels; | 885 png_ptr->row_info.channels = png_ptr->channels; |
| 815 png_ptr->row_info.bit_depth = png_ptr->bit_depth; | 886 png_ptr->row_info.bit_depth = png_ptr->bit_depth; |
| 816 png_ptr->row_info.pixel_depth = png_ptr->pixel_depth; | 887 png_ptr->row_info.pixel_depth = png_ptr->pixel_depth; |
| 817 | 888 |
| 818 png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, | 889 png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, |
| 819 png_ptr->row_info.width); | 890 png_ptr->row_info.width); |
| 820 | 891 |
| 821 png_read_filter_row(png_ptr, &(png_ptr->row_info), | 892 png_read_filter_row(png_ptr, &(png_ptr->row_info), |
| 822 png_ptr->row_buf + 1, png_ptr->prev_row + 1, | 893 png_ptr->row_buf + 1, png_ptr->prev_row + 1, |
| 823 (int)(png_ptr->row_buf[0])); | 894 (int)(png_ptr->row_buf[0])); |
| 824 | 895 |
| 825 png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf, | 896 png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf, |
| 826 png_ptr->rowbytes + 1); | 897 png_ptr->rowbytes + 1); |
| 827 | 898 |
| 828 if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA)) | 899 if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA)) |
| 829 png_do_read_transformations(png_ptr); | 900 png_do_read_transformations(png_ptr); |
| 830 | 901 |
| 831 #if defined(PNG_READ_INTERLACING_SUPPORTED) | 902 #if defined(PNG_READ_INTERLACING_SUPPORTED) |
| 832 /* blow up interlaced rows to full size */ | 903 /* Blow up interlaced rows to full size */ |
| 833 if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) | 904 if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) |
| 834 { | 905 { |
| 835 if (png_ptr->pass < 6) | 906 if (png_ptr->pass < 6) |
| 836 /* old interface (pre-1.0.9): | 907 /* old interface (pre-1.0.9): |
| 837 png_do_read_interlace(&(png_ptr->row_info), | 908 png_do_read_interlace(&(png_ptr->row_info), |
| 838 png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations); | 909 png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations); |
| 839 */ | 910 */ |
| 840 png_do_read_interlace(png_ptr); | 911 png_do_read_interlace(png_ptr); |
| 841 | 912 |
| 842 switch (png_ptr->pass) | 913 switch (png_ptr->pass) |
| 843 { | 914 { |
| 844 case 0: | 915 case 0: |
| 845 { | 916 { |
| 846 int i; | 917 int i; |
| 847 for (i = 0; i < 8 && png_ptr->pass == 0; i++) | 918 for (i = 0; i < 8 && png_ptr->pass == 0; i++) |
| 848 { | 919 { |
| 849 png_push_have_row(png_ptr, png_ptr->row_buf + 1); | 920 png_push_have_row(png_ptr, png_ptr->row_buf + 1); |
| 850 png_read_push_finish_row(png_ptr); /* updates png_ptr->pass */ | 921 png_read_push_finish_row(png_ptr); /* Updates png_ptr->pass */ |
| 851 } | 922 } |
| 852 if (png_ptr->pass == 2) /* pass 1 might be empty */ | 923 |
| 924 if (png_ptr->pass == 2) /* Pass 1 might be empty */ |
| 853 { | 925 { |
| 854 for (i = 0; i < 4 && png_ptr->pass == 2; i++) | 926 for (i = 0; i < 4 && png_ptr->pass == 2; i++) |
| 855 { | 927 { |
| 856 png_push_have_row(png_ptr, png_bytep_NULL); | 928 png_push_have_row(png_ptr, png_bytep_NULL); |
| 857 png_read_push_finish_row(png_ptr); | 929 png_read_push_finish_row(png_ptr); |
| 858 } | 930 } |
| 859 } | 931 } |
| 932 |
| 860 if (png_ptr->pass == 4 && png_ptr->height <= 4) | 933 if (png_ptr->pass == 4 && png_ptr->height <= 4) |
| 861 { | 934 { |
| 862 for (i = 0; i < 2 && png_ptr->pass == 4; i++) | 935 for (i = 0; i < 2 && png_ptr->pass == 4; i++) |
| 863 { | 936 { |
| 864 png_push_have_row(png_ptr, png_bytep_NULL); | 937 png_push_have_row(png_ptr, png_bytep_NULL); |
| 865 png_read_push_finish_row(png_ptr); | 938 png_read_push_finish_row(png_ptr); |
| 866 } | 939 } |
| 867 } | 940 } |
| 941 |
| 868 if (png_ptr->pass == 6 && png_ptr->height <= 4) | 942 if (png_ptr->pass == 6 && png_ptr->height <= 4) |
| 869 { | 943 { |
| 870 png_push_have_row(png_ptr, png_bytep_NULL); | 944 png_push_have_row(png_ptr, png_bytep_NULL); |
| 871 png_read_push_finish_row(png_ptr); | 945 png_read_push_finish_row(png_ptr); |
| 872 } | 946 } |
| 947 |
| 873 break; | 948 break; |
| 874 } | 949 } |
| 950 |
| 875 case 1: | 951 case 1: |
| 876 { | 952 { |
| 877 int i; | 953 int i; |
| 878 for (i = 0; i < 8 && png_ptr->pass == 1; i++) | 954 for (i = 0; i < 8 && png_ptr->pass == 1; i++) |
| 879 { | 955 { |
| 880 png_push_have_row(png_ptr, png_ptr->row_buf + 1); | 956 png_push_have_row(png_ptr, png_ptr->row_buf + 1); |
| 881 png_read_push_finish_row(png_ptr); | 957 png_read_push_finish_row(png_ptr); |
| 882 } | 958 } |
| 883 if (png_ptr->pass == 2) /* skip top 4 generated rows */ | 959 |
| 960 if (png_ptr->pass == 2) /* Skip top 4 generated rows */ |
| 884 { | 961 { |
| 885 for (i = 0; i < 4 && png_ptr->pass == 2; i++) | 962 for (i = 0; i < 4 && png_ptr->pass == 2; i++) |
| 886 { | 963 { |
| 887 png_push_have_row(png_ptr, png_bytep_NULL); | 964 png_push_have_row(png_ptr, png_bytep_NULL); |
| 888 png_read_push_finish_row(png_ptr); | 965 png_read_push_finish_row(png_ptr); |
| 889 } | 966 } |
| 890 } | 967 } |
| 968 |
| 891 break; | 969 break; |
| 892 } | 970 } |
| 971 |
| 893 case 2: | 972 case 2: |
| 894 { | 973 { |
| 895 int i; | 974 int i; |
| 975 |
| 896 for (i = 0; i < 4 && png_ptr->pass == 2; i++) | 976 for (i = 0; i < 4 && png_ptr->pass == 2; i++) |
| 897 { | 977 { |
| 898 png_push_have_row(png_ptr, png_ptr->row_buf + 1); | 978 png_push_have_row(png_ptr, png_ptr->row_buf + 1); |
| 899 png_read_push_finish_row(png_ptr); | 979 png_read_push_finish_row(png_ptr); |
| 900 } | 980 } |
| 981 |
| 901 for (i = 0; i < 4 && png_ptr->pass == 2; i++) | 982 for (i = 0; i < 4 && png_ptr->pass == 2; i++) |
| 902 { | 983 { |
| 903 png_push_have_row(png_ptr, png_bytep_NULL); | 984 png_push_have_row(png_ptr, png_bytep_NULL); |
| 904 png_read_push_finish_row(png_ptr); | 985 png_read_push_finish_row(png_ptr); |
| 905 } | 986 } |
| 906 if (png_ptr->pass == 4) /* pass 3 might be empty */ | 987 |
| 988 if (png_ptr->pass == 4) /* Pass 3 might be empty */ |
| 907 { | 989 { |
| 908 for (i = 0; i < 2 && png_ptr->pass == 4; i++) | 990 for (i = 0; i < 2 && png_ptr->pass == 4; i++) |
| 909 { | 991 { |
| 910 png_push_have_row(png_ptr, png_bytep_NULL); | 992 png_push_have_row(png_ptr, png_bytep_NULL); |
| 911 png_read_push_finish_row(png_ptr); | 993 png_read_push_finish_row(png_ptr); |
| 912 } | 994 } |
| 913 } | 995 } |
| 996 |
| 914 break; | 997 break; |
| 915 } | 998 } |
| 999 |
| 916 case 3: | 1000 case 3: |
| 917 { | 1001 { |
| 918 int i; | 1002 int i; |
| 1003 |
| 919 for (i = 0; i < 4 && png_ptr->pass == 3; i++) | 1004 for (i = 0; i < 4 && png_ptr->pass == 3; i++) |
| 920 { | 1005 { |
| 921 png_push_have_row(png_ptr, png_ptr->row_buf + 1); | 1006 png_push_have_row(png_ptr, png_ptr->row_buf + 1); |
| 922 png_read_push_finish_row(png_ptr); | 1007 png_read_push_finish_row(png_ptr); |
| 923 } | 1008 } |
| 924 if (png_ptr->pass == 4) /* skip top two generated rows */ | 1009 |
| 1010 if (png_ptr->pass == 4) /* Skip top two generated rows */ |
| 925 { | 1011 { |
| 926 for (i = 0; i < 2 && png_ptr->pass == 4; i++) | 1012 for (i = 0; i < 2 && png_ptr->pass == 4; i++) |
| 927 { | 1013 { |
| 928 png_push_have_row(png_ptr, png_bytep_NULL); | 1014 png_push_have_row(png_ptr, png_bytep_NULL); |
| 929 png_read_push_finish_row(png_ptr); | 1015 png_read_push_finish_row(png_ptr); |
| 930 } | 1016 } |
| 931 } | 1017 } |
| 1018 |
| 932 break; | 1019 break; |
| 933 } | 1020 } |
| 1021 |
| 934 case 4: | 1022 case 4: |
| 935 { | 1023 { |
| 936 int i; | 1024 int i; |
| 1025 |
| 937 for (i = 0; i < 2 && png_ptr->pass == 4; i++) | 1026 for (i = 0; i < 2 && png_ptr->pass == 4; i++) |
| 938 { | 1027 { |
| 939 png_push_have_row(png_ptr, png_ptr->row_buf + 1); | 1028 png_push_have_row(png_ptr, png_ptr->row_buf + 1); |
| 940 png_read_push_finish_row(png_ptr); | 1029 png_read_push_finish_row(png_ptr); |
| 941 } | 1030 } |
| 1031 |
| 942 for (i = 0; i < 2 && png_ptr->pass == 4; i++) | 1032 for (i = 0; i < 2 && png_ptr->pass == 4; i++) |
| 943 { | 1033 { |
| 944 png_push_have_row(png_ptr, png_bytep_NULL); | 1034 png_push_have_row(png_ptr, png_bytep_NULL); |
| 945 png_read_push_finish_row(png_ptr); | 1035 png_read_push_finish_row(png_ptr); |
| 946 } | 1036 } |
| 947 if (png_ptr->pass == 6) /* pass 5 might be empty */ | 1037 |
| 1038 if (png_ptr->pass == 6) /* Pass 5 might be empty */ |
| 948 { | 1039 { |
| 949 png_push_have_row(png_ptr, png_bytep_NULL); | 1040 png_push_have_row(png_ptr, png_bytep_NULL); |
| 950 png_read_push_finish_row(png_ptr); | 1041 png_read_push_finish_row(png_ptr); |
| 951 } | 1042 } |
| 1043 |
| 952 break; | 1044 break; |
| 953 } | 1045 } |
| 1046 |
| 954 case 5: | 1047 case 5: |
| 955 { | 1048 { |
| 956 int i; | 1049 int i; |
| 1050 |
| 957 for (i = 0; i < 2 && png_ptr->pass == 5; i++) | 1051 for (i = 0; i < 2 && png_ptr->pass == 5; i++) |
| 958 { | 1052 { |
| 959 png_push_have_row(png_ptr, png_ptr->row_buf + 1); | 1053 png_push_have_row(png_ptr, png_ptr->row_buf + 1); |
| 960 png_read_push_finish_row(png_ptr); | 1054 png_read_push_finish_row(png_ptr); |
| 961 } | 1055 } |
| 962 if (png_ptr->pass == 6) /* skip top generated row */ | 1056 |
| 1057 if (png_ptr->pass == 6) /* Skip top generated row */ |
| 963 { | 1058 { |
| 964 png_push_have_row(png_ptr, png_bytep_NULL); | 1059 png_push_have_row(png_ptr, png_bytep_NULL); |
| 965 png_read_push_finish_row(png_ptr); | 1060 png_read_push_finish_row(png_ptr); |
| 966 } | 1061 } |
| 1062 |
| 967 break; | 1063 break; |
| 968 } | 1064 } |
| 969 case 6: | 1065 case 6: |
| 970 { | 1066 { |
| 971 png_push_have_row(png_ptr, png_ptr->row_buf + 1); | 1067 png_push_have_row(png_ptr, png_ptr->row_buf + 1); |
| 972 png_read_push_finish_row(png_ptr); | 1068 png_read_push_finish_row(png_ptr); |
| 1069 |
| 973 if (png_ptr->pass != 6) | 1070 if (png_ptr->pass != 6) |
| 974 break; | 1071 break; |
| 1072 |
| 975 png_push_have_row(png_ptr, png_bytep_NULL); | 1073 png_push_have_row(png_ptr, png_bytep_NULL); |
| 976 png_read_push_finish_row(png_ptr); | 1074 png_read_push_finish_row(png_ptr); |
| 977 } | 1075 } |
| 978 } | 1076 } |
| 979 } | 1077 } |
| 980 else | 1078 else |
| 981 #endif | 1079 #endif |
| 982 { | 1080 { |
| 983 png_push_have_row(png_ptr, png_ptr->row_buf + 1); | 1081 png_push_have_row(png_ptr, png_ptr->row_buf + 1); |
| 984 png_read_push_finish_row(png_ptr); | 1082 png_read_push_finish_row(png_ptr); |
| 985 } | 1083 } |
| 986 } | 1084 } |
| 987 | 1085 |
| 988 void /* PRIVATE */ | 1086 void /* PRIVATE */ |
| 989 png_read_push_finish_row(png_structp png_ptr) | 1087 png_read_push_finish_row(png_structp png_ptr) |
| 990 { | 1088 { |
| 991 #ifdef PNG_USE_LOCAL_ARRAYS | 1089 #ifdef PNG_USE_LOCAL_ARRAYS |
| 992 /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ | 1090 /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ |
| 993 | 1091 |
| 994 /* start of interlace block */ | 1092 /* Start of interlace block */ |
| 995 PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; | 1093 PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; |
| 996 | 1094 |
| 997 /* offset to next interlace block */ | 1095 /* Offset to next interlace block */ |
| 998 PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; | 1096 PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; |
| 999 | 1097 |
| 1000 /* start of interlace block in the y direction */ | 1098 /* Start of interlace block in the y direction */ |
| 1001 PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; | 1099 PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; |
| 1002 | 1100 |
| 1003 /* offset to next interlace block in the y direction */ | 1101 /* Offset to next interlace block in the y direction */ |
| 1004 PNG_CONST int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2}; | 1102 PNG_CONST int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2}; |
| 1005 | 1103 |
| 1006 /* Height of interlace block. This is not currently used - if you need | 1104 /* Height of interlace block. This is not currently used - if you need |
| 1007 * it, uncomment it here and in png.h | 1105 * it, uncomment it here and in png.h |
| 1008 PNG_CONST int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1}; | 1106 PNG_CONST int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1}; |
| 1009 */ | 1107 */ |
| 1010 #endif | 1108 #endif |
| 1011 | 1109 |
| 1012 png_ptr->row_number++; | 1110 png_ptr->row_number++; |
| 1013 if (png_ptr->row_number < png_ptr->num_rows) | 1111 if (png_ptr->row_number < png_ptr->num_rows) |
| 1014 return; | 1112 return; |
| 1015 | 1113 |
| 1114 #if defined(PNG_READ_INTERLACING_SUPPORTED) |
| 1016 if (png_ptr->interlaced) | 1115 if (png_ptr->interlaced) |
| 1017 { | 1116 { |
| 1018 png_ptr->row_number = 0; | 1117 png_ptr->row_number = 0; |
| 1019 png_memset_check(png_ptr, png_ptr->prev_row, 0, | 1118 png_memset_check(png_ptr, png_ptr->prev_row, 0, |
| 1020 png_ptr->rowbytes + 1); | 1119 png_ptr->rowbytes + 1); |
| 1021 do | 1120 do |
| 1022 { | 1121 { |
| 1023 png_ptr->pass++; | 1122 png_ptr->pass++; |
| 1024 if ((png_ptr->pass == 1 && png_ptr->width < 5) || | 1123 if ((png_ptr->pass == 1 && png_ptr->width < 5) || |
| 1025 (png_ptr->pass == 3 && png_ptr->width < 3) || | 1124 (png_ptr->pass == 3 && png_ptr->width < 3) || |
| 1026 (png_ptr->pass == 5 && png_ptr->width < 2)) | 1125 (png_ptr->pass == 5 && png_ptr->width < 2)) |
| 1027 png_ptr->pass++; | 1126 png_ptr->pass++; |
| 1028 | 1127 |
| 1029 if (png_ptr->pass > 7) | 1128 if (png_ptr->pass > 7) |
| 1030 png_ptr->pass--; | 1129 png_ptr->pass--; |
| 1130 |
| 1031 if (png_ptr->pass >= 7) | 1131 if (png_ptr->pass >= 7) |
| 1032 break; | 1132 break; |
| 1033 | 1133 |
| 1034 png_ptr->iwidth = (png_ptr->width + | 1134 png_ptr->iwidth = (png_ptr->width + |
| 1035 png_pass_inc[png_ptr->pass] - 1 - | 1135 png_pass_inc[png_ptr->pass] - 1 - |
| 1036 png_pass_start[png_ptr->pass]) / | 1136 png_pass_start[png_ptr->pass]) / |
| 1037 png_pass_inc[png_ptr->pass]; | 1137 png_pass_inc[png_ptr->pass]; |
| 1038 | 1138 |
| 1039 png_ptr->irowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, | 1139 png_ptr->irowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, |
| 1040 png_ptr->iwidth) + 1; | 1140 png_ptr->iwidth) + 1; |
| 1041 | 1141 |
| 1042 if (png_ptr->transformations & PNG_INTERLACE) | 1142 if (png_ptr->transformations & PNG_INTERLACE) |
| 1043 break; | 1143 break; |
| 1044 | 1144 |
| 1045 png_ptr->num_rows = (png_ptr->height + | 1145 png_ptr->num_rows = (png_ptr->height + |
| 1046 png_pass_yinc[png_ptr->pass] - 1 - | 1146 png_pass_yinc[png_ptr->pass] - 1 - |
| 1047 png_pass_ystart[png_ptr->pass]) / | 1147 png_pass_ystart[png_ptr->pass]) / |
| 1048 png_pass_yinc[png_ptr->pass]; | 1148 png_pass_yinc[png_ptr->pass]; |
| 1049 | 1149 |
| 1050 } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0); | 1150 } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0); |
| 1051 } | 1151 } |
| 1152 #endif /* PNG_READ_INTERLACING_SUPPORTED */ |
| 1052 } | 1153 } |
| 1053 | 1154 |
| 1054 #if defined(PNG_READ_tEXt_SUPPORTED) | 1155 #if defined(PNG_READ_tEXt_SUPPORTED) |
| 1055 void /* PRIVATE */ | 1156 void /* PRIVATE */ |
| 1056 png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 | 1157 png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 |
| 1057 length) | 1158 length) |
| 1058 { | 1159 { |
| 1059 if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) | 1160 if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) |
| 1060 { | 1161 { |
| 1061 png_error(png_ptr, "Out of place tEXt"); | 1162 png_error(png_ptr, "Out of place tEXt"); |
| 1062 info_ptr = info_ptr; /* to quiet some compiler warnings */ | 1163 info_ptr = info_ptr; /* To quiet some compiler warnings */ |
| 1063 } | 1164 } |
| 1064 | 1165 |
| 1065 #ifdef PNG_MAX_MALLOC_64K | 1166 #ifdef PNG_MAX_MALLOC_64K |
| 1066 png_ptr->skip_length = 0; /* This may not be necessary */ | 1167 png_ptr->skip_length = 0; /* This may not be necessary */ |
| 1067 | 1168 |
| 1068 if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ | 1169 if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ |
| 1069 { | 1170 { |
| 1070 png_warning(png_ptr, "tEXt chunk too large to fit in memory"); | 1171 png_warning(png_ptr, "tEXt chunk too large to fit in memory"); |
| 1071 png_ptr->skip_length = length - (png_uint_32)65535L; | 1172 png_ptr->skip_length = length - (png_uint_32)65535L; |
| 1072 length = (png_uint_32)65535L; | 1173 length = (png_uint_32)65535L; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1084 | 1185 |
| 1085 void /* PRIVATE */ | 1186 void /* PRIVATE */ |
| 1086 png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr) | 1187 png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr) |
| 1087 { | 1188 { |
| 1088 if (png_ptr->buffer_size && png_ptr->current_text_left) | 1189 if (png_ptr->buffer_size && png_ptr->current_text_left) |
| 1089 { | 1190 { |
| 1090 png_size_t text_size; | 1191 png_size_t text_size; |
| 1091 | 1192 |
| 1092 if (png_ptr->buffer_size < png_ptr->current_text_left) | 1193 if (png_ptr->buffer_size < png_ptr->current_text_left) |
| 1093 text_size = png_ptr->buffer_size; | 1194 text_size = png_ptr->buffer_size; |
| 1195 |
| 1094 else | 1196 else |
| 1095 text_size = png_ptr->current_text_left; | 1197 text_size = png_ptr->current_text_left; |
| 1198 |
| 1096 png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); | 1199 png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); |
| 1097 png_ptr->current_text_left -= text_size; | 1200 png_ptr->current_text_left -= text_size; |
| 1098 png_ptr->current_text_ptr += text_size; | 1201 png_ptr->current_text_ptr += text_size; |
| 1099 } | 1202 } |
| 1100 if (!(png_ptr->current_text_left)) | 1203 if (!(png_ptr->current_text_left)) |
| 1101 { | 1204 { |
| 1102 png_textp text_ptr; | 1205 png_textp text_ptr; |
| 1103 png_charp text; | 1206 png_charp text; |
| 1104 png_charp key; | 1207 png_charp key; |
| 1105 int ret; | 1208 int ret; |
| 1106 | 1209 |
| 1107 if (png_ptr->buffer_size < 4) | 1210 if (png_ptr->buffer_size < 4) |
| 1108 { | 1211 { |
| 1109 png_push_save_buffer(png_ptr); | 1212 png_push_save_buffer(png_ptr); |
| 1110 return; | 1213 return; |
| 1111 } | 1214 } |
| 1112 | 1215 |
| 1113 png_push_crc_finish(png_ptr); | 1216 png_push_crc_finish(png_ptr); |
| 1114 | 1217 |
| 1115 #if defined(PNG_MAX_MALLOC_64K) | 1218 #if defined(PNG_MAX_MALLOC_64K) |
| 1116 if (png_ptr->skip_length) | 1219 if (png_ptr->skip_length) |
| 1117 return; | 1220 return; |
| 1118 #endif | 1221 #endif |
| 1119 | 1222 |
| 1120 key = png_ptr->current_text; | 1223 key = png_ptr->current_text; |
| 1121 | 1224 |
| 1122 for (text = key; *text; text++) | 1225 for (text = key; *text; text++) |
| 1123 /* empty loop */ ; | 1226 /* Empty loop */ ; |
| 1124 | 1227 |
| 1125 if (text < key + png_ptr->current_text_size) | 1228 if (text < key + png_ptr->current_text_size) |
| 1126 text++; | 1229 text++; |
| 1127 | 1230 |
| 1128 text_ptr = (png_textp)png_malloc(png_ptr, | 1231 text_ptr = (png_textp)png_malloc(png_ptr, |
| 1129 (png_uint_32)png_sizeof(png_text)); | 1232 (png_uint_32)png_sizeof(png_text)); |
| 1130 text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; | 1233 text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; |
| 1131 text_ptr->key = key; | 1234 text_ptr->key = key; |
| 1132 #ifdef PNG_iTXt_SUPPORTED | 1235 #ifdef PNG_iTXt_SUPPORTED |
| 1133 text_ptr->lang = NULL; | 1236 text_ptr->lang = NULL; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1148 #endif | 1251 #endif |
| 1149 | 1252 |
| 1150 #if defined(PNG_READ_zTXt_SUPPORTED) | 1253 #if defined(PNG_READ_zTXt_SUPPORTED) |
| 1151 void /* PRIVATE */ | 1254 void /* PRIVATE */ |
| 1152 png_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 | 1255 png_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 |
| 1153 length) | 1256 length) |
| 1154 { | 1257 { |
| 1155 if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) | 1258 if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) |
| 1156 { | 1259 { |
| 1157 png_error(png_ptr, "Out of place zTXt"); | 1260 png_error(png_ptr, "Out of place zTXt"); |
| 1158 info_ptr = info_ptr; /* to quiet some compiler warnings */ | 1261 info_ptr = info_ptr; /* To quiet some compiler warnings */ |
| 1159 } | 1262 } |
| 1160 | 1263 |
| 1161 #ifdef PNG_MAX_MALLOC_64K | 1264 #ifdef PNG_MAX_MALLOC_64K |
| 1162 /* We can't handle zTXt chunks > 64K, since we don't have enough space | 1265 /* We can't handle zTXt chunks > 64K, since we don't have enough space |
| 1163 * to be able to store the uncompressed data. Actually, the threshold | 1266 * to be able to store the uncompressed data. Actually, the threshold |
| 1164 * is probably around 32K, but it isn't as definite as 64K is. | 1267 * is probably around 32K, but it isn't as definite as 64K is. |
| 1165 */ | 1268 */ |
| 1166 if (length > (png_uint_32)65535L) | 1269 if (length > (png_uint_32)65535L) |
| 1167 { | 1270 { |
| 1168 png_warning(png_ptr, "zTXt chunk too large to fit in memory"); | 1271 png_warning(png_ptr, "zTXt chunk too large to fit in memory"); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1182 | 1285 |
| 1183 void /* PRIVATE */ | 1286 void /* PRIVATE */ |
| 1184 png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr) | 1287 png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr) |
| 1185 { | 1288 { |
| 1186 if (png_ptr->buffer_size && png_ptr->current_text_left) | 1289 if (png_ptr->buffer_size && png_ptr->current_text_left) |
| 1187 { | 1290 { |
| 1188 png_size_t text_size; | 1291 png_size_t text_size; |
| 1189 | 1292 |
| 1190 if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left) | 1293 if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left) |
| 1191 text_size = png_ptr->buffer_size; | 1294 text_size = png_ptr->buffer_size; |
| 1295 |
| 1192 else | 1296 else |
| 1193 text_size = png_ptr->current_text_left; | 1297 text_size = png_ptr->current_text_left; |
| 1298 |
| 1194 png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); | 1299 png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); |
| 1195 png_ptr->current_text_left -= text_size; | 1300 png_ptr->current_text_left -= text_size; |
| 1196 png_ptr->current_text_ptr += text_size; | 1301 png_ptr->current_text_ptr += text_size; |
| 1197 } | 1302 } |
| 1198 if (!(png_ptr->current_text_left)) | 1303 if (!(png_ptr->current_text_left)) |
| 1199 { | 1304 { |
| 1200 png_textp text_ptr; | 1305 png_textp text_ptr; |
| 1201 png_charp text; | 1306 png_charp text; |
| 1202 png_charp key; | 1307 png_charp key; |
| 1203 int ret; | 1308 int ret; |
| 1204 png_size_t text_size, key_size; | 1309 png_size_t text_size, key_size; |
| 1205 | 1310 |
| 1206 if (png_ptr->buffer_size < 4) | 1311 if (png_ptr->buffer_size < 4) |
| 1207 { | 1312 { |
| 1208 png_push_save_buffer(png_ptr); | 1313 png_push_save_buffer(png_ptr); |
| 1209 return; | 1314 return; |
| 1210 } | 1315 } |
| 1211 | 1316 |
| 1212 png_push_crc_finish(png_ptr); | 1317 png_push_crc_finish(png_ptr); |
| 1213 | 1318 |
| 1214 key = png_ptr->current_text; | 1319 key = png_ptr->current_text; |
| 1215 | 1320 |
| 1216 for (text = key; *text; text++) | 1321 for (text = key; *text; text++) |
| 1217 /* empty loop */ ; | 1322 /* Empty loop */ ; |
| 1218 | 1323 |
| 1219 /* zTXt can't have zero text */ | 1324 /* zTXt can't have zero text */ |
| 1220 if (text >= key + png_ptr->current_text_size) | 1325 if (text >= key + png_ptr->current_text_size) |
| 1221 { | 1326 { |
| 1222 png_ptr->current_text = NULL; | 1327 png_ptr->current_text = NULL; |
| 1223 png_free(png_ptr, key); | 1328 png_free(png_ptr, key); |
| 1224 return; | 1329 return; |
| 1225 } | 1330 } |
| 1226 | 1331 |
| 1227 text++; | 1332 text++; |
| 1228 | 1333 |
| 1229 if (*text != PNG_TEXT_COMPRESSION_zTXt) /* check compression byte */ | 1334 if (*text != PNG_TEXT_COMPRESSION_zTXt) /* Check compression byte */ |
| 1230 { | 1335 { |
| 1231 png_ptr->current_text = NULL; | 1336 png_ptr->current_text = NULL; |
| 1232 png_free(png_ptr, key); | 1337 png_free(png_ptr, key); |
| 1233 return; | 1338 return; |
| 1234 } | 1339 } |
| 1235 | 1340 |
| 1236 text++; | 1341 text++; |
| 1237 | 1342 |
| 1238 png_ptr->zstream.next_in = (png_bytep )text; | 1343 png_ptr->zstream.next_in = (png_bytep )text; |
| 1239 png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size - | 1344 png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size - |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1258 png_free(png_ptr, text); | 1363 png_free(png_ptr, text); |
| 1259 return; | 1364 return; |
| 1260 } | 1365 } |
| 1261 if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END) | 1366 if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END) |
| 1262 { | 1367 { |
| 1263 if (text == NULL) | 1368 if (text == NULL) |
| 1264 { | 1369 { |
| 1265 text = (png_charp)png_malloc(png_ptr, | 1370 text = (png_charp)png_malloc(png_ptr, |
| 1266 (png_uint_32)(png_ptr->zbuf_size | 1371 (png_uint_32)(png_ptr->zbuf_size |
| 1267 - png_ptr->zstream.avail_out + key_size + 1)); | 1372 - png_ptr->zstream.avail_out + key_size + 1)); |
| 1373 |
| 1268 png_memcpy(text + key_size, png_ptr->zbuf, | 1374 png_memcpy(text + key_size, png_ptr->zbuf, |
| 1269 png_ptr->zbuf_size - png_ptr->zstream.avail_out); | 1375 png_ptr->zbuf_size - png_ptr->zstream.avail_out); |
| 1376 |
| 1270 png_memcpy(text, key, key_size); | 1377 png_memcpy(text, key, key_size); |
| 1378 |
| 1271 text_size = key_size + png_ptr->zbuf_size - | 1379 text_size = key_size + png_ptr->zbuf_size - |
| 1272 png_ptr->zstream.avail_out; | 1380 png_ptr->zstream.avail_out; |
| 1381 |
| 1273 *(text + text_size) = '\0'; | 1382 *(text + text_size) = '\0'; |
| 1274 } | 1383 } |
| 1275 else | 1384 else |
| 1276 { | 1385 { |
| 1277 png_charp tmp; | 1386 png_charp tmp; |
| 1278 | 1387 |
| 1279 tmp = text; | 1388 tmp = text; |
| 1280 text = (png_charp)png_malloc(png_ptr, text_size + | 1389 text = (png_charp)png_malloc(png_ptr, text_size + |
| 1281 (png_uint_32)(png_ptr->zbuf_size | 1390 (png_uint_32)(png_ptr->zbuf_size |
| 1282 - png_ptr->zstream.avail_out + 1)); | 1391 - png_ptr->zstream.avail_out + 1)); |
| 1392 |
| 1283 png_memcpy(text, tmp, text_size); | 1393 png_memcpy(text, tmp, text_size); |
| 1284 png_free(png_ptr, tmp); | 1394 png_free(png_ptr, tmp); |
| 1395 |
| 1285 png_memcpy(text + text_size, png_ptr->zbuf, | 1396 png_memcpy(text + text_size, png_ptr->zbuf, |
| 1286 png_ptr->zbuf_size - png_ptr->zstream.avail_out); | 1397 png_ptr->zbuf_size - png_ptr->zstream.avail_out); |
| 1398 |
| 1287 text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out; | 1399 text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out; |
| 1288 *(text + text_size) = '\0'; | 1400 *(text + text_size) = '\0'; |
| 1289 } | 1401 } |
| 1290 if (ret != Z_STREAM_END) | 1402 if (ret != Z_STREAM_END) |
| 1291 { | 1403 { |
| 1292 png_ptr->zstream.next_out = png_ptr->zbuf; | 1404 png_ptr->zstream.next_out = png_ptr->zbuf; |
| 1293 png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; | 1405 png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; |
| 1294 } | 1406 } |
| 1295 } | 1407 } |
| 1296 else | 1408 else |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1340 #endif | 1452 #endif |
| 1341 | 1453 |
| 1342 #if defined(PNG_READ_iTXt_SUPPORTED) | 1454 #if defined(PNG_READ_iTXt_SUPPORTED) |
| 1343 void /* PRIVATE */ | 1455 void /* PRIVATE */ |
| 1344 png_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 | 1456 png_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 |
| 1345 length) | 1457 length) |
| 1346 { | 1458 { |
| 1347 if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) | 1459 if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) |
| 1348 { | 1460 { |
| 1349 png_error(png_ptr, "Out of place iTXt"); | 1461 png_error(png_ptr, "Out of place iTXt"); |
| 1350 info_ptr = info_ptr; /* to quiet some compiler warnings */ | 1462 info_ptr = info_ptr; /* To quiet some compiler warnings */ |
| 1351 } | 1463 } |
| 1352 | 1464 |
| 1353 #ifdef PNG_MAX_MALLOC_64K | 1465 #ifdef PNG_MAX_MALLOC_64K |
| 1354 png_ptr->skip_length = 0; /* This may not be necessary */ | 1466 png_ptr->skip_length = 0; /* This may not be necessary */ |
| 1355 | 1467 |
| 1356 if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ | 1468 if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ |
| 1357 { | 1469 { |
| 1358 png_warning(png_ptr, "iTXt chunk too large to fit in memory"); | 1470 png_warning(png_ptr, "iTXt chunk too large to fit in memory"); |
| 1359 png_ptr->skip_length = length - (png_uint_32)65535L; | 1471 png_ptr->skip_length = length - (png_uint_32)65535L; |
| 1360 length = (png_uint_32)65535L; | 1472 length = (png_uint_32)65535L; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1373 void /* PRIVATE */ | 1485 void /* PRIVATE */ |
| 1374 png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr) | 1486 png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr) |
| 1375 { | 1487 { |
| 1376 | 1488 |
| 1377 if (png_ptr->buffer_size && png_ptr->current_text_left) | 1489 if (png_ptr->buffer_size && png_ptr->current_text_left) |
| 1378 { | 1490 { |
| 1379 png_size_t text_size; | 1491 png_size_t text_size; |
| 1380 | 1492 |
| 1381 if (png_ptr->buffer_size < png_ptr->current_text_left) | 1493 if (png_ptr->buffer_size < png_ptr->current_text_left) |
| 1382 text_size = png_ptr->buffer_size; | 1494 text_size = png_ptr->buffer_size; |
| 1495 |
| 1383 else | 1496 else |
| 1384 text_size = png_ptr->current_text_left; | 1497 text_size = png_ptr->current_text_left; |
| 1498 |
| 1385 png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); | 1499 png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); |
| 1386 png_ptr->current_text_left -= text_size; | 1500 png_ptr->current_text_left -= text_size; |
| 1387 png_ptr->current_text_ptr += text_size; | 1501 png_ptr->current_text_ptr += text_size; |
| 1388 } | 1502 } |
| 1389 if (!(png_ptr->current_text_left)) | 1503 if (!(png_ptr->current_text_left)) |
| 1390 { | 1504 { |
| 1391 png_textp text_ptr; | 1505 png_textp text_ptr; |
| 1392 png_charp key; | 1506 png_charp key; |
| 1393 int comp_flag; | 1507 int comp_flag; |
| 1394 png_charp lang; | 1508 png_charp lang; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1405 png_push_crc_finish(png_ptr); | 1519 png_push_crc_finish(png_ptr); |
| 1406 | 1520 |
| 1407 #if defined(PNG_MAX_MALLOC_64K) | 1521 #if defined(PNG_MAX_MALLOC_64K) |
| 1408 if (png_ptr->skip_length) | 1522 if (png_ptr->skip_length) |
| 1409 return; | 1523 return; |
| 1410 #endif | 1524 #endif |
| 1411 | 1525 |
| 1412 key = png_ptr->current_text; | 1526 key = png_ptr->current_text; |
| 1413 | 1527 |
| 1414 for (lang = key; *lang; lang++) | 1528 for (lang = key; *lang; lang++) |
| 1415 /* empty loop */ ; | 1529 /* Empty loop */ ; |
| 1416 | 1530 |
| 1417 if (lang < key + png_ptr->current_text_size - 3) | 1531 if (lang < key + png_ptr->current_text_size - 3) |
| 1418 lang++; | 1532 lang++; |
| 1419 | 1533 |
| 1420 comp_flag = *lang++; | 1534 comp_flag = *lang++; |
| 1421 lang++; /* skip comp_type, always zero */ | 1535 lang++; /* Skip comp_type, always zero */ |
| 1422 | 1536 |
| 1423 for (lang_key = lang; *lang_key; lang_key++) | 1537 for (lang_key = lang; *lang_key; lang_key++) |
| 1424 /* empty loop */ ; | 1538 /* Empty loop */ ; |
| 1425 lang_key++; /* skip NUL separator */ | 1539 |
| 1540 lang_key++; /* Skip NUL separator */ |
| 1426 | 1541 |
| 1427 text=lang_key; | 1542 text=lang_key; |
| 1543 |
| 1428 if (lang_key < key + png_ptr->current_text_size - 1) | 1544 if (lang_key < key + png_ptr->current_text_size - 1) |
| 1429 { | 1545 { |
| 1430 for (; *text; text++) | 1546 for (; *text; text++) |
| 1431 /* empty loop */ ; | 1547 /* Empty loop */ ; |
| 1432 } | 1548 } |
| 1433 | 1549 |
| 1434 if (text < key + png_ptr->current_text_size) | 1550 if (text < key + png_ptr->current_text_size) |
| 1435 text++; | 1551 text++; |
| 1436 | 1552 |
| 1437 text_ptr = (png_textp)png_malloc(png_ptr, | 1553 text_ptr = (png_textp)png_malloc(png_ptr, |
| 1438 (png_uint_32)png_sizeof(png_text)); | 1554 (png_uint_32)png_sizeof(png_text)); |
| 1555 |
| 1439 text_ptr->compression = comp_flag + 2; | 1556 text_ptr->compression = comp_flag + 2; |
| 1440 text_ptr->key = key; | 1557 text_ptr->key = key; |
| 1441 text_ptr->lang = lang; | 1558 text_ptr->lang = lang; |
| 1442 text_ptr->lang_key = lang_key; | 1559 text_ptr->lang_key = lang_key; |
| 1443 text_ptr->text = text; | 1560 text_ptr->text = text; |
| 1444 text_ptr->text_length = 0; | 1561 text_ptr->text_length = 0; |
| 1445 text_ptr->itxt_length = png_strlen(text); | 1562 text_ptr->itxt_length = png_strlen(text); |
| 1446 | 1563 |
| 1447 ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); | 1564 ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); |
| 1448 | 1565 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1470 #if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) | 1587 #if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) |
| 1471 if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != | 1588 if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != |
| 1472 PNG_HANDLE_CHUNK_ALWAYS | 1589 PNG_HANDLE_CHUNK_ALWAYS |
| 1473 #if defined(PNG_READ_USER_CHUNKS_SUPPORTED) | 1590 #if defined(PNG_READ_USER_CHUNKS_SUPPORTED) |
| 1474 && png_ptr->read_user_chunk_fn == NULL | 1591 && png_ptr->read_user_chunk_fn == NULL |
| 1475 #endif | 1592 #endif |
| 1476 ) | 1593 ) |
| 1477 #endif | 1594 #endif |
| 1478 png_chunk_error(png_ptr, "unknown critical chunk"); | 1595 png_chunk_error(png_ptr, "unknown critical chunk"); |
| 1479 | 1596 |
| 1480 info_ptr = info_ptr; /* to quiet some compiler warnings */ | 1597 info_ptr = info_ptr; /* To quiet some compiler warnings */ |
| 1481 } | 1598 } |
| 1482 | 1599 |
| 1483 #if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) | 1600 #if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) |
| 1484 if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) | 1601 if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) |
| 1485 { | 1602 { |
| 1486 #ifdef PNG_MAX_MALLOC_64K | 1603 #ifdef PNG_MAX_MALLOC_64K |
| 1487 if (length > (png_uint_32)65535L) | 1604 if (length > (png_uint_32)65535L) |
| 1488 { | 1605 { |
| 1489 png_warning(png_ptr, "unknown chunk too large to fit in memory"); | 1606 png_warning(png_ptr, "unknown chunk too large to fit in memory"); |
| 1490 skip = length - (png_uint_32)65535L; | 1607 skip = length - (png_uint_32)65535L; |
| 1491 length = (png_uint_32)65535L; | 1608 length = (png_uint_32)65535L; |
| 1492 } | 1609 } |
| 1493 #endif | 1610 #endif |
| 1494 png_memcpy((png_charp)png_ptr->unknown_chunk.name, | 1611 png_memcpy((png_charp)png_ptr->unknown_chunk.name, |
| 1495 (png_charp)png_ptr->chunk_name, | 1612 (png_charp)png_ptr->chunk_name, |
| 1496 png_sizeof(png_ptr->unknown_chunk.name)); | 1613 png_sizeof(png_ptr->unknown_chunk.name)); |
| 1497 png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name) - 1] | 1614 png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name) - 1] |
| 1498 = '\0'; | 1615 = '\0'; |
| 1499 | 1616 |
| 1500 png_ptr->unknown_chunk.size = (png_size_t)length; | 1617 png_ptr->unknown_chunk.size = (png_size_t)length; |
| 1618 |
| 1501 if (length == 0) | 1619 if (length == 0) |
| 1502 png_ptr->unknown_chunk.data = NULL; | 1620 png_ptr->unknown_chunk.data = NULL; |
| 1621 |
| 1503 else | 1622 else |
| 1504 { | 1623 { |
| 1505 png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, | 1624 png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, |
| 1506 (png_uint_32)length); | 1625 (png_uint_32)length); |
| 1507 png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length); | 1626 png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length); |
| 1508 } | 1627 } |
| 1628 |
| 1509 #if defined(PNG_READ_USER_CHUNKS_SUPPORTED) | 1629 #if defined(PNG_READ_USER_CHUNKS_SUPPORTED) |
| 1510 if (png_ptr->read_user_chunk_fn != NULL) | 1630 if (png_ptr->read_user_chunk_fn != NULL) |
| 1511 { | 1631 { |
| 1512 /* callback to user unknown chunk handler */ | 1632 /* Callback to user unknown chunk handler */ |
| 1513 int ret; | 1633 int ret; |
| 1514 ret = (*(png_ptr->read_user_chunk_fn)) | 1634 ret = (*(png_ptr->read_user_chunk_fn)) |
| 1515 (png_ptr, &png_ptr->unknown_chunk); | 1635 (png_ptr, &png_ptr->unknown_chunk); |
| 1636 |
| 1516 if (ret < 0) | 1637 if (ret < 0) |
| 1517 png_chunk_error(png_ptr, "error in user chunk"); | 1638 png_chunk_error(png_ptr, "error in user chunk"); |
| 1639 |
| 1518 if (ret == 0) | 1640 if (ret == 0) |
| 1519 { | 1641 { |
| 1520 if (!(png_ptr->chunk_name[0] & 0x20)) | 1642 if (!(png_ptr->chunk_name[0] & 0x20)) |
| 1521 if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != | 1643 if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != |
| 1522 PNG_HANDLE_CHUNK_ALWAYS) | 1644 PNG_HANDLE_CHUNK_ALWAYS) |
| 1523 png_chunk_error(png_ptr, "unknown critical chunk"); | 1645 png_chunk_error(png_ptr, "unknown critical chunk"); |
| 1524 png_set_unknown_chunks(png_ptr, info_ptr, | 1646 png_set_unknown_chunks(png_ptr, info_ptr, |
| 1525 &png_ptr->unknown_chunk, 1); | 1647 &png_ptr->unknown_chunk, 1); |
| 1526 } | 1648 } |
| 1527 } | 1649 } |
| 1650 |
| 1528 else | 1651 else |
| 1529 #endif | 1652 #endif |
| 1530 png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); | 1653 png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); |
| 1531 png_free(png_ptr, png_ptr->unknown_chunk.data); | 1654 png_free(png_ptr, png_ptr->unknown_chunk.data); |
| 1532 png_ptr->unknown_chunk.data = NULL; | 1655 png_ptr->unknown_chunk.data = NULL; |
| 1533 } | 1656 } |
| 1657 |
| 1534 else | 1658 else |
| 1535 #endif | 1659 #endif |
| 1536 skip=length; | 1660 skip=length; |
| 1537 png_push_crc_skip(png_ptr, skip); | 1661 png_push_crc_skip(png_ptr, skip); |
| 1538 } | 1662 } |
| 1539 | 1663 |
| 1540 void /* PRIVATE */ | 1664 void /* PRIVATE */ |
| 1541 png_push_have_info(png_structp png_ptr, png_infop info_ptr) | 1665 png_push_have_info(png_structp png_ptr, png_infop info_ptr) |
| 1542 { | 1666 { |
| 1543 if (png_ptr->info_fn != NULL) | 1667 if (png_ptr->info_fn != NULL) |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1560 } | 1684 } |
| 1561 | 1685 |
| 1562 void PNGAPI | 1686 void PNGAPI |
| 1563 png_progressive_combine_row (png_structp png_ptr, | 1687 png_progressive_combine_row (png_structp png_ptr, |
| 1564 png_bytep old_row, png_bytep new_row) | 1688 png_bytep old_row, png_bytep new_row) |
| 1565 { | 1689 { |
| 1566 #ifdef PNG_USE_LOCAL_ARRAYS | 1690 #ifdef PNG_USE_LOCAL_ARRAYS |
| 1567 PNG_CONST int FARDATA png_pass_dsp_mask[7] = | 1691 PNG_CONST int FARDATA png_pass_dsp_mask[7] = |
| 1568 {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff}; | 1692 {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff}; |
| 1569 #endif | 1693 #endif |
| 1570 if (png_ptr == NULL) return; | 1694 if (png_ptr == NULL) |
| 1695 return; |
| 1696 |
| 1571 if (new_row != NULL) /* new_row must == png_ptr->row_buf here. */ | 1697 if (new_row != NULL) /* new_row must == png_ptr->row_buf here. */ |
| 1572 png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]); | 1698 png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]); |
| 1573 } | 1699 } |
| 1574 | 1700 |
| 1575 void PNGAPI | 1701 void PNGAPI |
| 1576 png_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr, | 1702 png_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr, |
| 1577 png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, | 1703 png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, |
| 1578 png_progressive_end_ptr end_fn) | 1704 png_progressive_end_ptr end_fn) |
| 1579 { | 1705 { |
| 1580 if (png_ptr == NULL) return; | 1706 if (png_ptr == NULL) |
| 1707 return; |
| 1708 |
| 1581 png_ptr->info_fn = info_fn; | 1709 png_ptr->info_fn = info_fn; |
| 1582 png_ptr->row_fn = row_fn; | 1710 png_ptr->row_fn = row_fn; |
| 1583 png_ptr->end_fn = end_fn; | 1711 png_ptr->end_fn = end_fn; |
| 1584 | 1712 |
| 1585 png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer); | 1713 png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer); |
| 1586 } | 1714 } |
| 1587 | 1715 |
| 1588 png_voidp PNGAPI | 1716 png_voidp PNGAPI |
| 1589 png_get_progressive_ptr(png_structp png_ptr) | 1717 png_get_progressive_ptr(png_structp png_ptr) |
| 1590 { | 1718 { |
| 1591 if (png_ptr == NULL) return (NULL); | 1719 if (png_ptr == NULL) |
| 1720 return (NULL); |
| 1721 |
| 1592 return png_ptr->io_ptr; | 1722 return png_ptr->io_ptr; |
| 1593 } | 1723 } |
| 1594 #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ | 1724 #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ |
| OLD | NEW |