pixelbutler
Version:
Low-res bitmap render engine for big screens
91 lines (90 loc) • 2.17 kB
JavaScript
;
var RGBA = require('./RGBA');
var HSV = require('./HSV');
function useAlpha(col) {
return (typeof col.a === 'number' && col.a < 255);
}
exports.useAlpha = useAlpha;
function hsv2rgb(hsv) {
var r, g, b;
var i;
var f, p, q, t;
var h = hsv.h;
var s = hsv.s;
var v = hsv.v;
h = Math.max(0, Math.min(360, h));
s = Math.max(0, Math.min(100, s));
v = Math.max(0, Math.min(100, v));
s /= 100;
v /= 100;
if (s === 0) {
r = g = b = v;
return new RGBA(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255));
}
h /= 60;
i = Math.floor(h);
f = h - i;
p = v * (1 - s);
q = v * (1 - s * f);
t = v * (1 - s * (1 - f));
switch (i) {
case 0:
r = v;
g = t;
b = p;
break;
case 1:
r = q;
g = v;
b = p;
break;
case 2:
r = p;
g = v;
b = t;
break;
case 3:
r = p;
g = q;
b = v;
break;
case 4:
r = t;
g = p;
b = v;
break;
default:
r = v;
g = p;
b = q;
}
return new RGBA(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255));
}
exports.hsv2rgb = hsv2rgb;
function rgb2hsv(rgb) {
var rr, gg, bb, r = rgb.r / 255, g = rgb.g / 255, b = rgb.b / 255, h, s, v = Math.max(r, g, b), diff = v - Math.min(r, g, b), diffc = function (c) {
return (v - c) / 6 / diff + 1 / 2;
};
if (diff === 0) {
h = s = 0;
} else {
s = diff / v;
rr = diffc(r);
gg = diffc(g);
bb = diffc(b);
if (r === v) {
h = bb - gg;
} else if (g === v) {
h = (1 / 3) + rr - bb;
} else if (b === v) {
h = (2 / 3) + gg - rr;
}
if (h < 0) {
h += 1;
} else if (h > 1) {
h -= 1;
}
}
return new HSV(Math.round(h * 360), Math.round(s * 100), Math.round(v * 100));
}
exports.rgb2hsv = rgb2hsv;