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

 get array () {
  return this.#data.map(_ => _);
 }

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

/* UINT32 SUPPORT ONLY */
class Bitmap {
 #data;
 constructor (width, height) {
  width  = width >>> 0;
  height = height >>> 0;

  this.#data        = new Uint8ClampedArray(width * height * 4);
  this.#data.width  = width;
  this.#data.height = height;
 }
 get width () {
  return this.#data.width;
 }
 get height () {
  return this.#data.height;
 }
 get data () {
  return this.#data.map(_ => _);
 }
 has (x, y) {
  return x >= 0 && x < this.width && y >= 0 && y < this.height;
 }
 get (x, y) {
  return this.has(x, y) ? new Color(
   this.#data[4 * (x + y * this.width) + 0], 
   this.#data[4 * (x + y * this.width) + 1], 
   this.#data[4 * (x + y * this.width) + 2], 
   this.#data[4 * (x + y * this.width) + 3]
  ) : null;
 }
 set (x, y, color) {
  if(!this.has(x, y) || !(color instanceof Color)) {
   return false;
  }

  this.#data[4 * (x + y * this.width) + 0] = color.r;
  this.#data[4 * (x + y * this.width) + 1] = color.g;
  this.#data[4 * (x + y * this.width) + 2] = color.b;
  this.#data[4 * (x + y * this.width) + 3] = color.a;
 }
 toArray () {
  let buffer = new Uint8ClampedArray(this.#data.size + 8);
  let view = new DataView(buffer);
  view.setUint32(0, this.width);
  view.setUint32(4, this.height);
  this.#data.forEach((v, i) => { buffer[i + 8] = v; });
  return buffer;
 }
 static fromArray (array) {
  if(!(array instanceof Uint8ClampedArray) || array.length < 8)
   return null;
  let view   = new DataView(array);
  let width  = view.getUint32(0);
  let height = view.getUint32(4);
  if(width * height * 4 !== view.length - 8)
   return null;
  
 }
}