1 // Inspired by https://gist.github.com/ahem/d19ee198565e20c6f5e1bcd8f87b3408
2 const worker = new Worker('worker.js');
4 const canvasKitInitPromise =
5 CanvasKitInit({locateFile: (file) => 'https://unpkg.com/canvaskit-wasm@0.25.0/bin/full/'+file});
7 const bigImagePromise =
8 fetch('https://upload.wikimedia.org/wikipedia/commons/3/30/Large_Gautama_Buddha_statue_in_Buddha_Park_of_Ravangla%2C_Sikkim.jpg')
9 .then((response) => response.blob());
18 const surface = CanvasKit.MakeWebGLCanvasSurface('main-thread-canvas', null);
20 throw 'Could not make main thread canvas surface';
23 const paint = new CanvasKit.Paint();
24 paint.setColor(CanvasKit.RED);
27 // This animation draws a red circle oscillating from the center of the canvas.
28 // It is there to show the lag introduced by decoding the image on the main
30 const drawFrame = (canvas) => {
31 canvas.clear(CanvasKit.WHITE);
34 canvas.drawImageRect(decodedImage,
35 CanvasKit.LTRBRect(0, 0, 3764, 5706), // original size of the image
36 CanvasKit.LTRBRect(0, 0, 500, 800), // scaled down
37 null); // no paint needed
39 canvas.drawCircle(250, 250, 200 * Math.abs(Math.sin(Date.now() / 1000)), paint);
40 surface.requestAnimationFrame(drawFrame);
42 surface.requestAnimationFrame(drawFrame);
45 document.getElementById('load-button-main').addEventListener('click', () => {
47 decodedImage.delete();
50 const imgBitmapPromise = createImageBitmap(imageBlob);
51 imgBitmapPromise.then((imgBitmap) => {
52 decodedImage = CanvasKit.MakeImageFromCanvasImageSource(imgBitmap);
56 document.getElementById('load-button-web').addEventListener('click', () => {
58 decodedImage.delete();
61 worker.postMessage(imageBlob);
63 worker.addEventListener('message', (e) => {
64 const decodedBuffer = e.data.decodedArrayBuffer;
65 const pixels = new Uint8Array(decodedBuffer);
66 decodedImage = CanvasKit.MakeImage({
68 height: e.data.height,
69 alphaType: CanvasKit.AlphaType.Unpremul,
70 colorType: CanvasKit.ColorType.RGBA_8888,
71 colorSpace: CanvasKit.ColorSpace.SRGB
72 }, pixels, 4 * e.data.width);
74 document.getElementById('clear-button').addEventListener('click', () => {
76 decodedImage.delete();