Test/node_modules/pica/lib/worker.js
2026-04-09 22:54:00 +07:00

49 lines
1.6 KiB
JavaScript

// Web Worker wrapper for image resize function
'use strict';
module.exports = function () {
const MathLib = require('./mathlib');
let mathLib;
/* eslint-disable no-undef */
onmessage = function (ev) {
let tileOpts = ev.data.opts;
let returnBitmap = false;
if (!tileOpts.src && tileOpts.srcBitmap) {
let canvas = new OffscreenCanvas(tileOpts.width, tileOpts.height);
let ctx = canvas.getContext('2d', { alpha: Boolean(tileOpts.alpha) });
ctx.drawImage(tileOpts.srcBitmap, 0, 0);
tileOpts.src = ctx.getImageData(0, 0, tileOpts.width, tileOpts.height).data;
canvas.width = canvas.height = 0;
canvas = null;
tileOpts.srcBitmap.close();
tileOpts.srcBitmap = null;
// Temporary force out data to typed array, because Chrome have artefacts
// https://github.com/nodeca/pica/issues/223
// returnBitmap = true;
}
if (!mathLib) mathLib = new MathLib(ev.data.features);
// Use multimath's sync auto-init. Avoid Promise use in old browsers,
// because polyfills are not propagated to webworker.
let data = mathLib.resizeAndUnsharp(tileOpts);
if (returnBitmap) {
let toImageData = new ImageData(new Uint8ClampedArray(data), tileOpts.toWidth, tileOpts.toHeight);
let canvas = new OffscreenCanvas(tileOpts.toWidth, tileOpts.toHeight);
let ctx = canvas.getContext('2d', { alpha: Boolean(tileOpts.alpha) });
ctx.putImageData(toImageData, 0, 0);
createImageBitmap(canvas).then(bitmap => {
postMessage({ bitmap }, [ bitmap ]);
});
} else {
postMessage({ data }, [ data.buffer ]);
}
};
};