@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
162 lines • 11 kB
JavaScript
export class TgdColor {
constructor(r = 0, g = 0, b = 0, a = 1) {
/** Red [0..1] */
this.R = 1;
/** Green [0..1] */
this.G = 1;
/** Blue [0..1] */
this.B = 1;
/** Alpha [0..1] */
this.A = 1;
/** Hue [0..1] */
this.H = 1;
/** Saturation [0..1] */
this.S = 1;
/** Lumimance [0..1] */
this.L = 1;
if (typeof r === "string") {
this.parse(r);
}
else {
this.R = r;
this.G = g;
this.B = b;
this.A = a;
}
}
parse(color) {
const context = getContext();
context.clearRect(0, 0, 1, 1);
context.fillStyle = color;
context.fillRect(0, 0, 1, 1);
const bitmap = context.getImageData(0, 0, 1, 1);
const [R, G, B, A] = bitmap.data;
const w = 1 / 255;
this.R = R * w;
this.G = G * w;
this.B = B * w;
this.A = A * w;
}
toString() {
const { R, G, B, A } = this;
return `#${hex(R)}${hex(G)}${hex(B)}${hex(A)}`;
}
rgb2hsl() {
const R = this.R;
const G = this.G;
const B = this.B;
const min = Math.min(R, G, B);
const max = Math.max(R, G, B);
const delta = max - min;
this.L = HALF * (max + min);
if (delta < EPSILON) {
this.H = 0;
this.S = 0;
}
else {
this.S = delta / (1 - Math.abs(this.L + this.L - 1));
if (max === R) {
this.H =
G >= B
? INV_6 * ((G - B) / delta)
: INV_6 * ((B - G) / delta);
}
else if (max === G) {
this.H = INV_6 * (VAL_2 + (B - R) / delta);
}
else {
this.H = INV_6 * (VAL_4 + (R - G) / delta);
}
}
return this;
}
hsl2rgb() {
const H = VAL_6 * this.H;
const S = this.S;
const L = this.L;
const chroma = (1 - Math.abs(L + L - 1)) * S;
const { R, G, B } = convertToRGB(H, chroma);
const shift = L - chroma * HALF;
this.R = R + shift;
this.G = G + shift;
this.B = B + shift;
return this;
}
}
const EPSILON = 1e-6;
const HALF = 0.5;
const VAL_1 = 1;
const VAL_2 = 2;
const VAL_3 = 3;
const VAL_4 = 4;
const VAL_5 = 5;
const VAL_6 = 6;
const INV_6 = 1 / VAL_6;
/**
* This is an helper function for the method `hsl2rgb()`.
* @param H Hue [0..6]
* @param chroma Chrominance
* @param x
*/
function convertToRGB(H, chroma) {
let R = 0;
let G = 0;
let B = 0;
const x = chroma * (1 - Math.abs((H % VAL_2) - 1));
if (H < VAL_3) {
if (H < VAL_1) {
R = chroma;
G = x;
B = 0;
}
else if (H < VAL_2) {
R = x;
G = chroma;
B = 0;
}
else {
// H == 2.
R = 0;
G = chroma;
B = x;
}
}
else if (H < VAL_4) {
R = 0;
G = x;
B = chroma;
}
else if (H < VAL_5) {
R = x;
G = 0;
B = chroma;
}
else {
R = chroma;
G = 0;
B = x;
}
return { R, G, B };
}
function hex(value) {
return Math.floor(value * 255)
.toString(16)
.padStart(2, "0");
}
let globalContext = null;
function getContext() {
if (!globalContext) {
const canvas = document.createElement("canvas");
canvas.width = 1;
canvas.height = 1;
const context = canvas.getContext("2d", {
alpha: true,
willReadFrequently: true,
});
if (!context)
throw new Error("Unable to create a 2D context!");
globalContext = context;
}
return globalContext;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29sb3IvY29sb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLFFBQVE7SUFzQmpCLFlBQVksSUFBcUIsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQztRQXJCdkQsaUJBQWlCO1FBQ1YsTUFBQyxHQUFXLENBQUMsQ0FBQTtRQUVwQixtQkFBbUI7UUFDWixNQUFDLEdBQVcsQ0FBQyxDQUFBO1FBRXBCLGtCQUFrQjtRQUNYLE1BQUMsR0FBVyxDQUFDLENBQUE7UUFFcEIsbUJBQW1CO1FBQ1osTUFBQyxHQUFXLENBQUMsQ0FBQTtRQUVwQixpQkFBaUI7UUFDVixNQUFDLEdBQVcsQ0FBQyxDQUFBO1FBRXBCLHdCQUF3QjtRQUNqQixNQUFDLEdBQVcsQ0FBQyxDQUFBO1FBRXBCLHVCQUF1QjtRQUNoQixNQUFDLEdBQVcsQ0FBQyxDQUFBO1FBR2hCLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNqQixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ1YsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDVixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNWLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2QsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBYTtRQUNmLE1BQU0sT0FBTyxHQUFHLFVBQVUsRUFBRSxDQUFBO1FBQzVCLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDN0IsT0FBTyxDQUFDLFNBQVMsR0FBRyxLQUFL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