console.log("hello from emblemscanner worker"); let qrtool = require('../qrtool.wx.js'); // Create offscreen canvas for image generation (self-contained) let offscreenCanvas = null; function getOffscreenCanvas() { if (!offscreenCanvas) { offscreenCanvas = wx.createOffscreenCanvas({ type: '2d', width: 100, height: 100, }); } return offscreenCanvas; } /** * Convert raw frame data to data URL for image visualization */ function data_url_from_frame(width, height, image_data) { const canvas = getOffscreenCanvas(); canvas.width = width; canvas.height = height; var ctx = canvas.getContext('2d'); var imgd = ctx.createImageData(width, height); imgd.data.set(image_data); ctx.putImageData(imgd, 0, 0); return canvas.toDataURL("image/jpeg", 1.0); } var qrtool_ready = false; qrtool.onRuntimeInitialized = () => { console.log("emblemscanner qrtool ready"); qrtool_ready = true; worker.postMessage({ type: "ready", }); } var submit_message = null; function handle_frame(data, width, height, camera_sensitivity) { if (!qrtool_ready) { console.log("qrtool not ready"); worker.postMessage({ type: "result", res: { ok: false, err: "qrtool not ready", }, processing_time: 0, }); return; } const begin = Date.now(); var uca = new Uint8ClampedArray(data); var buf = qrtool._malloc(uca.length * uca.BYTES_PER_ELEMENT); qrtool.HEAPU8.set(uca, buf); var r = qrtool.ccall('qrtool_angle', 'string', ['number', 'number', 'number', 'number', 'number'], [buf, width, height, 0, camera_sensitivity]); qrtool._free(buf); console.log("emblemscanner worker r:", r); var res = JSON.parse(r); worker.postMessage({ type: "result", res, processing_time: Date.now() - begin, }); if (res.ok) { // Since image_data takes seconds to serialize, send it in a separate // message to the UI can update with the good news const dataUrl = data_url_from_frame(width, height, uca); submit_message = { type: "submit", res, image_data: { data: dataUrl, width, height }, }; } } worker.onMessage((msg) => { console.log("emblemscanner worker got message", msg.type); switch (msg.type) { case "frame": try { // Use frame data from message instead of getCameraFrameData() if (msg.data) { handle_frame(msg.data, msg.width, msg.height, msg.camera_sensitivity); } } catch (e) { console.log(e); } break; case "ready_to_submit": worker.postMessage(submit_message); break; default: console.log("Unknown message type:", msg.type); } });