62 lines
1.4 KiB
JavaScript
62 lines
1.4 KiB
JavaScript
|
// HSL to RGB converter. Both methods adapted from:
|
||
|
// http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
|
||
|
|
||
|
function hslToRgb(h, s, l) {
|
||
|
var r, g, b;
|
||
|
|
||
|
// normalize hue orientation b/w 0 and 360 degrees
|
||
|
h = h % 360;
|
||
|
if (h < 0)
|
||
|
h += 360;
|
||
|
h = ~~h / 360;
|
||
|
|
||
|
if (s < 0)
|
||
|
s = 0;
|
||
|
else if (s > 100)
|
||
|
s = 100;
|
||
|
s = ~~s / 100;
|
||
|
|
||
|
if (l < 0)
|
||
|
l = 0;
|
||
|
else if (l > 100)
|
||
|
l = 100;
|
||
|
l = ~~l / 100;
|
||
|
|
||
|
if (s === 0) {
|
||
|
r = g = b = l; // achromatic
|
||
|
} else {
|
||
|
var q = l < 0.5 ?
|
||
|
l * (1 + s) :
|
||
|
l + s - l * s;
|
||
|
var p = 2 * l - q;
|
||
|
r = hueToRgb(p, q, h + 1/3);
|
||
|
g = hueToRgb(p, q, h);
|
||
|
b = hueToRgb(p, q, h - 1/3);
|
||
|
}
|
||
|
|
||
|
return [~~(r * 255), ~~(g * 255), ~~(b * 255)];
|
||
|
}
|
||
|
|
||
|
function hueToRgb(p, q, t) {
|
||
|
if (t < 0) t += 1;
|
||
|
if (t > 1) t -= 1;
|
||
|
if (t < 1/6) return p + (q - p) * 6 * t;
|
||
|
if (t < 1/2) return q;
|
||
|
if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;
|
||
|
return p;
|
||
|
}
|
||
|
|
||
|
function shortenHsl(hue, saturation, lightness) {
|
||
|
var asRgb = hslToRgb(hue, saturation, lightness);
|
||
|
var redAsHex = asRgb[0].toString(16);
|
||
|
var greenAsHex = asRgb[1].toString(16);
|
||
|
var blueAsHex = asRgb[2].toString(16);
|
||
|
|
||
|
return '#' +
|
||
|
((redAsHex.length == 1 ? '0' : '') + redAsHex) +
|
||
|
((greenAsHex.length == 1 ? '0' : '') + greenAsHex) +
|
||
|
((blueAsHex.length == 1 ? '0' : '') + blueAsHex);
|
||
|
}
|
||
|
|
||
|
module.exports = shortenHsl;
|