blob: aef94bcd7cea0e3802a698797feb58fc961ce695 [file] [log] [blame]
// Inspired by https://gist.github.com/ahem/d19ee198565e20c6f5e1bcd8f87b3408
const worker = new Worker('worker.js');
const canvasKitInitPromise =
CanvasKitInit({locateFile: (file) => 'https://unpkg.com/canvaskit-wasm@0.25.0/bin/full/'+file});
const bigImagePromise =
fetch('https://upload.wikimedia.org/wikipedia/commons/3/30/Large_Gautama_Buddha_statue_in_Buddha_Park_of_Ravangla%2C_Sikkim.jpg')
.then((response) => response.blob());
Promise.all([
canvasKitInitPromise,
bigImagePromise
]).then(([
CanvasKit,
imageBlob
]) => {
const surface = CanvasKit.MakeWebGLCanvasSurface('main-thread-canvas', null);
if (!surface) {
throw 'Could not make main thread canvas surface';
}
const paint = new CanvasKit.Paint();
paint.setColor(CanvasKit.RED);
let decodedImage;
// This animation draws a red circle oscillating from the center of the canvas.
// It is there to show the lag introduced by decoding the image on the main
// thread.
const drawFrame = (canvas) => {
canvas.clear(CanvasKit.WHITE);
if (decodedImage) {
canvas.drawImageRect(decodedImage,
CanvasKit.LTRBRect(0, 0, 3764, 5706), // original size of the image
CanvasKit.LTRBRect(0, 0, 500, 800), // scaled down
null); // no paint needed
}
canvas.drawCircle(250, 250, 200 * Math.abs(Math.sin(Date.now() / 1000)), paint);
surface.requestAnimationFrame(drawFrame);
};
surface.requestAnimationFrame(drawFrame);
document.getElementById('load-button-main').addEventListener('click', () => {
if (decodedImage) {
decodedImage.delete();
decodedImage = null;
}
const imgBitmapPromise = createImageBitmap(imageBlob);
imgBitmapPromise.then((imgBitmap) => {
decodedImage = CanvasKit.MakeImageFromCanvasImageSource(imgBitmap);
});
});
document.getElementById('load-button-web').addEventListener('click', () => {
if (decodedImage) {
decodedImage.delete();
decodedImage = null;
}
worker.postMessage(imageBlob);
});
worker.addEventListener('message', (e) => {
const decodedBuffer = e.data.decodedArrayBuffer;
const pixels = new Uint8Array(decodedBuffer);
decodedImage = CanvasKit.MakeImage({
width: e.data.width,
height: e.data.height,
alphaType: CanvasKit.AlphaType.Unpremul,
colorType: CanvasKit.ColorType.RGBA_8888,
colorSpace: CanvasKit.ColorSpace.SRGB
}, pixels, 4 * e.data.width);
});
document.getElementById('clear-button').addEventListener('click', () => {
if (decodedImage) {
decodedImage.delete();
decodedImage = null;
}
});
});