# HG changeset patch # User drewp@bigasterisk.com # Date 1706935908 28800 # Node ID ecbbf76318bb11476d9c9ab0d3bd38d63e3c35b0 # Parent 7d9a056e29feb3057f5ea80361f122bab77e3d0e simpleWhiteVal diff -r 7d9a056e29fe -r ecbbf76318bb color_convert.py --- a/color_convert.py Mon Jan 29 23:41:27 2024 -0800 +++ b/color_convert.py Fri Feb 02 20:51:48 2024 -0800 @@ -1,3 +1,4 @@ +import colorsys import logging from dataclasses import dataclass @@ -6,6 +7,19 @@ log = logging.getLogger('conv') +def inverseLerp(a, b, val) -> float: + return (val - a) / (b - a) + + +def clamped(x) -> float: + return min(1, max(0, x)) + + +def simpleWhiteVal(r, g, b) -> float: + h, s, v = colorsys.rgb_to_hsv(r, g, b) + return (1 - s)**2 * clamped(inverseLerp(.5, 1, v))**2 + + @dataclass(frozen=True) class DeviceColor: """neutral representation of the adjusted color that we send to a device""" @@ -34,14 +48,15 @@ def oneWhiteConv(c: Color) -> DeviceColor: - return DeviceColor(r=c.r, g=c.g, b=c.b, w=max(c.r, c.g, c.b)) + return DeviceColor(r=c.r, g=c.g, b=c.b, w=simpleWhiteVal(c.r, c.g, c.b)) + def brightnessConv(c: Color) -> DeviceColor: return DeviceColor(brightness=max(c.r, c.g, c.b)) def twoWhitesConv(c: Color) -> DeviceColor: - return DeviceColor(r=c.r, g=c.g, b=c.b, cw=max(c.r, c.g, c.b), ww=0) + return DeviceColor(r=c.r, g=c.g, b=c.b, cw=simpleWhiteVal(c.r, c.g, c.b), ww=simpleWhiteVal(c.r, c.g, c.b)) def relayConv(c: Color) -> DeviceColor: