|
'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); |
|
} |
|
|