Photowall_WebApp/js/color.js
Kováts Levente 402f21e5c6 Hibajavítások
escapeHtml, color parsing, képnéző betöltés/megjelenítés
2021-01-24 10:16:18 +01:00

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();
}
}