95 lines
2.9 KiB
JavaScript
95 lines
2.9 KiB
JavaScript
'use strict';
|
|
(self.dispatchPort = null),
|
|
(self.outputPort = null),
|
|
(self.workerNumber = -1),
|
|
(self.activeJobId = null),
|
|
(self.sentBlobs = new Map()),
|
|
(self.sentBuffers = new Map()),
|
|
(self.JobHandlers = {});
|
|
function FlipImageData(a, b, c) {
|
|
const d = 4 * b,
|
|
e = new Uint8Array(d),
|
|
f = a.buffer;
|
|
for (let g = 0, h = Math.floor(c / 2); g < h; ++g) {
|
|
const a = c - g - 1,
|
|
b = new Uint8Array(f, g * d, d),
|
|
h = new Uint8Array(f, a * d, d);
|
|
e.set(b), b.set(h), h.set(e);
|
|
}
|
|
}
|
|
function UnpremultiplyImageData(b) {
|
|
for (let c = 0, a = b.length; c < a; c += 4) {
|
|
const d = b[c + 3];
|
|
if (255 === d) continue;
|
|
const a = 255 / d;
|
|
(b[c] *= a), (b[c + 1] *= a), (b[c + 2] *= a);
|
|
}
|
|
}
|
|
(self.JobHandlers['ProcessImageData'] = function (a) {
|
|
const b = a['buffer'],
|
|
c = new Uint8Array(b),
|
|
d = a['width'],
|
|
e = a['height'];
|
|
return (
|
|
a['flipY'] && FlipImageData(c, d, e),
|
|
a['unpremultiply'] && UnpremultiplyImageData(c),
|
|
{ result: b, transferables: [b] }
|
|
);
|
|
}),
|
|
self.addEventListener('message', (a) => {
|
|
const b = a.data,
|
|
c = b['type'];
|
|
return 'init' === c
|
|
? ((self.workerNumber = b['number']),
|
|
(self.dispatchPort = b['dispatch-port']),
|
|
(self.dispatchPort.onmessage = OnDispatchWorkerMessage),
|
|
void (self.outputPort = b['output-port']))
|
|
: 'terminate' === c
|
|
? void self.close()
|
|
: void console.error("unknown message '" + c + "'");
|
|
});
|
|
function SendReady() {
|
|
self.dispatchPort.postMessage({ type: 'ready' }), self.outputPort.postMessage({ type: 'ready' });
|
|
}
|
|
function SendError(a, b) {
|
|
a || self.outputPort.postMessage({ type: 'error', jobId: self.activeJobId, error: b.toString() }),
|
|
SendDone();
|
|
}
|
|
function SendResult(a, b) {
|
|
if (!a) {
|
|
const a = b.transferables || [];
|
|
self.outputPort.postMessage({ type: 'result', jobId: self.activeJobId, result: b.result }, a);
|
|
}
|
|
SendDone();
|
|
}
|
|
function SendDone() {
|
|
(self.activeJobId = null), self.dispatchPort.postMessage({ type: 'done' });
|
|
}
|
|
function SendProgress(a) {
|
|
self.outputPort.postMessage({ type: 'progress', jobId: self.activeJobId, progress: a });
|
|
}
|
|
function OnDispatchWorkerMessage(a) {
|
|
const b = a.data,
|
|
c = b['type'];
|
|
if ('_import_scripts' === c) return void importScripts(...b['scripts']);
|
|
if ('_send_blob' === c) return void self.sentBlobs.set(b['id'], b['blob']);
|
|
if ('_send_buffer' === c) return void self.sentBuffers.set(b['id'], b['buffer']);
|
|
if ('_testMessageChannel' === c)
|
|
return void self.outputPort.postMessage({ type: '_testMessageChannelOk' });
|
|
if ('_ready' === c) return void SendReady();
|
|
const d = b['jobId'],
|
|
f = b['isBroadcast'],
|
|
e = b['params'];
|
|
let g;
|
|
if (((self.activeJobId = d), !self.JobHandlers.hasOwnProperty(c)))
|
|
return void console.error(`no handler for message type '${c}'`);
|
|
try {
|
|
g = self.JobHandlers[c](e);
|
|
} catch (a) {
|
|
return void SendError(f, 'Exception in job handler: ' + a);
|
|
}
|
|
g && g.then
|
|
? g.then((a) => SendResult(f, a)).catch((a) => SendError(f, 'Rejection in job handler: ' + a))
|
|
: SendResult(f, g);
|
|
}
|