def self.from_hsl(h, s, l, a)
h = Float(h) / 360
s = Float(s) / 100
l = Float(l) / 100
a = Float(a || 1)
if s == 0
r = l
g = r
b = r
else
luminocity2 = (l < 0.5) ? l * (1 + s) : l + s - l * s
luminocity1 = 2 * l - luminocity2
hue_to_rgb = lambda do |lum1, lum2, hue|
hue += 1 if hue < 0.0
hue -= 1 if hue > 1.0
if hue < 1.0 / 6.0
(lum1 + (lum2 - lum1) * 6.0 * hue)
elsif hue < 1.0 / 2.0
lum2
elsif hue < 2.0 / 3.0
lum1 + (lum2 - lum1) * ((2.0 / 3.0) - hue) * 6.0
else
lum1
end
end
r = hue_to_rgb.call(luminocity1, luminocity2, h + 1.0 / 3.0)
g = hue_to_rgb.call(luminocity1, luminocity2, h)
b = hue_to_rgb.call(luminocity1, luminocity2, h - 1.0 / 3.0)
end
new r * 256, g * 256, b * 256, a
end