120 lines
1.7 KiB
JavaScript
120 lines
1.7 KiB
JavaScript
/**
|
|
* @module color-space/hsv
|
|
*/
|
|
import rgb from './rgb.js';
|
|
import hsl from './hsl.js';
|
|
|
|
|
|
var hsv = {
|
|
name: 'hsv',
|
|
min: [0, 0, 0],
|
|
max: [360, 100, 100],
|
|
channel: ['hue', 'saturation', 'value'],
|
|
alias: ['HSV', 'HSB'],
|
|
|
|
rgb: function (hsv) {
|
|
var h = hsv[0] / 60,
|
|
s = hsv[1] / 100,
|
|
v = hsv[2] / 100,
|
|
hi = (Math.floor(h) % 6);
|
|
|
|
var f = h - Math.floor(h),
|
|
p = 255 * v * (1 - s),
|
|
q = 255 * v * (1 - (s * f)),
|
|
t = 255 * v * (1 - (s * (1 - f)));
|
|
v *= 255;
|
|
|
|
switch (hi) {
|
|
case 0:
|
|
return [v, t, p];
|
|
case 1:
|
|
return [q, v, p];
|
|
case 2:
|
|
return [p, v, t];
|
|
case 3:
|
|
return [p, q, v];
|
|
case 4:
|
|
return [t, p, v];
|
|
case 5:
|
|
return [v, p, q];
|
|
}
|
|
},
|
|
|
|
hsl: function (hsv) {
|
|
var h = hsv[0],
|
|
s = hsv[1] / 100,
|
|
v = hsv[2] / 100,
|
|
sl, l;
|
|
|
|
l = (2 - s) * v;
|
|
sl = s * v;
|
|
sl /= (l <= 1) ? l : 2 - l;
|
|
sl = sl || 0;
|
|
l /= 2;
|
|
|
|
return [h, sl * 100, l * 100];
|
|
}
|
|
};
|
|
|
|
export default (hsv);
|
|
|
|
|
|
//append rgb
|
|
rgb.hsv = function (rgb) {
|
|
var r = rgb[0],
|
|
g = rgb[1],
|
|
b = rgb[2],
|
|
min = Math.min(r, g, b),
|
|
max = Math.max(r, g, b),
|
|
delta = max - min,
|
|
h, s, v;
|
|
|
|
if (max === 0) {
|
|
s = 0;
|
|
}
|
|
else {
|
|
s = (delta / max * 100);
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
v = ((max / 255) * 1000) / 10;
|
|
|
|
return [h, s, v];
|
|
};
|
|
|
|
|
|
|
|
//extend hsl
|
|
hsl.hsv = function (hsl) {
|
|
var h = hsl[0],
|
|
s = hsl[1] / 100,
|
|
l = hsl[2] / 100,
|
|
sv, v;
|
|
l *= 2;
|
|
s *= (l <= 1) ? l : 2 - l;
|
|
v = (l + s) / 2;
|
|
sv = (2 * s) / (l + s) || 0;
|
|
|
|
return [h, sv * 100, v * 100];
|
|
};
|