110 lines
3.1 KiB
JavaScript
110 lines
3.1 KiB
JavaScript
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();
|
|
}
|
|
|
|
} |