Skip to content

Commit 6e0f46f

Browse files
committed
Update hsl/hwb to rgb
1 parent 4f59827 commit 6e0f46f

File tree

7 files changed

+48
-57
lines changed

7 files changed

+48
-57
lines changed

lib/sass/value/color/space/hsl.rb

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,26 +29,29 @@ def initialize
2929
end
3030

3131
def convert(dest, hue, saturation, lightness, alpha)
32-
scaled_hue = ((hue.nil? ? 0 : hue) / 360.0) % 1
33-
scaled_saturation = (saturation.nil? ? 0 : saturation) / 100.0
34-
scaled_lightness = (lightness.nil? ? 0 : lightness) / 100.0
32+
missing_lightness = lightness.nil?
33+
missing_chroma = saturation.nil?
34+
missing_hue = hue.nil?
3535

36-
m2 = if scaled_lightness <= 0.5
37-
scaled_lightness * (scaled_saturation + 1)
38-
else
39-
scaled_lightness + scaled_saturation - (scaled_lightness * scaled_saturation)
40-
end
41-
m1 = (scaled_lightness * 2) - m2
36+
hue = ((hue.nil? ? 0 : hue) % 360) / 30.0
37+
saturation = (saturation.nil? ? 0 : saturation) / 100.0
38+
lightness = (lightness.nil? ? 0 : lightness) / 100.0
39+
40+
a = saturation * [lightness, 1 - lightness].min
41+
f = lambda do |n|
42+
k = (n + hue) % 12
43+
lightness - (a * [-1, [k - 3, 9 - k, 1].min].max)
44+
end
4245

4346
SRGB.convert(
4447
dest,
45-
Utils.hue_to_rgb(m1, m2, scaled_hue + (1 / 3.0)),
46-
Utils.hue_to_rgb(m1, m2, scaled_hue),
47-
Utils.hue_to_rgb(m1, m2, scaled_hue - (1 / 3.0)),
48+
f.call(0),
49+
f.call(8),
50+
f.call(4),
4851
alpha,
49-
missing_lightness: lightness.nil?,
50-
missing_chroma: saturation.nil?,
51-
missing_hue: hue.nil?
52+
missing_lightness:,
53+
missing_chroma:,
54+
missing_hue:
5255
)
5356
end
5457
end

lib/sass/value/color/space/hwb.rb

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -29,28 +29,35 @@ def initialize
2929
end
3030

3131
def convert(dest, hue, whiteness, blackness, alpha)
32-
scaled_hue = (hue.nil? ? 0 : hue) % 360 / 360.0
33-
scaled_whiteness = (whiteness.nil? ? 0 : whiteness) / 100.0
34-
scaled_blackness = (blackness.nil? ? 0 : blackness) / 100.0
32+
missing_hue = hue.nil?
3533

36-
sum = scaled_whiteness + scaled_blackness
37-
if sum > 1
38-
scaled_whiteness /= sum
39-
scaled_blackness /= sum
40-
end
34+
hue = ((hue.nil? ? 0 : hue) % 360) / 30.0
35+
whiteness = (whiteness.nil? ? 0 : whiteness) / 100.0
36+
blackness = (blackness.nil? ? 0 : blackness) / 100.0
4137

42-
factor = 1 - scaled_whiteness - scaled_blackness
38+
sum = whiteness + blackness
39+
if sum > 1
40+
gray = whiteness / sum
41+
SRGB.convert(dest,
42+
gray,
43+
gray,
44+
gray,
45+
alpha,
46+
missing_hue:)
47+
else
48+
f = lambda do |n|
49+
k = (n + hue) % 12
50+
0.5 - ([-1, [k - 3, 9 - k, 1].min].max / 2.0)
51+
end
4352

44-
to_rgb = lambda do |hue_|
45-
(Utils.hue_to_rgb(0, 1, hue_) * factor) + scaled_whiteness
53+
factor = 1 - sum
54+
SRGB.convert(dest,
55+
(f.call(0) * factor) + whiteness,
56+
(f.call(8) * factor) + whiteness,
57+
(f.call(4) * factor) + whiteness,
58+
alpha,
59+
missing_hue:)
4660
end
47-
48-
SRGB.convert(dest,
49-
to_rgb.call(scaled_hue + (1 / 3.0)),
50-
to_rgb.call(scaled_hue),
51-
to_rgb.call(scaled_hue - (1 / 3.0)),
52-
alpha,
53-
missing_hue: hue.nil?)
5461
end
5562
end
5663

lib/sass/value/color/space/lch.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ def initialize
2727
def convert(dest, lightness, chroma, hue, alpha)
2828
missing_chroma = chroma.nil?
2929
missing_hue = hue.nil?
30+
3031
chroma = 0 if missing_chroma
3132
hue = 0 if missing_hue
3233

lib/sass/value/color/space/oklab.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,11 @@ def convert(dest, lightness, a, b, alpha, # rubocop:disable Naming/MethodParamet
3030
missing_lightness = lightness.nil?
3131
missing_a = a.nil?
3232
missing_b = b.nil?
33+
3334
lightness = 0 if missing_lightness
3435
a = 0 if missing_a
3536
b = 0 if missing_b
37+
3638
LMS.convert(
3739
dest,
3840
((

lib/sass/value/color/space/oklch.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ def initialize
2828
def convert(dest, lightness, chroma, hue, alpha)
2929
missing_chroma = chroma.nil?
3030
missing_hue = hue.nil?
31+
3132
chroma = 0 if missing_chroma
3233
hue = 0 if missing_hue
3334

lib/sass/value/color/space/utils.rb

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -31,29 +31,6 @@ module Utils
3131
LinearChannel.new('z', 0, 1).freeze
3232
].freeze
3333

34-
# Converts a legacy HSL/HWB hue to an RGB channel.
35-
#
36-
# The algorithm comes from from the CSS3 spec:
37-
# http://www.w3.org/TR/css3-color/#hsl-color.
38-
# @param m1 [Numeric]
39-
# @param m2 [Numeric]
40-
# @param hue [Numeric]
41-
# @return [Numeric]
42-
def hue_to_rgb(m1, m2, hue) # rubocop:disable Naming/MethodParameterName
43-
hue += 1 if hue.negative?
44-
hue -= 1 if hue > 1
45-
46-
if hue < 1 / 6.0
47-
m1 + ((m2 - m1) * hue * 6)
48-
elsif hue < 1 / 2.0
49-
m2
50-
elsif hue < 2 / 3.0
51-
m1 + ((m2 - m1) * ((2 / 3.0) - hue) * 6)
52-
else
53-
m1
54-
end
55-
end
56-
5734
# The algorithm for converting a single `srgb` or `display-p3` channel to
5835
# linear-light form.
5936
# @param [Numeric]

spec/sass/value/color_legacy_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ def legacy_hwb(...)
158158

159159
it 'has HWB channels' do
160160
expect(color.hue).to eq(120)
161-
expect(color.whiteness).to eq(24.360000000000003)
161+
expect(color.whiteness).to eq(24.36000000000000)
162162
expect(color.blackness).to eq(40.36000000000001)
163163
end
164164

0 commit comments

Comments
 (0)