skia2/specs/web-img-decode/proposed/impl/impl.js

58 lines
1.4 KiB
JavaScript
Raw Normal View History

(function(window) {
let CanvasKit = null;
window.loadPolyfill = () => {
return CanvasKitInit({
locateFile: (file) => 'https://unpkg.com/canvaskit-wasm@0.6.0/bin/'+file,
}).ready().then((CK) => {
CanvasKit = CK;
});
}
window.createImageData = (src, options) => {
const skImg = CanvasKit.MakeImageFromEncoded(src);
// we know width and height
const imageInfo = {
width: options.resizeWidth || skImg.width(),
height: options.resizeHeight || skImg.height(),
alphaType: options.premul ? CanvasKit.AlphaType.Premul : CanvasKit.AlphaType.Unpremul,
}
switch (options.colorType) {
case "float32":
imageInfo.colorType = CanvasKit.ColorType.RGBA_F32;
break;
case "uint8":
default:
imageInfo.colorType = CanvasKit.ColorType.RGBA_8888;
break;
}
const pixels = skImg.readPixels(imageInfo, 0, 0);
let output;
// ImageData at the moment only supports Uint8, so we have to convert our numbers to that
switch (options.colorType) {
case "float32":
// This will make an extra copy, which is a limitation of the native Browser's
// ImageData support.
output = new Uint8ClampedArray(pixels);
break;
case "uint8":
default:
// We can cast w/o another copy
output = new Uint8ClampedArray(pixels.buffer);
break;
}
const ret = new ImageData(output, imageInfo.width, imageInfo.height);
skImg.delete();
return ret;
}
})(window);