libdom
Version:
Lean Browser Library for typical DOM operations
131 lines (100 loc) • 3.05 kB
JavaScript
;
import { number } from "libcore";
import format from "./format.js";
var BYTE = 255,
BYTE_PERCENT = 127,
BYTE_HUE = 511,
PERCENT = 100,
HUE = 360,
SATURATION = PERCENT,
LUMINOSITY = PERCENT;
// from: https://gist.github.com/mjackson/5311256
function hue2rgb(p, q, t) {
t = (t + 1) % 1;
switch (true) {
case t < 1/6: return p + (q - p) * 6 * t;
case t < 1/2: return q;
case t < 2/3: return p + (q - p) * (2/3 - t) * 6;
}
return p;
}
export
function itemize(value, index, colorFormat) {
var M = Math,
F = format,
isFloat = index > 2 && colorFormat !== F.PERCENT,
min = 0,
max = index < 3 ?
BYTE : PERCENT;
value = F.format(value, colorFormat);
if (isFloat) {
value *= 100;
}
return M.max(min, M.min(max, value));
}
export
function toArray(integer) {
var M = Math,
h2r = hue2rgb,
size = BYTE,
psize = BYTE_PERCENT,
h = integer & BYTE_HUE,
s = (integer >> 9) & psize,
l = (integer >> 16) & psize,
a = (integer >> 23) & psize;
var q, p;
l /= LUMINOSITY;
if (s === 0) {
return [l, l, l];
}
h /= HUE;
s /= SATURATION;
q = l < 0.5 ?
l * (1 + s) :
l + s - l * s;
p = 2 * l - q;
return [M.round(h2r(p, q, h + 1/3) * size),
M.round(h2r(p, q, h) * size),
M.round(h2r(p, q, h - 1/3) * size),
(a).toFixed(2)];
}
export
function toInteger(r, g, b, a) {
var M = Math,
size = BYTE,
psize = BYTE_PERCENT;
var max, min, h, s, l, d;
r /= size;
g /= size;
b /= size;
max = M.max(r, g, b);
min = M.min(r, g, b);
l = (max + min) / 2;
if (max === min) {
h = s = 0; // achromatic
}
else {
d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch (max) {
case r: h = (g - b) / d + (g < b ? 6 : 0); break;
case g: h = (b - r) / d + 2; break;
case b: h = (r - g) / d + 4; break;
}
h /= 6;
}
if (!number(a)) {
a = PERCENT;
}
return ((a & psize) << 23) |
(((l * LUMINOSITY) & psize) << 16) |
(((s * SATURATION) & psize) << 9) |
((h * HUE) & BYTE_HUE);
}
export
function toString(integer) {
var values = toArray(integer),
alpha = (values[3] / PERCENT);
values[3] = parseFloat(alpha.toFixed(2));
return 'rgba(' + values.join(',') + ')';
}