themblem/scanner/precheck.js
2024-09-01 21:51:50 +01:00

69 lines
2.0 KiB
JavaScript

var qrtool = null;
var qrtool_ready = false;
function load_qrtool() {
var m = require('/assets/qrtool.wx.js');
m.onRuntimeInitialized = () => {
console.log("runtime initialized");
qrtool_ready = true;
qrtool = m;
}
}
function frame_pre_check(width, height, uca, camera_sensitivity) {
var r;
if (!qrtool_ready) {
console.log("qrtool not ready");
return -1;
}
var buf = qrtool._malloc(uca.length * uca.BYTES_PER_ELEMENT);
qrtool.HEAPU8.set(uca, buf);
const dot_area_size = 32;
const da_len = dot_area_size * dot_area_size * uca.BYTES_PER_ELEMENT * 4;
var dot_area_buf = qrtool._malloc(da_len)
r = qrtool.ccall('qrtool_angle', 'string', ['number', 'number', 'number', 'number', 'number'], [buf, width, height, dot_area_buf, camera_sensitivity]);
// r = qrtool.ccall('qrtool_angle', 'string', ['number', 'number', 'number', 'number'], [buf, width, height, 0]);
var view = qrtool.HEAPU8.subarray(dot_area_buf, dot_area_buf + da_len);
console.log("view begin", view[0], view[1], view[2], view[3]);
const a = da_len - 8;
console.log("view end", view[a + 0], view[a + 1], view[a + 2], view[a + 3]);
const data_url = data_url_from_frame(dot_area_size, dot_area_size, view);
qrtool._free(buf);
qrtool._free(dot_area_buf);
return {
result: JSON.parse(r),
data_url,
}
}
const offscreenCanvas = wx.createOffscreenCanvas({
type: '2d',
width: 100,
height: 100,
});
function data_url_from_frame(width, height, uca) {
offscreenCanvas.width = width;
offscreenCanvas.height = height;
var ctx = offscreenCanvas.getContext('2d')
var imgd = ctx.createImageData(width, height);
imgd.data.set(uca);
ctx.putImageData(imgd, 0, 0);
return offscreenCanvas.toDataURL("image/jpeg", 1.0);
}
function is_emblem_qr_pattern(p)
{
if (p.search(/code=[0-9a-zA-Z]+/) >= 0) return true;
if (p.search(/c=[0-9a-zA-Z]+/) >= 0) return true;
if (p.search(/https:\/\/xy.ltd\/v\/[0-9a-zA-Z]+/) >= 0) return true;
return false;
}
module.exports = {
data_url_from_frame,
frame_pre_check,
load_qrtool,
is_emblem_qr_pattern,
};