UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

162 lines 11 kB
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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