From bc3e76fc16f1dea6363582ad40b22fa55e816d7f Mon Sep 17 00:00:00 2001 From: jackw01 Date: Sat, 23 Jan 2021 19:43:22 -0800 Subject: [PATCH] greatly improve rgbw desaturated color rendering --- ledcontrol/driver/led_render.h | 52 +++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/ledcontrol/driver/led_render.h b/ledcontrol/driver/led_render.h index 5d8171e..4e5f609 100644 --- a/ledcontrol/driver/led_render.h +++ b/ledcontrol/driver/led_render.h @@ -171,7 +171,7 @@ uint32_t render_hsv2rgb_rainbow_float(color_hsv_float hsv, w = 255; } else { uint8_t desat = 255 - sat; - desat = scale_8(scale_8(desat, desat), desat); + desat = scale_8(desat, desat); r = scale_8(r, sat); g = scale_8(g, sat); b = scale_8(b, sat); @@ -232,30 +232,42 @@ uint32_t render_rgb_float(color_rgb_float rgb, float g = clamp(rgb.g, 0, 1); float b = clamp(rgb.b, 0, 1); float w = 0; - - // If saturation is not 1, desaturate the color - // Moves r/g/b values closer to their average - // Not sure if this is the technically correct way but it seems to work? - if (saturation < 1) { - float v = (r + g + b) / 3.0; - if (saturation == 0) { - r = v; - b = v; - g = v; - } else { - r = (r - v) * saturation + v; - g = (g - v) * saturation + v; - b = (b - v) * saturation + v; - } - } + uint8_t sat = saturation * 255.0; if (has_white) { - float min = r < g ? (r < b ? r : b) : (g < b ? g : b); - min *= min; + float max = r > g ? (r > b ? r : b) : (g > b ? g : b); + float min; + if (sat == 0) { + r = 0; + g = 0; + b = 0; + min = max; + } else { + r = (r - max) * saturation + max; + g = (g - max) * saturation + max; + b = (b - max) * saturation + max; + min = r < g ? (r < b ? r : b) : (g < b ? g : b); r -= min; g -= min; b -= min; - w = min; + } + w = min * min; + } else { + // If saturation is not 1, desaturate the color + // Moves r/g/b values closer to their average + // Not sure if this is the technically correct way but it seems to work? + if (sat != 255) { + float v = (r + g + b) / 3.0; + if (sat == 0) { + r = v; + b = v; + g = v; + } else { + r = (r - v) * saturation + v; + g = (g - v) * saturation + v; + b = (b - v) * saturation + v; + } + } } /*