From 431cf5e1f3e0dc804d05c9211b0a9c143d642b3a Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 14 Mar 2015 21:16:33 +0100 Subject: [PATCH] (RPNG) Use Z_NO_FLUSH as second param to inflate and put it in a while loop --- libretro-common/formats/png/rpng_decode.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/libretro-common/formats/png/rpng_decode.c b/libretro-common/formats/png/rpng_decode.c index 4ff2094348..23cfb02138 100644 --- a/libretro-common/formats/png/rpng_decode.c +++ b/libretro-common/formats/png/rpng_decode.c @@ -580,6 +580,7 @@ int png_reverse_filter_iterate(struct rpng_t *rpng, bool rpng_load_image_argb_process_init(struct rpng_t *rpng, uint32_t **data, unsigned *width, unsigned *height) { + int zstatus; rpng->process.inflate_buf_size = 0; rpng->process.inflate_buf = NULL; @@ -600,11 +601,19 @@ bool rpng_load_image_argb_process_init(struct rpng_t *rpng, rpng->process.stream.avail_out = rpng->process.inflate_buf_size; rpng->process.stream.next_out = rpng->process.inflate_buf; - if (inflate(&rpng->process.stream, Z_FINISH) != Z_STREAM_END) + do { - inflateEnd(&rpng->process.stream); - return false; - } + zstatus = inflate(&rpng->process.stream, Z_NO_FLUSH); + if (zstatus == Z_STREAM_END) + break; + if (zstatus != Z_OK && zstatus != Z_BUF_ERROR) + { + inflateEnd(&rpng->process.stream); + return false; + } + } while(rpng->process.stream.avail_in > 0 + && rpng->process.stream.avail_out > 0); + inflateEnd(&rpng->process.stream); *width = rpng->ihdr.width;