1function ImageData(arr, width, height) {
2  if (!width || height === 0) {
3    throw 'invalid dimensions, width and height must be non-zero';
4  }
5  if (arr.length % 4) {
6    throw 'arr must be a multiple of 4';
7  }
8  height = height || arr.length/(4*width);
9
10  Object.defineProperty(this, 'data', {
11    value: arr,
12    writable: false
13  });
14  Object.defineProperty(this, 'height', {
15    value: height,
16    writable: false
17  });
18  Object.defineProperty(this, 'width', {
19    value: width,
20    writable: false
21  });
22}
23
24CanvasKit.ImageData = function() {
25  if (arguments.length === 2) {
26    var width = arguments[0];
27    var height = arguments[1];
28    var byteLength = 4 * width * height;
29    return new ImageData(new Uint8ClampedArray(byteLength),
30                         width, height);
31  } else if (arguments.length === 3) {
32    var arr = arguments[0];
33    if (arr.prototype.constructor !== Uint8ClampedArray ) {
34      throw 'bytes must be given as a Uint8ClampedArray';
35    }
36    var width = arguments[1];
37    var height = arguments[2];
38    if (arr % 4) {
39      throw 'bytes must be given in a multiple of 4';
40    }
41    if (arr % width) {
42      throw 'bytes must divide evenly by width';
43    }
44    if (height && (height !== (arr / (width * 4)))) {
45      throw 'invalid height given';
46    }
47    height = arr / (width * 4);
48    return new ImageData(arr, width, height);
49  } else {
50    throw 'invalid number of arguments - takes 2 or 3, saw ' + arguments.length;
51  }
52}