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