diff --git a/libretro-common/formats/png/rpng_decode.c b/libretro-common/formats/png/rpng_decode.c index c1f0ced0ff..66578cef91 100644 --- a/libretro-common/formats/png/rpng_decode.c +++ b/libretro-common/formats/png/rpng_decode.c @@ -626,3 +626,49 @@ bool png_reverse_filter_loop(struct rpng_t *rpng, return true; } + +bool rpng_load_image_argb_process_init(struct rpng_t *rpng, + uint32_t **data, unsigned *width, unsigned *height) +{ + rpng->process.inflate_buf_size = 0; + rpng->process.inflate_buf = NULL; + + if (inflateInit(&rpng->process.stream) != Z_OK) + return false; + + png_pass_geom(&rpng->ihdr, rpng->ihdr.width, + rpng->ihdr.height, NULL, NULL, &rpng->process.inflate_buf_size); + if (rpng->ihdr.interlace == 1) /* To be sure. */ + rpng->process.inflate_buf_size *= 2; + + rpng->process.inflate_buf = (uint8_t*)malloc(rpng->process.inflate_buf_size); + if (!rpng->process.inflate_buf) + return false; + + rpng->process.stream.next_in = rpng->idat_buf.data; + rpng->process.stream.avail_in = rpng->idat_buf.size; + 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) + { + inflateEnd(&rpng->process.stream); + return false; + } + inflateEnd(&rpng->process.stream); + + *width = rpng->ihdr.width; + *height = rpng->ihdr.height; +#ifdef GEKKO + /* we often use these in textures, make sure they're 32-byte aligned */ + *data = (uint32_t*)memalign(32, rpng->ihdr.width * + rpng->ihdr.height * sizeof(uint32_t)); +#else + *data = (uint32_t*)malloc(rpng->ihdr.width * + rpng->ihdr.height * sizeof(uint32_t)); +#endif + if (!*data) + return false; + + return true; +} diff --git a/libretro-common/formats/png/rpng_decode.h b/libretro-common/formats/png/rpng_decode.h index 78786a9727..63bc2147be 100644 --- a/libretro-common/formats/png/rpng_decode.h +++ b/libretro-common/formats/png/rpng_decode.h @@ -45,4 +45,7 @@ int png_reverse_filter_regular_loop(uint32_t **data, bool png_reverse_filter_loop(struct rpng_t *rpng, uint32_t **data); +bool rpng_load_image_argb_process_init(struct rpng_t *rpng, + uint32_t **data, unsigned *width, unsigned *height); + #endif diff --git a/libretro-common/formats/png/rpng_fbio.c b/libretro-common/formats/png/rpng_fbio.c index 9b714db348..1ed06c1c5e 100644 --- a/libretro-common/formats/png/rpng_fbio.c +++ b/libretro-common/formats/png/rpng_fbio.c @@ -257,38 +257,8 @@ bool rpng_load_image_argb(const char *path, uint32_t **data, if (!rpng.has_ihdr || !rpng.has_idat || !rpng.has_iend) GOTO_END_ERROR(); - if (inflateInit(&rpng.process.stream) != Z_OK) - GOTO_END_ERROR(); - - png_pass_geom(&rpng.ihdr, rpng.ihdr.width, rpng.ihdr.height, NULL, NULL, &rpng.process.inflate_buf_size); - if (rpng.ihdr.interlace == 1) /* To be sure. */ - rpng.process.inflate_buf_size *= 2; - - rpng.process.inflate_buf = (uint8_t*)malloc(rpng.process.inflate_buf_size); - if (!rpng.process.inflate_buf) - GOTO_END_ERROR(); - - rpng.process.stream.next_in = rpng.idat_buf.data; - rpng.process.stream.avail_in = rpng.idat_buf.size; - 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) - { - inflateEnd(&rpng.process.stream); - GOTO_END_ERROR(); - } - inflateEnd(&rpng.process.stream); - - *width = rpng.ihdr.width; - *height = rpng.ihdr.height; -#ifdef GEKKO - /* we often use these in textures, make sure they're 32-byte aligned */ - *data = (uint32_t*)memalign(32, rpng.ihdr.width * rpng.ihdr.height * sizeof(uint32_t)); -#else - *data = (uint32_t*)malloc(rpng.ihdr.width * rpng.ihdr.height * sizeof(uint32_t)); -#endif - if (!*data) + if (!rpng_load_image_argb_process_init(&rpng, data, width, + height)) GOTO_END_ERROR(); if (!png_reverse_filter_loop(&rpng, data)) diff --git a/libretro-common/formats/png/rpng_nbio.c b/libretro-common/formats/png/rpng_nbio.c index 1aecb03ce4..ab3ce34b31 100644 --- a/libretro-common/formats/png/rpng_nbio.c +++ b/libretro-common/formats/png/rpng_nbio.c @@ -194,47 +194,8 @@ bool rpng_nbio_load_image_argb_iterate(uint8_t *buf, struct rpng_t *rpng) bool rpng_nbio_load_image_argb_process(struct rpng_t *rpng, uint32_t **data, unsigned *width, unsigned *height) { - if (!rpng) - return false; - - rpng->process.inflate_buf_size = 0; - rpng->process.inflate_buf = NULL; - - if (inflateInit(&rpng->process.stream) != Z_OK) - return false; - - png_pass_geom(&rpng->ihdr, rpng->ihdr.width, - rpng->ihdr.height, NULL, NULL, &rpng->process.inflate_buf_size); - if (rpng->ihdr.interlace == 1) /* To be sure. */ - rpng->process.inflate_buf_size *= 2; - - rpng->process.inflate_buf = (uint8_t*)malloc(rpng->process.inflate_buf_size); - if (!rpng->process.inflate_buf) - return false; - - rpng->process.stream.next_in = rpng->idat_buf.data; - rpng->process.stream.avail_in = rpng->idat_buf.size; - 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) - { - inflateEnd(&rpng->process.stream); - return false; - } - inflateEnd(&rpng->process.stream); - - *width = rpng->ihdr.width; - *height = rpng->ihdr.height; -#ifdef GEKKO - /* we often use these in textures, make sure they're 32-byte aligned */ - *data = (uint32_t*)memalign(32, rpng->ihdr.width * - rpng->ihdr.height * sizeof(uint32_t)); -#else - *data = (uint32_t*)malloc(rpng->ihdr.width * - rpng->ihdr.height * sizeof(uint32_t)); -#endif - if (!*data) + if (!rpng_load_image_argb_process_init(rpng, data, width, + height)) return false; if (!png_reverse_filter_loop(rpng, data))