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)