From e0436e33d4b2ad203ec358e040fc194afc999918 Mon Sep 17 00:00:00 2001 From: Lior Halphon Date: Mon, 25 Jul 2022 19:55:31 +0300 Subject: [PATCH] Use gamma correct (and nearly gamma correct) color mixing --- Core/display.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Core/display.c b/Core/display.c index f00418e..d192491 100644 --- a/Core/display.c +++ b/Core/display.c @@ -281,12 +281,21 @@ uint32_t GB_convert_rgb15(GB_gameboy_t *gb, uint16_t color, bool for_border) if (gb->color_correction_mode != GB_COLOR_CORRECTION_CORRECT_CURVES) { uint8_t new_r, new_g, new_b; + double gamma = 2.2; + if (gb->color_correction_mode < GB_COLOR_CORRECTION_REDUCE_CONTRAST) { + /* Don't use absolutely gamma-correct mixing for the high-contrast + modes, to prevent the blue hues from being too washed out */ + gamma = 1.6; + } + + // TODO: Optimze pow out using a LUT if (agb) { - new_g = (g * 5 + b) / 6; + new_g = pow((pow(g / 255.0, gamma) * 5 + pow(b / 255.0, gamma)) / 6, 1 / gamma) * 255; } else { - new_g = (g * 3 + b) / 4; + new_g = pow((pow(g / 255.0, gamma) * 3 + pow(b / 255.0, gamma)) / 4, 1 / gamma) * 255; } + new_r = r; new_b = b; if (gb->color_correction_mode == GB_COLOR_CORRECTION_REDUCE_CONTRAST) {