class Color extends Uint8ClampedArray {
    constructor (r, g, b, a) {
        super([r, g, b, a]);
    }

    get r () {
        return this[0];
    }
    set r (v) {
        this[0] = v;
    }

    get g () {
        return this[1];
    }
    set g (v) {
        this[1] = v;
    }

    get b () {
        return this[2];
    }
    set b (v) {
        this[2] = v;
    }

    get a () {
        return this[3];
    }
    set a (v) {
        this[3] = v;
    }

    get hex () {
        return Array.from(this).map(_ => _.toString(16).padStart(2, '0').toUpperCase()).join("");
    }
    
    get normalize () {
        return new Float32Array(Array.from(this).map(_ => _ / 255));
    }
    
    toString () {
        return this.hex;
    }
}

class Point extends Float32Array {
    constructor (x, y) {
        super([x, y]);
    }

    get x () {
        return this[0];
    }
    set x (v) {
        this[0] = v;
    }

    get y () {
        return this[1];
    }
    set y (v) {
        this[1] = v;
    }

    get normalize () {
        return new Float32Array(Array.from(this).map(_ => _ / Math.max(this.x, this.y)));
    }

    toString () {
        return this.x + ", " + this.y;
    }
}

class Bitmap extends Uint8ClampedArray {
    #view;

    constructor (width, height) {
        width  = width >>> 0;
        height = height >>> 0;
        super((width * height * 4) + 8);

        this.#view = new DataView(this);
        this.#view.setUint32(0, width);
        this.#view.setUint32(4, height);
    }

    get width () {
        return this.#view.getUint32(0);
    }

    get height () {
        return this.#view.getUint32(4);
    }

    get data () {
        return this.subarray(8);
    }

    has (x, y) {
        return x >= 0 && x < this.width && y >= 0 && y < this.height;
    }

    indexOf (x, y) {
        return this.has(x, y) ? 4 * (y * this.width + x) + 8 : -1;
    }

    get (x, y) {
        if (this.has(x, y)) {
            let index = this.indexOf(x, y);
            return new Color(
                this[index + 0], 
                this[index + 1], 
                this[index + 2], 
                this[index + 3]
            );
        }
        return null;
    }

    set (x, y, color) {
        if (this.has(x, y) && color instanceof Color) {
            let index = this.indexOf(x, y);

            this[index + 0] = color.r;
            this[index + 1] = color.g;
            this[index + 2] = color.b;
            this[index + 3] = color.a;
            return true;
        }
        return false;
    }
}