class Color { constructor() { this.r = this.g = this.b = 0; this.a = 1.0; this.components = [ "r", "g", "b", "a" ]; } // komponensek korlátozása az értelmezési tartományra clip_components() { for (let i = 0; i < 4; i++) { let orig_val = this[this.components[i]]; this[this.components[i]] = Math.round(Math.min(255, Math.max(this[this.components[i]], 0))); if (orig_val !== this[this.components[i]]) { console.log(`Warning: channel ${this.components[i]} clipped!`); } } } // rgb(r,g,b) vagy rgba(r,g,b,a) formátumot feldolgoz from_cssrgb(rgb_str) { let parts = rgb_str.split("("); // ha érvénytelen az eredmény if (parts === null || parts.length < 2) { return; } // ha érvényes, akkor levágjuk a végéről a zárójelet parts = parts[1].split(")"); if (parts === null || parts.length < 1) { return; } let components_str = parts[0]; // whitespace-ek kiütése components_str = components_str.replace(/[ ]/, ''); // komponensek kigyűjtése let components = components_str.split(","); // ha nincs elég komponens, akkor érvénytelen if (components === null || components.length < 3) { return; } // csonkolás a megfelelő tartományra for (let i = 0; i < components.length; i++) { components[i] = Math.round(Math.min(255, Math.max(components[i], 0))); } // komponensek előállítása this.r = Number(components[0]); this.g = Number(components[1]); this.b = Number(components[2]); if (components.length <= 4) { this.a = Number(components[3]); } } // rgb(r,g,b) formátumban kiadja a színt to_cssrgb() { return `rgb(${this.r},${this.g},${this.b})`; } // rgba(r,g,b,a) formátumban kiadja a színt to_rgba() { return `rgb(${this.r},${this.g},${this.b},${this.a})`; } // #RRGGBB vagy #RRGGBBAA formátum befogadása from_hexa(hexa_str) { let val = hexa_str.trim(); if (hexa_str.charAt(0) === '#') { val = val.substr(1); } this.r = parseInt(val.substr(0,2), 16); this.g = parseInt(val.substr(2,2), 16); this.b = parseInt(val.substr(4,2), 16); // ha van alpha-csatorna is... if (val.length >= 8) { this.a = parseInt(val.substr(6,2), 16); } } // alpha-csatornával együtt kiadja hex-formátumban to_hexa() { return `#${this.r.toString(16)}${this.g.toString(16)}${this.b.toString(16)}${this.a.toString(16)}`; } // szín kiadása hex-formátumban alpha-csatorna nélkül to_hex() { return `#${this.r.toString(16)}${this.g.toString(16)}${this.b.toString(16)}`; } // szín szorzása konstanssal mul(c) { for (let i = 0; i < 4; i++) { this[this.components[i]] *= c; } // clip... this.clip_components(); } }