scanic 1.0.8 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -0
- package/dist/scanic.js +693 -5
- package/dist/scanic.umd.cjs +1 -1
- package/package.json +5 -1
- package/src/scanic.d.ts +56 -0
package/README.md
CHANGED
|
@@ -95,6 +95,34 @@ if (extracted.success) {
|
|
|
95
95
|
}
|
|
96
96
|
```
|
|
97
97
|
|
|
98
|
+
### Manual Corner Adjustment UI (New)
|
|
99
|
+
|
|
100
|
+
Use the built-in corner editor to let users drag corners on mobile and desktop,
|
|
101
|
+
then pass the confirmed corners into extraction.
|
|
102
|
+
|
|
103
|
+
```js
|
|
104
|
+
import { createCornerEditor, extractDocument } from 'scanic';
|
|
105
|
+
|
|
106
|
+
const editor = createCornerEditor({
|
|
107
|
+
container: document.getElementById('editorHost'),
|
|
108
|
+
image: imageElement,
|
|
109
|
+
corners: detectedCorners, // optional: defaults to an inset quad
|
|
110
|
+
magnifier: {
|
|
111
|
+
zoom: 2,
|
|
112
|
+
size: 110
|
|
113
|
+
},
|
|
114
|
+
nudges: {
|
|
115
|
+
enabled: true,
|
|
116
|
+
steps: [1, 5]
|
|
117
|
+
},
|
|
118
|
+
onConfirm: async (corners) => {
|
|
119
|
+
const extracted = await extractDocument(imageElement, corners, { output: 'canvas' });
|
|
120
|
+
document.getElementById('output').appendChild(extracted.output);
|
|
121
|
+
editor.destroy();
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
```
|
|
125
|
+
|
|
98
126
|
### Optimized Usage (Recommended for Batch/Real-time)
|
|
99
127
|
The `Scanner` class maintains a persistent WebAssembly instance, avoiding the overhead of re-initializing WASM for every scan.
|
|
100
128
|
|
package/dist/scanic.js
CHANGED
|
@@ -677,8 +677,16 @@ function isNodeRuntime() {
|
|
|
677
677
|
async function initializeWasmInternal() {
|
|
678
678
|
if (isNodeRuntime()) {
|
|
679
679
|
try {
|
|
680
|
-
const
|
|
681
|
-
const
|
|
680
|
+
const fsModule = "node:fs/promises";
|
|
681
|
+
const urlModule = "node:url";
|
|
682
|
+
const { readFile } = await import(
|
|
683
|
+
/* @vite-ignore */
|
|
684
|
+
fsModule
|
|
685
|
+
);
|
|
686
|
+
const { fileURLToPath } = await import(
|
|
687
|
+
/* @vite-ignore */
|
|
688
|
+
urlModule
|
|
689
|
+
);
|
|
682
690
|
const moduleUrl = new URL(import.meta.url);
|
|
683
691
|
moduleUrl.search = "";
|
|
684
692
|
moduleUrl.hash = "";
|
|
@@ -1112,6 +1120,688 @@ async function cannyEdgeDetector(input, options = {}) {
|
|
|
1112
1120
|
timings.unshift({ step: "Edge Detection Total", ms: (tEnd - tStart).toFixed(2) });
|
|
1113
1121
|
return finalEdges;
|
|
1114
1122
|
}
|
|
1123
|
+
function cloneCorners(corners) {
|
|
1124
|
+
return {
|
|
1125
|
+
topLeft: { x: corners.topLeft.x, y: corners.topLeft.y },
|
|
1126
|
+
topRight: { x: corners.topRight.x, y: corners.topRight.y },
|
|
1127
|
+
bottomRight: { x: corners.bottomRight.x, y: corners.bottomRight.y },
|
|
1128
|
+
bottomLeft: { x: corners.bottomLeft.x, y: corners.bottomLeft.y }
|
|
1129
|
+
};
|
|
1130
|
+
}
|
|
1131
|
+
function pointDistance$1(a, b) {
|
|
1132
|
+
return Math.hypot(a.x - b.x, a.y - b.y);
|
|
1133
|
+
}
|
|
1134
|
+
function cornersAreFiniteAndDistinct$1(corners, minDistance = 4) {
|
|
1135
|
+
const points = [corners == null ? void 0 : corners.topLeft, corners == null ? void 0 : corners.topRight, corners == null ? void 0 : corners.bottomRight, corners == null ? void 0 : corners.bottomLeft];
|
|
1136
|
+
if (points.some((p) => !p || !Number.isFinite(p.x) || !Number.isFinite(p.y))) {
|
|
1137
|
+
return false;
|
|
1138
|
+
}
|
|
1139
|
+
for (let i = 0; i < points.length; i++) {
|
|
1140
|
+
for (let j = i + 1; j < points.length; j++) {
|
|
1141
|
+
if (pointDistance$1(points[i], points[j]) < minDistance) {
|
|
1142
|
+
return false;
|
|
1143
|
+
}
|
|
1144
|
+
}
|
|
1145
|
+
}
|
|
1146
|
+
return true;
|
|
1147
|
+
}
|
|
1148
|
+
function isConvexQuadrilateral$1(corners) {
|
|
1149
|
+
const points = [corners.topLeft, corners.topRight, corners.bottomRight, corners.bottomLeft];
|
|
1150
|
+
const crossSigns = [];
|
|
1151
|
+
for (let i = 0; i < points.length; i++) {
|
|
1152
|
+
const p0 = points[i];
|
|
1153
|
+
const p1 = points[(i + 1) % points.length];
|
|
1154
|
+
const p2 = points[(i + 2) % points.length];
|
|
1155
|
+
const cross = (p1.x - p0.x) * (p2.y - p1.y) - (p1.y - p0.y) * (p2.x - p1.x);
|
|
1156
|
+
if (Math.abs(cross) < 1e-6) continue;
|
|
1157
|
+
crossSigns.push(Math.sign(cross));
|
|
1158
|
+
}
|
|
1159
|
+
if (crossSigns.length < 3) {
|
|
1160
|
+
return false;
|
|
1161
|
+
}
|
|
1162
|
+
const firstSign = crossSigns[0];
|
|
1163
|
+
return crossSigns.every((s) => s === firstSign);
|
|
1164
|
+
}
|
|
1165
|
+
function createDefaultCorners(imageWidth, imageHeight, insetRatio = 0.08) {
|
|
1166
|
+
const inset = Math.max(8, Math.min(imageWidth, imageHeight) * insetRatio);
|
|
1167
|
+
return {
|
|
1168
|
+
topLeft: { x: inset, y: inset },
|
|
1169
|
+
topRight: { x: imageWidth - inset, y: inset },
|
|
1170
|
+
bottomRight: { x: imageWidth - inset, y: imageHeight - inset },
|
|
1171
|
+
bottomLeft: { x: inset, y: imageHeight - inset }
|
|
1172
|
+
};
|
|
1173
|
+
}
|
|
1174
|
+
function drawHandle(ctx, point, radius, color, stroke, lineWidth) {
|
|
1175
|
+
ctx.beginPath();
|
|
1176
|
+
ctx.arc(point.x, point.y, radius, 0, Math.PI * 2);
|
|
1177
|
+
ctx.fillStyle = color;
|
|
1178
|
+
ctx.fill();
|
|
1179
|
+
ctx.lineWidth = lineWidth;
|
|
1180
|
+
ctx.strokeStyle = stroke;
|
|
1181
|
+
ctx.stroke();
|
|
1182
|
+
}
|
|
1183
|
+
function normalizeImageToCanvas(image) {
|
|
1184
|
+
if (!image) {
|
|
1185
|
+
throw new Error("No image provided");
|
|
1186
|
+
}
|
|
1187
|
+
const isImageData = image && typeof image.width === "number" && typeof image.height === "number" && image.data;
|
|
1188
|
+
let width = 0;
|
|
1189
|
+
let height = 0;
|
|
1190
|
+
if (isImageData) {
|
|
1191
|
+
width = image.width;
|
|
1192
|
+
height = image.height;
|
|
1193
|
+
} else {
|
|
1194
|
+
width = image.width || image.naturalWidth;
|
|
1195
|
+
height = image.height || image.naturalHeight;
|
|
1196
|
+
}
|
|
1197
|
+
if (!width || !height) {
|
|
1198
|
+
throw new Error("Image must be loaded before creating the corner editor");
|
|
1199
|
+
}
|
|
1200
|
+
const canvas = document.createElement("canvas");
|
|
1201
|
+
canvas.width = width;
|
|
1202
|
+
canvas.height = height;
|
|
1203
|
+
const ctx = canvas.getContext("2d", { willReadFrequently: true });
|
|
1204
|
+
if (!ctx) {
|
|
1205
|
+
throw new Error("Failed to create 2D canvas context for source image");
|
|
1206
|
+
}
|
|
1207
|
+
if (isImageData) {
|
|
1208
|
+
ctx.putImageData(image, 0, 0);
|
|
1209
|
+
} else {
|
|
1210
|
+
ctx.drawImage(image, 0, 0, width, height);
|
|
1211
|
+
}
|
|
1212
|
+
return { canvas, width, height };
|
|
1213
|
+
}
|
|
1214
|
+
function createCornerEditor(options = {}) {
|
|
1215
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
1216
|
+
const container = options.container;
|
|
1217
|
+
if (!container || typeof container.appendChild !== "function") {
|
|
1218
|
+
throw new Error("createCornerEditor requires a valid container element");
|
|
1219
|
+
}
|
|
1220
|
+
const { canvas: sourceCanvas, width: imageWidth, height: imageHeight } = normalizeImageToCanvas(options.image);
|
|
1221
|
+
const editorCanvas = document.createElement("canvas");
|
|
1222
|
+
editorCanvas.style.position = "absolute";
|
|
1223
|
+
editorCanvas.style.top = "0";
|
|
1224
|
+
editorCanvas.style.left = "0";
|
|
1225
|
+
editorCanvas.style.display = "block";
|
|
1226
|
+
editorCanvas.style.boxSizing = "border-box";
|
|
1227
|
+
editorCanvas.style.touchAction = "none";
|
|
1228
|
+
editorCanvas.style.userSelect = "none";
|
|
1229
|
+
editorCanvas.style.webkitUserSelect = "none";
|
|
1230
|
+
editorCanvas.style.cursor = "crosshair";
|
|
1231
|
+
editorCanvas.style.outline = "none";
|
|
1232
|
+
const keyboardEnabled = options.keyboard !== false;
|
|
1233
|
+
if (keyboardEnabled) {
|
|
1234
|
+
editorCanvas.tabIndex = 0;
|
|
1235
|
+
editorCanvas.setAttribute("role", "application");
|
|
1236
|
+
editorCanvas.setAttribute("aria-label", "Document corner editor. Use arrow keys to adjust the selected corner.");
|
|
1237
|
+
}
|
|
1238
|
+
const restoreContainerStyle = {
|
|
1239
|
+
position: container.style.position,
|
|
1240
|
+
minHeight: container.style.minHeight
|
|
1241
|
+
};
|
|
1242
|
+
let changedContainerPosition = false;
|
|
1243
|
+
let changedContainerMinHeight = false;
|
|
1244
|
+
if (getComputedStyle(container).position === "static") {
|
|
1245
|
+
container.style.position = "relative";
|
|
1246
|
+
changedContainerPosition = true;
|
|
1247
|
+
}
|
|
1248
|
+
container.appendChild(editorCanvas);
|
|
1249
|
+
const ctx = editorCanvas.getContext("2d");
|
|
1250
|
+
if (!ctx) {
|
|
1251
|
+
throw new Error("Failed to create 2D canvas context for corner editor");
|
|
1252
|
+
}
|
|
1253
|
+
const magnifier = {
|
|
1254
|
+
enabled: ((_a = options.magnifier) == null ? void 0 : _a.enabled) !== false,
|
|
1255
|
+
size: ((_b = options.magnifier) == null ? void 0 : _b.size) || 110,
|
|
1256
|
+
zoom: ((_c = options.magnifier) == null ? void 0 : _c.zoom) || 2,
|
|
1257
|
+
margin: ((_d = options.magnifier) == null ? void 0 : _d.margin) || 16,
|
|
1258
|
+
borderColor: ((_e = options.magnifier) == null ? void 0 : _e.borderColor) || "#ffffff",
|
|
1259
|
+
borderWidth: ((_f = options.magnifier) == null ? void 0 : _f.borderWidth) || 2,
|
|
1260
|
+
crosshairColor: ((_g = options.magnifier) == null ? void 0 : _g.crosshairColor) || "#ffffff",
|
|
1261
|
+
crosshairSize: ((_h = options.magnifier) == null ? void 0 : _h.crosshairSize) || 18
|
|
1262
|
+
};
|
|
1263
|
+
const nudges = {
|
|
1264
|
+
enabled: !!((_i = options.nudges) == null ? void 0 : _i.enabled),
|
|
1265
|
+
steps: (((_j = options.nudges) == null ? void 0 : _j.steps) && options.nudges.steps.length ? options.nudges.steps : [1, 5]).map((v) => Math.max(1, Math.round(v)))
|
|
1266
|
+
};
|
|
1267
|
+
const defaultCorners = createDefaultCorners(imageWidth, imageHeight);
|
|
1268
|
+
const requestedCorners = options.corners ? cloneCorners(options.corners) : defaultCorners;
|
|
1269
|
+
let corners = cornersAreFiniteAndDistinct$1(requestedCorners) && isConvexQuadrilateral$1(requestedCorners) ? requestedCorners : defaultCorners;
|
|
1270
|
+
const initialCorners = cloneCorners(corners);
|
|
1271
|
+
let isDestroyed = false;
|
|
1272
|
+
let activeCornerKey = null;
|
|
1273
|
+
let dragPointerId = null;
|
|
1274
|
+
let lastPointerPosition = null;
|
|
1275
|
+
const handleHitArea = Math.max(24, options.handleHitArea || 48);
|
|
1276
|
+
const handleRadius = Math.max(8, Math.min(16, handleHitArea * 0.3));
|
|
1277
|
+
const cornerOrder = ["topLeft", "topRight", "bottomRight", "bottomLeft"];
|
|
1278
|
+
let view = { scale: 1, offsetX: 0, offsetY: 0, width: 1, height: 1 };
|
|
1279
|
+
let nudgeControls = null;
|
|
1280
|
+
let activeNudgeCorner = "topLeft";
|
|
1281
|
+
const runtimeGlobal = typeof window !== "undefined" ? window : globalThis;
|
|
1282
|
+
function emitChange() {
|
|
1283
|
+
if (typeof options.onChange === "function") {
|
|
1284
|
+
options.onChange(cloneCorners(corners));
|
|
1285
|
+
}
|
|
1286
|
+
}
|
|
1287
|
+
let lastDisplayWidth = 0;
|
|
1288
|
+
let lastDisplayHeight = 0;
|
|
1289
|
+
function computeDisplaySize() {
|
|
1290
|
+
const width = Math.max(1, Math.round(container.clientWidth));
|
|
1291
|
+
let height = Math.round(container.clientHeight);
|
|
1292
|
+
if (height < 80) {
|
|
1293
|
+
const aspect = imageHeight / Math.max(1, imageWidth);
|
|
1294
|
+
const viewportCap = (runtimeGlobal.innerHeight || 800) * 0.7;
|
|
1295
|
+
height = Math.max(240, Math.round(Math.min(width * aspect, viewportCap)));
|
|
1296
|
+
container.style.minHeight = height + "px";
|
|
1297
|
+
changedContainerMinHeight = true;
|
|
1298
|
+
}
|
|
1299
|
+
return { width, height: Math.max(1, height) };
|
|
1300
|
+
}
|
|
1301
|
+
function updateCanvasSize() {
|
|
1302
|
+
const { width, height } = computeDisplaySize();
|
|
1303
|
+
const dpr = runtimeGlobal.devicePixelRatio || 1;
|
|
1304
|
+
lastDisplayWidth = width;
|
|
1305
|
+
lastDisplayHeight = height;
|
|
1306
|
+
editorCanvas.style.width = width + "px";
|
|
1307
|
+
editorCanvas.style.height = height + "px";
|
|
1308
|
+
const bufferWidth = Math.round(width * dpr);
|
|
1309
|
+
const bufferHeight = Math.round(height * dpr);
|
|
1310
|
+
if (editorCanvas.width !== bufferWidth) editorCanvas.width = bufferWidth;
|
|
1311
|
+
if (editorCanvas.height !== bufferHeight) editorCanvas.height = bufferHeight;
|
|
1312
|
+
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
|
|
1313
|
+
const padding = 12;
|
|
1314
|
+
const availableWidth = Math.max(1, width - padding * 2);
|
|
1315
|
+
const availableHeight = Math.max(1, height - padding * 2);
|
|
1316
|
+
const scale = Math.min(availableWidth / imageWidth, availableHeight / imageHeight);
|
|
1317
|
+
const drawWidth = imageWidth * scale;
|
|
1318
|
+
const drawHeight = imageHeight * scale;
|
|
1319
|
+
view = {
|
|
1320
|
+
scale,
|
|
1321
|
+
offsetX: Math.round((width - drawWidth) / 2),
|
|
1322
|
+
offsetY: Math.round((height - drawHeight) / 2),
|
|
1323
|
+
width,
|
|
1324
|
+
height
|
|
1325
|
+
};
|
|
1326
|
+
}
|
|
1327
|
+
function imageToView(point) {
|
|
1328
|
+
return {
|
|
1329
|
+
x: view.offsetX + point.x * view.scale,
|
|
1330
|
+
y: view.offsetY + point.y * view.scale
|
|
1331
|
+
};
|
|
1332
|
+
}
|
|
1333
|
+
function viewToImage(x, y) {
|
|
1334
|
+
const px = (x - view.offsetX) / view.scale;
|
|
1335
|
+
const py = (y - view.offsetY) / view.scale;
|
|
1336
|
+
return {
|
|
1337
|
+
x: Math.max(0, Math.min(imageWidth, px)),
|
|
1338
|
+
y: Math.max(0, Math.min(imageHeight, py))
|
|
1339
|
+
};
|
|
1340
|
+
}
|
|
1341
|
+
function cornersValid(nextCorners) {
|
|
1342
|
+
return cornersAreFiniteAndDistinct$1(nextCorners) && isConvexQuadrilateral$1(nextCorners);
|
|
1343
|
+
}
|
|
1344
|
+
function getEventCanvasPoint(event) {
|
|
1345
|
+
const rect = editorCanvas.getBoundingClientRect();
|
|
1346
|
+
return {
|
|
1347
|
+
x: event.clientX - rect.left,
|
|
1348
|
+
y: event.clientY - rect.top
|
|
1349
|
+
};
|
|
1350
|
+
}
|
|
1351
|
+
function hitTestCorner(canvasX, canvasY) {
|
|
1352
|
+
let hit = null;
|
|
1353
|
+
let bestDistance = Infinity;
|
|
1354
|
+
for (const key of cornerOrder) {
|
|
1355
|
+
const p = imageToView(corners[key]);
|
|
1356
|
+
const d = Math.hypot(canvasX - p.x, canvasY - p.y);
|
|
1357
|
+
if (d <= handleHitArea && d < bestDistance) {
|
|
1358
|
+
bestDistance = d;
|
|
1359
|
+
hit = key;
|
|
1360
|
+
}
|
|
1361
|
+
}
|
|
1362
|
+
return hit;
|
|
1363
|
+
}
|
|
1364
|
+
function drawPolygonOverlay() {
|
|
1365
|
+
const points = cornerOrder.map((key) => imageToView(corners[key]));
|
|
1366
|
+
ctx.save();
|
|
1367
|
+
ctx.fillStyle = "rgba(15, 23, 42, 0.40)";
|
|
1368
|
+
ctx.beginPath();
|
|
1369
|
+
ctx.rect(0, 0, view.width, view.height);
|
|
1370
|
+
ctx.moveTo(points[0].x, points[0].y);
|
|
1371
|
+
for (let i = 1; i < points.length; i++) {
|
|
1372
|
+
ctx.lineTo(points[i].x, points[i].y);
|
|
1373
|
+
}
|
|
1374
|
+
ctx.closePath();
|
|
1375
|
+
ctx.fill("evenodd");
|
|
1376
|
+
ctx.restore();
|
|
1377
|
+
ctx.save();
|
|
1378
|
+
ctx.strokeStyle = "#22c55e";
|
|
1379
|
+
ctx.lineWidth = 3;
|
|
1380
|
+
ctx.beginPath();
|
|
1381
|
+
ctx.moveTo(points[0].x, points[0].y);
|
|
1382
|
+
for (let i = 1; i < points.length; i++) {
|
|
1383
|
+
ctx.lineTo(points[i].x, points[i].y);
|
|
1384
|
+
}
|
|
1385
|
+
ctx.closePath();
|
|
1386
|
+
ctx.stroke();
|
|
1387
|
+
ctx.restore();
|
|
1388
|
+
for (const key of cornerOrder) {
|
|
1389
|
+
const p = imageToView(corners[key]);
|
|
1390
|
+
const isActive = key === activeCornerKey;
|
|
1391
|
+
drawHandle(
|
|
1392
|
+
ctx,
|
|
1393
|
+
p,
|
|
1394
|
+
isActive ? handleRadius + 1 : handleRadius,
|
|
1395
|
+
isActive ? "#f59e0b" : "#ffffff",
|
|
1396
|
+
isActive ? "#7c2d12" : "#0f172a",
|
|
1397
|
+
2
|
|
1398
|
+
);
|
|
1399
|
+
}
|
|
1400
|
+
}
|
|
1401
|
+
function drawMagnifier() {
|
|
1402
|
+
if (!magnifier.enabled || !activeCornerKey || !lastPointerPosition) {
|
|
1403
|
+
return;
|
|
1404
|
+
}
|
|
1405
|
+
const active = corners[activeCornerKey];
|
|
1406
|
+
const size = magnifier.size;
|
|
1407
|
+
const radius = size / 2;
|
|
1408
|
+
const zoom = Math.max(1.1, magnifier.zoom);
|
|
1409
|
+
let lensX = lastPointerPosition.x + radius + magnifier.margin;
|
|
1410
|
+
let lensY = lastPointerPosition.y - radius - magnifier.margin;
|
|
1411
|
+
if (lensX + radius > view.width) {
|
|
1412
|
+
lensX = lastPointerPosition.x - radius - magnifier.margin;
|
|
1413
|
+
}
|
|
1414
|
+
if (lensY - radius < 0) {
|
|
1415
|
+
lensY = lastPointerPosition.y + radius + magnifier.margin;
|
|
1416
|
+
}
|
|
1417
|
+
lensX = Math.max(radius + 2, Math.min(view.width - radius - 2, lensX));
|
|
1418
|
+
lensY = Math.max(radius + 2, Math.min(view.height - radius - 2, lensY));
|
|
1419
|
+
const sampleSize = size / zoom;
|
|
1420
|
+
const sx = Math.max(0, Math.min(imageWidth - sampleSize, active.x - sampleSize / 2));
|
|
1421
|
+
const sy = Math.max(0, Math.min(imageHeight - sampleSize, active.y - sampleSize / 2));
|
|
1422
|
+
ctx.save();
|
|
1423
|
+
ctx.beginPath();
|
|
1424
|
+
ctx.arc(lensX, lensY, radius, 0, Math.PI * 2);
|
|
1425
|
+
ctx.clip();
|
|
1426
|
+
ctx.drawImage(sourceCanvas, sx, sy, sampleSize, sampleSize, lensX - radius, lensY - radius, size, size);
|
|
1427
|
+
ctx.restore();
|
|
1428
|
+
ctx.save();
|
|
1429
|
+
ctx.beginPath();
|
|
1430
|
+
ctx.arc(lensX, lensY, radius, 0, Math.PI * 2);
|
|
1431
|
+
ctx.lineWidth = magnifier.borderWidth;
|
|
1432
|
+
ctx.strokeStyle = magnifier.borderColor;
|
|
1433
|
+
ctx.stroke();
|
|
1434
|
+
const ch = magnifier.crosshairSize / 2;
|
|
1435
|
+
ctx.strokeStyle = magnifier.crosshairColor;
|
|
1436
|
+
ctx.lineWidth = 1.5;
|
|
1437
|
+
ctx.beginPath();
|
|
1438
|
+
ctx.moveTo(lensX - ch, lensY);
|
|
1439
|
+
ctx.lineTo(lensX + ch, lensY);
|
|
1440
|
+
ctx.moveTo(lensX, lensY - ch);
|
|
1441
|
+
ctx.lineTo(lensX, lensY + ch);
|
|
1442
|
+
ctx.stroke();
|
|
1443
|
+
ctx.restore();
|
|
1444
|
+
}
|
|
1445
|
+
function render() {
|
|
1446
|
+
if (isDestroyed) return;
|
|
1447
|
+
ctx.clearRect(0, 0, view.width, view.height);
|
|
1448
|
+
ctx.drawImage(
|
|
1449
|
+
sourceCanvas,
|
|
1450
|
+
0,
|
|
1451
|
+
0,
|
|
1452
|
+
imageWidth,
|
|
1453
|
+
imageHeight,
|
|
1454
|
+
view.offsetX,
|
|
1455
|
+
view.offsetY,
|
|
1456
|
+
imageWidth * view.scale,
|
|
1457
|
+
imageHeight * view.scale
|
|
1458
|
+
);
|
|
1459
|
+
drawPolygonOverlay();
|
|
1460
|
+
drawMagnifier();
|
|
1461
|
+
}
|
|
1462
|
+
const raf = typeof runtimeGlobal.requestAnimationFrame === "function" ? runtimeGlobal.requestAnimationFrame.bind(runtimeGlobal) : null;
|
|
1463
|
+
const caf = typeof runtimeGlobal.cancelAnimationFrame === "function" ? runtimeGlobal.cancelAnimationFrame.bind(runtimeGlobal) : null;
|
|
1464
|
+
let rafId = null;
|
|
1465
|
+
function scheduleRender() {
|
|
1466
|
+
if (isDestroyed) return;
|
|
1467
|
+
if (!raf) {
|
|
1468
|
+
render();
|
|
1469
|
+
return;
|
|
1470
|
+
}
|
|
1471
|
+
if (rafId !== null) return;
|
|
1472
|
+
rafId = raf(() => {
|
|
1473
|
+
rafId = null;
|
|
1474
|
+
render();
|
|
1475
|
+
});
|
|
1476
|
+
}
|
|
1477
|
+
function setCorner(nextCornerKey, nextPoint) {
|
|
1478
|
+
const candidate = cloneCorners(corners);
|
|
1479
|
+
candidate[nextCornerKey] = {
|
|
1480
|
+
x: Math.max(0, Math.min(imageWidth, nextPoint.x)),
|
|
1481
|
+
y: Math.max(0, Math.min(imageHeight, nextPoint.y))
|
|
1482
|
+
};
|
|
1483
|
+
if (!cornersValid(candidate)) {
|
|
1484
|
+
return false;
|
|
1485
|
+
}
|
|
1486
|
+
corners = candidate;
|
|
1487
|
+
activeNudgeCorner = nextCornerKey;
|
|
1488
|
+
emitChange();
|
|
1489
|
+
scheduleRender();
|
|
1490
|
+
return true;
|
|
1491
|
+
}
|
|
1492
|
+
function buildNudgeControls() {
|
|
1493
|
+
if (!nudges.enabled) {
|
|
1494
|
+
return;
|
|
1495
|
+
}
|
|
1496
|
+
nudgeControls = document.createElement("div");
|
|
1497
|
+
nudgeControls.style.position = "absolute";
|
|
1498
|
+
nudgeControls.style.right = "8px";
|
|
1499
|
+
nudgeControls.style.bottom = "8px";
|
|
1500
|
+
nudgeControls.style.background = "rgba(15, 23, 42, 0.9)";
|
|
1501
|
+
nudgeControls.style.border = "1px solid rgba(148, 163, 184, 0.5)";
|
|
1502
|
+
nudgeControls.style.borderRadius = "10px";
|
|
1503
|
+
nudgeControls.style.padding = "8px";
|
|
1504
|
+
nudgeControls.style.display = "grid";
|
|
1505
|
+
nudgeControls.style.gridTemplateColumns = "repeat(4, auto)";
|
|
1506
|
+
nudgeControls.style.gap = "6px";
|
|
1507
|
+
nudgeControls.style.zIndex = "2";
|
|
1508
|
+
const makeButton = (glyph, ariaLabel, dx, dy, step) => {
|
|
1509
|
+
const btn = document.createElement("button");
|
|
1510
|
+
btn.type = "button";
|
|
1511
|
+
btn.textContent = glyph + (step > 1 ? " " + step : "");
|
|
1512
|
+
btn.setAttribute("aria-label", ariaLabel);
|
|
1513
|
+
btn.style.border = "1px solid #475569";
|
|
1514
|
+
btn.style.background = "#0f172a";
|
|
1515
|
+
btn.style.color = "#e2e8f0";
|
|
1516
|
+
btn.style.borderRadius = "6px";
|
|
1517
|
+
btn.style.padding = "4px 8px";
|
|
1518
|
+
btn.style.fontSize = "13px";
|
|
1519
|
+
btn.style.lineHeight = "1";
|
|
1520
|
+
btn.style.cursor = "pointer";
|
|
1521
|
+
btn.addEventListener("click", () => {
|
|
1522
|
+
const current = corners[activeNudgeCorner];
|
|
1523
|
+
setCorner(activeNudgeCorner, {
|
|
1524
|
+
x: current.x + dx * step,
|
|
1525
|
+
y: current.y + dy * step
|
|
1526
|
+
});
|
|
1527
|
+
});
|
|
1528
|
+
return btn;
|
|
1529
|
+
};
|
|
1530
|
+
for (const step of nudges.steps) {
|
|
1531
|
+
nudgeControls.appendChild(makeButton("←", `Move left ${step}px`, -1, 0, step));
|
|
1532
|
+
nudgeControls.appendChild(makeButton("→", `Move right ${step}px`, 1, 0, step));
|
|
1533
|
+
nudgeControls.appendChild(makeButton("↑", `Move up ${step}px`, 0, -1, step));
|
|
1534
|
+
nudgeControls.appendChild(makeButton("↓", `Move down ${step}px`, 0, 1, step));
|
|
1535
|
+
}
|
|
1536
|
+
container.appendChild(nudgeControls);
|
|
1537
|
+
}
|
|
1538
|
+
function handlePointerDown(event) {
|
|
1539
|
+
if (isDestroyed) return;
|
|
1540
|
+
const point = getEventCanvasPoint(event);
|
|
1541
|
+
const hitCorner = hitTestCorner(point.x, point.y);
|
|
1542
|
+
if (!hitCorner) return;
|
|
1543
|
+
if (typeof event.preventDefault === "function") {
|
|
1544
|
+
event.preventDefault();
|
|
1545
|
+
}
|
|
1546
|
+
activeCornerKey = hitCorner;
|
|
1547
|
+
activeNudgeCorner = hitCorner;
|
|
1548
|
+
dragPointerId = event.pointerId;
|
|
1549
|
+
lastPointerPosition = point;
|
|
1550
|
+
editorCanvas.style.cursor = "grabbing";
|
|
1551
|
+
if (keyboardEnabled && typeof editorCanvas.focus === "function") {
|
|
1552
|
+
try {
|
|
1553
|
+
editorCanvas.focus({ preventScroll: true });
|
|
1554
|
+
} catch (_) {
|
|
1555
|
+
editorCanvas.focus();
|
|
1556
|
+
}
|
|
1557
|
+
}
|
|
1558
|
+
if (editorCanvas.setPointerCapture && dragPointerId !== void 0) {
|
|
1559
|
+
editorCanvas.setPointerCapture(dragPointerId);
|
|
1560
|
+
}
|
|
1561
|
+
scheduleRender();
|
|
1562
|
+
}
|
|
1563
|
+
function handlePointerMove(event) {
|
|
1564
|
+
if (isDestroyed) return;
|
|
1565
|
+
const point = getEventCanvasPoint(event);
|
|
1566
|
+
if (!activeCornerKey) {
|
|
1567
|
+
editorCanvas.style.cursor = hitTestCorner(point.x, point.y) ? "grab" : "crosshair";
|
|
1568
|
+
return;
|
|
1569
|
+
}
|
|
1570
|
+
if (dragPointerId !== null && event.pointerId !== dragPointerId) return;
|
|
1571
|
+
lastPointerPosition = point;
|
|
1572
|
+
const imagePoint = viewToImage(point.x, point.y);
|
|
1573
|
+
setCorner(activeCornerKey, imagePoint);
|
|
1574
|
+
}
|
|
1575
|
+
function handlePointerUp(event) {
|
|
1576
|
+
if (!activeCornerKey) return;
|
|
1577
|
+
if (dragPointerId !== null && event.pointerId !== dragPointerId) return;
|
|
1578
|
+
if (editorCanvas.releasePointerCapture && dragPointerId !== null && dragPointerId !== void 0) {
|
|
1579
|
+
try {
|
|
1580
|
+
editorCanvas.releasePointerCapture(dragPointerId);
|
|
1581
|
+
} catch (_) {
|
|
1582
|
+
}
|
|
1583
|
+
}
|
|
1584
|
+
activeCornerKey = null;
|
|
1585
|
+
dragPointerId = null;
|
|
1586
|
+
lastPointerPosition = null;
|
|
1587
|
+
editorCanvas.style.cursor = "crosshair";
|
|
1588
|
+
scheduleRender();
|
|
1589
|
+
}
|
|
1590
|
+
function handleKeyDown(event) {
|
|
1591
|
+
if (isDestroyed || !keyboardEnabled) return;
|
|
1592
|
+
if (event.key === "Enter") {
|
|
1593
|
+
event.preventDefault();
|
|
1594
|
+
confirmEditor();
|
|
1595
|
+
return;
|
|
1596
|
+
}
|
|
1597
|
+
if (event.key === "Escape") {
|
|
1598
|
+
event.preventDefault();
|
|
1599
|
+
cancelEditor();
|
|
1600
|
+
return;
|
|
1601
|
+
}
|
|
1602
|
+
let dx = 0;
|
|
1603
|
+
let dy = 0;
|
|
1604
|
+
if (event.key === "ArrowLeft") dx = -1;
|
|
1605
|
+
else if (event.key === "ArrowRight") dx = 1;
|
|
1606
|
+
else if (event.key === "ArrowUp") dy = -1;
|
|
1607
|
+
else if (event.key === "ArrowDown") dy = 1;
|
|
1608
|
+
else return;
|
|
1609
|
+
event.preventDefault();
|
|
1610
|
+
const step = event.shiftKey ? nudges.steps[nudges.steps.length - 1] || 10 : 1;
|
|
1611
|
+
const current = corners[activeNudgeCorner];
|
|
1612
|
+
setCorner(activeNudgeCorner, {
|
|
1613
|
+
x: current.x + dx * step,
|
|
1614
|
+
y: current.y + dy * step
|
|
1615
|
+
});
|
|
1616
|
+
}
|
|
1617
|
+
function handleMouseDown(event) {
|
|
1618
|
+
handlePointerDown({
|
|
1619
|
+
clientX: event.clientX,
|
|
1620
|
+
clientY: event.clientY,
|
|
1621
|
+
pointerId: 1
|
|
1622
|
+
});
|
|
1623
|
+
}
|
|
1624
|
+
function handleMouseMove(event) {
|
|
1625
|
+
handlePointerMove({
|
|
1626
|
+
clientX: event.clientX,
|
|
1627
|
+
clientY: event.clientY,
|
|
1628
|
+
pointerId: 1
|
|
1629
|
+
});
|
|
1630
|
+
}
|
|
1631
|
+
function handleTouchStart(event) {
|
|
1632
|
+
const touch = event.touches[0];
|
|
1633
|
+
if (!touch) return;
|
|
1634
|
+
const point = getEventCanvasPoint(touch);
|
|
1635
|
+
if (hitTestCorner(point.x, point.y)) {
|
|
1636
|
+
event.preventDefault();
|
|
1637
|
+
}
|
|
1638
|
+
handlePointerDown({
|
|
1639
|
+
clientX: touch.clientX,
|
|
1640
|
+
clientY: touch.clientY,
|
|
1641
|
+
pointerId: 2
|
|
1642
|
+
});
|
|
1643
|
+
}
|
|
1644
|
+
function handleTouchMove(event) {
|
|
1645
|
+
const touch = event.touches[0];
|
|
1646
|
+
if (!touch) return;
|
|
1647
|
+
event.preventDefault();
|
|
1648
|
+
handlePointerMove({
|
|
1649
|
+
clientX: touch.clientX,
|
|
1650
|
+
clientY: touch.clientY,
|
|
1651
|
+
pointerId: 2
|
|
1652
|
+
});
|
|
1653
|
+
}
|
|
1654
|
+
function attachEvents() {
|
|
1655
|
+
if (typeof runtimeGlobal.PointerEvent !== "undefined") {
|
|
1656
|
+
editorCanvas.addEventListener("pointerdown", handlePointerDown);
|
|
1657
|
+
editorCanvas.addEventListener("pointermove", handlePointerMove);
|
|
1658
|
+
editorCanvas.addEventListener("pointerup", handlePointerUp);
|
|
1659
|
+
editorCanvas.addEventListener("pointercancel", handlePointerUp);
|
|
1660
|
+
} else {
|
|
1661
|
+
editorCanvas.addEventListener("mousedown", handleMouseDown);
|
|
1662
|
+
if (typeof runtimeGlobal.addEventListener === "function") {
|
|
1663
|
+
runtimeGlobal.addEventListener("mousemove", handleMouseMove);
|
|
1664
|
+
runtimeGlobal.addEventListener("mouseup", handlePointerUp);
|
|
1665
|
+
}
|
|
1666
|
+
editorCanvas.addEventListener("touchstart", handleTouchStart, { passive: false });
|
|
1667
|
+
editorCanvas.addEventListener("touchmove", handleTouchMove, { passive: false });
|
|
1668
|
+
editorCanvas.addEventListener("touchend", handlePointerUp);
|
|
1669
|
+
editorCanvas.addEventListener("touchcancel", handlePointerUp);
|
|
1670
|
+
}
|
|
1671
|
+
if (keyboardEnabled) {
|
|
1672
|
+
editorCanvas.addEventListener("keydown", handleKeyDown);
|
|
1673
|
+
}
|
|
1674
|
+
}
|
|
1675
|
+
function detachEvents() {
|
|
1676
|
+
editorCanvas.removeEventListener("pointerdown", handlePointerDown);
|
|
1677
|
+
editorCanvas.removeEventListener("pointermove", handlePointerMove);
|
|
1678
|
+
editorCanvas.removeEventListener("pointerup", handlePointerUp);
|
|
1679
|
+
editorCanvas.removeEventListener("pointercancel", handlePointerUp);
|
|
1680
|
+
editorCanvas.removeEventListener("mousedown", handleMouseDown);
|
|
1681
|
+
if (typeof runtimeGlobal.removeEventListener === "function") {
|
|
1682
|
+
runtimeGlobal.removeEventListener("mousemove", handleMouseMove);
|
|
1683
|
+
runtimeGlobal.removeEventListener("mouseup", handlePointerUp);
|
|
1684
|
+
}
|
|
1685
|
+
editorCanvas.removeEventListener("touchstart", handleTouchStart);
|
|
1686
|
+
editorCanvas.removeEventListener("touchmove", handleTouchMove);
|
|
1687
|
+
editorCanvas.removeEventListener("touchend", handlePointerUp);
|
|
1688
|
+
editorCanvas.removeEventListener("touchcancel", handlePointerUp);
|
|
1689
|
+
editorCanvas.removeEventListener("keydown", handleKeyDown);
|
|
1690
|
+
}
|
|
1691
|
+
let dprCleanup = null;
|
|
1692
|
+
function watchDevicePixelRatio() {
|
|
1693
|
+
if (typeof runtimeGlobal.matchMedia !== "function") return;
|
|
1694
|
+
if (dprCleanup) dprCleanup();
|
|
1695
|
+
const dpr = runtimeGlobal.devicePixelRatio || 1;
|
|
1696
|
+
const mq = runtimeGlobal.matchMedia(`(resolution: ${dpr}dppx)`);
|
|
1697
|
+
const onChange = () => {
|
|
1698
|
+
if (isDestroyed) return;
|
|
1699
|
+
updateCanvasSize();
|
|
1700
|
+
scheduleRender();
|
|
1701
|
+
watchDevicePixelRatio();
|
|
1702
|
+
};
|
|
1703
|
+
if (typeof mq.addEventListener === "function") {
|
|
1704
|
+
mq.addEventListener("change", onChange);
|
|
1705
|
+
dprCleanup = () => mq.removeEventListener("change", onChange);
|
|
1706
|
+
} else if (typeof mq.addListener === "function") {
|
|
1707
|
+
mq.addListener(onChange);
|
|
1708
|
+
dprCleanup = () => mq.removeListener(onChange);
|
|
1709
|
+
} else {
|
|
1710
|
+
dprCleanup = null;
|
|
1711
|
+
}
|
|
1712
|
+
}
|
|
1713
|
+
function confirmEditor() {
|
|
1714
|
+
const output = cloneCorners(corners);
|
|
1715
|
+
if (typeof options.onConfirm === "function") {
|
|
1716
|
+
options.onConfirm(output);
|
|
1717
|
+
}
|
|
1718
|
+
return output;
|
|
1719
|
+
}
|
|
1720
|
+
function cancelEditor() {
|
|
1721
|
+
if (typeof options.onCancel === "function") {
|
|
1722
|
+
options.onCancel();
|
|
1723
|
+
}
|
|
1724
|
+
}
|
|
1725
|
+
const resizeObserver = typeof ResizeObserver !== "undefined" ? new ResizeObserver(() => {
|
|
1726
|
+
if (isDestroyed) return;
|
|
1727
|
+
const next = computeDisplaySize();
|
|
1728
|
+
if (next.width === lastDisplayWidth && next.height === lastDisplayHeight) {
|
|
1729
|
+
return;
|
|
1730
|
+
}
|
|
1731
|
+
updateCanvasSize();
|
|
1732
|
+
scheduleRender();
|
|
1733
|
+
}) : null;
|
|
1734
|
+
updateCanvasSize();
|
|
1735
|
+
buildNudgeControls();
|
|
1736
|
+
attachEvents();
|
|
1737
|
+
watchDevicePixelRatio();
|
|
1738
|
+
if (resizeObserver) {
|
|
1739
|
+
resizeObserver.observe(container);
|
|
1740
|
+
}
|
|
1741
|
+
render();
|
|
1742
|
+
return {
|
|
1743
|
+
getCorners() {
|
|
1744
|
+
return cloneCorners(corners);
|
|
1745
|
+
},
|
|
1746
|
+
setCorners(nextCorners) {
|
|
1747
|
+
if (!nextCorners || !cornersValid(nextCorners)) {
|
|
1748
|
+
return false;
|
|
1749
|
+
}
|
|
1750
|
+
corners = cloneCorners(nextCorners);
|
|
1751
|
+
emitChange();
|
|
1752
|
+
scheduleRender();
|
|
1753
|
+
return true;
|
|
1754
|
+
},
|
|
1755
|
+
reset() {
|
|
1756
|
+
corners = cloneCorners(initialCorners);
|
|
1757
|
+
emitChange();
|
|
1758
|
+
scheduleRender();
|
|
1759
|
+
},
|
|
1760
|
+
nudge(cornerKey, dx, dy, step = 1) {
|
|
1761
|
+
if (!cornerOrder.includes(cornerKey)) {
|
|
1762
|
+
return false;
|
|
1763
|
+
}
|
|
1764
|
+
return setCorner(cornerKey, {
|
|
1765
|
+
x: corners[cornerKey].x + dx * step,
|
|
1766
|
+
y: corners[cornerKey].y + dy * step
|
|
1767
|
+
});
|
|
1768
|
+
},
|
|
1769
|
+
confirm() {
|
|
1770
|
+
return confirmEditor();
|
|
1771
|
+
},
|
|
1772
|
+
cancel() {
|
|
1773
|
+
cancelEditor();
|
|
1774
|
+
},
|
|
1775
|
+
destroy() {
|
|
1776
|
+
if (isDestroyed) return;
|
|
1777
|
+
isDestroyed = true;
|
|
1778
|
+
if (rafId !== null && caf) {
|
|
1779
|
+
caf(rafId);
|
|
1780
|
+
rafId = null;
|
|
1781
|
+
}
|
|
1782
|
+
if (dprCleanup) {
|
|
1783
|
+
dprCleanup();
|
|
1784
|
+
dprCleanup = null;
|
|
1785
|
+
}
|
|
1786
|
+
if (resizeObserver) {
|
|
1787
|
+
resizeObserver.disconnect();
|
|
1788
|
+
}
|
|
1789
|
+
detachEvents();
|
|
1790
|
+
if (nudgeControls && nudgeControls.parentNode) {
|
|
1791
|
+
nudgeControls.parentNode.removeChild(nudgeControls);
|
|
1792
|
+
}
|
|
1793
|
+
if (editorCanvas.parentNode) {
|
|
1794
|
+
editorCanvas.parentNode.removeChild(editorCanvas);
|
|
1795
|
+
}
|
|
1796
|
+
if (changedContainerPosition) {
|
|
1797
|
+
container.style.position = restoreContainerStyle.position;
|
|
1798
|
+
}
|
|
1799
|
+
if (changedContainerMinHeight) {
|
|
1800
|
+
container.style.minHeight = restoreContainerStyle.minHeight;
|
|
1801
|
+
}
|
|
1802
|
+
}
|
|
1803
|
+
};
|
|
1804
|
+
}
|
|
1115
1805
|
async function initialize() {
|
|
1116
1806
|
return await initializeWasm();
|
|
1117
1807
|
}
|
|
@@ -1961,11 +2651,9 @@ async function scanDocument(image, options = {}) {
|
|
|
1961
2651
|
timings
|
|
1962
2652
|
};
|
|
1963
2653
|
}
|
|
1964
|
-
const __viteBrowserExternal = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
1965
|
-
__proto__: null
|
|
1966
|
-
}, Symbol.toStringTag, { value: "Module" }));
|
|
1967
2654
|
export {
|
|
1968
2655
|
Scanner,
|
|
2656
|
+
createCornerEditor,
|
|
1969
2657
|
extractDocument,
|
|
1970
2658
|
initialize,
|
|
1971
2659
|
scanDocument
|
package/dist/scanic.umd.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(A,I){"object"==typeof exports&&"undefined"!=typeof module?I(exports):"function"==typeof define&&define.amd?define(["exports"],I):I((A="undefined"!=typeof globalThis?globalThis:A||self).scanic={})}(this,function(A){"use strict";var I="undefined"!=typeof document?document.currentScript:null;const g=1e3,B=10;function Q(A,I={}){const Q=I.width||Math.sqrt(A.length),i=I.height||A.length/Q,o=void 0!==I.mode?I.mode:1,t=void 0!==I.method?I.method:2,e=I.minArea||g,a=Q+2,n=i+2,s=new Int32Array(a*n);for(let g=0;g<i;g++)for(let I=0;I<Q;I++)A[g*Q+I]>0&&(s[(g+1)*a+(I+1)]=1);const c=[];let h=2;for(let g=1;g<=i;g++)for(let A=1;A<=Q;A++){const I=s[g*a+A],Q=s[g*a+(A-1)];let i=null,e=!1,D=-1;if(1===I&&0===Q?(e=!0,i={x:A,y:g},D=2):0===I&&Q>=1&&-1!==Q&&1===Q&&(e=!1,i={x:A-1,y:g},D=6),i){if(0===o&&!e){s[i.y*a+i.x]=-1;continue}const A=h++,I=C(s,a,n,i,D,A);if(I&&I.length>0){let g=I;2===t&&(g=E(I));const Q=g.map(A=>({x:A.x-1,y:A.y-1}));if(Q.length>=(2===t?4:B)){const I={id:A,points:Q,isOuter:e};c.push(I)}}else 1===s[i.y*a+i.x]&&(s[i.y*a+i.x]=A)}}c.forEach(A=>{A.area=function(A){let I=0;const g=A.length;if(g<3)return 0;for(let B=0;B<g;B++){const Q=(B+1)%g;I+=A[B].x*A[Q].y,I-=A[Q].x*A[B].y}return Math.abs(I)/2}(A.points),A.boundingBox=function(A){if(0===A.length)return{minX:0,minY:0,maxX:0,maxY:0};let I=A[0].x,g=A[0].y,B=A[0].x,Q=A[0].y;for(let C=1;C<A.length;C++){const E=A[C];I=Math.min(I,E.x),g=Math.min(g,E.y),B=Math.max(B,E.x),Q=Math.max(Q,E.y)}return{minX:I,minY:g,maxX:B,maxY:Q}}(A.points)});const D=c.filter(A=>A.area>=e);return D.sort((A,I)=>I.area-A.area),I.debug&&(I.debug.labels=s,I.debug.rawContours=c,I.debug.finalContours=D),D}function C(A,I,g,B,Q,C){const E=[],i=new Set;let o=B.x,t=B.y;const e=o,a=t;let n=-1;A[a*I+e]=C;let s=0;const c=I*g,h=[0,1,1,1,0,-1,-1,-1],D=[-1,-1,0,1,1,1,0,-1];for(;s++<c;){let B;if(-1===n){let C=!1;for(let E=0;E<8;E++){B=Q+E&7;const i=o+h[B],e=t+D[B];if(i>=0&&i<I&&e>=0&&e<g&&A[e*I+i]>0){C=!0;break}}if(!C)return null}else B=n+2&7;let s=-1,c=-1;for(let Q=0;Q<8;Q++){const C=B+Q&7,E=o+h[C],i=t+D[C];if(E>=0&&E<I&&i>=0&&i<g&&A[i*I+E]>0){s=E,c=i,n=C+4&7;break}}if(-1===s){0===E.length&&E.push({x:o,y:t});break}const r=t*I+o;if(i.has(r))return E;E.push({x:o,y:t}),i.add(r);const y=c*I+s;if(1===A[y]&&(A[y]=C),o=s,t=c,o===e&&t===a)break}return s>=c?null:E}function E(A){const I=A.length;if(I<=2)return A;const g=[],B=A[I-1],Q=A[0];let C=B,E=Q,i=A[1],o=E.x-C.x,t=E.y-C.y,e=i.x-E.x,a=i.y-E.y;o*a!==t*e&&g.push(E);for(let n=1;n<I-1;n++)C=A[n-1],E=A[n],i=A[n+1],o=E.x-C.x,t=E.y-C.y,e=i.x-E.x,a=i.y-E.y,o*a!==t*e&&g.push(E);if(C=A[I-2],E=B,i=Q,o=E.x-C.x,t=E.y-C.y,e=i.x-E.x,a=i.y-E.y,o*a!==t*e&&g.push(E),0===g.length){if(1===I)return[A[0]];if(2===I)return A;let g=0,B=1;const C=Q.x,E=Q.y;for(let Q=1;Q<I;Q++){const I=A[Q],i=I.x-C,o=I.y-E,t=i*i+o*o;t>g&&(g=t,B=Q)}return[Q,A[B]]}return g}function i(A,I=1){if(A.length<=2)return A;let g=0,B=0;const Q=A[0],C=A[A.length-1];for(let E=1;E<A.length-1;E++){const I=o(A[E],Q,C);I>g&&(g=I,B=E)}if(g>I){const g=i(A.slice(0,B+1),I),Q=i(A.slice(B),I);return g.slice(0,-1).concat(Q)}return[Q,C]}function o(A,I,g){const B=g.x-I.x,Q=g.y-I.y,C=B*B+Q*Q;if(0===C)return Math.sqrt(Math.pow(A.x-I.x,2)+Math.pow(A.y-I.y,2));const E=((A.x-I.x)*B+(A.y-I.y)*Q)/C;let i,o;E<0?(i=I.x,o=I.y):E>1?(i=g.x,o=g.y):(i=I.x+E*B,o=I.y+E*Q);const t=A.x-i,e=A.y-o;return Math.sqrt(t*t+e*e)}function t(A,I=.02){return i(A,I*function(A){let I=0;const g=A.length;if(g<2)return 0;for(let B=0;B<g;B++){const Q=(B+1)%g,C=A[B].x-A[Q].x,E=A[B].y-A[Q].y;I+=Math.sqrt(C*C+E*E)}return I}(A))}function e(A,I){return Math.hypot(I.x-A.x,I.y-A.y)}function a(A){let I=0,g=0;for(const B of A)I+=B.x,g+=B.y;return{x:I/A.length,y:g/A.length}}function n(A,I={}){if(!A||!A.points||A.points.length<4)return null;const g=I.epsilon||.02,B=function(A,I){if(!A||A.length<4)return null;const g=[I,1.3*I,1.6*I,2*I],B=new Set;for(const Q of g){const I=Math.min(.12,Q),g=I.toFixed(4);if(B.has(g))continue;B.add(g);const C=s(t(A,I));if(C&&4===C.length)return C}return null}(A.points,g);let Q;return B&&4===B.length?Q=function(A){if(4!==A.length)return null;const I=a(A),g=[...A].sort((A,g)=>Math.atan2(A.y-I.y,A.x-I.x)-Math.atan2(g.y-I.y,g.x-I.x));let B=1/0,Q=0;for(let E=0;E<4;E++){const A=g[E].x+g[E].y;A<B&&(B=A,Q=E)}const C=[g[Q],g[(Q+1)%4],g[(Q+2)%4],g[(Q+3)%4]];return{topLeft:C[0],topRight:C[1],bottomRight:C[2],bottomLeft:C[3]}}(B):(Q=function(A){if(!A||A.length<4)return null;const I=a(A);let g=null,B=null,Q=null,C=null,E=0,i=0,o=0,t=0;for(const a of A){const A=e(a,I);a.x<I.x&&a.y<I.y?A>E&&(g=a,E=A):a.x>I.x&&a.y<I.y?A>i&&(B=a,i=A):a.x>I.x&&a.y>I.y?A>o&&(Q=a,o=A):a.x<I.x&&a.y>I.y&&A>t&&(C=a,t=A)}if(!(g&&B&&Q&&C))return null;return{topLeft:g,topRight:B,bottomRight:Q,bottomLeft:C}}(A.points),Q&&Q.topLeft&&Q.topRight&&Q.bottomRight&&Q.bottomLeft||(Q=function(A){if(!A||0===A.length)return null;let I=A[0],g=A[0],B=A[0],Q=A[0],C=I.x+I.y,E=g.x-g.y,i=B.x+B.y,o=Q.x-Q.y;for(let t=1;t<A.length;t++){const e=A[t],a=e.x+e.y,n=e.x-e.y;a<C&&(C=a,I=e),a>i&&(i=a,B=e),n>E&&(E=n,g=e),n<o&&(o=n,Q=e)}return{topLeft:I,topRight:g,bottomRight:B,bottomLeft:Q}}(A.points))),Q&&Q.topLeft&&Q.topRight&&Q.bottomRight&&Q.bottomLeft?Q:null}function s(A){if(!A||A.length<4)return null;if(4===A.length)return A;if(A.length>8)return null;let I=function(A,I){if(!A||0===A.length)return[];const g=[];for(const B of A)(0===g.length||e(B,g[g.length-1])>I)&&g.push(B);g.length>2&&e(g[0],g[g.length-1])<=I&&g.pop();return g}(A,6);return 4===I.length?I:(I.length,null)}let c,h=null;function D(){return null!==h&&0!==h.byteLength||(h=new Uint8Array(c.memory.buffer)),h}let r=0;function y(A,I){const g=I(1*A.length,1)>>>0;return D().set(A,g/1),r=A.length,g}function w(A,I){return A>>>=0,D().subarray(A/1,A/1+I)}let l=null;function N(){return null!==l&&0!==l.byteLength||(l=new Float32Array(c.memory.buffer)),l}function R(A,I,g,B,Q){const C=function(A,I){const g=I(4*A.length,4)>>>0;return N().set(A,g/4),r=A.length,g}(A,c.__wbindgen_malloc),E=r,i=c.hysteresis_thresholding(C,E,I,g,B,Q);var o=w(i[0],i[1]).slice();return c.__wbindgen_free(i[0],1*i[1],1),o}let F=null;function G(A,I){const g=I(2*A.length,2)>>>0;return(null!==F&&0!==F.byteLength||(F=new Uint16Array(c.memory.buffer)),F).set(A,g/2),r=A.length,g}function J(A,I,g,B,Q){const C=G(A,c.__wbindgen_malloc),E=r,i=G(I,c.__wbindgen_malloc),o=r,t=c.non_maximum_suppression(C,E,i,o,g,B,Q);var e,a,n=(e=t[0],a=t[1],e>>>=0,N().subarray(e/4,e/4+a)).slice();return c.__wbindgen_free(t[0],4*t[1],4),n}async function f(A){if(void 0!==c)return c;void 0!==A&&Object.getPrototypeOf(A)===Object.prototype&&({module_or_path:A}=A),void 0===A&&(A=new URL("data:application/wasm;base64,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JAAgAiABIAJqIgFLBEBBAEEAEC0ACyADQQRqIAAoAgAiAiAAKAIEQQggASACQQF0IgIgASACSxsiASABQQhNGyIBQQFBARARIAMoAgRBAUYEQCADKAIIIAMoAgwQLQALIAMoAgghAiAAIAE2AgAgACACNgIEIANBEGokAAt5AQF/IwBBIGsiAiQAAn8gACgCAEGAgICAeEcEQCABIAAoAgQgACgCCBAwDAELIAJBEGogACgCDCgCACIAQQhqKQIANwMAIAJBGGogAEEQaikCADcDACACIAApAgA3AwggASgCACABKAIEIAJBCGoQBwsgAkEgaiQAC2kBA38jAEEQayIBJAAgAUEEaiAAKAIAIgIgACgCBEEEIAJBAXQiAiACQQRNGyICQQRBBBARIAEoAgRBAUYEQCABKAIIIAEoAgwQLQALIAEoAgghAyAAIAI2AgAgACADNgIEIAFBEGokAAtpAQN/IwBBEGsiASQAIAFBBGogACgCACICIAAoAgRBBCACQQF0IgIgAkEETRsiAkEEQQgQESABKAIEQQFGBEAgASgCCCABKAIMEC0ACyABKAIIIQMgACACNgIAIAAgAzYCBCABQRBqJAALaQEDfyMAQRBrIgEkACABQQRqIAAoAgAiAiAAKAIEQQQgAkEBdCICIAJBBE0bIgJBAkECEBEgASgCBEEBRgRAIAEoAgggASgCDBAtAAsgASgCCCEDIAAgAjYCACAAIAM2AgQgAUEQaiQACxIAIwBBMGsiACQAIABBMGokAAtoAgF/AX4jAEEwayIDJAAgAyABNgIEIAMgADYCACADQQI2AgwgA0Hkl8AANgIIIANCAjcCFCADQoCAgIAwIgQgA62ENwMoIAMgBCADQQRqrYQ3AyAgAyADQSBqNgIQIANBCGogAhAmAAtHAQF/IAAoAgAgACgCCCIDayACSQRAIAAgAyACEBIgACgCCCEDCyACBEAgACgCBCADaiABIAL8CgAACyAAIAIgA2o2AghBAAtEAQJ/IAEoAgQhAiABKAIAIQNBCEEEEDUiAUUEQEEEQQgQOQALIAEgAjYCBCABIAM2AgAgAEHcksAANgIEIAAgATYCAAvGAgACQCAAIAJNBEAgACABTSABIAJLcg0BIwBBMGsiAiQAIAIgATYCBCACIAA2AgAgAkECNgIMIAJB2JbAADYCCCACQgI3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IAAAABwAEAAMAAAAEgAAABcAAAAcABAADAAAABcAAAAZAAAAHAAQAAwAAAAUAAAAGQAAABwAEAAMAAAAUQAAAB4AAAAcABAADAAAAFIAAAAeAAAATGF6eSBpbnN0YW5jZSBoYXMgcHJldmlvdXNseSBiZWVuIHBvaXNvbmVkAAA8CBAAKgAAAEgBEABaAAAACAMAABkAAAByZWVudHJhbnQgaW5pdAAAgAgQAA4AAABIARAAWgAAAHoCAAANAAAAfP2LMlfmV/kC30S/40jnr21dy9YsUOtjeEGmV3Ebi7ltZW1vcnkgYWxsb2NhdGlvbiBvZiAgYnl0ZXMgZmFpbGVkAADICBAAFQAAAN0IEAANAAAALwEQABgAAABkAQAACQAAAAQAAAAMAAAABAAAAAUAAAAGAAAABwAAAAAAAAAIAAAABAAAAAgAAAAJAAAACgAAAAsAAAAMAAAAEAAAAAQAAAANAAAADgAAAA8AAAAQAAAAAAAAAAgAAAAEAAAAEQAAAGFzc2VydGlvbiBmYWlsZWQ6IHBzaXplID49IHNpemUgKyBtaW5fb3ZlcmhlYWQAAAQBEAAqAAAAsQQAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA8PSBzaXplICsgbWF4X292ZXJoZWFkAAAEARAAKgAAALcEAAANAAAABAAAAAwAAAAEAAAAEgAAAGNhcGFjaXR5IG92ZXJmbG93AAAA/AkQABEAAADjABAAIAAAABwAAAAFAAAAMDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUxNjE3MTgxOTIwMjEyMjIzMjQyNTI2MjcyODI5MzAzMTMyMzMzNDM1MzYzNzM4Mzk0MDQxNDI0MzQ0NDU0NjQ3NDg0OTUwNTE1MjUzNTQ1NTU2NTc1ODU5NjA2MTYyNjM2NDY1NjY2NzY4Njk3MDcxNzI3Mzc0NzU3Njc3Nzg3OTgwODE4MjgzODQ4NTg2ODc4ODg5OTA5MTkyOTM5NDk1OTY5Nzk4OTlyYW5nZSBlbmQgaW5kZXggIG91dCBvZiByYW5nZSBmb3Igc2xpY2Ugb2YgbGVuZ3RoIAAA8AoQABAAAAAACxAAIgAAAHNsaWNlIGluZGV4IHN0YXJ0cyBhdCAgYnV0IGVuZHMgYXQgADQLEAAWAAAASgsQAA0AAAByYW5nZSBzdGFydCBpbmRleCAAAGgLEAASAAAAAAsQACIAAABhdHRlbXB0IHRvIGRpdmlkZSBieSB6ZXJvAAAAjAsQABkAAABpbmRleCBvdXQgb2YgYm91bmRzOiB0aGUgbGVuIGlzICBidXQgdGhlIGluZGV4IGlzIAAAsAsQACAAAADQCxAAEgAAAAAAAD8AAAC/AEGUmMAACwEBAHwJcHJvZHVjZXJzAghsYW5ndWFnZQEEUnVzdAAMcHJvY2Vzc2VkLWJ5AwVydXN0Yx0xLjkyLjAgKGRlZDVjMDZjZiAyMDI1LTEyLTA4KQZ3YWxydXMGMC4yMy4zDHdhc20tYmluZGdlbhMwLjIuMTAwICgyNDA1ZWMyYjQpAHQPdGFyZ2V0X2ZlYXR1cmVzBysPbXV0YWJsZS1nbG9iYWxzKxNub250cmFwcGluZy1mcHRvaW50KwdzaW1kMTI4KwtidWxrLW1lbW9yeSsIc2lnbi1leHQrD3JlZmVyZW5jZS10eXBlcysKbXVsdGl2YWx1ZQ==","undefined"==typeof document&&"undefined"==typeof location?require("url").pathToFileURL(__filename).href:"undefined"==typeof document?location.href:I&&"SCRIPT"===I.tagName.toUpperCase()&&I.src||new URL("scanic.umd.cjs",document.baseURI).href));const g=function(){const A={wbg:{}};return A.wbg.__wbindgen_init_externref_table=function(){const A=c.__wbindgen_export_0,I=A.grow(4);A.set(0,void 0),A.set(I+0,void 0),A.set(I+1,null),A.set(I+2,!0),A.set(I+3,!1)},A}();("string"==typeof A||"function"==typeof Request&&A instanceof Request||"function"==typeof URL&&A instanceof URL)&&(A=fetch(A));const{instance:B,module:Q}=await async function(A,I){if("function"==typeof Response&&A instanceof Response){if("function"==typeof WebAssembly.instantiateStreaming)try{return await WebAssembly.instantiateStreaming(A,I)}catch(g){if("application/wasm"==A.headers.get("Content-Type"))throw g}const B=await A.arrayBuffer();return await WebAssembly.instantiate(B,I)}{const g=await WebAssembly.instantiate(A,I);return g instanceof WebAssembly.Instance?{instance:g,module:A}:g}}(await A,g);return function(A,I){return c=A.exports,f.__wbindgen_wasm_module=I,l=null,F=null,h=null,c.__wbindgen_start(),c}(B,Q)}let d=null,S=!1;async function m(){if("undefined"!=typeof process&&(null==(A=process.versions)?void 0:A.node))try{const{readFile:A}=await Promise.resolve().then(()=>v),{fileURLToPath:g}=await Promise.resolve().then(()=>v),B=new URL("undefined"==typeof document&&"undefined"==typeof location?require("url").pathToFileURL(__filename).href:"undefined"==typeof document?location.href:I&&"SCRIPT"===I.tagName.toUpperCase()&&I.src||new URL("scanic.umd.cjs",document.baseURI).href);B.search="",B.hash="";const Q=new URL("../wasm_blur/pkg/wasm_blur_bg.wasm",B),C=await A(g(Q));return await f({module_or_path:C})}catch{return await f()}var A;return await f()}function k(){return d||(d=m().catch(A=>{throw d=null,A})),d}function u(A,I,g,B=5,Q=0){0===Q&&(Q=.3*(.5*(B-1)-1)+.8);const C=Math.floor(B/2),E=function(A,I){const g=new Float32Array(A),B=Math.floor(A/2);let Q=0;for(let C=0;C<A;C++){const A=C-B;g[C]=Math.exp(-A*A/(2*I*I)),Q+=g[C]}for(let C=0;C<A;C++)g[C]/=Q;return g}(B,Q),i=new Uint8ClampedArray(I*g),o=new Uint8ClampedArray(I*g);for(let t=0;t<g;t++){const g=t*I;for(let B=0;B<I;B++){let Q=0;for(let i=-C;i<=C;i++){Q+=A[g+Math.min(I-1,Math.max(0,B+i))]*E[C+i]}i[g+B]=Q}}for(let t=0;t<I;t++)for(let A=0;A<g;A++){let B=0;for(let Q=-C;Q<=C;Q++){B+=i[Math.min(g-1,Math.max(0,A+Q))*I+t]*E[C+Q]}o[A*I+t]=Math.round(B)}return o}function M(A,I,g,B,Q){const C=new Uint8Array(I*g),E=[];for(let t=1;t<g-1;t++)for(let g=1;g<I-1;g++){const i=t*I+g,o=A[i];o>=Q?(C[i]=2,E.push({x:g,y:t})):C[i]=o>=B?0:1}for(let t=0;t<I;t++)C[t]=1,C[(g-1)*I+t]=1;for(let t=1;t<g-1;t++)C[t*I]=1,C[t*I+I-1]=1;const i=[-1,0,1,-1,1,-1,0,1],o=[-1,-1,-1,0,0,1,1,1];for(;E.length>0;){const{x:A,y:g}=E.pop();for(let B=0;B<8;B++){const Q=A+i[B],t=g+o[B],e=t*I+Q;0===C[e]&&(C[e]=2,E.push({x:Q,y:t}))}}return C}async function L(A,I={}){const g=!(!I.debug||I.debug._timingsOnly),B=[],Q=performance.now();let C,E,i;if(I.skipGrayscale||!1)C=I.width,E=I.height,i=A,g&&(I.debug.grayscale=i);else{C=A.width,E=A.height;let Q=performance.now();i=function(A){const{width:I,height:g,data:B}=A,Q=new Uint8ClampedArray(I*g);for(let C=0,E=0;C<B.length;C+=4,E++)Q[E]=54*B[C]+183*B[C+1]+19*B[C+2]>>8;return Q}(A);let o=performance.now();B.push({step:"Grayscale",ms:(o-Q).toFixed(2)}),g&&(I.debug.grayscale=i)}let o=void 0!==I.lowThreshold?I.lowThreshold:null,t=void 0!==I.highThreshold?I.highThreshold:null;if(null===o||null===t){const A=1024,I=new Uint32Array(A);let g=0;for(let o=1;o<E-1;o++)for(let B=1;B<C-1;B++){const Q=o*C+B,E=-i[Q-C-1]+i[Q-C+1]-2*i[Q-1]+2*i[Q+1]-i[Q+C-1]+i[Q+C+1],t=-i[Q-C-1]-2*i[Q-C]-i[Q-C+1]+i[Q+C-1]+2*i[Q+C]+i[Q+C+1];let e=Math.abs(E)+Math.abs(t);e>=A&&(e=A-1),e>0&&(I[e]++,g++)}const B=Math.round(.7*g);let Q=0,e=75;for(let C=1;C<A;C++)if(Q+=I[C],Q>=B){e=C;break}null===o&&(o=Math.max(5,Math.round(.5*e))),null===t&&(t=Math.min(500,Math.round(1.5*e)))}const e=I.kernelSize||5,a=I.sigma||0,n=void 0!==I.L2gradient&&I.L2gradient,s=void 0===I.applyDilation||I.applyDilation,h=I.dilationKernelSize||5,D=void 0!==I.useWasmHysteresis&&I.useWasmHysteresis,l=void 0!==I.useWasmFullCanny&&I.useWasmFullCanny;if(o>=t&&([o,t]=[t,o]),l)try{await k();const A=performance.now(),D=new Uint8ClampedArray(function(A,I,g,B,Q,C,E,i,o,t){const e=y(A,c.__wbindgen_malloc),a=r,n=c.canny_edge_detector_full(e,a,I,g,B,Q,C,E,i,o,t);var s=w(n[0],n[1]).slice();return c.__wbindgen_free(n[0],1*n[1],1),s}(i,C,E,o,t,e,a,n,s,h)),l=(performance.now()-A).toFixed(2);B.push({step:"Edge Processing (WASM)",ms:l}),g&&(I.debug.finalEdges=D),I.debug?I.debug.timings=B:I.debug={timings:B};const N=performance.now();return B.unshift({step:"Edge Detection Total",ms:(N-Q).toFixed(2)}),D}catch(q){if(!S){S=!0;q instanceof Error?q.message:String(q)}}let N,F,G,f,d,m;N=performance.now();try{await k(),G=function(A,I,g,B,Q){const C=y(A,c.__wbindgen_malloc),E=r,i=c.blur(C,E,I,g,B,Q);var o=w(i[0],i[1]).slice();return c.__wbindgen_free(i[0],1*i[1],1),o}(i,C,E,e,a)}catch(x){G=u(i,C,E,e,a)}F=performance.now(),B.push({step:"Gaussian Blur",ms:(F-N).toFixed(2)}),g&&(I.debug.blurred=G),N=performance.now();{const A=function(A,I,g){const B=new Int16Array(I*g),Q=new Int16Array(I*g);for(let C=1;C<g-1;C++){const g=C*I,E=(C-1)*I,i=(C+1)*I;for(let C=1;C<I-1;C++){const I=g+C,o=A[E+C-1],t=A[E+C],e=A[E+C+1],a=A[g+C-1],n=A[g+C+1],s=A[i+C-1],c=A[i+C],h=A[i+C+1],D=e-o+2*(n-a)+(h-s),r=s+2*c+h-(o+2*t+e);B[I]=D,Q[I]=r}}return{dx:B,dy:Q}}(G,C,E);f=A.dx,d=A.dy}F=performance.now(),B.push({step:"Gradients",ms:(F-N).toFixed(2)}),N=performance.now();try{await k(),m=await J(f,d,C,E,n)}catch(x){m=function(A,I,g,B,Q){const C=new Float32Array(g*B),E=new Float32Array(g*B);for(let i=0;i<A.length;i++){const g=A[i],B=I[i];C[i]=Q?Math.sqrt(g*g+B*B):Math.abs(g)+Math.abs(B)}for(let i=1;i<B-1;i++)for(let B=1;B<g-1;B++){const Q=i*g+B,o=C[Q];if(0===o){E[Q]=0;continue}const t=A[Q],e=I[Q];let a=0,n=0;const s=Math.abs(t),c=Math.abs(e);if(c>2.4142*s)a=C[Q-g],n=C[Q+g];else if(s>2.4142*c)a=C[Q-1],n=C[Q+1];else{const A=(t^e)<0?-1:1;e>0?(a=C[(i-1)*g+(B-A)],n=C[(i+1)*g+(B+A)]):(a=C[(i+1)*g+(B-A)],n=C[(i-1)*g+(B+A)]),t>0&&e>0||t<0&&e<0?(a=C[(i-1)*g+(B+1)],n=C[(i+1)*g+(B-1)]):(a=C[(i-1)*g+(B-1)],n=C[(i+1)*g+(B+1)])}E[Q]=o>=a&&o>=n?o:0}return E}(f,d,C,E,n)}F=performance.now(),B.push({step:"Non-Max Suppression",ms:(F-N).toFixed(2)}),N=performance.now();const L=n?o*o:o,U=n?t*t:t;let H;if(D)try{await k(),H=R(m,C,E,L,U)}catch(x){H=M(m,C,E,L,U)}else H=M(m,C,E,L,U);F=performance.now(),B.push({step:"Hysteresis",ms:(F-N).toFixed(2)}),N=performance.now();const p=new Uint8ClampedArray(C*E);for(let c=0;c<H.length;c++)p[c]=2===H[c]?255:0;F=performance.now(),B.push({step:"Binary Image",ms:(F-N).toFixed(2)}),N=performance.now();let Y=p;if(s)try{await k(),Y=function(A,I,g,B){const Q=y(A,c.__wbindgen_malloc),C=r,E=c.dilate(Q,C,I,g,B);var i=w(E[0],E[1]).slice();return c.__wbindgen_free(E[0],1*E[1],1),i}(p,C,E,h)}catch(x){Y=function(A,I,g,B=5){const Q=Math.floor(B/2),C=new Uint8ClampedArray(I*g),E=new Uint8ClampedArray(I*g);for(let i=0;i<g;i++){const g=i*I;for(let B=0;B<I;B++){let E=0;for(let C=-Q;C<=Q;C++){const Q=B+C;if(Q>=0&&Q<I){const I=A[g+Q];I>E&&(E=I)}}C[g+B]=E}}for(let i=0;i<I;i++)for(let A=0;A<g;A++){let B=0;for(let E=-Q;E<=Q;E++){const Q=A+E;if(Q>=0&&Q<g){const A=C[Q*I+i];A>B&&(B=A)}}E[A*I+i]=B}return E}(p,C,E,h)}if(F=performance.now(),B.push({step:"Dilation",ms:(F-N).toFixed(2)}),g){I.debug.dx=f,I.debug.dy=d;const A=new Float32Array(C*E);for(let I=0;I<f.length;I++){const g=f[I],B=d[I];A[I]=n?Math.sqrt(g*g+B*B):Math.abs(g)+Math.abs(B)}I.debug.magnitude=A,I.debug.suppressed=m,I.debug.edgeMap=H,I.debug.cannyEdges=p,I.debug.finalEdges=Y}I.debug?I.debug.timings=B:I.debug||(I.debug={timings:B});const b=performance.now();return B.unshift({step:"Edge Detection Total",ms:(b-Q).toFixed(2)}),Y}function U(A){return A<=0?0:A>=1?1:A}function H(A,I){return Math.hypot(A.x-I.x,A.y-I.y)}function p(A){return[H(A.topLeft,A.topRight),H(A.topRight,A.bottomRight),H(A.bottomRight,A.bottomLeft),H(A.bottomLeft,A.topLeft)]}function Y(A){const I=function(A){const I=[A.topLeft,A.topRight,A.bottomRight,A.bottomLeft],g=[];for(let B=0;B<I.length;B++){const A=I[(B+I.length-1)%I.length],Q=I[B],C=I[(B+1)%I.length],E=A.x-Q.x,i=A.y-Q.y,o=C.x-Q.x,t=C.y-Q.y,e=E*o+i*t,a=Math.hypot(E,i),n=Math.hypot(o,t),s=Math.max(1e-6,a*n),c=Math.max(-1,Math.min(1,e/s));g.push(180*Math.acos(c)/Math.PI)}return g}(A);let g=0;for(const B of I){g+=U(1-Math.abs(B-90)/55)}return g/Math.max(1,I.length)}function b(A,I){const g=Number(I.isValid)-Number(A.isValid);if(0!==g)return g;const B=I.confidence-A.confidence;if(!(Math.abs(B)<.015)&&0!==B)return B;const Q=Math.abs((A.approxCount??99)-4)-Math.abs((I.approxCount??99)-4);if(0!==Q)return Q;const C=(I.rightAngleScore??0)-(A.rightAngleScore??0);if(Math.abs(C)>1e-6)return C;const E=Math.abs(1-(A.contourFitRatio??1))-Math.abs(1-(I.contourFitRatio??1));return Math.abs(E)>1e-6?E:B||I.score-A.score||I.coverageRatio-A.coverageRatio||I.area-A.area}function q(A,I,g,B,Q={}){const C=Q.epsilon||.02,E=t(A.points,C).length,i=n(A,{epsilon:C});if(!i)return{contour:A,corners:null,score:0,confidence:0,isValid:!1,area:A.area||0,fillRatio:0,coverageRatio:0,cornersArea:0,approxCount:E,convex:!1,edgeSupport:0,aspectRatio:1/0,minSide:0,rightAngleScore:0,oppositeSideConsistency:0,contourFitRatio:0,contourFitScore:0};const o=g*B,e=A.area||0,a=A.boundingBox||{minX:0,minY:0,maxX:0,maxY:0},s=e/Math.max(1,(a.maxX-a.minX+1)*(a.maxY-a.minY+1)),c=function(A){if(!A)return 0;const I=[A.topLeft,A.topRight,A.bottomRight,A.bottomLeft];let g=0;for(let B=0;B<I.length;B++){const A=(B+1)%I.length;g+=I[B].x*I[A].y-I[A].x*I[B].y}return Math.abs(g)/2}(i),h=c/Math.max(1,o),D=p(i),r=Math.min(...D),y=(D[0]+D[2])/2,w=(D[1]+D[3])/2,l=y>w?y/Math.max(1e-6,w):w/Math.max(1e-6,y),N=function(A){const I=[A.topLeft,A.topRight,A.bottomRight,A.bottomLeft],g=[];for(let Q=0;Q<I.length;Q++){const A=I[Q],B=I[(Q+1)%I.length],C=I[(Q+2)%I.length],E=(B.x-A.x)*(C.y-B.y)-(B.y-A.y)*(C.x-B.x);Math.abs(E)<1e-6||g.push(Math.sign(E))}if(g.length<3)return!1;const B=g[0];return g.every(A=>A===B)}(i),R=function(A,I,g,B){if(!(null==A?void 0:A.points)||0===A.points.length)return 0;const Q=Math.max(1,Math.floor(A.points.length/240));let C=0,E=0;for(let i=0;i<A.points.length;i+=Q){const Q=A.points[i],o=Math.max(0,Math.min(g-1,0|Q.x)),t=Math.max(0,Math.min(B-1,0|Q.y));C++;let e=!1;for(let A=-1;A<=1&&!e;A++){const Q=t+A;if(!(Q<0||Q>=B))for(let A=-1;A<=1;A++){const B=o+A;if(!(B<0||B>=g)&&I[Q*g+B]>0){e=!0;break}}}e&&E++}return 0===C?0:E/C}(A,I,g,B),F=Y(i),G=function(A){const I=p(A);return(Math.min(I[0],I[2])/Math.max(1e-6,Math.max(I[0],I[2]))+Math.min(I[1],I[3])/Math.max(1e-6,Math.max(I[1],I[3])))/2}(i),J=e/Math.max(1,c),f=U(1-Math.abs(J-1)/.55),d=4===E?1:5===E?.9:6===E?.7:E<=8?.5:.28,S=U(e/Math.max(1,.4*o)),m=U((s-.08)/.72),k=U((h-.03)/.82),u=void 0!==Q.minDocumentSideRatio?Q.minDocumentSideRatio:.06,M=void 0!==Q.minDocumentCoverageRatio?Q.minDocumentCoverageRatio:.04,L=void 0!==Q.maxDocumentAspectRatio?Q.maxDocumentAspectRatio:8,b=void 0!==Q.minDocumentFillRatio?Q.minDocumentFillRatio:.07,q=void 0!==Q.minContourFitRatio?Q.minContourFitRatio:.11,x=void 0!==Q.maxContourFitRatio?Q.maxContourFitRatio:1.2,K=void 0!==Q.minRightAngleScore?Q.minRightAngleScore:.42,T=void 0!==Q.minOppositeSideConsistency?Q.minOppositeSideConsistency:.3,W=Math.min(g,B)*u,v=function(A,I=6){const g=[null==A?void 0:A.topLeft,null==A?void 0:A.topRight,null==A?void 0:A.bottomRight,null==A?void 0:A.bottomLeft];if(g.some(A=>!A||!Number.isFinite(A.x)||!Number.isFinite(A.y)))return!1;for(let B=0;B<g.length;B++)for(let A=B+1;A<g.length;A++)if(H(g[B],g[A])<I)return!1;return!0}(i)&&N&&r>=W&&h>=M&&l<=L&&s>=b&&J>=q&&J<=x&&F>=K&&G>=T,Z=.22*S+.14*m+.15*d+.08*(N?1:0)+.08*R+.13*k+.1*F+.05*G+.05*f;return{contour:A,corners:i,score:Z,confidence:v?Z:.33*Z,isValid:v,area:e,fillRatio:s,coverageRatio:h,cornersArea:c,approxCount:E,convex:N,edgeSupport:R,aspectRatio:l,minSide:r,rightAngleScore:F,oppositeSideConsistency:G,contourFitRatio:J,contourFitScore:f}}async function x(A,I,g,B,C={}){const E=C.debug?{}:{_timingsOnly:!0},i=[];E&&!E._timingsOnly&&(E.preprocessing={scaledDimensions:{width:I,height:g},scaleFactor:B,maxProcessingDimension:C.maxProcessingDimension||800});const o=function(A={}){const I=A.dilationKernelSize||3,g=A.dilationIterations||1,B=void 0===A.applyDilation||A.applyDilation,Q=[{name:"default",lowThreshold:A.lowThreshold,highThreshold:A.highThreshold,dilationKernelSize:I,dilationIterations:g,applyDilation:B}];if(!1===A.enableDetectionCascade)return Q;Q.push({name:"connect-edges",lowThreshold:A.lowThreshold,highThreshold:A.highThreshold,dilationKernelSize:Math.max(I,5),dilationIterations:Math.max(g,2),applyDilation:!0}),Q.push({name:"no-dilation",lowThreshold:A.lowThreshold,highThreshold:A.highThreshold,dilationKernelSize:I,dilationIterations:g,applyDilation:!1}),void 0===A.lowThreshold&&void 0===A.highThreshold&&Q.push({name:"fixed-mid-thresholds",lowThreshold:60,highThreshold:180,dilationKernelSize:I,dilationIterations:g,applyDilation:B});const C=[],E=new Set;for(const i of Q){const A=[i.lowThreshold,i.highThreshold,i.dilationKernelSize,i.dilationIterations,i.applyDilation].join(":");E.has(A)||(E.add(A),C.push(i))}return C}(C),t=[],e=async(E,o)=>{const t=E.name||`pass-${o+1}`,e=0===o?"":` (${t})`,a=C.debug?{}:{_timingsOnly:!0},n=await L(A,{width:I,height:g,lowThreshold:E.lowThreshold,highThreshold:E.highThreshold,dilationKernelSize:E.dilationKernelSize,dilationIterations:E.dilationIterations,applyDilation:E.applyDilation,debug:a,skipGrayscale:!0,useWasmBlur:!0,useWasmHysteresis:C.useWasmHysteresis,useWasmFullCanny:C.useWasmFullCanny});a.timings&&a.timings.forEach(A=>{"Edge Detection Total"!==A.step&&i.push({step:`${A.step}${e}`,ms:A.ms})});let s=performance.now();const c=Q(n,{minArea:(C.minArea||1e3)/(B*B),width:I,height:g});i.push({step:`Find Contours${e}`,ms:(performance.now()-s).toFixed(2)}),s=performance.now();const{best:h,candidates:D}=function(A,I,g,B,Q={}){const C=Q.maxCandidateContours||12,E=A.slice(0,C).map((A,C)=>({rankByArea:C,...q(A,I,g,B,Q)})).sort(b);return{best:E[0]||null,candidates:E}}(c,n,I,g,C);return i.push({step:`Corner Detection${e}`,ms:(performance.now()-s).toFixed(2)}),{name:t,params:{lowThreshold:E.lowThreshold,highThreshold:E.highThreshold,dilationKernelSize:E.dilationKernelSize,dilationIterations:E.dilationIterations,applyDilation:E.applyDilation},contours:c,best:h,candidates:D}},a=await e(o[0],0);if(t.push(a),function(A,I={}){if(!1===I.enableDetectionCascade)return!1;if(!A||!A.corners)return!0;const g=void 0!==I.minCascadeTriggerConfidence?I.minCascadeTriggerConfidence:.68;return!A.isValid||A.confidence<g||A.approxCount>5||A.rightAngleScore<.55||A.contourFitRatio<.14}(a.best,C))for(let Q=1;Q<o.length;Q++)t.push(await e(o[Q],Q));const n=[];for(const Q of t)for(const A of Q.candidates)n.push({...A,passName:Q.name,passParams:Q.params});n.sort(b);const s=n[0]||null,c=n;if(!s||!s.corners)return{success:!1,message:"No document detected",debug:E._timingsOnly?null:E,timings:i};E&&!E._timingsOnly&&(E.passes=t.map(A=>({name:A.name,params:A.params,contourCount:A.contours.length,bestCandidate:A.best?{score:A.best.score,confidence:A.best.confidence,isValid:A.best.isValid,approxCount:A.best.approxCount,coverageRatio:A.best.coverageRatio,fillRatio:A.best.fillRatio,rightAngleScore:A.best.rightAngleScore,contourFitRatio:A.best.contourFitRatio}:null})),E.candidates=c.map(A=>({passName:A.passName,rankByArea:A.rankByArea,area:A.area,fillRatio:A.fillRatio,coverageRatio:A.coverageRatio,cornersArea:A.cornersArea,approxCount:A.approxCount,convex:A.convex,edgeSupport:A.edgeSupport,aspectRatio:A.aspectRatio,minSide:A.minSide,rightAngleScore:A.rightAngleScore,oppositeSideConsistency:A.oppositeSideConsistency,contourFitRatio:A.contourFitRatio,contourFitScore:A.contourFitScore,score:A.score,confidence:A.confidence,isValid:A.isValid})),E.selectedCandidate=c[0]?{passName:c[0].passName,rankByArea:c[0].rankByArea,area:c[0].area,fillRatio:c[0].fillRatio,coverageRatio:c[0].coverageRatio,approxCount:c[0].approxCount,edgeSupport:c[0].edgeSupport,aspectRatio:c[0].aspectRatio,minSide:c[0].minSide,rightAngleScore:c[0].rightAngleScore,oppositeSideConsistency:c[0].oppositeSideConsistency,contourFitRatio:c[0].contourFitRatio,score:c[0].score,confidence:c[0].confidence,isValid:c[0].isValid}:null);const h=s.corners,D=s.contour;let r=h;return 1!==B&&(r={topLeft:{x:h.topLeft.x*B,y:h.topLeft.y*B},topRight:{x:h.topRight.x*B,y:h.topRight.y*B},bottomRight:{x:h.bottomRight.x*B,y:h.bottomRight.y*B},bottomLeft:{x:h.bottomLeft.x*B,y:h.bottomLeft.y*B}}),{success:!0,contour:D,corners:r,confidence:s.confidence,debug:E._timingsOnly?null:E,timings:i}}function K(A,I,g){const{topLeft:B,topRight:Q,bottomRight:C,bottomLeft:E}=g,i=Math.hypot(C.x-E.x,C.y-E.y),o=Math.hypot(Q.x-B.x,Q.y-B.y),t=Math.round(Math.max(i,o)),e=Math.hypot(Q.x-C.x,Q.y-C.y),a=Math.hypot(B.x-E.x,B.y-E.y),n=Math.round(Math.max(e,a));A.canvas.width=t,A.canvas.height=n;const s=function(A,I){const g=function(A,I){const g=A.length,B=A[0].length,Q=A.map(A=>A.slice()),C=I.slice();for(let i=0;i<B;i++){let A=i;for(let I=i+1;I<g;I++)Math.abs(Q[I][i])>Math.abs(Q[A][i])&&(A=I);[Q[i],Q[A]]=[Q[A],Q[i]],[C[i],C[A]]=[C[A],C[i]];for(let I=i+1;I<g;I++){const A=Q[I][i]/Q[i][i];for(let g=i;g<B;g++)Q[I][g]-=A*Q[i][g];C[I]-=A*C[i]}}const E=new Array(B);for(let i=B-1;i>=0;i--){let A=C[i];for(let I=i+1;I<B;I++)A-=Q[i][I]*E[I];E[i]=A/Q[i][i]}return E}(function(A){const g=[];for(let B=0;B<4;B++){const[Q,C]=A[B];g.push([Q,C,1,0,0,0,-Q*I[B][0],-C*I[B][0]]),g.push([0,0,0,Q,C,1,-Q*I[B][1],-C*I[B][1]])}return g}(A),[I[0][0],I[0][1],I[1][0],I[1][1],I[2][0],I[2][1],I[3][0],I[3][1]]);return[[g[0],g[1],g[2]],[g[3],g[4],g[5]],[g[6],g[7],1]]}([[B.x,B.y],[Q.x,Q.y],[C.x,C.y],[E.x,E.y]],[[0,0],[t-1,0],[t-1,n-1],[0,n-1]]);!function(A,I,g,B,Q){const C=I&&"number"==typeof I.width&&"number"==typeof I.height&&I.data,E=I.width||I.naturalWidth,i=I.height||I.naturalHeight,o=document.createElement("canvas");o.width=E,o.height=i;const t=o.getContext("2d",{willReadFrequently:!0});C?t.putImageData(I,0,0):t.drawImage(I,0,0,E,i);const e=t.getImageData(0,0,E,i).data,a=function(A){const I=A[0][0],g=A[0][1],B=A[0][2],Q=A[1][0],C=A[1][1],E=A[1][2],i=A[2][0],o=A[2][1],t=A[2][2],e=C*t-E*o,a=-(Q*t-E*i),n=Q*o-C*i,s=-(g*t-B*o),c=I*t-B*i,h=-(I*o-g*i),D=g*E-B*C,r=-(I*E-B*Q),y=I*C-g*Q,w=I*e+g*a+B*n;if(0===w)throw new Error("Singular matrix");return[[e/w,s/w,D/w],[a/w,c/w,r/w],[n/w,h/w,y/w]]}(g),n=a[0][0],s=a[0][1],c=a[0][2],h=a[1][0],D=a[1][1],r=a[1][2],y=a[2][0],w=a[2][1],l=a[2][2],N=A.createImageData(B,Q),R=N.data,F=E-1,G=i-1;for(let J=0;J<Q;J++){const A=s*J+c,I=D*J+r,g=w*J+l;for(let Q=0;Q<B;Q++){const C=1/(y*Q+g),i=(n*Q+A)*C,o=(h*Q+I)*C,t=i<0?0:i>F?F:i,a=o<0?0:o>G?G:o,s=0|t,c=0|a,D=s<F?s+1:s,r=c<G?c+1:c,w=t-s,l=a-c,N=1-w,f=1-l,d=N*f,S=w*f,m=N*l,k=w*l,u=c*E+s<<2,M=c*E+D<<2,L=r*E+s<<2,U=r*E+D<<2,H=J*B+Q<<2;R[H]=e[u]*d+e[M]*S+e[L]*m+e[U]*k+.5|0,R[H+1]=e[u+1]*d+e[M+1]*S+e[L+1]*m+e[U+1]*k+.5|0,R[H+2]=e[u+2]*d+e[M+2]*S+e[L+2]*m+e[U+2]*k+.5|0,R[H+3]=255}}A.putImageData(N,0,0)}(A,I,s,t,n)}async function T(A,I,g={}){const B=g.output||"canvas";if(!(I&&I.topLeft&&I.topRight&&I.bottomRight&&I.bottomLeft))return{output:null,corners:null,success:!1,message:"Invalid corner points provided"};try{const g=document.createElement("canvas");let Q;return K(g.getContext("2d"),A,I),Q="canvas"===B?g:"imagedata"===B?g.getContext("2d").getImageData(0,0,g.width,g.height):"dataurl"===B?g.toDataURL():g,{output:Q,corners:I,success:!0,message:"Document extracted successfully"}}catch(Q){return{output:null,corners:I,success:!1,message:`Extraction failed: ${Q.message}`}}}async function W(A,I={}){const g=[],B=performance.now(),Q=I.mode||"detect",C=I.output||"canvas";I.debug;const E=I.maxProcessingDimension||800;let i=performance.now();const{grayscaleData:o,imageData:t,scaleFactor:e,originalDimensions:a,scaledDimensions:n}=await async function(A,I=800){let g,B;const Q=A&&"number"==typeof A.width&&"number"==typeof A.height&&A.data;if(Q)g=A.width,B=A.height;else{if(!A)throw new Error("No image provided");g=A.width||A.naturalWidth,B=A.height||A.naturalHeight}const C=Math.max(g,B);let E,i,o;if(C<=I)E=g,i=B,o=1;else{const A=I/C;E=Math.round(g*A),i=Math.round(B*A),o=1/A}const t="undefined"!=typeof OffscreenCanvas,e=t?new OffscreenCanvas(E,i):document.createElement("canvas");t||(e.width=E,e.height=i);const a=e.getContext("2d",{willReadFrequently:!0});if(a.imageSmoothingEnabled=!0,a.imageSmoothingQuality="medium",Q){const I=t?new OffscreenCanvas(g,B):document.createElement("canvas");t||(I.width=g,I.height=B),I.getContext("2d").putImageData(A,0,0),a.drawImage(I,0,0,g,B,0,0,E,i)}else a.drawImage(A,0,0,g,B,0,0,E,i);const n=a.getImageData(0,0,E,i),s=n.data,c=new Uint8ClampedArray(E*i);for(let h=0,D=0;h<s.length;h+=4,D++){const A=54*s[h]+183*s[h+1]+19*s[h+2]>>8;c[D]=A,s[h]=s[h+1]=s[h+2]=A}return{grayscaleData:c,imageData:n,scaleFactor:o,originalDimensions:{width:g,height:B},scaledDimensions:{width:E,height:i}}}(A,E);g.push({step:"Image Prep + Scale + Gray",ms:(performance.now()-i).toFixed(2)});const s=await x(o,n.width,n.height,e,I);if(s.timings&&s.timings.forEach(A=>g.push(A)),!s.success){const A=performance.now();return g.unshift({step:"Total",ms:(A-B).toFixed(2)}),{output:null,corners:null,contour:null,confidence:s.confidence||null,debug:s.debug,success:!1,message:s.message||"No document detected",timings:g}}let c,h;if("detect"===Q)h=null;else if("extract"===Q){i=performance.now(),c=document.createElement("canvas");K(c.getContext("2d"),A,s.corners),g.push({step:"Perspective Transform",ms:(performance.now()-i).toFixed(2)})}"detect"!==Q&&c&&(i=performance.now(),h="canvas"===C?c:"imagedata"===C?c.getContext("2d").getImageData(0,0,c.width,c.height):"dataurl"===C?c.toDataURL():c,g.push({step:"Output Conversion",ms:(performance.now()-i).toFixed(2)}));const D=performance.now();return g.unshift({step:"Total",ms:(D-B).toFixed(2)}),{output:h,corners:s.corners,contour:s.contour,confidence:s.confidence||null,debug:s.debug,success:!0,message:"Document detected",timings:g}}const v=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"}));A.Scanner=class{constructor(A={}){this.defaultOptions={maxProcessingDimension:800,mode:"detect",output:"canvas",...A},this.initialized=!1}async initialize(){this.initialized||(await k(),this.initialized=!0)}async scan(A,I={}){this.initialized||await this.initialize();const g={...this.defaultOptions,...I};return await W(A,g)}async extract(A,I,g={}){this.initialized||await this.initialize();const B={...this.defaultOptions,...g};return await T(A,I,B)}},A.extractDocument=T,A.initialize=async function(){return await k()},A.scanDocument=W,Object.defineProperty(A,Symbol.toStringTag,{value:"Module"})});
|
|
1
|
+
!function(A,I){"object"==typeof exports&&"undefined"!=typeof module?I(exports):"function"==typeof define&&define.amd?define(["exports"],I):I((A="undefined"!=typeof globalThis?globalThis:A||self).scanic={})}(this,function(A){"use strict";var I="undefined"!=typeof document?document.currentScript:null;const g=1e3,B=10;function Q(A,I={}){const Q=I.width||Math.sqrt(A.length),i=I.height||A.length/Q,t=void 0!==I.mode?I.mode:1,o=void 0!==I.method?I.method:2,e=I.minArea||g,n=Q+2,a=i+2,s=new Int32Array(n*a);for(let g=0;g<i;g++)for(let I=0;I<Q;I++)A[g*Q+I]>0&&(s[(g+1)*n+(I+1)]=1);const r=[];let c=2;for(let g=1;g<=i;g++)for(let A=1;A<=Q;A++){const I=s[g*n+A],Q=s[g*n+(A-1)];let i=null,e=!1,h=-1;if(1===I&&0===Q?(e=!0,i={x:A,y:g},h=2):0===I&&Q>=1&&-1!==Q&&1===Q&&(e=!1,i={x:A-1,y:g},h=6),i){if(0===t&&!e){s[i.y*n+i.x]=-1;continue}const A=c++,I=C(s,n,a,i,h,A);if(I&&I.length>0){let g=I;2===o&&(g=E(I));const Q=g.map(A=>({x:A.x-1,y:A.y-1}));if(Q.length>=(2===o?4:B)){const I={id:A,points:Q,isOuter:e};r.push(I)}}else 1===s[i.y*n+i.x]&&(s[i.y*n+i.x]=A)}}r.forEach(A=>{A.area=function(A){let I=0;const g=A.length;if(g<3)return 0;for(let B=0;B<g;B++){const Q=(B+1)%g;I+=A[B].x*A[Q].y,I-=A[Q].x*A[B].y}return Math.abs(I)/2}(A.points),A.boundingBox=function(A){if(0===A.length)return{minX:0,minY:0,maxX:0,maxY:0};let I=A[0].x,g=A[0].y,B=A[0].x,Q=A[0].y;for(let C=1;C<A.length;C++){const E=A[C];I=Math.min(I,E.x),g=Math.min(g,E.y),B=Math.max(B,E.x),Q=Math.max(Q,E.y)}return{minX:I,minY:g,maxX:B,maxY:Q}}(A.points)});const h=r.filter(A=>A.area>=e);return h.sort((A,I)=>I.area-A.area),I.debug&&(I.debug.labels=s,I.debug.rawContours=r,I.debug.finalContours=h),h}function C(A,I,g,B,Q,C){const E=[],i=new Set;let t=B.x,o=B.y;const e=t,n=o;let a=-1;A[n*I+e]=C;let s=0;const r=I*g,c=[0,1,1,1,0,-1,-1,-1],h=[-1,-1,0,1,1,1,0,-1];for(;s++<r;){let B;if(-1===a){let C=!1;for(let E=0;E<8;E++){B=Q+E&7;const i=t+c[B],e=o+h[B];if(i>=0&&i<I&&e>=0&&e<g&&A[e*I+i]>0){C=!0;break}}if(!C)return null}else B=a+2&7;let s=-1,r=-1;for(let Q=0;Q<8;Q++){const C=B+Q&7,E=t+c[C],i=o+h[C];if(E>=0&&E<I&&i>=0&&i<g&&A[i*I+E]>0){s=E,r=i,a=C+4&7;break}}if(-1===s){0===E.length&&E.push({x:t,y:o});break}const y=o*I+t;if(i.has(y))return E;E.push({x:t,y:o}),i.add(y);const l=r*I+s;if(1===A[l]&&(A[l]=C),t=s,o=r,t===e&&o===n)break}return s>=r?null:E}function E(A){const I=A.length;if(I<=2)return A;const g=[],B=A[I-1],Q=A[0];let C=B,E=Q,i=A[1],t=E.x-C.x,o=E.y-C.y,e=i.x-E.x,n=i.y-E.y;t*n!==o*e&&g.push(E);for(let a=1;a<I-1;a++)C=A[a-1],E=A[a],i=A[a+1],t=E.x-C.x,o=E.y-C.y,e=i.x-E.x,n=i.y-E.y,t*n!==o*e&&g.push(E);if(C=A[I-2],E=B,i=Q,t=E.x-C.x,o=E.y-C.y,e=i.x-E.x,n=i.y-E.y,t*n!==o*e&&g.push(E),0===g.length){if(1===I)return[A[0]];if(2===I)return A;let g=0,B=1;const C=Q.x,E=Q.y;for(let Q=1;Q<I;Q++){const I=A[Q],i=I.x-C,t=I.y-E,o=i*i+t*t;o>g&&(g=o,B=Q)}return[Q,A[B]]}return g}function i(A,I=1){if(A.length<=2)return A;let g=0,B=0;const Q=A[0],C=A[A.length-1];for(let E=1;E<A.length-1;E++){const I=t(A[E],Q,C);I>g&&(g=I,B=E)}if(g>I){const g=i(A.slice(0,B+1),I),Q=i(A.slice(B),I);return g.slice(0,-1).concat(Q)}return[Q,C]}function t(A,I,g){const B=g.x-I.x,Q=g.y-I.y,C=B*B+Q*Q;if(0===C)return Math.sqrt(Math.pow(A.x-I.x,2)+Math.pow(A.y-I.y,2));const E=((A.x-I.x)*B+(A.y-I.y)*Q)/C;let i,t;E<0?(i=I.x,t=I.y):E>1?(i=g.x,t=g.y):(i=I.x+E*B,t=I.y+E*Q);const o=A.x-i,e=A.y-t;return Math.sqrt(o*o+e*e)}function o(A,I=.02){return i(A,I*function(A){let I=0;const g=A.length;if(g<2)return 0;for(let B=0;B<g;B++){const Q=(B+1)%g,C=A[B].x-A[Q].x,E=A[B].y-A[Q].y;I+=Math.sqrt(C*C+E*E)}return I}(A))}function e(A,I){return Math.hypot(I.x-A.x,I.y-A.y)}function n(A){let I=0,g=0;for(const B of A)I+=B.x,g+=B.y;return{x:I/A.length,y:g/A.length}}function a(A,I={}){if(!A||!A.points||A.points.length<4)return null;const g=I.epsilon||.02,B=function(A,I){if(!A||A.length<4)return null;const g=[I,1.3*I,1.6*I,2*I],B=new Set;for(const Q of g){const I=Math.min(.12,Q),g=I.toFixed(4);if(B.has(g))continue;B.add(g);const C=s(o(A,I));if(C&&4===C.length)return C}return null}(A.points,g);let Q;return B&&4===B.length?Q=function(A){if(4!==A.length)return null;const I=n(A),g=[...A].sort((A,g)=>Math.atan2(A.y-I.y,A.x-I.x)-Math.atan2(g.y-I.y,g.x-I.x));let B=1/0,Q=0;for(let E=0;E<4;E++){const A=g[E].x+g[E].y;A<B&&(B=A,Q=E)}const C=[g[Q],g[(Q+1)%4],g[(Q+2)%4],g[(Q+3)%4]];return{topLeft:C[0],topRight:C[1],bottomRight:C[2],bottomLeft:C[3]}}(B):(Q=function(A){if(!A||A.length<4)return null;const I=n(A);let g=null,B=null,Q=null,C=null,E=0,i=0,t=0,o=0;for(const n of A){const A=e(n,I);n.x<I.x&&n.y<I.y?A>E&&(g=n,E=A):n.x>I.x&&n.y<I.y?A>i&&(B=n,i=A):n.x>I.x&&n.y>I.y?A>t&&(Q=n,t=A):n.x<I.x&&n.y>I.y&&A>o&&(C=n,o=A)}if(!(g&&B&&Q&&C))return null;return{topLeft:g,topRight:B,bottomRight:Q,bottomLeft:C}}(A.points),Q&&Q.topLeft&&Q.topRight&&Q.bottomRight&&Q.bottomLeft||(Q=function(A){if(!A||0===A.length)return null;let I=A[0],g=A[0],B=A[0],Q=A[0],C=I.x+I.y,E=g.x-g.y,i=B.x+B.y,t=Q.x-Q.y;for(let o=1;o<A.length;o++){const e=A[o],n=e.x+e.y,a=e.x-e.y;n<C&&(C=n,I=e),n>i&&(i=n,B=e),a>E&&(E=a,g=e),a<t&&(t=a,Q=e)}return{topLeft:I,topRight:g,bottomRight:B,bottomLeft:Q}}(A.points))),Q&&Q.topLeft&&Q.topRight&&Q.bottomRight&&Q.bottomLeft?Q:null}function s(A){if(!A||A.length<4)return null;if(4===A.length)return A;if(A.length>8)return null;let I=function(A,I){if(!A||0===A.length)return[];const g=[];for(const B of A)(0===g.length||e(B,g[g.length-1])>I)&&g.push(B);g.length>2&&e(g[0],g[g.length-1])<=I&&g.pop();return g}(A,6);return 4===I.length?I:(I.length,null)}let r,c=null;function h(){return null!==c&&0!==c.byteLength||(c=new Uint8Array(r.memory.buffer)),c}let y=0;function l(A,I){const g=I(1*A.length,1)>>>0;return h().set(A,g/1),y=A.length,g}function D(A,I){return A>>>=0,h().subarray(A/1,A/1+I)}let w=null;function f(){return null!==w&&0!==w.byteLength||(w=new Float32Array(r.memory.buffer)),w}function d(A,I,g,B,Q){const C=function(A,I){const g=I(4*A.length,4)>>>0;return f().set(A,g/4),y=A.length,g}(A,r.__wbindgen_malloc),E=y,i=r.hysteresis_thresholding(C,E,I,g,B,Q);var t=D(i[0],i[1]).slice();return r.__wbindgen_free(i[0],1*i[1],1),t}let u=null;function R(A,I){const g=I(2*A.length,2)>>>0;return(null!==u&&0!==u.byteLength||(u=new Uint16Array(r.memory.buffer)),u).set(A,g/2),y=A.length,g}function m(A,I,g,B,Q){const C=R(A,r.__wbindgen_malloc),E=y,i=R(I,r.__wbindgen_malloc),t=y,o=r.non_maximum_suppression(C,E,i,t,g,B,Q);var e,n,a=(e=o[0],n=o[1],e>>>=0,f().subarray(e/4,e/4+n)).slice();return r.__wbindgen_free(o[0],4*o[1],4),a}async function N(A){if(void 0!==r)return r;void 0!==A&&Object.getPrototypeOf(A)===Object.prototype&&({module_or_path:A}=A),void 0===A&&(A=new URL("data:application/wasm;base64,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JAAgAiABIAJqIgFLBEBBAEEAEC0ACyADQQRqIAAoAgAiAiAAKAIEQQggASACQQF0IgIgASACSxsiASABQQhNGyIBQQFBARARIAMoAgRBAUYEQCADKAIIIAMoAgwQLQALIAMoAgghAiAAIAE2AgAgACACNgIEIANBEGokAAt5AQF/IwBBIGsiAiQAAn8gACgCAEGAgICAeEcEQCABIAAoAgQgACgCCBAwDAELIAJBEGogACgCDCgCACIAQQhqKQIANwMAIAJBGGogAEEQaikCADcDACACIAApAgA3AwggASgCACABKAIEIAJBCGoQBwsgAkEgaiQAC2kBA38jAEEQayIBJAAgAUEEaiAAKAIAIgIgACgCBEEEIAJBAXQiAiACQQRNGyICQQRBBBARIAEoAgRBAUYEQCABKAIIIAEoAgwQLQALIAEoAgghAyAAIAI2AgAgACADNgIEIAFBEGokAAtpAQN/IwBBEGsiASQAIAFBBGogACgCACICIAAoAgRBBCACQQF0IgIgAkEETRsiAkEEQQgQESABKAIEQQFGBEAgASgCCCABKAIMEC0ACyABKAIIIQMgACACNgIAIAAgAzYCBCABQRBqJAALaQEDfyMAQRBrIgEkACABQQRqIAAoAgAiAiAAKAIEQQQgAkEBdCICIAJBBE0bIgJBAkECEBEgASgCBEEBRgRAIAEoAgggASgCDBAtAAsgASgCCCEDIAAgAjYCACAAIAM2AgQgAUEQaiQACxIAIwBBMGsiACQAIABBMGokAAtoAgF/AX4jAEEwayIDJAAgAyABNgIEIAMgADYCACADQQI2AgwgA0Hkl8AANgIIIANCAjcCFCADQoCAgIAwIgQgA62ENwMoIAMgBCADQQRqrYQ3AyAgAyADQSBqNgIQIANBCGogAhAmAAtHAQF/IAAoAgAgACgCCCIDayACSQRAIAAgAyACEBIgACgCCCEDCyACBEAgACgCBCADaiABIAL8CgAACyAAIAIgA2o2AghBAAtEAQJ/IAEoAgQhAiABKAIAIQNBCEEEEDUiAUUEQEEEQQgQOQALIAEgAjYCBCABIAM2AgAgAEHcksAANgIEIAAgATYCAAvGAgACQCAAIAJNBEAgACABTSABIAJLcg0BIwBBMGsiAiQAIAIgATYCBCACIAA2AgAgAkECNgIMIAJB2JbAADYCCCACQgI3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IAAAABwAEAAMAAAAEgAAABcAAAAcABAADAAAABcAAAAZAAAAHAAQAAwAAAAUAAAAGQAAABwAEAAMAAAAUQAAAB4AAAAcABAADAAAAFIAAAAeAAAATGF6eSBpbnN0YW5jZSBoYXMgcHJldmlvdXNseSBiZWVuIHBvaXNvbmVkAAA8CBAAKgAAAEgBEABaAAAACAMAABkAAAByZWVudHJhbnQgaW5pdAAAgAgQAA4AAABIARAAWgAAAHoCAAANAAAAfP2LMlfmV/kC30S/40jnr21dy9YsUOtjeEGmV3Ebi7ltZW1vcnkgYWxsb2NhdGlvbiBvZiAgYnl0ZXMgZmFpbGVkAADICBAAFQAAAN0IEAANAAAALwEQABgAAABkAQAACQAAAAQAAAAMAAAABAAAAAUAAAAGAAAABwAAAAAAAAAIAAAABAAAAAgAAAAJAAAACgAAAAsAAAAMAAAAEAAAAAQAAAANAAAADgAAAA8AAAAQAAAAAAAAAAgAAAAEAAAAEQAAAGFzc2VydGlvbiBmYWlsZWQ6IHBzaXplID49IHNpemUgKyBtaW5fb3ZlcmhlYWQAAAQBEAAqAAAAsQQAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA8PSBzaXplICsgbWF4X292ZXJoZWFkAAAEARAAKgAAALcEAAANAAAABAAAAAwAAAAEAAAAEgAAAGNhcGFjaXR5IG92ZXJmbG93AAAA/AkQABEAAADjABAAIAAAABwAAAAFAAAAMDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUxNjE3MTgxOTIwMjEyMjIzMjQyNTI2MjcyODI5MzAzMTMyMzMzNDM1MzYzNzM4Mzk0MDQxNDI0MzQ0NDU0NjQ3NDg0OTUwNTE1MjUzNTQ1NTU2NTc1ODU5NjA2MTYyNjM2NDY1NjY2NzY4Njk3MDcxNzI3Mzc0NzU3Njc3Nzg3OTgwODE4MjgzODQ4NTg2ODc4ODg5OTA5MTkyOTM5NDk1OTY5Nzk4OTlyYW5nZSBlbmQgaW5kZXggIG91dCBvZiByYW5nZSBmb3Igc2xpY2Ugb2YgbGVuZ3RoIAAA8AoQABAAAAAACxAAIgAAAHNsaWNlIGluZGV4IHN0YXJ0cyBhdCAgYnV0IGVuZHMgYXQgADQLEAAWAAAASgsQAA0AAAByYW5nZSBzdGFydCBpbmRleCAAAGgLEAASAAAAAAsQACIAAABhdHRlbXB0IHRvIGRpdmlkZSBieSB6ZXJvAAAAjAsQABkAAABpbmRleCBvdXQgb2YgYm91bmRzOiB0aGUgbGVuIGlzICBidXQgdGhlIGluZGV4IGlzIAAAsAsQACAAAADQCxAAEgAAAAAAAD8AAAC/AEGUmMAACwEBAHwJcHJvZHVjZXJzAghsYW5ndWFnZQEEUnVzdAAMcHJvY2Vzc2VkLWJ5AwVydXN0Yx0xLjkyLjAgKGRlZDVjMDZjZiAyMDI1LTEyLTA4KQZ3YWxydXMGMC4yMy4zDHdhc20tYmluZGdlbhMwLjIuMTAwICgyNDA1ZWMyYjQpAHQPdGFyZ2V0X2ZlYXR1cmVzBysPbXV0YWJsZS1nbG9iYWxzKxNub250cmFwcGluZy1mcHRvaW50KwdzaW1kMTI4KwtidWxrLW1lbW9yeSsIc2lnbi1leHQrD3JlZmVyZW5jZS10eXBlcysKbXVsdGl2YWx1ZQ==","undefined"==typeof document&&"undefined"==typeof location?require("url").pathToFileURL(__filename).href:"undefined"==typeof document?location.href:I&&"SCRIPT"===I.tagName.toUpperCase()&&I.src||new URL("scanic.umd.cjs",document.baseURI).href));const g=function(){const A={wbg:{}};return A.wbg.__wbindgen_init_externref_table=function(){const A=r.__wbindgen_export_0,I=A.grow(4);A.set(0,void 0),A.set(I+0,void 0),A.set(I+1,null),A.set(I+2,!0),A.set(I+3,!1)},A}();("string"==typeof A||"function"==typeof Request&&A instanceof Request||"function"==typeof URL&&A instanceof URL)&&(A=fetch(A));const{instance:B,module:Q}=await async function(A,I){if("function"==typeof Response&&A instanceof Response){if("function"==typeof WebAssembly.instantiateStreaming)try{return await WebAssembly.instantiateStreaming(A,I)}catch(g){if("application/wasm"==A.headers.get("Content-Type"))throw g}const B=await A.arrayBuffer();return await WebAssembly.instantiate(B,I)}{const g=await WebAssembly.instantiate(A,I);return g instanceof WebAssembly.Instance?{instance:g,module:A}:g}}(await A,g);return function(A,I){return r=A.exports,N.__wbindgen_wasm_module=I,w=null,u=null,c=null,r.__wbindgen_start(),r}(B,Q)}let F=null,G=!1;async function J(){if("undefined"!=typeof process&&(null==(A=process.versions)?void 0:A.node))try{const A="node:fs/promises",g="node:url",{readFile:B}=await import(A),{fileURLToPath:Q}=await import(g),C=new URL("undefined"==typeof document&&"undefined"==typeof location?require("url").pathToFileURL(__filename).href:"undefined"==typeof document?location.href:I&&"SCRIPT"===I.tagName.toUpperCase()&&I.src||new URL("scanic.umd.cjs",document.baseURI).href);C.search="",C.hash="";const E=new URL("../wasm_blur/pkg/wasm_blur_bg.wasm",C),i=await B(Q(E));return await N({module_or_path:i})}catch{return await N()}var A;return await N()}function S(){return F||(F=J().catch(A=>{throw F=null,A})),F}function k(A,I,g,B=5,Q=0){0===Q&&(Q=.3*(.5*(B-1)-1)+.8);const C=Math.floor(B/2),E=function(A,I){const g=new Float32Array(A),B=Math.floor(A/2);let Q=0;for(let C=0;C<A;C++){const A=C-B;g[C]=Math.exp(-A*A/(2*I*I)),Q+=g[C]}for(let C=0;C<A;C++)g[C]/=Q;return g}(B,Q),i=new Uint8ClampedArray(I*g),t=new Uint8ClampedArray(I*g);for(let o=0;o<g;o++){const g=o*I;for(let B=0;B<I;B++){let Q=0;for(let i=-C;i<=C;i++){Q+=A[g+Math.min(I-1,Math.max(0,B+i))]*E[C+i]}i[g+B]=Q}}for(let o=0;o<I;o++)for(let A=0;A<g;A++){let B=0;for(let Q=-C;Q<=C;Q++){B+=i[Math.min(g-1,Math.max(0,A+Q))*I+o]*E[C+Q]}t[A*I+o]=Math.round(B)}return t}function M(A,I,g,B,Q){const C=new Uint8Array(I*g),E=[];for(let o=1;o<g-1;o++)for(let g=1;g<I-1;g++){const i=o*I+g,t=A[i];t>=Q?(C[i]=2,E.push({x:g,y:o})):C[i]=t>=B?0:1}for(let o=0;o<I;o++)C[o]=1,C[(g-1)*I+o]=1;for(let o=1;o<g-1;o++)C[o*I]=1,C[o*I+I-1]=1;const i=[-1,0,1,-1,1,-1,0,1],t=[-1,-1,-1,0,0,1,1,1];for(;E.length>0;){const{x:A,y:g}=E.pop();for(let B=0;B<8;B++){const Q=A+i[B],o=g+t[B],e=o*I+Q;0===C[e]&&(C[e]=2,E.push({x:Q,y:o}))}}return C}async function p(A,I={}){const g=!(!I.debug||I.debug._timingsOnly),B=[],Q=performance.now();let C,E,i;if(I.skipGrayscale||!1)C=I.width,E=I.height,i=A,g&&(I.debug.grayscale=i);else{C=A.width,E=A.height;let Q=performance.now();i=function(A){const{width:I,height:g,data:B}=A,Q=new Uint8ClampedArray(I*g);for(let C=0,E=0;C<B.length;C+=4,E++)Q[E]=54*B[C]+183*B[C+1]+19*B[C+2]>>8;return Q}(A);let t=performance.now();B.push({step:"Grayscale",ms:(t-Q).toFixed(2)}),g&&(I.debug.grayscale=i)}let t=void 0!==I.lowThreshold?I.lowThreshold:null,o=void 0!==I.highThreshold?I.highThreshold:null;if(null===t||null===o){const A=1024,I=new Uint32Array(A);let g=0;for(let t=1;t<E-1;t++)for(let B=1;B<C-1;B++){const Q=t*C+B,E=-i[Q-C-1]+i[Q-C+1]-2*i[Q-1]+2*i[Q+1]-i[Q+C-1]+i[Q+C+1],o=-i[Q-C-1]-2*i[Q-C]-i[Q-C+1]+i[Q+C-1]+2*i[Q+C]+i[Q+C+1];let e=Math.abs(E)+Math.abs(o);e>=A&&(e=A-1),e>0&&(I[e]++,g++)}const B=Math.round(.7*g);let Q=0,e=75;for(let C=1;C<A;C++)if(Q+=I[C],Q>=B){e=C;break}null===t&&(t=Math.max(5,Math.round(.5*e))),null===o&&(o=Math.min(500,Math.round(1.5*e)))}const e=I.kernelSize||5,n=I.sigma||0,a=void 0!==I.L2gradient&&I.L2gradient,s=void 0===I.applyDilation||I.applyDilation,c=I.dilationKernelSize||5,h=void 0!==I.useWasmHysteresis&&I.useWasmHysteresis,w=void 0!==I.useWasmFullCanny&&I.useWasmFullCanny;if(t>=o&&([t,o]=[o,t]),w)try{await S();const A=performance.now(),h=new Uint8ClampedArray(function(A,I,g,B,Q,C,E,i,t,o){const e=l(A,r.__wbindgen_malloc),n=y,a=r.canny_edge_detector_full(e,n,I,g,B,Q,C,E,i,t,o);var s=D(a[0],a[1]).slice();return r.__wbindgen_free(a[0],1*a[1],1),s}(i,C,E,t,o,e,n,a,s,c)),w=(performance.now()-A).toFixed(2);B.push({step:"Edge Processing (WASM)",ms:w}),g&&(I.debug.finalEdges=h),I.debug?I.debug.timings=B:I.debug={timings:B};const f=performance.now();return B.unshift({step:"Edge Detection Total",ms:(f-Q).toFixed(2)}),h}catch(Y){if(!G){G=!0;Y instanceof Error?Y.message:String(Y)}}let f,u,R,N,F,J;f=performance.now();try{await S(),R=function(A,I,g,B,Q){const C=l(A,r.__wbindgen_malloc),E=y,i=r.blur(C,E,I,g,B,Q);var t=D(i[0],i[1]).slice();return r.__wbindgen_free(i[0],1*i[1],1),t}(i,C,E,e,n)}catch(q){R=k(i,C,E,e,n)}u=performance.now(),B.push({step:"Gaussian Blur",ms:(u-f).toFixed(2)}),g&&(I.debug.blurred=R),f=performance.now();{const A=function(A,I,g){const B=new Int16Array(I*g),Q=new Int16Array(I*g);for(let C=1;C<g-1;C++){const g=C*I,E=(C-1)*I,i=(C+1)*I;for(let C=1;C<I-1;C++){const I=g+C,t=A[E+C-1],o=A[E+C],e=A[E+C+1],n=A[g+C-1],a=A[g+C+1],s=A[i+C-1],r=A[i+C],c=A[i+C+1],h=e-t+2*(a-n)+(c-s),y=s+2*r+c-(t+2*o+e);B[I]=h,Q[I]=y}}return{dx:B,dy:Q}}(R,C,E);N=A.dx,F=A.dy}u=performance.now(),B.push({step:"Gradients",ms:(u-f).toFixed(2)}),f=performance.now();try{await S(),J=await m(N,F,C,E,a)}catch(q){J=function(A,I,g,B,Q){const C=new Float32Array(g*B),E=new Float32Array(g*B);for(let i=0;i<A.length;i++){const g=A[i],B=I[i];C[i]=Q?Math.sqrt(g*g+B*B):Math.abs(g)+Math.abs(B)}for(let i=1;i<B-1;i++)for(let B=1;B<g-1;B++){const Q=i*g+B,t=C[Q];if(0===t){E[Q]=0;continue}const o=A[Q],e=I[Q];let n=0,a=0;const s=Math.abs(o),r=Math.abs(e);if(r>2.4142*s)n=C[Q-g],a=C[Q+g];else if(s>2.4142*r)n=C[Q-1],a=C[Q+1];else{const A=(o^e)<0?-1:1;e>0?(n=C[(i-1)*g+(B-A)],a=C[(i+1)*g+(B+A)]):(n=C[(i+1)*g+(B-A)],a=C[(i-1)*g+(B+A)]),o>0&&e>0||o<0&&e<0?(n=C[(i-1)*g+(B+1)],a=C[(i+1)*g+(B-1)]):(n=C[(i-1)*g+(B-1)],a=C[(i+1)*g+(B+1)])}E[Q]=t>=n&&t>=a?t:0}return E}(N,F,C,E,a)}u=performance.now(),B.push({step:"Non-Max Suppression",ms:(u-f).toFixed(2)}),f=performance.now();const p=a?t*t:t,L=a?o*o:o;let U;if(h)try{await S(),U=d(J,C,E,p,L)}catch(q){U=M(J,C,E,p,L)}else U=M(J,C,E,p,L);u=performance.now(),B.push({step:"Hysteresis",ms:(u-f).toFixed(2)}),f=performance.now();const b=new Uint8ClampedArray(C*E);for(let r=0;r<U.length;r++)b[r]=2===U[r]?255:0;u=performance.now(),B.push({step:"Binary Image",ms:(u-f).toFixed(2)}),f=performance.now();let H=b;if(s)try{await S(),H=function(A,I,g,B){const Q=l(A,r.__wbindgen_malloc),C=y,E=r.dilate(Q,C,I,g,B);var i=D(E[0],E[1]).slice();return r.__wbindgen_free(E[0],1*E[1],1),i}(b,C,E,c)}catch(q){H=function(A,I,g,B=5){const Q=Math.floor(B/2),C=new Uint8ClampedArray(I*g),E=new Uint8ClampedArray(I*g);for(let i=0;i<g;i++){const g=i*I;for(let B=0;B<I;B++){let E=0;for(let C=-Q;C<=Q;C++){const Q=B+C;if(Q>=0&&Q<I){const I=A[g+Q];I>E&&(E=I)}}C[g+B]=E}}for(let i=0;i<I;i++)for(let A=0;A<g;A++){let B=0;for(let E=-Q;E<=Q;E++){const Q=A+E;if(Q>=0&&Q<g){const A=C[Q*I+i];A>B&&(B=A)}}E[A*I+i]=B}return E}(b,C,E,c)}if(u=performance.now(),B.push({step:"Dilation",ms:(u-f).toFixed(2)}),g){I.debug.dx=N,I.debug.dy=F;const A=new Float32Array(C*E);for(let I=0;I<N.length;I++){const g=N[I],B=F[I];A[I]=a?Math.sqrt(g*g+B*B):Math.abs(g)+Math.abs(B)}I.debug.magnitude=A,I.debug.suppressed=J,I.debug.edgeMap=U,I.debug.cannyEdges=b,I.debug.finalEdges=H}I.debug?I.debug.timings=B:I.debug||(I.debug={timings:B});const x=performance.now();return B.unshift({step:"Edge Detection Total",ms:(x-Q).toFixed(2)}),H}function L(A){return{topLeft:{x:A.topLeft.x,y:A.topLeft.y},topRight:{x:A.topRight.x,y:A.topRight.y},bottomRight:{x:A.bottomRight.x,y:A.bottomRight.y},bottomLeft:{x:A.bottomLeft.x,y:A.bottomLeft.y}}}function U(A,I){return Math.hypot(A.x-I.x,A.y-I.y)}function b(A,I=4){const g=[null==A?void 0:A.topLeft,null==A?void 0:A.topRight,null==A?void 0:A.bottomRight,null==A?void 0:A.bottomLeft];if(g.some(A=>!A||!Number.isFinite(A.x)||!Number.isFinite(A.y)))return!1;for(let B=0;B<g.length;B++)for(let A=B+1;A<g.length;A++)if(U(g[B],g[A])<I)return!1;return!0}function H(A){const I=[A.topLeft,A.topRight,A.bottomRight,A.bottomLeft],g=[];for(let Q=0;Q<I.length;Q++){const A=I[Q],B=I[(Q+1)%I.length],C=I[(Q+2)%I.length],E=(B.x-A.x)*(C.y-B.y)-(B.y-A.y)*(C.x-B.x);Math.abs(E)<1e-6||g.push(Math.sign(E))}if(g.length<3)return!1;const B=g[0];return g.every(A=>A===B)}function x(A,I,g,B,Q,C){A.beginPath(),A.arc(I.x,I.y,g,0,2*Math.PI),A.fillStyle=B,A.fill(),A.lineWidth=C,A.strokeStyle=Q,A.stroke()}function Y(A){return A<=0?0:A>=1?1:A}function q(A,I){return Math.hypot(A.x-I.x,A.y-I.y)}function v(A){return[q(A.topLeft,A.topRight),q(A.topRight,A.bottomRight),q(A.bottomRight,A.bottomLeft),q(A.bottomLeft,A.topLeft)]}function K(A){const I=function(A){const I=[A.topLeft,A.topRight,A.bottomRight,A.bottomLeft],g=[];for(let B=0;B<I.length;B++){const A=I[(B+I.length-1)%I.length],Q=I[B],C=I[(B+1)%I.length],E=A.x-Q.x,i=A.y-Q.y,t=C.x-Q.x,o=C.y-Q.y,e=E*t+i*o,n=Math.hypot(E,i),a=Math.hypot(t,o),s=Math.max(1e-6,n*a),r=Math.max(-1,Math.min(1,e/s));g.push(180*Math.acos(r)/Math.PI)}return g}(A);let g=0;for(const B of I){g+=Y(1-Math.abs(B-90)/55)}return g/Math.max(1,I.length)}function T(A,I){const g=Number(I.isValid)-Number(A.isValid);if(0!==g)return g;const B=I.confidence-A.confidence;if(!(Math.abs(B)<.015)&&0!==B)return B;const Q=Math.abs((A.approxCount??99)-4)-Math.abs((I.approxCount??99)-4);if(0!==Q)return Q;const C=(I.rightAngleScore??0)-(A.rightAngleScore??0);if(Math.abs(C)>1e-6)return C;const E=Math.abs(1-(A.contourFitRatio??1))-Math.abs(1-(I.contourFitRatio??1));return Math.abs(E)>1e-6?E:B||I.score-A.score||I.coverageRatio-A.coverageRatio||I.area-A.area}function W(A,I,g,B,Q={}){const C=Q.epsilon||.02,E=o(A.points,C).length,i=a(A,{epsilon:C});if(!i)return{contour:A,corners:null,score:0,confidence:0,isValid:!1,area:A.area||0,fillRatio:0,coverageRatio:0,cornersArea:0,approxCount:E,convex:!1,edgeSupport:0,aspectRatio:1/0,minSide:0,rightAngleScore:0,oppositeSideConsistency:0,contourFitRatio:0,contourFitScore:0};const t=g*B,e=A.area||0,n=A.boundingBox||{minX:0,minY:0,maxX:0,maxY:0},s=e/Math.max(1,(n.maxX-n.minX+1)*(n.maxY-n.minY+1)),r=function(A){if(!A)return 0;const I=[A.topLeft,A.topRight,A.bottomRight,A.bottomLeft];let g=0;for(let B=0;B<I.length;B++){const A=(B+1)%I.length;g+=I[B].x*I[A].y-I[A].x*I[B].y}return Math.abs(g)/2}(i),c=r/Math.max(1,t),h=v(i),y=Math.min(...h),l=(h[0]+h[2])/2,D=(h[1]+h[3])/2,w=l>D?l/Math.max(1e-6,D):D/Math.max(1e-6,l),f=function(A){const I=[A.topLeft,A.topRight,A.bottomRight,A.bottomLeft],g=[];for(let Q=0;Q<I.length;Q++){const A=I[Q],B=I[(Q+1)%I.length],C=I[(Q+2)%I.length],E=(B.x-A.x)*(C.y-B.y)-(B.y-A.y)*(C.x-B.x);Math.abs(E)<1e-6||g.push(Math.sign(E))}if(g.length<3)return!1;const B=g[0];return g.every(A=>A===B)}(i),d=function(A,I,g,B){if(!(null==A?void 0:A.points)||0===A.points.length)return 0;const Q=Math.max(1,Math.floor(A.points.length/240));let C=0,E=0;for(let i=0;i<A.points.length;i+=Q){const Q=A.points[i],t=Math.max(0,Math.min(g-1,0|Q.x)),o=Math.max(0,Math.min(B-1,0|Q.y));C++;let e=!1;for(let A=-1;A<=1&&!e;A++){const Q=o+A;if(!(Q<0||Q>=B))for(let A=-1;A<=1;A++){const B=t+A;if(!(B<0||B>=g)&&I[Q*g+B]>0){e=!0;break}}}e&&E++}return 0===C?0:E/C}(A,I,g,B),u=K(i),R=function(A){const I=v(A);return(Math.min(I[0],I[2])/Math.max(1e-6,Math.max(I[0],I[2]))+Math.min(I[1],I[3])/Math.max(1e-6,Math.max(I[1],I[3])))/2}(i),m=e/Math.max(1,r),N=Y(1-Math.abs(m-1)/.55),F=4===E?1:5===E?.9:6===E?.7:E<=8?.5:.28,G=Y(e/Math.max(1,.4*t)),J=Y((s-.08)/.72),S=Y((c-.03)/.82),k=void 0!==Q.minDocumentSideRatio?Q.minDocumentSideRatio:.06,M=void 0!==Q.minDocumentCoverageRatio?Q.minDocumentCoverageRatio:.04,p=void 0!==Q.maxDocumentAspectRatio?Q.maxDocumentAspectRatio:8,L=void 0!==Q.minDocumentFillRatio?Q.minDocumentFillRatio:.07,U=void 0!==Q.minContourFitRatio?Q.minContourFitRatio:.11,b=void 0!==Q.maxContourFitRatio?Q.maxContourFitRatio:1.2,H=void 0!==Q.minRightAngleScore?Q.minRightAngleScore:.42,x=void 0!==Q.minOppositeSideConsistency?Q.minOppositeSideConsistency:.3,T=Math.min(g,B)*k,W=function(A,I=6){const g=[null==A?void 0:A.topLeft,null==A?void 0:A.topRight,null==A?void 0:A.bottomRight,null==A?void 0:A.bottomLeft];if(g.some(A=>!A||!Number.isFinite(A.x)||!Number.isFinite(A.y)))return!1;for(let B=0;B<g.length;B++)for(let A=B+1;A<g.length;A++)if(q(g[B],g[A])<I)return!1;return!0}(i)&&f&&y>=T&&c>=M&&w<=p&&s>=L&&m>=U&&m<=b&&u>=H&&R>=x,P=.22*G+.14*J+.15*F+.08*(f?1:0)+.08*d+.13*S+.1*u+.05*R+.05*N;return{contour:A,corners:i,score:P,confidence:W?P:.33*P,isValid:W,area:e,fillRatio:s,coverageRatio:c,cornersArea:r,approxCount:E,convex:f,edgeSupport:d,aspectRatio:w,minSide:y,rightAngleScore:u,oppositeSideConsistency:R,contourFitRatio:m,contourFitScore:N}}async function P(A,I,g,B,C={}){const E=C.debug?{}:{_timingsOnly:!0},i=[];E&&!E._timingsOnly&&(E.preprocessing={scaledDimensions:{width:I,height:g},scaleFactor:B,maxProcessingDimension:C.maxProcessingDimension||800});const t=function(A={}){const I=A.dilationKernelSize||3,g=A.dilationIterations||1,B=void 0===A.applyDilation||A.applyDilation,Q=[{name:"default",lowThreshold:A.lowThreshold,highThreshold:A.highThreshold,dilationKernelSize:I,dilationIterations:g,applyDilation:B}];if(!1===A.enableDetectionCascade)return Q;Q.push({name:"connect-edges",lowThreshold:A.lowThreshold,highThreshold:A.highThreshold,dilationKernelSize:Math.max(I,5),dilationIterations:Math.max(g,2),applyDilation:!0}),Q.push({name:"no-dilation",lowThreshold:A.lowThreshold,highThreshold:A.highThreshold,dilationKernelSize:I,dilationIterations:g,applyDilation:!1}),void 0===A.lowThreshold&&void 0===A.highThreshold&&Q.push({name:"fixed-mid-thresholds",lowThreshold:60,highThreshold:180,dilationKernelSize:I,dilationIterations:g,applyDilation:B});const C=[],E=new Set;for(const i of Q){const A=[i.lowThreshold,i.highThreshold,i.dilationKernelSize,i.dilationIterations,i.applyDilation].join(":");E.has(A)||(E.add(A),C.push(i))}return C}(C),o=[],e=async(E,t)=>{const o=E.name||`pass-${t+1}`,e=0===t?"":` (${o})`,n=C.debug?{}:{_timingsOnly:!0},a=await p(A,{width:I,height:g,lowThreshold:E.lowThreshold,highThreshold:E.highThreshold,dilationKernelSize:E.dilationKernelSize,dilationIterations:E.dilationIterations,applyDilation:E.applyDilation,debug:n,skipGrayscale:!0,useWasmBlur:!0,useWasmHysteresis:C.useWasmHysteresis,useWasmFullCanny:C.useWasmFullCanny});n.timings&&n.timings.forEach(A=>{"Edge Detection Total"!==A.step&&i.push({step:`${A.step}${e}`,ms:A.ms})});let s=performance.now();const r=Q(a,{minArea:(C.minArea||1e3)/(B*B),width:I,height:g});i.push({step:`Find Contours${e}`,ms:(performance.now()-s).toFixed(2)}),s=performance.now();const{best:c,candidates:h}=function(A,I,g,B,Q={}){const C=Q.maxCandidateContours||12,E=A.slice(0,C).map((A,C)=>({rankByArea:C,...W(A,I,g,B,Q)})).sort(T);return{best:E[0]||null,candidates:E}}(r,a,I,g,C);return i.push({step:`Corner Detection${e}`,ms:(performance.now()-s).toFixed(2)}),{name:o,params:{lowThreshold:E.lowThreshold,highThreshold:E.highThreshold,dilationKernelSize:E.dilationKernelSize,dilationIterations:E.dilationIterations,applyDilation:E.applyDilation},contours:r,best:c,candidates:h}},n=await e(t[0],0);if(o.push(n),function(A,I={}){if(!1===I.enableDetectionCascade)return!1;if(!A||!A.corners)return!0;const g=void 0!==I.minCascadeTriggerConfidence?I.minCascadeTriggerConfidence:.68;return!A.isValid||A.confidence<g||A.approxCount>5||A.rightAngleScore<.55||A.contourFitRatio<.14}(n.best,C))for(let Q=1;Q<t.length;Q++)o.push(await e(t[Q],Q));const a=[];for(const Q of o)for(const A of Q.candidates)a.push({...A,passName:Q.name,passParams:Q.params});a.sort(T);const s=a[0]||null,r=a;if(!s||!s.corners)return{success:!1,message:"No document detected",debug:E._timingsOnly?null:E,timings:i};E&&!E._timingsOnly&&(E.passes=o.map(A=>({name:A.name,params:A.params,contourCount:A.contours.length,bestCandidate:A.best?{score:A.best.score,confidence:A.best.confidence,isValid:A.best.isValid,approxCount:A.best.approxCount,coverageRatio:A.best.coverageRatio,fillRatio:A.best.fillRatio,rightAngleScore:A.best.rightAngleScore,contourFitRatio:A.best.contourFitRatio}:null})),E.candidates=r.map(A=>({passName:A.passName,rankByArea:A.rankByArea,area:A.area,fillRatio:A.fillRatio,coverageRatio:A.coverageRatio,cornersArea:A.cornersArea,approxCount:A.approxCount,convex:A.convex,edgeSupport:A.edgeSupport,aspectRatio:A.aspectRatio,minSide:A.minSide,rightAngleScore:A.rightAngleScore,oppositeSideConsistency:A.oppositeSideConsistency,contourFitRatio:A.contourFitRatio,contourFitScore:A.contourFitScore,score:A.score,confidence:A.confidence,isValid:A.isValid})),E.selectedCandidate=r[0]?{passName:r[0].passName,rankByArea:r[0].rankByArea,area:r[0].area,fillRatio:r[0].fillRatio,coverageRatio:r[0].coverageRatio,approxCount:r[0].approxCount,edgeSupport:r[0].edgeSupport,aspectRatio:r[0].aspectRatio,minSide:r[0].minSide,rightAngleScore:r[0].rightAngleScore,oppositeSideConsistency:r[0].oppositeSideConsistency,contourFitRatio:r[0].contourFitRatio,score:r[0].score,confidence:r[0].confidence,isValid:r[0].isValid}:null);const c=s.corners,h=s.contour;let y=c;return 1!==B&&(y={topLeft:{x:c.topLeft.x*B,y:c.topLeft.y*B},topRight:{x:c.topRight.x*B,y:c.topRight.y*B},bottomRight:{x:c.bottomRight.x*B,y:c.bottomRight.y*B},bottomLeft:{x:c.bottomLeft.x*B,y:c.bottomLeft.y*B}}),{success:!0,contour:h,corners:y,confidence:s.confidence,debug:E._timingsOnly?null:E,timings:i}}function X(A,I,g){const{topLeft:B,topRight:Q,bottomRight:C,bottomLeft:E}=g,i=Math.hypot(C.x-E.x,C.y-E.y),t=Math.hypot(Q.x-B.x,Q.y-B.y),o=Math.round(Math.max(i,t)),e=Math.hypot(Q.x-C.x,Q.y-C.y),n=Math.hypot(B.x-E.x,B.y-E.y),a=Math.round(Math.max(e,n));A.canvas.width=o,A.canvas.height=a;const s=function(A,I){const g=function(A,I){const g=A.length,B=A[0].length,Q=A.map(A=>A.slice()),C=I.slice();for(let i=0;i<B;i++){let A=i;for(let I=i+1;I<g;I++)Math.abs(Q[I][i])>Math.abs(Q[A][i])&&(A=I);[Q[i],Q[A]]=[Q[A],Q[i]],[C[i],C[A]]=[C[A],C[i]];for(let I=i+1;I<g;I++){const A=Q[I][i]/Q[i][i];for(let g=i;g<B;g++)Q[I][g]-=A*Q[i][g];C[I]-=A*C[i]}}const E=new Array(B);for(let i=B-1;i>=0;i--){let A=C[i];for(let I=i+1;I<B;I++)A-=Q[i][I]*E[I];E[i]=A/Q[i][i]}return E}(function(A){const g=[];for(let B=0;B<4;B++){const[Q,C]=A[B];g.push([Q,C,1,0,0,0,-Q*I[B][0],-C*I[B][0]]),g.push([0,0,0,Q,C,1,-Q*I[B][1],-C*I[B][1]])}return g}(A),[I[0][0],I[0][1],I[1][0],I[1][1],I[2][0],I[2][1],I[3][0],I[3][1]]);return[[g[0],g[1],g[2]],[g[3],g[4],g[5]],[g[6],g[7],1]]}([[B.x,B.y],[Q.x,Q.y],[C.x,C.y],[E.x,E.y]],[[0,0],[o-1,0],[o-1,a-1],[0,a-1]]);!function(A,I,g,B,Q){const C=I&&"number"==typeof I.width&&"number"==typeof I.height&&I.data,E=I.width||I.naturalWidth,i=I.height||I.naturalHeight,t=document.createElement("canvas");t.width=E,t.height=i;const o=t.getContext("2d",{willReadFrequently:!0});C?o.putImageData(I,0,0):o.drawImage(I,0,0,E,i);const e=o.getImageData(0,0,E,i).data,n=function(A){const I=A[0][0],g=A[0][1],B=A[0][2],Q=A[1][0],C=A[1][1],E=A[1][2],i=A[2][0],t=A[2][1],o=A[2][2],e=C*o-E*t,n=-(Q*o-E*i),a=Q*t-C*i,s=-(g*o-B*t),r=I*o-B*i,c=-(I*t-g*i),h=g*E-B*C,y=-(I*E-B*Q),l=I*C-g*Q,D=I*e+g*n+B*a;if(0===D)throw new Error("Singular matrix");return[[e/D,s/D,h/D],[n/D,r/D,y/D],[a/D,c/D,l/D]]}(g),a=n[0][0],s=n[0][1],r=n[0][2],c=n[1][0],h=n[1][1],y=n[1][2],l=n[2][0],D=n[2][1],w=n[2][2],f=A.createImageData(B,Q),d=f.data,u=E-1,R=i-1;for(let m=0;m<Q;m++){const A=s*m+r,I=h*m+y,g=D*m+w;for(let Q=0;Q<B;Q++){const C=1/(l*Q+g),i=(a*Q+A)*C,t=(c*Q+I)*C,o=i<0?0:i>u?u:i,n=t<0?0:t>R?R:t,s=0|o,r=0|n,h=s<u?s+1:s,y=r<R?r+1:r,D=o-s,w=n-r,f=1-D,N=1-w,F=f*N,G=D*N,J=f*w,S=D*w,k=r*E+s<<2,M=r*E+h<<2,p=y*E+s<<2,L=y*E+h<<2,U=m*B+Q<<2;d[U]=e[k]*F+e[M]*G+e[p]*J+e[L]*S+.5|0,d[U+1]=e[k+1]*F+e[M+1]*G+e[p+1]*J+e[L+1]*S+.5|0,d[U+2]=e[k+2]*F+e[M+2]*G+e[p+2]*J+e[L+2]*S+.5|0,d[U+3]=255}}A.putImageData(f,0,0)}(A,I,s,o,a)}async function Z(A,I,g={}){const B=g.output||"canvas";if(!(I&&I.topLeft&&I.topRight&&I.bottomRight&&I.bottomLeft))return{output:null,corners:null,success:!1,message:"Invalid corner points provided"};try{const g=document.createElement("canvas");let Q;return X(g.getContext("2d"),A,I),Q="canvas"===B?g:"imagedata"===B?g.getContext("2d").getImageData(0,0,g.width,g.height):"dataurl"===B?g.toDataURL():g,{output:Q,corners:I,success:!0,message:"Document extracted successfully"}}catch(Q){return{output:null,corners:I,success:!1,message:`Extraction failed: ${Q.message}`}}}async function V(A,I={}){const g=[],B=performance.now(),Q=I.mode||"detect",C=I.output||"canvas";I.debug;const E=I.maxProcessingDimension||800;let i=performance.now();const{grayscaleData:t,imageData:o,scaleFactor:e,originalDimensions:n,scaledDimensions:a}=await async function(A,I=800){let g,B;const Q=A&&"number"==typeof A.width&&"number"==typeof A.height&&A.data;if(Q)g=A.width,B=A.height;else{if(!A)throw new Error("No image provided");g=A.width||A.naturalWidth,B=A.height||A.naturalHeight}const C=Math.max(g,B);let E,i,t;if(C<=I)E=g,i=B,t=1;else{const A=I/C;E=Math.round(g*A),i=Math.round(B*A),t=1/A}const o="undefined"!=typeof OffscreenCanvas,e=o?new OffscreenCanvas(E,i):document.createElement("canvas");o||(e.width=E,e.height=i);const n=e.getContext("2d",{willReadFrequently:!0});if(n.imageSmoothingEnabled=!0,n.imageSmoothingQuality="medium",Q){const I=o?new OffscreenCanvas(g,B):document.createElement("canvas");o||(I.width=g,I.height=B),I.getContext("2d").putImageData(A,0,0),n.drawImage(I,0,0,g,B,0,0,E,i)}else n.drawImage(A,0,0,g,B,0,0,E,i);const a=n.getImageData(0,0,E,i),s=a.data,r=new Uint8ClampedArray(E*i);for(let c=0,h=0;c<s.length;c+=4,h++){const A=54*s[c]+183*s[c+1]+19*s[c+2]>>8;r[h]=A,s[c]=s[c+1]=s[c+2]=A}return{grayscaleData:r,imageData:a,scaleFactor:t,originalDimensions:{width:g,height:B},scaledDimensions:{width:E,height:i}}}(A,E);g.push({step:"Image Prep + Scale + Gray",ms:(performance.now()-i).toFixed(2)});const s=await P(t,a.width,a.height,e,I);if(s.timings&&s.timings.forEach(A=>g.push(A)),!s.success){const A=performance.now();return g.unshift({step:"Total",ms:(A-B).toFixed(2)}),{output:null,corners:null,contour:null,confidence:s.confidence||null,debug:s.debug,success:!1,message:s.message||"No document detected",timings:g}}let r,c;if("detect"===Q)c=null;else if("extract"===Q){i=performance.now(),r=document.createElement("canvas");X(r.getContext("2d"),A,s.corners),g.push({step:"Perspective Transform",ms:(performance.now()-i).toFixed(2)})}"detect"!==Q&&r&&(i=performance.now(),c="canvas"===C?r:"imagedata"===C?r.getContext("2d").getImageData(0,0,r.width,r.height):"dataurl"===C?r.toDataURL():r,g.push({step:"Output Conversion",ms:(performance.now()-i).toFixed(2)}));const h=performance.now();return g.unshift({step:"Total",ms:(h-B).toFixed(2)}),{output:c,corners:s.corners,contour:s.contour,confidence:s.confidence||null,debug:s.debug,success:!0,message:"Document detected",timings:g}}A.Scanner=class{constructor(A={}){this.defaultOptions={maxProcessingDimension:800,mode:"detect",output:"canvas",...A},this.initialized=!1}async initialize(){this.initialized||(await S(),this.initialized=!0)}async scan(A,I={}){this.initialized||await this.initialize();const g={...this.defaultOptions,...I};return await V(A,g)}async extract(A,I,g={}){this.initialized||await this.initialize();const B={...this.defaultOptions,...g};return await Z(A,I,B)}},A.createCornerEditor=function(A={}){var I,g,B,Q,C,E,i,t,o,e;const n=A.container;if(!n||"function"!=typeof n.appendChild)throw new Error("createCornerEditor requires a valid container element");const{canvas:a,width:s,height:r}=function(A){if(!A)throw new Error("No image provided");const I=A&&"number"==typeof A.width&&"number"==typeof A.height&&A.data;let g=0,B=0;if(I?(g=A.width,B=A.height):(g=A.width||A.naturalWidth,B=A.height||A.naturalHeight),!g||!B)throw new Error("Image must be loaded before creating the corner editor");const Q=document.createElement("canvas");Q.width=g,Q.height=B;const C=Q.getContext("2d",{willReadFrequently:!0});if(!C)throw new Error("Failed to create 2D canvas context for source image");return I?C.putImageData(A,0,0):C.drawImage(A,0,0,g,B),{canvas:Q,width:g,height:B}}(A.image),c=document.createElement("canvas");c.style.position="absolute",c.style.top="0",c.style.left="0",c.style.display="block",c.style.boxSizing="border-box",c.style.touchAction="none",c.style.userSelect="none",c.style.webkitUserSelect="none",c.style.cursor="crosshair",c.style.outline="none";const h=!1!==A.keyboard;h&&(c.tabIndex=0,c.setAttribute("role","application"),c.setAttribute("aria-label","Document corner editor. Use arrow keys to adjust the selected corner."));const y={position:n.style.position,minHeight:n.style.minHeight};let l=!1,D=!1;"static"===getComputedStyle(n).position&&(n.style.position="relative",l=!0),n.appendChild(c);const w=c.getContext("2d");if(!w)throw new Error("Failed to create 2D canvas context for corner editor");const f={enabled:!1!==(null==(I=A.magnifier)?void 0:I.enabled),size:(null==(g=A.magnifier)?void 0:g.size)||110,zoom:(null==(B=A.magnifier)?void 0:B.zoom)||2,margin:(null==(Q=A.magnifier)?void 0:Q.margin)||16,borderColor:(null==(C=A.magnifier)?void 0:C.borderColor)||"#ffffff",borderWidth:(null==(E=A.magnifier)?void 0:E.borderWidth)||2,crosshairColor:(null==(i=A.magnifier)?void 0:i.crosshairColor)||"#ffffff",crosshairSize:(null==(t=A.magnifier)?void 0:t.crosshairSize)||18},d={enabled:!!(null==(o=A.nudges)?void 0:o.enabled),steps:((null==(e=A.nudges)?void 0:e.steps)&&A.nudges.steps.length?A.nudges.steps:[1,5]).map(A=>Math.max(1,Math.round(A)))},u=function(A,I,g=.08){const B=Math.max(8,Math.min(A,I)*g);return{topLeft:{x:B,y:B},topRight:{x:A-B,y:B},bottomRight:{x:A-B,y:I-B},bottomLeft:{x:B,y:I-B}}}(s,r),R=A.corners?L(A.corners):u;let m=b(R)&&H(R)?R:u;const N=L(m);let F=!1,G=null,J=null,S=null;const k=Math.max(24,A.handleHitArea||48),M=Math.max(8,Math.min(16,.3*k)),p=["topLeft","topRight","bottomRight","bottomLeft"];let U={scale:1,offsetX:0,offsetY:0,width:1,height:1},Y=null,q="topLeft";const v="undefined"!=typeof window?window:globalThis;function K(){"function"==typeof A.onChange&&A.onChange(L(m))}let T=0,W=0;function P(){const A=Math.max(1,Math.round(n.clientWidth));let I=Math.round(n.clientHeight);if(I<80){const g=r/Math.max(1,s),B=.7*(v.innerHeight||800);I=Math.max(240,Math.round(Math.min(A*g,B))),n.style.minHeight=I+"px",D=!0}return{width:A,height:Math.max(1,I)}}function X(){const{width:A,height:I}=P(),g=v.devicePixelRatio||1;T=A,W=I,c.style.width=A+"px",c.style.height=I+"px";const B=Math.round(A*g),Q=Math.round(I*g);c.width!==B&&(c.width=B),c.height!==Q&&(c.height=Q),w.setTransform(g,0,0,g,0,0);const C=Math.max(1,A-24),E=Math.max(1,I-24),i=Math.min(C/s,E/r),t=s*i,o=r*i;U={scale:i,offsetX:Math.round((A-t)/2),offsetY:Math.round((I-o)/2),width:A,height:I}}function Z(A){return{x:U.offsetX+A.x*U.scale,y:U.offsetY+A.y*U.scale}}function V(A){return b(A)&&H(A)}function j(A){const I=c.getBoundingClientRect();return{x:A.clientX-I.left,y:A.clientY-I.top}}function O(A,I){let g=null,B=1/0;for(const Q of p){const C=Z(m[Q]),E=Math.hypot(A-C.x,I-C.y);E<=k&&E<B&&(B=E,g=Q)}return g}function z(){F||(w.clearRect(0,0,U.width,U.height),w.drawImage(a,0,0,s,r,U.offsetX,U.offsetY,s*U.scale,r*U.scale),function(){const A=p.map(A=>Z(m[A]));w.save(),w.fillStyle="rgba(15, 23, 42, 0.40)",w.beginPath(),w.rect(0,0,U.width,U.height),w.moveTo(A[0].x,A[0].y);for(let I=1;I<A.length;I++)w.lineTo(A[I].x,A[I].y);w.closePath(),w.fill("evenodd"),w.restore(),w.save(),w.strokeStyle="#22c55e",w.lineWidth=3,w.beginPath(),w.moveTo(A[0].x,A[0].y);for(let I=1;I<A.length;I++)w.lineTo(A[I].x,A[I].y);w.closePath(),w.stroke(),w.restore();for(const I of p){const A=Z(m[I]),g=I===G;x(w,A,g?M+1:M,g?"#f59e0b":"#ffffff",g?"#7c2d12":"#0f172a",2)}}(),function(){if(!f.enabled||!G||!S)return;const A=m[G],I=f.size,g=I/2,B=Math.max(1.1,f.zoom);let Q=S.x+g+f.margin,C=S.y-g-f.margin;Q+g>U.width&&(Q=S.x-g-f.margin),C-g<0&&(C=S.y+g+f.margin),Q=Math.max(g+2,Math.min(U.width-g-2,Q)),C=Math.max(g+2,Math.min(U.height-g-2,C));const E=I/B,i=Math.max(0,Math.min(s-E,A.x-E/2)),t=Math.max(0,Math.min(r-E,A.y-E/2));w.save(),w.beginPath(),w.arc(Q,C,g,0,2*Math.PI),w.clip(),w.drawImage(a,i,t,E,E,Q-g,C-g,I,I),w.restore(),w.save(),w.beginPath(),w.arc(Q,C,g,0,2*Math.PI),w.lineWidth=f.borderWidth,w.strokeStyle=f.borderColor,w.stroke();const o=f.crosshairSize/2;w.strokeStyle=f.crosshairColor,w.lineWidth=1.5,w.beginPath(),w.moveTo(Q-o,C),w.lineTo(Q+o,C),w.moveTo(Q,C-o),w.lineTo(Q,C+o),w.stroke(),w.restore()}())}const _="function"==typeof v.requestAnimationFrame?v.requestAnimationFrame.bind(v):null,$="function"==typeof v.cancelAnimationFrame?v.cancelAnimationFrame.bind(v):null;let AA=null;function IA(){F||(_?null===AA&&(AA=_(()=>{AA=null,z()})):z())}function gA(A,I){const g=L(m);return g[A]={x:Math.max(0,Math.min(s,I.x)),y:Math.max(0,Math.min(r,I.y))},!!V(g)&&(m=g,q=A,K(),IA(),!0)}function BA(A){if(F)return;const I=j(A),g=O(I.x,I.y);if(g){if("function"==typeof A.preventDefault&&A.preventDefault(),G=g,q=g,J=A.pointerId,S=I,c.style.cursor="grabbing",h&&"function"==typeof c.focus)try{c.focus({preventScroll:!0})}catch(B){c.focus()}c.setPointerCapture&&void 0!==J&&c.setPointerCapture(J),IA()}}function QA(A){if(F)return;const I=j(A);if(!G)return void(c.style.cursor=O(I.x,I.y)?"grab":"crosshair");if(null!==J&&A.pointerId!==J)return;S=I;const g=function(A,I){const g=(A-U.offsetX)/U.scale,B=(I-U.offsetY)/U.scale;return{x:Math.max(0,Math.min(s,g)),y:Math.max(0,Math.min(r,B))}}(I.x,I.y);gA(G,g)}function CA(A){if(G&&(null===J||A.pointerId===J)){if(c.releasePointerCapture&&null!=J)try{c.releasePointerCapture(J)}catch(I){}G=null,J=null,S=null,c.style.cursor="crosshair",IA()}}function EA(A){if(F||!h)return;if("Enter"===A.key)return A.preventDefault(),void aA();if("Escape"===A.key)return A.preventDefault(),void sA();let I=0,g=0;if("ArrowLeft"===A.key)I=-1;else if("ArrowRight"===A.key)I=1;else if("ArrowUp"===A.key)g=-1;else{if("ArrowDown"!==A.key)return;g=1}A.preventDefault();const B=A.shiftKey?d.steps[d.steps.length-1]||10:1,Q=m[q];gA(q,{x:Q.x+I*B,y:Q.y+g*B})}function iA(A){BA({clientX:A.clientX,clientY:A.clientY,pointerId:1})}function tA(A){QA({clientX:A.clientX,clientY:A.clientY,pointerId:1})}function oA(A){const I=A.touches[0];if(!I)return;const g=j(I);O(g.x,g.y)&&A.preventDefault(),BA({clientX:I.clientX,clientY:I.clientY,pointerId:2})}function eA(A){const I=A.touches[0];I&&(A.preventDefault(),QA({clientX:I.clientX,clientY:I.clientY,pointerId:2}))}let nA=null;function aA(){const I=L(m);return"function"==typeof A.onConfirm&&A.onConfirm(I),I}function sA(){"function"==typeof A.onCancel&&A.onCancel()}const rA="undefined"!=typeof ResizeObserver?new ResizeObserver(()=>{if(F)return;const A=P();A.width===T&&A.height===W||(X(),IA())}):null;return X(),function(){if(!d.enabled)return;Y=document.createElement("div"),Y.style.position="absolute",Y.style.right="8px",Y.style.bottom="8px",Y.style.background="rgba(15, 23, 42, 0.9)",Y.style.border="1px solid rgba(148, 163, 184, 0.5)",Y.style.borderRadius="10px",Y.style.padding="8px",Y.style.display="grid",Y.style.gridTemplateColumns="repeat(4, auto)",Y.style.gap="6px",Y.style.zIndex="2";const A=(A,I,g,B,Q)=>{const C=document.createElement("button");return C.type="button",C.textContent=A+(Q>1?" "+Q:""),C.setAttribute("aria-label",I),C.style.border="1px solid #475569",C.style.background="#0f172a",C.style.color="#e2e8f0",C.style.borderRadius="6px",C.style.padding="4px 8px",C.style.fontSize="13px",C.style.lineHeight="1",C.style.cursor="pointer",C.addEventListener("click",()=>{const A=m[q];gA(q,{x:A.x+g*Q,y:A.y+B*Q})}),C};for(const I of d.steps)Y.appendChild(A("←",`Move left ${I}px`,-1,0,I)),Y.appendChild(A("→",`Move right ${I}px`,1,0,I)),Y.appendChild(A("↑",`Move up ${I}px`,0,-1,I)),Y.appendChild(A("↓",`Move down ${I}px`,0,1,I));n.appendChild(Y)}(),void 0!==v.PointerEvent?(c.addEventListener("pointerdown",BA),c.addEventListener("pointermove",QA),c.addEventListener("pointerup",CA),c.addEventListener("pointercancel",CA)):(c.addEventListener("mousedown",iA),"function"==typeof v.addEventListener&&(v.addEventListener("mousemove",tA),v.addEventListener("mouseup",CA)),c.addEventListener("touchstart",oA,{passive:!1}),c.addEventListener("touchmove",eA,{passive:!1}),c.addEventListener("touchend",CA),c.addEventListener("touchcancel",CA)),h&&c.addEventListener("keydown",EA),function A(){if("function"!=typeof v.matchMedia)return;nA&&nA();const I=v.devicePixelRatio||1,g=v.matchMedia(`(resolution: ${I}dppx)`),B=()=>{F||(X(),IA(),A())};"function"==typeof g.addEventListener?(g.addEventListener("change",B),nA=()=>g.removeEventListener("change",B)):"function"==typeof g.addListener?(g.addListener(B),nA=()=>g.removeListener(B)):nA=null}(),rA&&rA.observe(n),z(),{getCorners:()=>L(m),setCorners:A=>!(!A||!V(A))&&(m=L(A),K(),IA(),!0),reset(){m=L(N),K(),IA()},nudge:(A,I,g,B=1)=>!!p.includes(A)&&gA(A,{x:m[A].x+I*B,y:m[A].y+g*B}),confirm:()=>aA(),cancel(){sA()},destroy(){F||(F=!0,null!==AA&&$&&($(AA),AA=null),nA&&(nA(),nA=null),rA&&rA.disconnect(),c.removeEventListener("pointerdown",BA),c.removeEventListener("pointermove",QA),c.removeEventListener("pointerup",CA),c.removeEventListener("pointercancel",CA),c.removeEventListener("mousedown",iA),"function"==typeof v.removeEventListener&&(v.removeEventListener("mousemove",tA),v.removeEventListener("mouseup",CA)),c.removeEventListener("touchstart",oA),c.removeEventListener("touchmove",eA),c.removeEventListener("touchend",CA),c.removeEventListener("touchcancel",CA),c.removeEventListener("keydown",EA),Y&&Y.parentNode&&Y.parentNode.removeChild(Y),c.parentNode&&c.parentNode.removeChild(c),l&&(n.style.position=y.position),D&&(n.style.minHeight=y.minHeight))}}},A.extractDocument=Z,A.initialize=async function(){return await S()},A.scanDocument=V,Object.defineProperty(A,Symbol.toStringTag,{value:"Module"})});
|
package/package.json
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "scanic",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Modern document scanner in pure JavaScript and Wasm",
|
|
5
5
|
"type": "module",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"engines": {
|
|
8
|
+
"node": ">=20"
|
|
9
|
+
},
|
|
6
10
|
"main": "dist/scanic.umd.cjs",
|
|
7
11
|
"module": "dist/scanic.js",
|
|
8
12
|
"types": "src/scanic.d.ts",
|
package/src/scanic.d.ts
CHANGED
|
@@ -10,6 +10,57 @@ export interface CornerPoints {
|
|
|
10
10
|
bottomLeft: Point;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
+
export interface CornerEditorMagnifierOptions {
|
|
14
|
+
enabled?: boolean;
|
|
15
|
+
size?: number;
|
|
16
|
+
zoom?: number;
|
|
17
|
+
margin?: number;
|
|
18
|
+
borderColor?: string;
|
|
19
|
+
borderWidth?: number;
|
|
20
|
+
crosshairColor?: string;
|
|
21
|
+
crosshairSize?: number;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface CornerEditorNudgesOptions {
|
|
25
|
+
enabled?: boolean;
|
|
26
|
+
steps?: number[];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface CornerEditorOptions {
|
|
30
|
+
/** Host element the editor canvas is mounted into. */
|
|
31
|
+
container: HTMLElement;
|
|
32
|
+
/** Source image to adjust corners against. */
|
|
33
|
+
image: HTMLImageElement | HTMLCanvasElement | ImageData;
|
|
34
|
+
/** Initial corner positions (image-space pixels). Defaults to an inset quad. */
|
|
35
|
+
corners?: CornerPoints;
|
|
36
|
+
magnifier?: CornerEditorMagnifierOptions;
|
|
37
|
+
nudges?: CornerEditorNudgesOptions;
|
|
38
|
+
/** Touch/click target radius (px) around each handle. Default 48. */
|
|
39
|
+
handleHitArea?: number;
|
|
40
|
+
/**
|
|
41
|
+
* Enable keyboard control of the focused canvas (default true):
|
|
42
|
+
* arrow keys nudge the active corner (Shift = coarse step),
|
|
43
|
+
* Enter confirms, Escape cancels.
|
|
44
|
+
*/
|
|
45
|
+
keyboard?: boolean;
|
|
46
|
+
/** Fired on every corner change (drag, nudge, keyboard). */
|
|
47
|
+
onChange?: (corners: CornerPoints) => void;
|
|
48
|
+
/** Fired by confirm()/Enter with the final corners. */
|
|
49
|
+
onConfirm?: (corners: CornerPoints) => void;
|
|
50
|
+
/** Fired by cancel()/Escape. */
|
|
51
|
+
onCancel?: () => void;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface CornerEditor {
|
|
55
|
+
getCorners(): CornerPoints;
|
|
56
|
+
setCorners(corners: CornerPoints): boolean;
|
|
57
|
+
reset(): void;
|
|
58
|
+
nudge(cornerKey: keyof CornerPoints, dx: number, dy: number, step?: number): boolean;
|
|
59
|
+
confirm(): CornerPoints;
|
|
60
|
+
cancel(): void;
|
|
61
|
+
destroy(): void;
|
|
62
|
+
}
|
|
63
|
+
|
|
13
64
|
export interface DetectionOptions {
|
|
14
65
|
mode?: 'detect' | 'extract';
|
|
15
66
|
output?: 'canvas' | 'imagedata' | 'dataurl';
|
|
@@ -82,3 +133,8 @@ export class Scanner {
|
|
|
82
133
|
options?: DetectionOptions
|
|
83
134
|
): Promise<ScannerResult>;
|
|
84
135
|
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Create a manual corner adjustment editor.
|
|
139
|
+
*/
|
|
140
|
+
export function createCornerEditor(options: CornerEditorOptions): CornerEditor;
|