diff --git a/libretro-common/gfx/scaler/pixconv.c b/libretro-common/gfx/scaler/pixconv.c index b4f7bc7c7a..c5f0043724 100644 --- a/libretro-common/gfx/scaler/pixconv.c +++ b/libretro-common/gfx/scaler/pixconv.c @@ -359,6 +359,29 @@ void conv_rgba4444_argb8888(void *output_, const void *input_, } } +void conv_rgba4444_rgb565(void *output_, const void *input_, + int width, int height, + int out_stride, int in_stride) +{ + int h, w; + const uint16_t *input = (const uint16_t*)input_; + uint16_t *output = (uint16_t*)output_; + + for (h = 0; h < height; + h++, output += out_stride >> 1, input += in_stride >> 1) + { + for (w = 0; w < width; w++) + { + uint32_t col = input[w]; + uint32_t r = (col >> 12) & 0xf; + uint32_t g = (col >> 8) & 0xf; + uint32_t b = (col >> 4) & 0xf; + + output[w] = (r << 12) | (g << 7) | (b << 1); + } + } +} + #if defined(__SSE2__) /* :( TODO: Make this saner. */ static inline void store_bgr24_sse2(void *output, __m128i a, diff --git a/libretro-common/gfx/scaler/scaler.c b/libretro-common/gfx/scaler/scaler.c index 1bd6fdc407..ef928456e4 100644 --- a/libretro-common/gfx/scaler/scaler.c +++ b/libretro-common/gfx/scaler/scaler.c @@ -150,6 +150,8 @@ static bool set_direct_pix_conv(struct scaler_ctx *ctx) case SCALER_FMT_RGBA4444: if (ctx->out_fmt == SCALER_FMT_ARGB8888) ctx->direct_pixconv = conv_rgba4444_argb8888; + else if (ctx->out_fmt == SCALER_FMT_RGB565) + ctx->direct_pixconv = conv_rgba4444_rgb565; break; case SCALER_FMT_ABGR8888: /* FIXME/TODO */ diff --git a/libretro-common/include/gfx/scaler/pixconv.h b/libretro-common/include/gfx/scaler/pixconv.h index 2f3586e625..430d0e7c97 100644 --- a/libretro-common/include/gfx/scaler/pixconv.h +++ b/libretro-common/include/gfx/scaler/pixconv.h @@ -45,6 +45,10 @@ void conv_rgba4444_argb8888(void *output, const void *input, int width, int height, int out_stride, int in_stride); +void conv_rgba4444_rgb565(void *output, const void *input, + int width, int height, + int out_stride, int in_stride); + void conv_bgr24_argb8888(void *output, const void *input, int width, int height, int out_stride, int in_stride);