xref: /aosp_15_r20/external/skia/specs/web-img-decode/proposed/impl/impl.js (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker(function(window) {
2*c8dee2aaSAndroid Build Coastguard Worker
3*c8dee2aaSAndroid Build Coastguard Workerlet CanvasKit = null;
4*c8dee2aaSAndroid Build Coastguard Worker
5*c8dee2aaSAndroid Build Coastguard Workerwindow.loadPolyfill = () => {
6*c8dee2aaSAndroid Build Coastguard Worker  // TODO(kjlubick): change ready().then() to just then() when using a newer version
7*c8dee2aaSAndroid Build Coastguard Worker  // from npm (see
8*c8dee2aaSAndroid Build Coastguard Worker  // https://skia.googlesource.com/skia/+/d1285b131bcf9c10fe1ad16fd2830c556715ed9e)
9*c8dee2aaSAndroid Build Coastguard Worker  return CanvasKitInit({
10*c8dee2aaSAndroid Build Coastguard Worker    locateFile: (file) => 'https://unpkg.com/[email protected]/bin/'+file,
11*c8dee2aaSAndroid Build Coastguard Worker  }).ready().then((CK) => {
12*c8dee2aaSAndroid Build Coastguard Worker    CanvasKit = CK;
13*c8dee2aaSAndroid Build Coastguard Worker  });
14*c8dee2aaSAndroid Build Coastguard Worker}
15*c8dee2aaSAndroid Build Coastguard Worker
16*c8dee2aaSAndroid Build Coastguard Workerwindow.createImageData = (src, options) => {
17*c8dee2aaSAndroid Build Coastguard Worker  const skImg = CanvasKit.MakeImageFromEncoded(src);
18*c8dee2aaSAndroid Build Coastguard Worker  // we know width and height
19*c8dee2aaSAndroid Build Coastguard Worker  const imageInfo = {
20*c8dee2aaSAndroid Build Coastguard Worker    width: options.resizeWidth || skImg.width(),
21*c8dee2aaSAndroid Build Coastguard Worker    height: options.resizeHeight || skImg.height(),
22*c8dee2aaSAndroid Build Coastguard Worker    alphaType: options.premul ? CanvasKit.AlphaType.Premul : CanvasKit.AlphaType.Unpremul,
23*c8dee2aaSAndroid Build Coastguard Worker  }
24*c8dee2aaSAndroid Build Coastguard Worker  switch (options.colorType) {
25*c8dee2aaSAndroid Build Coastguard Worker    case "float32":
26*c8dee2aaSAndroid Build Coastguard Worker      imageInfo.colorType = CanvasKit.ColorType.RGBA_F32;
27*c8dee2aaSAndroid Build Coastguard Worker      break;
28*c8dee2aaSAndroid Build Coastguard Worker
29*c8dee2aaSAndroid Build Coastguard Worker    case "uint8":
30*c8dee2aaSAndroid Build Coastguard Worker    default:
31*c8dee2aaSAndroid Build Coastguard Worker      imageInfo.colorType = CanvasKit.ColorType.RGBA_8888;
32*c8dee2aaSAndroid Build Coastguard Worker      break;
33*c8dee2aaSAndroid Build Coastguard Worker  }
34*c8dee2aaSAndroid Build Coastguard Worker
35*c8dee2aaSAndroid Build Coastguard Worker  const pixels = skImg.readPixels(imageInfo, 0, 0);
36*c8dee2aaSAndroid Build Coastguard Worker  let output;
37*c8dee2aaSAndroid Build Coastguard Worker  // ImageData at the moment only supports Uint8, so we have to convert our numbers to that
38*c8dee2aaSAndroid Build Coastguard Worker  switch (options.colorType) {
39*c8dee2aaSAndroid Build Coastguard Worker    case "float32":
40*c8dee2aaSAndroid Build Coastguard Worker      // This will make an extra copy, which is a limitation of the native Browser's
41*c8dee2aaSAndroid Build Coastguard Worker      // ImageData support.
42*c8dee2aaSAndroid Build Coastguard Worker      output = new Uint8ClampedArray(pixels);
43*c8dee2aaSAndroid Build Coastguard Worker      break;
44*c8dee2aaSAndroid Build Coastguard Worker
45*c8dee2aaSAndroid Build Coastguard Worker    case "uint8":
46*c8dee2aaSAndroid Build Coastguard Worker    default:
47*c8dee2aaSAndroid Build Coastguard Worker      // We can cast w/o another copy
48*c8dee2aaSAndroid Build Coastguard Worker      output = new Uint8ClampedArray(pixels.buffer);
49*c8dee2aaSAndroid Build Coastguard Worker      break;
50*c8dee2aaSAndroid Build Coastguard Worker  }
51*c8dee2aaSAndroid Build Coastguard Worker
52*c8dee2aaSAndroid Build Coastguard Worker
53*c8dee2aaSAndroid Build Coastguard Worker  const ret = new ImageData(output, imageInfo.width, imageInfo.height);
54*c8dee2aaSAndroid Build Coastguard Worker  skImg.delete();
55*c8dee2aaSAndroid Build Coastguard Worker
56*c8dee2aaSAndroid Build Coastguard Worker  return ret;
57*c8dee2aaSAndroid Build Coastguard Worker}
58*c8dee2aaSAndroid Build Coastguard Worker
59*c8dee2aaSAndroid Build Coastguard Worker
60*c8dee2aaSAndroid Build Coastguard Worker})(window);
61