From 9465a00d4b38c97bd050e6b05e8c7b769e557c48 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Wed, 4 May 2016 18:44:39 +0200 Subject: [PATCH] Create video_frame_convert_rgba_to_bgr --- gfx/drivers/gl.c | 30 +++++++++--------------------- gfx/video_frame.h | 17 +++++++++++++++++ 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index 6fedde6982..b164a33635 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -3142,16 +3142,13 @@ static bool gl_read_viewport(void *data, uint8_t *buffer) if (ptr) { - unsigned x, y; - + unsigned y; for (y = 0; y < gl->vp.height; y++) { - for (x = 0; x < gl->vp.width; x++, buffer += 3, ptr += 4) - { - buffer[0] = ptr[2]; /* RGBA -> BGR. */ - buffer[1] = ptr[1]; - buffer[2] = ptr[0]; - } + video_frame_convert_rgba_to_bgr( + (const void*)ptr, + buffer, + gl->vp.width); } } else @@ -3176,10 +3173,6 @@ static bool gl_read_viewport(void *data, uint8_t *buffer) as we don't really care about performance in this case. */ #endif { - unsigned i; - uint8_t *dst = NULL; - const uint8_t *src = NULL; - /* GLES2 only guarantees GL_RGBA/GL_UNSIGNED_BYTE * readbacks so do just that. * GLES2 also doesn't support reading back data @@ -3201,15 +3194,10 @@ static bool gl_read_viewport(void *data, uint8_t *buffer) video_driver_ctl(RARCH_DISPLAY_CTL_CACHED_FRAME_RENDER, NULL); - dst = buffer; - src = (const uint8_t*)gl->readback_buffer_screenshot; - - for (i = 0; i < num_pixels; i++, dst += 3, src += 4) - { - dst[0] = src[2]; /* RGBA -> BGR. */ - dst[1] = src[1]; - dst[2] = src[0]; - } + video_frame_convert_rgba_to_bgr( + (const void*)gl->readback_buffer_screenshot, + buffer, + num_pixels); free(gl->readback_buffer_screenshot); gl->readback_buffer_screenshot = NULL; diff --git a/gfx/video_frame.h b/gfx/video_frame.h index 81348bdee8..10cbb4bdd2 100644 --- a/gfx/video_frame.h +++ b/gfx/video_frame.h @@ -161,4 +161,21 @@ static INLINE void video_frame_convert_to_bgr24( scaler_ctx_scale(scaler, output, input); } +static INLINE void video_frame_convert_rgba_to_bgr( + const void *src_data, + void *dst_data, + unsigned width) +{ + unsigned x; + uint8_t *dst = (uint8_t*)dst_data; + const uint8_t *src = (const uint8_t*)src_data; + + for (x = 0; x < width; x++, dst += 3, src += 4) + { + dst[0] = src[2]; + dst[1] = src[1]; + dst[2] = src[0]; + } +} + #endif