viridis
Version:
Color gradients for data visualization
74 lines (73 loc) • 1.74 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.rgb2hsl = rgb2hsl;
exports.hsl2rgb = hsl2rgb;
var SMath = require("smath");
/**
* Convert RGB to HSL
*/
function rgb2hsl(rgb) {
var r = SMath.clamp(SMath.normalize(rgb.red, 0, 255), 0, 1);
var g = SMath.clamp(SMath.normalize(rgb.green, 0, 255), 0, 1);
var b = SMath.clamp(SMath.normalize(rgb.blue, 0, 255), 0, 1);
var M = Math.max(r, g, b);
var m = Math.min(r, g, b);
var C = M - m;
var H = 0;
if (C !== 0) {
if (M === r) {
H = (g - b) / C + 6;
}
else if (M === g) {
H = (b - r) / C + 2;
}
else if (M === b) {
H = (r - g) / C + 4;
}
}
var L = (M + m) / 2;
var S = 0;
if (L > 0 && L < 1) {
S = C / (1 - Math.abs(2 * L - 1));
}
return { hue: (H % 6) * 60, saturation: S * 100, lightness: L * 100 };
}
/**
* Convert HSL to RGB
*/
function hsl2rgb(hsl) {
var H = hsl.hue % 360;
var S = SMath.clamp(SMath.normalize(hsl.saturation, 0, 100), 0, 1);
var L = SMath.clamp(SMath.normalize(hsl.lightness, 0, 100), 0, 1);
var C = (1 - Math.abs(2 * L - 1)) * S;
var X = C * (1 - Math.abs(((H / 60) % 2) - 1));
var m = L - C / 2;
var r = 0;
var g = 0;
var b = 0;
if (H < 60) {
r = C;
g = X;
}
else if (H < 120) {
r = X;
g = C;
}
else if (H < 180) {
g = C;
b = X;
}
else if (H < 240) {
g = X;
b = C;
}
else if (H < 300) {
b = C;
r = X;
}
else {
b = X;
r = C;
}
return { red: (r + m) * 255, green: (g + m) * 255, blue: (b + m) * 255 };
}