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