@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
213 lines • 13.9 kB
JavaScript
import { tgdCalcClamp, tgdCalcModulo } from "./../utils/index.js";
export class TgdColor {
static fromHSL(H, S, L) {
const color = new TgdColor();
color.H = H;
color.S = S;
color.L = L;
color.hsl2rgb();
return color;
}
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;
}
}
get R() {
return this._R;
}
set R(v) {
this._R = tgdCalcClamp(v, 0, 1);
}
get G() {
return this._G;
}
set G(v) {
this._G = tgdCalcClamp(v, 0, 1);
}
get B() {
return this._B;
}
set B(v) {
this._B = tgdCalcClamp(v, 0, 1);
}
get A() {
return this._A;
}
set A(v) {
this._A = tgdCalcClamp(v, 0, 1);
}
get H() {
return this._H;
}
set H(v) {
this._H = tgdCalcModulo(v, 0, 1);
}
get S() {
return this._S;
}
set S(v) {
this._S = tgdCalcClamp(v, 0, 1);
}
get L() {
return this._L;
}
set L(v) {
this._L = tgdCalcClamp(v, 0, 1);
}
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29sb3IvY29sb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFFeEQsTUFBTSxPQUFPLFFBQVE7SUFDakIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVM7UUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQTtRQUM1QixLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNYLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ1gsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDWCxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDZixPQUFPLEtBQUssQ0FBQTtJQUNoQixDQUFDO0lBdUJELFlBQVksSUFBcUIsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQztRQXJCdkQsaUJBQWlCO1FBQ1QsT0FBRSxHQUFXLENBQUMsQ0FBQTtRQUV0QixtQkFBbUI7UUFDWCxPQUFFLEdBQVcsQ0FBQyxDQUFBO1FBRXRCLGtCQUFrQjtRQUNWLE9BQUUsR0FBVyxDQUFDLENBQUE7UUFFdEIsbUJBQW1CO1FBQ1gsT0FBRSxHQUFXLENBQUMsQ0FBQTtRQUV0QixpQkFBaUI7UUFDVCxPQUFFLEdBQVcsQ0FBQyxDQUFBO1FBRXRCLHdCQUF3QjtRQUNoQixPQUFFLEdBQVcsQ0FBQyxDQUFBO1FBRXRCLHVCQUF1QjtRQUNmLE9BQUUsR0FBVyxDQUFDLENBQUE7UUFHbEIsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2pCLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDVixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNWLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ1YsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDZCxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQUksQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQTtJQUNsQixDQUFDO0lBQ0QsSUFBSSxDQUFDLENBQUMsQ0FBUztRQUNYLElBQUksQ0FBQyxFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDbkMsQ0FBQztJQUVELElBQUksQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQTtJQUNsQixDQUFDO0lBQ0QsSUFBSSxDQUFDLENBQUMsQ0FBUztRQUNYLElBQUksQ0FBQyxFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDbkMsQ0FBQztJQUVELElBQUksQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQTtJQUNsQixDQUFDO0lBQ0QsSUFBSSxDQUFDLENBQUMsQ0FBUztRQUNYLElBQUksQ0FBQyxFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDbkMsQ0FBQztJQUVELElBQUksQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQTtJQUNsQixDQUFDO0lBQ0QsSUFBSSxDQUFDLENBQUMsQ0FBUztRQUNYLElBQUksQ0FBQyxFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDbkMsQ0FBQztJQUVELElBQUksQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQTtJQUNsQixDQUFDO0lBQ0QsSUFBSSxDQUFDLENBQUMsQ0FBUztRQUNYLElBQUksQ0FBQyxFQUFF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