Mercurial > code > home > repos > light-bridge
diff color.py @ 8:181a86533286
share Color with dimcurve
author | drewp@bigasterisk.com |
---|---|
date | Sun, 28 Jan 2024 16:51:36 -0800 |
parents | e8e4fd6d5619 |
children | 9f427d8073c3 |
line wrap: on
line diff
--- a/color.py Sun Jan 28 16:03:40 2024 -0800 +++ b/color.py Sun Jan 28 16:51:36 2024 -0800 @@ -1,6 +1,39 @@ +import logging +from dataclasses import dataclass -class Color(str): +from dataclasses_json import DataClassJsonMixin + +log = logging.getLogger('colr') + + +def lerp(a, b, t): + return (1 - t) * a + (t) * b + + +@dataclass(frozen=True) +class Color(DataClassJsonMixin): + r: float + g: float + b: float - def to_js(self): - return self + def __post_init__(self): + super().__setattr__('r', max(0, min(1, self.r))) + super().__setattr__('g', max(0, min(1, self.g))) + super().__setattr__('b', max(0, min(1, self.b))) + + def __repr__(self): + return f'(Color(r={self.r:.3f}, g={self.g:.3f}, b={self.b:.3f}))' + + def avg(self): + return (self.r + self.g + self.b) / 3 + def mix(self, other, x): + return Color( + lerp(self.r, other.r, x), + lerp(self.g, other.g, x), + lerp(self.b, other.b, x), + ) + + def hex(self): + r, g, b = int(self.r * 255), int(self.g * 255), int(self.b * 255) + return '#%02x%02x%02x' % (r, g, b)