From b8644536d2f4a644469fd2630cffbfe5503e334a Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 7 May 2016 04:04:09 +0200 Subject: [PATCH] (video_texture_image.c) Cleanups - we use nbio now in video_texture_image_load for both TGA and PNG, and we remove the file I/O based RPNG function --- gfx/video_texture_image.c | 137 ++++++++++++------- libretro-common/formats/png/rpng.c | 73 ---------- libretro-common/formats/png/test/rpng_test.c | 72 ++++++++++ 3 files changed, 161 insertions(+), 121 deletions(-) diff --git a/gfx/video_texture_image.c b/gfx/video_texture_image.c index fe66c575e1..3824b865d9 100644 --- a/gfx/video_texture_image.c +++ b/gfx/video_texture_image.c @@ -45,14 +45,20 @@ bool video_texture_image_set_color_shifts( unsigned *r_shift, unsigned *g_shift, unsigned *b_shift, unsigned *a_shift) { - bool use_rgba = video_driver_ctl( - RARCH_DISPLAY_CTL_SUPPORTS_RGBA, NULL); *a_shift = 24; - *r_shift = use_rgba ? 0 : 16; + *r_shift = 16; *g_shift = 8; - *b_shift = use_rgba ? 16 : 0; + *b_shift = 0; - return use_rgba; + if (video_driver_ctl( + RARCH_DISPLAY_CTL_SUPPORTS_RGBA, NULL)) + { + *r_shift = 0; + *b_shift = 16; + return true; + } + + return false; } bool video_texture_image_color_convert(unsigned r_shift, @@ -109,6 +115,7 @@ bool video_texture_image_color_convert(unsigned r_shift, static bool video_texture_image_rpng_gx_convert_texture32( struct texture_image *image) { + int ret; unsigned tmp_pitch, width2, i; const uint16_t *src = NULL; uint16_t *dst = NULL; @@ -149,18 +156,36 @@ static bool video_texture_image_rpng_gx_convert_texture32( #endif static bool video_texture_image_load_png( - const char *path, + void *ptr, struct texture_image *out_img, unsigned a_shift, unsigned r_shift, unsigned g_shift, unsigned b_shift) { - if (!rpng_load_image_argb(path, - &out_img->pixels, &out_img->width, &out_img->height)) + int ret; + rpng_t *rpng = rpng_alloc(); + + if (!rpng) + goto error; + + if (!rpng_set_buf_ptr(rpng, (uint8_t*)ptr)) + goto error; + + if (!rpng_nbio_load_image_argb_start(rpng)) + goto error; + + while (rpng_nbio_load_image_argb_iterate(rpng)); + + if (!rpng_is_valid(rpng)) + goto error; + + do { - out_img->pixels = NULL; - out_img->width = out_img->height = 0; - return false; - } + ret = rpng_nbio_load_image_argb_process(rpng, &out_img->pixels, &out_img->width, + &out_img->height); + }while(ret == IMAGE_PROCESS_NEXT); + + if (ret == IMAGE_PROCESS_ERROR || ret == IMAGE_PROCESS_ERROR_END) + goto error; video_texture_image_color_convert(r_shift, g_shift, b_shift, a_shift, out_img); @@ -169,11 +194,21 @@ static bool video_texture_image_load_png( if (!video_texture_image_rpng_gx_convert_texture32(out_img)) { video_texture_image_free(out_img); - return false; + goto error; } #endif + rpng_nbio_load_image_free(rpng); + return true; + +error: + out_img->pixels = NULL; + out_img->width = 0; + out_img->height = 0; + if (rpng) + rpng_nbio_load_image_free(rpng); + return false; } #endif @@ -188,35 +223,7 @@ void video_texture_image_free(struct texture_image *img) memset(img, 0, sizeof(*img)); } -static bool video_texture_image_load_tga( - const char *path, - struct texture_image *out_img, - unsigned a_shift, unsigned r_shift, - unsigned g_shift, unsigned b_shift) -{ - ssize_t len; - void *raw_buf = NULL; - uint8_t *buf = NULL; - bool ret = filestream_read_file(path, &raw_buf, &len); - - if (!ret || len < 0) - { - RARCH_ERR("Failed to read image: %s.\n", path); - return false; - } - - buf = (uint8_t*)raw_buf; - - ret = rtga_image_load_shift(buf, out_img, - a_shift, r_shift, g_shift, b_shift); - - if (buf) - free(buf); - - return ret; -} - -enum video_image_format video_texture_image_get_type(const char *path) +static enum video_image_format video_texture_image_get_type(const char *path) { if (strstr(path, ".tga")) return IMAGE_FORMAT_TGA; @@ -228,28 +235,62 @@ enum video_image_format video_texture_image_get_type(const char *path) bool video_texture_image_load(struct texture_image *out_img, const char *path) { + size_t file_len; unsigned r_shift, g_shift, b_shift, a_shift; + struct nbio_t *handle = NULL; + void *ptr = NULL; enum video_image_format fmt = video_texture_image_get_type(path); video_texture_image_set_color_shifts(&r_shift, &g_shift, &b_shift, &a_shift); + switch (fmt) + { + case IMAGE_FORMAT_NONE: + break; + default: + handle = (struct nbio_t*)nbio_open(path, NBIO_READ); + if (!handle) + goto error; + nbio_begin_read(handle); + + while (!nbio_iterate(handle)); + + ptr = nbio_get_ptr(handle, &file_len); + + if (!ptr) + goto error; + break; + } + switch (fmt) { case IMAGE_FORMAT_TGA: - return video_texture_image_load_tga(path, out_img, - a_shift, r_shift, g_shift, b_shift); + if (rtga_image_load_shift(ptr, out_img, + a_shift, r_shift, g_shift, b_shift)) + goto success; + break; case IMAGE_FORMAT_PNG: #ifdef HAVE_RPNG - return video_texture_image_load_png(path, out_img, - a_shift, r_shift, g_shift, b_shift); -#else - break; + if (video_texture_image_load_png(ptr, out_img, + a_shift, r_shift, g_shift, b_shift)) + goto success; #endif + break; default: case IMAGE_FORMAT_NONE: break; } +error: + if (handle) + nbio_free(handle); + return false; + +success: + if (handle) + nbio_free(handle); + + return true; } diff --git a/libretro-common/formats/png/rpng.c b/libretro-common/formats/png/rpng.c index d90711ff65..ab92674082 100644 --- a/libretro-common/formats/png/rpng.c +++ b/libretro-common/formats/png/rpng.c @@ -30,7 +30,6 @@ #endif #include -#include #include #include @@ -1037,75 +1036,3 @@ rpng_t *rpng_alloc(void) return NULL; return rpng; } - -bool rpng_load_image_argb(const char *path, uint32_t **data, - unsigned *width, unsigned *height) -{ - int retval; - size_t file_len; - bool ret = true; - rpng_t *rpng = NULL; - void *ptr = NULL; - struct nbio_t* handle = (struct nbio_t*)nbio_open(path, NBIO_READ); - - if (!handle) - goto end; - - nbio_begin_read(handle); - - while (!nbio_iterate(handle)); - - ptr = nbio_get_ptr(handle, &file_len); - - if (!ptr) - { - ret = false; - goto end; - } - - rpng = rpng_alloc(); - - if (!rpng) - { - ret = false; - goto end; - } - - if (!rpng_set_buf_ptr(rpng, (uint8_t*)ptr)) - { - ret = false; - goto end; - } - - if (!rpng_nbio_load_image_argb_start(rpng)) - { - ret = false; - goto end; - } - - while (rpng_nbio_load_image_argb_iterate(rpng)); - - if (!rpng_is_valid(rpng)) - { - ret = false; - goto end; - } - - do - { - retval = rpng_nbio_load_image_argb_process(rpng, data, width, height); - }while(retval == PNG_PROCESS_NEXT); - - if (retval == PNG_PROCESS_ERROR || retval == PNG_PROCESS_ERROR_END) - ret = false; - -end: - if (handle) - nbio_free(handle); - if (rpng) - rpng_nbio_load_image_free(rpng); - rpng = NULL; - if (!ret) - free(*data); - return ret; -} diff --git a/libretro-common/formats/png/test/rpng_test.c b/libretro-common/formats/png/test/rpng_test.c index bb457f9065..5642eab9ac 100644 --- a/libretro-common/formats/png/test/rpng_test.c +++ b/libretro-common/formats/png/test/rpng_test.c @@ -31,6 +31,78 @@ #include #include +static bool rpng_load_image_argb(const char *path, uint32_t **data, + unsigned *width, unsigned *height) +{ + int retval; + size_t file_len; + bool ret = true; + rpng_t *rpng = NULL; + void *ptr = NULL; + struct nbio_t* handle = (struct nbio_t*)nbio_open(path, NBIO_READ); + + if (!handle) + goto end; + + nbio_begin_read(handle); + + while (!nbio_iterate(handle)); + + ptr = nbio_get_ptr(handle, &file_len); + + if (!ptr) + { + ret = false; + goto end; + } + + rpng = rpng_alloc(); + + if (!rpng) + { + ret = false; + goto end; + } + + if (!rpng_set_buf_ptr(rpng, (uint8_t*)ptr)) + { + ret = false; + goto end; + } + + if (!rpng_nbio_load_image_argb_start(rpng)) + { + ret = false; + goto end; + } + + while (rpng_nbio_load_image_argb_iterate(rpng)); + + if (!rpng_is_valid(rpng)) + { + ret = false; + goto end; + } + + do + { + retval = rpng_nbio_load_image_argb_process(rpng, data, width, height); + }while(retval == PNG_PROCESS_NEXT); + + if (retval == PNG_PROCESS_ERROR || retval == PNG_PROCESS_ERROR_END) + ret = false; + +end: + if (handle) + nbio_free(handle); + if (rpng) + rpng_nbio_load_image_free(rpng); + rpng = NULL; + if (!ret) + free(*data); + return ret; +} + static int test_rpng(const char *in_path) { #ifdef HAVE_IMLIB2