temp-color
Version:
Convert any quantity to RGB color
107 lines (97 loc) • 2.81 kB
JavaScript
const checkRange = require('./checker');
function tempToColor (t, min, max, mode) {
if (!Number.isFinite(t) || !Number.isFinite(min) || !Number.isFinite(max)) {
throw new TypeError('function tempToColor() expected only numbers');
}
if (min > max) {
throw new Error('minimum cannot be greater than maximum');
}
if (t < min) {
t = min;
} else if (t > max) {
t = max;
}
const nT = (t - min) / (max - min);
let rValue = 255;
let gValue = 255;
let bValue = 255;
switch (mode) {
case 'extended': {
const regions = [1 / 6, (1 / 6) * 2, (1 / 6) * 3, (1 / 6) * 4, (1 / 6) * 5];
if (nT <= regions[0]) {
rValue = 128 - 6 * nT * 127.999;
gValue = 0;
bValue = 255;
} else if (nT > regions[0] && nT <= regions[1]) {
rValue = 0;
gValue = 1280 - 6 * (1 - nT) * 255.999;
bValue = 255;
} else if (nT > regions[1] && nT <= regions[2]) {
rValue = 0;
gValue = 255;
bValue = 768 - 6 * nT * 255.999;
} else if (nT > regions[2] && nT <= regions[3]) {
rValue = 768 - 6 * (1 - nT) * 255.999;
gValue = 255;
bValue = 0;
} else if (nT > regions[3] && nT <= regions[4]) {
rValue = 255;
gValue = 1280 - 6 * nT * 255.999;
bValue = 0;
} else {
rValue = 255;
gValue = 0;
bValue = 128 - 6 * (1 - nT) * 127.999;
}
break;
}
case 'half': {
const regions = [1 / 4, (1 / 4) * 2, (1 / 4) * 3];
if (nT <= regions[0]) {
rValue = 0;
gValue = 128 + 4 * nT * 127.999;
bValue = 0;
} else if (nT > regions[0] && nT <= regions[1]) {
rValue = 768 - 4 * (1 - nT) * 255.999;
gValue = 255;
bValue = 0;
} else if (nT > regions[1] && nT <= regions[2]) {
rValue = 255;
gValue = 768 - 4 * nT * 255.999;
bValue = 0;
} else {
rValue = 128 + 4 * (1 - nT) * 127.999;
gValue = 0;
bValue = 0;
}
break;
}
default: {
const regions = [1 / 4, (1 / 4) * 2, (1 / 4) * 3];
if (nT <= regions[0]) {
rValue = 0;
gValue = 4 * nT * 255.999;
bValue = 255;
} else if (nT > regions[0] && nT <= regions[1]) {
rValue = 0;
gValue = 255;
bValue = 512 - 4 * nT * 255.999;
} else if (nT > regions[1] && nT <= regions[2]) {
rValue = 512 - 4 * (1 - nT) * 255.999;
gValue = 255;
bValue = 0;
} else {
rValue = 255;
gValue = 4 * (1 - nT) * 255.999;
bValue = 0;
}
break;
}
}
return {
r: checkRange(Math.trunc(rValue)),
g: checkRange(Math.trunc(gValue)),
b: checkRange(Math.trunc(bValue))
};
};
module.exports.tempToColor = tempToColor;