annotate color.py @ 9:9f427d8073c3

redo data model; add ui colors
author drewp@bigasterisk.com
date Sun, 28 Jan 2024 16:53:08 -0800
parents 181a86533286
children ab80e8826441
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
1 import logging
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
2 from dataclasses import dataclass
4
e8e4fd6d5619 refactor
drewp@bigasterisk.com
parents:
diff changeset
3
8
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
4 from dataclasses_json import DataClassJsonMixin
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
5
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
6 log = logging.getLogger('colr')
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
7
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
8
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
9 def lerp(a, b, t):
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
10 return (1 - t) * a + (t) * b
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
11
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
12
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
13 @dataclass(frozen=True)
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
14 class Color(DataClassJsonMixin):
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
15 r: float
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
16 g: float
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
17 b: float
4
e8e4fd6d5619 refactor
drewp@bigasterisk.com
parents:
diff changeset
18
8
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
19 def __post_init__(self):
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
20 super().__setattr__('r', max(0, min(1, self.r)))
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
21 super().__setattr__('g', max(0, min(1, self.g)))
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
22 super().__setattr__('b', max(0, min(1, self.b)))
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
23
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
24 def __repr__(self):
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
25 return f'(Color(r={self.r:.3f}, g={self.g:.3f}, b={self.b:.3f}))'
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
26
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
27 def avg(self):
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
28 return (self.r + self.g + self.b) / 3
4
e8e4fd6d5619 refactor
drewp@bigasterisk.com
parents:
diff changeset
29
8
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
30 def mix(self, other, x):
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
31 return Color(
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
32 lerp(self.r, other.r, x),
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
33 lerp(self.g, other.g, x),
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
34 lerp(self.b, other.b, x),
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
35 )
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
36
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
37 def hex(self):
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
38 r, g, b = int(self.r * 255), int(self.g * 255), int(self.b * 255)
181a86533286 share Color with dimcurve
drewp@bigasterisk.com
parents: 4
diff changeset
39 return '#%02x%02x%02x' % (r, g, b)
9
9f427d8073c3 redo data model; add ui colors
drewp@bigasterisk.com
parents: 8
diff changeset
40
9f427d8073c3 redo data model; add ui colors
drewp@bigasterisk.com
parents: 8
diff changeset
41 @classmethod
9f427d8073c3 redo data model; add ui colors
drewp@bigasterisk.com
parents: 8
diff changeset
42 def fromHex(cls, h: str):
9f427d8073c3 redo data model; add ui colors
drewp@bigasterisk.com
parents: 8
diff changeset
43 return cls(
9f427d8073c3 redo data model; add ui colors
drewp@bigasterisk.com
parents: 8
diff changeset
44 r=int(h[1:3], 16) / 255,
9f427d8073c3 redo data model; add ui colors
drewp@bigasterisk.com
parents: 8
diff changeset
45 g=int(h[3:5], 16) / 255,
9f427d8073c3 redo data model; add ui colors
drewp@bigasterisk.com
parents: 8
diff changeset
46 b=int(h[5:7], 16) / 255,
9f427d8073c3 redo data model; add ui colors
drewp@bigasterisk.com
parents: 8
diff changeset
47 )