11"""HWB class."""
22from ...spaces import Space , HWBish
3+ from ..hsl import srgb_to_hsl , hsl_to_srgb
34from ...cat import WHITES
4- from ... import util
55from ...channels import Channel , FLG_ANGLE , FLG_OPT_PERCENT
66from ...types import Vector
77
88
9- def hwb_to_hsv ( hwb : Vector ) -> Vector :
10- """HWB to HSV ."""
9+ def srgb_to_hwb ( srgb : Vector ) -> Vector :
10+ """HWB to sRGB ."""
1111
12- h , w , b = hwb
13-
14- wb = w + b
15- if wb >= 1 :
16- return [h , 0.0 , w / wb ]
17-
18- v = 1 - b
19- s = 0 if v == 0 else 1 - w / v
20- return [util .constrain_hue (h ), s , v ]
12+ return [srgb_to_hsl (srgb )[0 ], min (srgb ), 1 - max (srgb )]
2113
2214
23- def hsv_to_hwb ( hsv : Vector ) -> Vector :
24- """HSV to HWB ."""
15+ def hwb_to_srgb ( hwb : Vector ) -> Vector :
16+ """HWB to sRGB ."""
2517
26- h , s , v = hsv
27- return [util .constrain_hue (h ), v * (1 - s ), 1 - v ]
18+ h , w , b = hwb
19+ wb_sum = w + b
20+ wb_factor = 1 - w - b
21+ return [w / wb_sum ] * 3 if wb_sum >= 1 else [c * wb_factor + w for c in hsl_to_srgb ([h , 1 , 0.5 ])]
2822
2923
3024class HWB (HWBish , Space ):
3125 """HWB class."""
3226
33- BASE = "hsv "
27+ BASE = "srgb "
3428 NAME = "hwb"
3529 SERIALIZE = ("--hwb" ,)
3630 CHANNELS = (
@@ -49,19 +43,14 @@ class HWB(HWBish, Space):
4943 def is_achromatic (self , coords : Vector ) -> bool :
5044 """Check if color is achromatic."""
5145
52- if (coords [1 ] + coords [2 ]) >= (1 - 1e-07 ):
53- return True
54-
55- v = 1 - coords [2 ]
56- s = 0 if v == 0 else 1 - coords [1 ] / v
57- return abs (s ) < 1e-4
46+ return (coords [1 ] + coords [2 ]) >= (1 - 1e-07 )
5847
5948 def to_base (self , coords : Vector ) -> Vector :
60- """To HSV from HWB."""
49+ """To sRGB from HWB."""
6150
62- return hwb_to_hsv (coords )
51+ return hwb_to_srgb (coords )
6352
6453 def from_base (self , coords : Vector ) -> Vector :
65- """From HSV to HWB."""
54+ """From sRGB to HWB."""
6655
67- return hsv_to_hwb (coords )
56+ return srgb_to_hwb (coords )
0 commit comments