84 lines
1.4 KiB
JavaScript
84 lines
1.4 KiB
JavaScript
/**
|
|
* @module color-space/hsl
|
|
*/
|
|
import rgb from './rgb.js';
|
|
|
|
var hsl = {
|
|
name: 'hsl',
|
|
min: [0, 0, 0],
|
|
max: [360, 100, 100],
|
|
channel: ['hue', 'saturation', 'lightness'],
|
|
alias: ['HSL'],
|
|
|
|
rgb: function (hsl) {
|
|
var h = hsl[0] / 360, s = hsl[1] / 100, l = hsl[2] / 100, t1, t2, t3, rgb, val, i = 0;
|
|
|
|
if (s === 0) return val = l * 255, [val, val, val];
|
|
|
|
t2 = l < 0.5 ? l * (1 + s) : l + s - l * s;
|
|
t1 = 2 * l - t2;
|
|
|
|
rgb = [0, 0, 0];
|
|
for (; i < 3;) {
|
|
t3 = h + 1 / 3 * - (i - 1);
|
|
t3 < 0 ? t3++ : t3 > 1 && t3--;
|
|
val = 6 * t3 < 1 ? t1 + (t2 - t1) * 6 * t3 :
|
|
2 * t3 < 1 ? t2 :
|
|
3 * t3 < 2 ? t1 + (t2 - t1) * (2 / 3 - t3) * 6 :
|
|
t1;
|
|
rgb[i++] = val * 255;
|
|
}
|
|
|
|
return rgb;
|
|
}
|
|
};
|
|
|
|
export default (hsl);
|
|
|
|
|
|
//extend rgb
|
|
rgb.hsl = function (rgb) {
|
|
var r = rgb[0] / 255,
|
|
g = rgb[1] / 255,
|
|
b = rgb[2] / 255,
|
|
min = Math.min(r, g, b),
|
|
max = Math.max(r, g, b),
|
|
delta = max - min,
|
|
h, s, l;
|
|
|
|
if (max === min) {
|
|
h = 0;
|
|
}
|
|
else if (r === max) {
|
|
h = (g - b) / delta;
|
|
}
|
|
else if (g === max) {
|
|
h = 2 + (b - r) / delta;
|
|
}
|
|
else if (b === max) {
|
|
h = 4 + (r - g) / delta;
|
|
}
|
|
|
|
//FIXME h is possibly undefined
|
|
//@ts-ignore
|
|
h = Math.min(h * 60, 360);
|
|
|
|
if (h < 0) {
|
|
h += 360;
|
|
}
|
|
|
|
l = (min + max) / 2;
|
|
|
|
if (max === min) {
|
|
s = 0;
|
|
}
|
|
else if (l <= 0.5) {
|
|
s = delta / (max + min);
|
|
}
|
|
else {
|
|
s = delta / (2 - max - min);
|
|
}
|
|
|
|
return [h, s * 100, l * 100];
|
|
};
|