scanic 0.1.8 → 1.0.4

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/dist/scanic.js CHANGED
@@ -1,755 +1,1422 @@
1
- const K = {
1
+ const DEFAULTS = {
2
2
  // Contour detection params
3
3
  MIN_CONTOUR_AREA: 1e3,
4
4
  MIN_CONTOUR_POINTS: 10
5
- }, O = 0, z = 1, x = 2, U = [
6
- { dx: 0, dy: -1 },
7
- // 0: Top
8
- { dx: 1, dy: -1 },
9
- // 1: Top-right
10
- { dx: 1, dy: 0 },
11
- // 2: Right
12
- { dx: 1, dy: 1 },
13
- // 3: Bottom-right
14
- { dx: 0, dy: 1 },
15
- // 4: Bottom
16
- { dx: -1, dy: 1 },
17
- // 5: Bottom-left
18
- { dx: -1, dy: 0 },
19
- // 6: Left
20
- { dx: -1, dy: -1 }
21
- // 7: Top-left
22
- ];
23
- function V(I, A = {}) {
24
- const g = A.width || Math.sqrt(I.length), C = A.height || I.length / g, E = A.mode !== void 0 ? A.mode : z, B = A.method !== void 0 ? A.method : x, Q = A.minArea || K.MIN_CONTOUR_AREA, i = g + 2, s = C + 2, o = new Int32Array(i * s);
25
- for (let D = 0; D < C; D++)
26
- for (let c = 0; c < g; c++)
27
- I[D * g + c] > 0 && (o[(D + 1) * i + (c + 1)] = 1);
28
- const t = [];
29
- let e = 2;
30
- for (let D = 1; D <= C; D++)
31
- for (let c = 1; c <= g; c++) {
32
- const y = o[D * i + c], w = o[D * i + (c - 1)];
33
- let n = null, h = !1, N = -1;
34
- if (y === 1 && w === 0 ? (h = !0, n = { x: c, y: D }, N = 2) : y === 0 && w >= 1 && w !== -1 && w === 1 && (h = !1, n = { x: c - 1, y: D }, N = 6), n) {
35
- if (E === O && !h) {
36
- o[n.y * i + n.x] = -1;
5
+ };
6
+ const RETR_EXTERNAL = 0;
7
+ const RETR_LIST = 1;
8
+ const CHAIN_APPROX_SIMPLE = 2;
9
+ function detectDocumentContour(edges, options = {}) {
10
+ const width = options.width || Math.sqrt(edges.length);
11
+ const height = options.height || edges.length / width;
12
+ const mode = options.mode !== void 0 ? options.mode : RETR_LIST;
13
+ const method = options.method !== void 0 ? options.method : CHAIN_APPROX_SIMPLE;
14
+ const minArea = options.minArea || DEFAULTS.MIN_CONTOUR_AREA;
15
+ const paddedWidth = width + 2;
16
+ const paddedHeight = height + 2;
17
+ const labels = new Int32Array(paddedWidth * paddedHeight);
18
+ for (let y = 0; y < height; y++) {
19
+ for (let x = 0; x < width; x++) {
20
+ if (edges[y * width + x] > 0) {
21
+ labels[(y + 1) * paddedWidth + (x + 1)] = 1;
22
+ }
23
+ }
24
+ }
25
+ const contours = [];
26
+ let nextContourId = 2;
27
+ for (let y = 1; y <= height; y++) {
28
+ for (let x = 1; x <= width; x++) {
29
+ const currentPixelLabel = labels[y * paddedWidth + x];
30
+ const leftPixelLabel = labels[y * paddedWidth + (x - 1)];
31
+ let startPoint = null;
32
+ let isOuter = false;
33
+ let initialDirection = -1;
34
+ if (currentPixelLabel === 1 && leftPixelLabel === 0) {
35
+ isOuter = true;
36
+ startPoint = { x, y };
37
+ initialDirection = 2;
38
+ } else if (currentPixelLabel === 0 && leftPixelLabel >= 1 && leftPixelLabel !== -1) {
39
+ if (leftPixelLabel === 1) {
40
+ isOuter = false;
41
+ startPoint = { x: x - 1, y };
42
+ initialDirection = 6;
43
+ }
44
+ }
45
+ if (startPoint) {
46
+ if (mode === RETR_EXTERNAL && !isOuter) {
47
+ labels[startPoint.y * paddedWidth + startPoint.x] = -1;
37
48
  continue;
38
49
  }
39
- const F = e++, G = _(o, i, s, n, N, F);
40
- if (G && G.length > 0) {
41
- let S = G;
42
- B === x && (S = $(G));
43
- const J = S.map((k) => ({ x: k.x - 1, y: k.y - 1 }));
44
- if (J.length >= (B === x ? 4 : K.MIN_CONTOUR_POINTS)) {
45
- const k = {
46
- id: F,
47
- points: J,
48
- isOuter: h
50
+ const contourId = nextContourId++;
51
+ const points = traceContour(labels, paddedWidth, paddedHeight, startPoint, initialDirection, contourId);
52
+ if (points && points.length > 0) {
53
+ let finalPoints = points;
54
+ if (method === CHAIN_APPROX_SIMPLE) {
55
+ finalPoints = simplifyChainApproxSimple(points);
56
+ }
57
+ const adjustedPoints = finalPoints.map((p) => ({ x: p.x - 1, y: p.y - 1 }));
58
+ if (adjustedPoints.length >= (method === CHAIN_APPROX_SIMPLE ? 4 : DEFAULTS.MIN_CONTOUR_POINTS)) {
59
+ const contour = {
60
+ id: contourId,
61
+ points: adjustedPoints,
62
+ isOuter
49
63
  // Calculate area and bounding box later if needed for filtering/sorting
50
64
  };
51
- t.push(k);
65
+ contours.push(contour);
66
+ }
67
+ } else {
68
+ if (labels[startPoint.y * paddedWidth + startPoint.x] === 1) {
69
+ labels[startPoint.y * paddedWidth + startPoint.x] = contourId;
52
70
  }
53
- } else
54
- o[n.y * i + n.x] === 1 && (o[n.y * i + n.x] = F);
71
+ }
55
72
  }
56
73
  }
57
- t.forEach((D) => {
58
- D.area = AA(D.points), D.boundingBox = IA(D.points);
74
+ }
75
+ contours.forEach((contour) => {
76
+ contour.area = calculateContourArea(contour.points);
77
+ contour.boundingBox = calculateBoundingBox(contour.points);
59
78
  });
60
- const a = t.filter((D) => D.area >= Q);
61
- return a.sort((D, c) => c.area - D.area), A.debug && (A.debug.labels = o, A.debug.rawContours = t, A.debug.finalContours = a), a;
62
- }
63
- function _(I, A, g, C, E, B) {
64
- const Q = [], i = /* @__PURE__ */ new Set();
65
- let s = { ...C }, o = -1;
66
- I[C.y * A + C.x] = B;
67
- let t = 0;
68
- const e = A * g;
69
- for (; t++ < e; ) {
70
- let a;
71
- if (o === -1) {
72
- let y = !1;
73
- for (let w = 0; w < 8; w++) {
74
- a = (E + w) % 8;
75
- const n = s.x + U[a].dx, h = s.y + U[a].dy;
76
- if (n >= 0 && n < A && h >= 0 && h < g && I[h * A + n] > 0) {
77
- y = !0;
79
+ const filteredContours = contours.filter((contour) => contour.area >= minArea);
80
+ filteredContours.sort((a, b) => b.area - a.area);
81
+ if (options.debug) {
82
+ options.debug.labels = labels;
83
+ options.debug.rawContours = contours;
84
+ options.debug.finalContours = filteredContours;
85
+ }
86
+ return filteredContours;
87
+ }
88
+ function traceContour(labels, width, height, startPoint, initialDirection, contourId) {
89
+ const points = [];
90
+ const visited = /* @__PURE__ */ new Set();
91
+ let currentX = startPoint.x;
92
+ let currentY = startPoint.y;
93
+ const startX = currentX;
94
+ const startY = currentY;
95
+ let prevDirection = -1;
96
+ labels[startY * width + startX] = contourId;
97
+ let count = 0;
98
+ const maxSteps = width * height;
99
+ const dx = [0, 1, 1, 1, 0, -1, -1, -1];
100
+ const dy = [-1, -1, 0, 1, 1, 1, 0, -1];
101
+ while (count++ < maxSteps) {
102
+ let searchDirection;
103
+ if (prevDirection === -1) {
104
+ let found = false;
105
+ for (let i = 0; i < 8; i++) {
106
+ searchDirection = initialDirection + i & 7;
107
+ const nextX2 = currentX + dx[searchDirection];
108
+ const nextY2 = currentY + dy[searchDirection];
109
+ if (nextX2 >= 0 && nextX2 < width && nextY2 >= 0 && nextY2 < height && labels[nextY2 * width + nextX2] > 0) {
110
+ found = true;
78
111
  break;
79
112
  }
80
113
  }
81
- if (!y) return null;
82
- } else
83
- a = (o + 2) % 8;
84
- let D = null;
85
- for (let y = 0; y < 8; y++) {
86
- const w = (a + y) % 8, n = s.x + U[w].dx, h = s.y + U[w].dy;
87
- if (n >= 0 && n < A && h >= 0 && h < g && I[h * A + n] > 0) {
88
- D = { x: n, y: h }, o = (w + 4) % 8;
89
- break;
114
+ if (!found) return null;
115
+ } else {
116
+ searchDirection = prevDirection + 2 & 7;
117
+ }
118
+ let nextX = -1;
119
+ let nextY = -1;
120
+ for (let i = 0; i < 8; i++) {
121
+ const checkDirection = searchDirection + i & 7;
122
+ const checkX = currentX + dx[checkDirection];
123
+ const checkY = currentY + dy[checkDirection];
124
+ if (checkX >= 0 && checkX < width && checkY >= 0 && checkY < height) {
125
+ if (labels[checkY * width + checkX] > 0) {
126
+ nextX = checkX;
127
+ nextY = checkY;
128
+ prevDirection = checkDirection + 4 & 7;
129
+ break;
130
+ }
90
131
  }
91
132
  }
92
- if (!D) {
93
- Q.length === 0 && Q.push({ ...s }), console.warn(`Contour tracing stopped unexpectedly at (${s.x - 1}, ${s.y - 1}) for contour ${B}`);
133
+ if (nextX === -1) {
134
+ if (points.length === 0) {
135
+ points.push({ x: currentX, y: currentY });
136
+ }
137
+ console.warn(`Contour tracing stopped unexpectedly at (${currentX - 1}, ${currentY - 1}) for contour ${contourId}`);
94
138
  break;
95
139
  }
96
- const c = `${s.x},${s.y}`;
97
- if (i.has(c))
98
- return Q;
99
- if (Q.push({ ...s }), i.add(c), I[D.y * A + D.x] === 1 && (I[D.y * A + D.x] = B), s = D, s.x === C.x && s.y === C.y)
140
+ const visitedKey = currentY * width + currentX;
141
+ if (visited.has(visitedKey)) {
142
+ return points;
143
+ }
144
+ points.push({ x: currentX, y: currentY });
145
+ visited.add(visitedKey);
146
+ const nextIdx = nextY * width + nextX;
147
+ if (labels[nextIdx] === 1) {
148
+ labels[nextIdx] = contourId;
149
+ }
150
+ currentX = nextX;
151
+ currentY = nextY;
152
+ if (currentX === startX && currentY === startY) {
100
153
  break;
154
+ }
155
+ }
156
+ if (count >= maxSteps) {
157
+ console.warn(`Contour tracing exceeded max steps for contour ${contourId}`);
158
+ return null;
159
+ }
160
+ return points;
161
+ }
162
+ function simplifyChainApproxSimple(points) {
163
+ const n = points.length;
164
+ if (n <= 2) {
165
+ return points;
166
+ }
167
+ const simplifiedPoints = [];
168
+ const lastPoint = points[n - 1];
169
+ const firstPoint = points[0];
170
+ let prevPoint = lastPoint;
171
+ let currentPoint = firstPoint;
172
+ let nextPoint = points[1];
173
+ let dx1 = currentPoint.x - prevPoint.x;
174
+ let dy1 = currentPoint.y - prevPoint.y;
175
+ let dx2 = nextPoint.x - currentPoint.x;
176
+ let dy2 = nextPoint.y - currentPoint.y;
177
+ if (dx1 * dy2 !== dy1 * dx2) {
178
+ simplifiedPoints.push(currentPoint);
101
179
  }
102
- return t >= e ? (console.warn(`Contour tracing exceeded max steps for contour ${B}`), null) : Q;
103
- }
104
- function $(I) {
105
- if (I.length <= 2)
106
- return I;
107
- const A = [], g = I.length;
108
- for (let C = 0; C < g; C++) {
109
- const E = I[(C + g - 1) % g], B = I[C], Q = I[(C + 1) % g], i = B.x - E.x, s = B.y - E.y, o = Q.x - B.x, t = Q.y - B.y;
110
- i * t !== s * o && A.push(B);
111
- }
112
- if (A.length === 0 && g > 0) {
113
- if (g === 1) return [I[0]];
114
- if (g === 2) return I;
115
- let C = 0, E = 1;
116
- const B = I[0];
117
- for (let Q = 1; Q < g; Q++) {
118
- const i = I[Q], s = (i.x - B.x) ** 2 + (i.y - B.y) ** 2;
119
- s > C && (C = s, E = Q);
120
- }
121
- return [I[0], I[E]];
122
- }
123
- return A;
124
- }
125
- function AA(I) {
126
- let A = 0;
127
- const g = I.length;
128
- if (g < 3) return 0;
129
- for (let C = 0; C < g; C++) {
130
- const E = (C + 1) % g;
131
- A += I[C].x * I[E].y, A -= I[E].x * I[C].y;
132
- }
133
- return Math.abs(A) / 2;
134
- }
135
- function IA(I) {
136
- if (I.length === 0)
180
+ for (let i = 1; i < n - 1; i++) {
181
+ prevPoint = points[i - 1];
182
+ currentPoint = points[i];
183
+ nextPoint = points[i + 1];
184
+ dx1 = currentPoint.x - prevPoint.x;
185
+ dy1 = currentPoint.y - prevPoint.y;
186
+ dx2 = nextPoint.x - currentPoint.x;
187
+ dy2 = nextPoint.y - currentPoint.y;
188
+ if (dx1 * dy2 !== dy1 * dx2) {
189
+ simplifiedPoints.push(currentPoint);
190
+ }
191
+ }
192
+ prevPoint = points[n - 2];
193
+ currentPoint = lastPoint;
194
+ nextPoint = firstPoint;
195
+ dx1 = currentPoint.x - prevPoint.x;
196
+ dy1 = currentPoint.y - prevPoint.y;
197
+ dx2 = nextPoint.x - currentPoint.x;
198
+ dy2 = nextPoint.y - currentPoint.y;
199
+ if (dx1 * dy2 !== dy1 * dx2) {
200
+ simplifiedPoints.push(currentPoint);
201
+ }
202
+ if (simplifiedPoints.length === 0) {
203
+ if (n === 1) return [points[0]];
204
+ if (n === 2) return points;
205
+ let maxDistSq = 0;
206
+ let farthestIdx = 1;
207
+ const p0x = firstPoint.x;
208
+ const p0y = firstPoint.y;
209
+ for (let i = 1; i < n; i++) {
210
+ const pi = points[i];
211
+ const dx = pi.x - p0x;
212
+ const dy = pi.y - p0y;
213
+ const distSq = dx * dx + dy * dy;
214
+ if (distSq > maxDistSq) {
215
+ maxDistSq = distSq;
216
+ farthestIdx = i;
217
+ }
218
+ }
219
+ return [firstPoint, points[farthestIdx]];
220
+ }
221
+ return simplifiedPoints;
222
+ }
223
+ function calculateContourArea(points) {
224
+ let area = 0;
225
+ const n = points.length;
226
+ if (n < 3) return 0;
227
+ for (let i = 0; i < n; i++) {
228
+ const j = (i + 1) % n;
229
+ area += points[i].x * points[j].y;
230
+ area -= points[j].x * points[i].y;
231
+ }
232
+ return Math.abs(area) / 2;
233
+ }
234
+ function calculateBoundingBox(points) {
235
+ if (points.length === 0) {
137
236
  return { minX: 0, minY: 0, maxX: 0, maxY: 0 };
138
- let A = I[0].x, g = I[0].y, C = I[0].x, E = I[0].y;
139
- for (let B = 1; B < I.length; B++) {
140
- const Q = I[B];
141
- A = Math.min(A, Q.x), g = Math.min(g, Q.y), C = Math.max(C, Q.x), E = Math.max(E, Q.y);
142
- }
143
- return { minX: A, minY: g, maxX: C, maxY: E };
144
- }
145
- function u(I, A = 1) {
146
- if (I.length <= 2)
147
- return I;
148
- let g = 0, C = 0;
149
- const E = I[0], B = I[I.length - 1];
150
- for (let Q = 1; Q < I.length - 1; Q++) {
151
- const i = gA(I[Q], E, B);
152
- i > g && (g = i, C = Q);
153
- }
154
- if (g > A) {
155
- const Q = u(I.slice(0, C + 1), A), i = u(I.slice(C), A);
156
- return Q.slice(0, -1).concat(i);
157
- } else
158
- return [E, B];
159
- }
160
- function gA(I, A, g) {
161
- const C = g.x - A.x, E = g.y - A.y, B = C * C + E * E;
162
- if (B === 0)
237
+ }
238
+ let minX = points[0].x;
239
+ let minY = points[0].y;
240
+ let maxX = points[0].x;
241
+ let maxY = points[0].y;
242
+ for (let i = 1; i < points.length; i++) {
243
+ const point = points[i];
244
+ minX = Math.min(minX, point.x);
245
+ minY = Math.min(minY, point.y);
246
+ maxX = Math.max(maxX, point.x);
247
+ maxY = Math.max(maxY, point.y);
248
+ }
249
+ return { minX, minY, maxX, maxY };
250
+ }
251
+ function simplifyContour(points, epsilon = 1) {
252
+ if (points.length <= 2) {
253
+ return points;
254
+ }
255
+ let maxDistance = 0;
256
+ let index = 0;
257
+ const firstPoint = points[0];
258
+ const lastPoint = points[points.length - 1];
259
+ for (let i = 1; i < points.length - 1; i++) {
260
+ const distance = perpendicularDistance(points[i], firstPoint, lastPoint);
261
+ if (distance > maxDistance) {
262
+ maxDistance = distance;
263
+ index = i;
264
+ }
265
+ }
266
+ if (maxDistance > epsilon) {
267
+ const firstSegment = simplifyContour(points.slice(0, index + 1), epsilon);
268
+ const secondSegment = simplifyContour(points.slice(index), epsilon);
269
+ return firstSegment.slice(0, -1).concat(secondSegment);
270
+ } else {
271
+ return [firstPoint, lastPoint];
272
+ }
273
+ }
274
+ function perpendicularDistance(point, lineStart, lineEnd) {
275
+ const dx = lineEnd.x - lineStart.x;
276
+ const dy = lineEnd.y - lineStart.y;
277
+ const lineLengthSq = dx * dx + dy * dy;
278
+ if (lineLengthSq === 0) {
163
279
  return Math.sqrt(
164
- Math.pow(I.x - A.x, 2) + Math.pow(I.y - A.y, 2)
280
+ Math.pow(point.x - lineStart.x, 2) + Math.pow(point.y - lineStart.y, 2)
165
281
  );
166
- const Q = ((I.x - A.x) * C + (I.y - A.y) * E) / B;
167
- let i, s;
168
- Q < 0 ? (i = A.x, s = A.y) : Q > 1 ? (i = g.x, s = g.y) : (i = A.x + Q * C, s = A.y + Q * E);
169
- const o = I.x - i, t = I.y - s;
170
- return Math.sqrt(o * o + t * t);
171
- }
172
- function BA(I, A = 0.02) {
173
- const g = QA(I), C = A * g;
174
- return u(I, C);
175
- }
176
- function QA(I) {
177
- let A = 0;
178
- const g = I.length;
179
- if (g < 2) return 0;
180
- for (let C = 0; C < g; C++) {
181
- const E = (C + 1) % g, B = I[C].x - I[E].x, Q = I[C].y - I[E].y;
182
- A += Math.sqrt(B * B + Q * Q);
183
- }
184
- return A;
185
- }
186
- function CA(I) {
187
- let A = 0, g = 0;
188
- for (const C of I)
189
- A += C.x, g += C.y;
282
+ }
283
+ const t = ((point.x - lineStart.x) * dx + (point.y - lineStart.y) * dy) / lineLengthSq;
284
+ let closestPointX, closestPointY;
285
+ if (t < 0) {
286
+ closestPointX = lineStart.x;
287
+ closestPointY = lineStart.y;
288
+ } else if (t > 1) {
289
+ closestPointX = lineEnd.x;
290
+ closestPointY = lineEnd.y;
291
+ } else {
292
+ closestPointX = lineStart.x + t * dx;
293
+ closestPointY = lineStart.y + t * dy;
294
+ }
295
+ const distDx = point.x - closestPointX;
296
+ const distDy = point.y - closestPointY;
297
+ return Math.sqrt(distDx * distDx + distDy * distDy);
298
+ }
299
+ function approximatePolygon(contourPoints, epsilon = 0.02) {
300
+ const perimeter = calculateContourPerimeter(contourPoints);
301
+ const actualEpsilon = epsilon * perimeter;
302
+ const simplifiedPoints = simplifyContour(contourPoints, actualEpsilon);
303
+ return simplifiedPoints;
304
+ }
305
+ function calculateContourPerimeter(points) {
306
+ let perimeter = 0;
307
+ const n = points.length;
308
+ if (n < 2) return 0;
309
+ for (let i = 0; i < n; i++) {
310
+ const j = (i + 1) % n;
311
+ const dx = points[i].x - points[j].x;
312
+ const dy = points[i].y - points[j].y;
313
+ perimeter += Math.sqrt(dx * dx + dy * dy);
314
+ }
315
+ return perimeter;
316
+ }
317
+ function findCenter(points) {
318
+ let sumX = 0;
319
+ let sumY = 0;
320
+ for (const point of points) {
321
+ sumX += point.x;
322
+ sumY += point.y;
323
+ }
190
324
  return {
191
- x: A / I.length,
192
- y: g / I.length
325
+ x: sumX / points.length,
326
+ y: sumY / points.length
193
327
  };
194
328
  }
195
- function EA(I, A = {}) {
196
- if (!I || !I.points || I.points.length < 4)
197
- return console.warn("Contour does not have enough points for corner detection"), null;
198
- const g = A.epsilon || 0.02, C = BA(I, g);
199
- let E;
200
- return C && C.length === 4 ? E = oA(C) : E = iA(I.points), !E || !E.topLeft || !E.topRight || !E.bottomRight || !E.bottomLeft ? (console.warn("Failed to find all four corners.", E), null) : (console.log("Corner points:", E), E);
329
+ function findCornerPoints(contour, options = {}) {
330
+ if (!contour || !contour.points || contour.points.length < 4) {
331
+ console.warn("Contour does not have enough points for corner detection");
332
+ return null;
333
+ }
334
+ const epsilon = options.epsilon || 0.02;
335
+ const approximation = approximatePolygon(contour, epsilon);
336
+ let corners;
337
+ if (approximation && approximation.length === 4) {
338
+ corners = orderCornerPoints(approximation);
339
+ } else {
340
+ corners = findCornersByCoordinateExtremes(contour.points);
341
+ }
342
+ if (!corners || !corners.topLeft || !corners.topRight || !corners.bottomRight || !corners.bottomLeft) {
343
+ console.warn("Failed to find all four corners.", corners);
344
+ return null;
345
+ }
346
+ return corners;
201
347
  }
202
- function iA(I) {
203
- if (!I || I.length === 0) return null;
204
- let A = I[0], g = I[0], C = I[0], E = I[0], B = A.x + A.y, Q = g.x - g.y, i = C.x + C.y, s = E.x - E.y;
205
- for (let o = 1; o < I.length; o++) {
206
- const t = I[o], e = t.x + t.y, a = t.x - t.y;
207
- e < B && (B = e, A = t), e > i && (i = e, C = t), a > Q && (Q = a, g = t), a < s && (s = a, E = t);
348
+ function findCornersByCoordinateExtremes(points) {
349
+ if (!points || points.length === 0) return null;
350
+ let topLeft = points[0];
351
+ let topRight = points[0];
352
+ let bottomRight = points[0];
353
+ let bottomLeft = points[0];
354
+ let minSum = topLeft.x + topLeft.y;
355
+ let maxDiff = topRight.x - topRight.y;
356
+ let maxSum = bottomRight.x + bottomRight.y;
357
+ let minDiff = bottomLeft.x - bottomLeft.y;
358
+ for (let i = 1; i < points.length; i++) {
359
+ const point = points[i];
360
+ const sum = point.x + point.y;
361
+ const diff = point.x - point.y;
362
+ if (sum < minSum) {
363
+ minSum = sum;
364
+ topLeft = point;
365
+ }
366
+ if (sum > maxSum) {
367
+ maxSum = sum;
368
+ bottomRight = point;
369
+ }
370
+ if (diff > maxDiff) {
371
+ maxDiff = diff;
372
+ topRight = point;
373
+ }
374
+ if (diff < minDiff) {
375
+ minDiff = diff;
376
+ bottomLeft = point;
377
+ }
208
378
  }
209
379
  return {
210
- topLeft: A,
211
- topRight: g,
212
- bottomRight: C,
213
- bottomLeft: E
380
+ topLeft,
381
+ topRight,
382
+ bottomRight,
383
+ bottomLeft
214
384
  };
215
385
  }
216
- function oA(I) {
217
- if (I.length !== 4)
218
- return console.warn(`Expected 4 points, got ${I.length}`), null;
219
- const A = CA(I), g = [...I].sort((Q, i) => {
220
- const s = Math.atan2(Q.y - A.y, Q.x - A.x), o = Math.atan2(i.y - A.y, i.x - A.x);
221
- return s - o;
386
+ function orderCornerPoints(points) {
387
+ if (points.length !== 4) {
388
+ console.warn(`Expected 4 points, got ${points.length}`);
389
+ return null;
390
+ }
391
+ const center = findCenter(points);
392
+ const sortedPoints = [...points].sort((a, b) => {
393
+ const angleA = Math.atan2(a.y - center.y, a.x - center.x);
394
+ const angleB = Math.atan2(b.y - center.y, b.x - center.x);
395
+ return angleA - angleB;
222
396
  });
223
- let C = 1 / 0, E = 0;
224
- for (let Q = 0; Q < 4; Q++) {
225
- const i = g[Q].x + g[Q].y;
226
- i < C && (C = i, E = Q);
227
- }
228
- const B = [
229
- g[E],
230
- g[(E + 1) % 4],
231
- g[(E + 2) % 4],
232
- g[(E + 3) % 4]
397
+ let minSum = Infinity;
398
+ let minIndex = 0;
399
+ for (let i = 0; i < 4; i++) {
400
+ const sum = sortedPoints[i].x + sortedPoints[i].y;
401
+ if (sum < minSum) {
402
+ minSum = sum;
403
+ minIndex = i;
404
+ }
405
+ }
406
+ const orderedPoints = [
407
+ sortedPoints[minIndex],
408
+ sortedPoints[(minIndex + 1) % 4],
409
+ sortedPoints[(minIndex + 2) % 4],
410
+ sortedPoints[(minIndex + 3) % 4]
233
411
  ];
234
412
  return {
235
- topLeft: B[0],
236
- topRight: B[1],
237
- bottomRight: B[2],
238
- bottomLeft: B[3]
413
+ topLeft: orderedPoints[0],
414
+ topRight: orderedPoints[1],
415
+ bottomRight: orderedPoints[2],
416
+ bottomLeft: orderedPoints[3]
239
417
  };
240
418
  }
241
- let r, L = null;
242
- function T() {
243
- return (L === null || L.byteLength === 0) && (L = new Uint8Array(r.memory.buffer)), L;
419
+ let wasm;
420
+ let cachedUint8ArrayMemory0 = null;
421
+ function getUint8ArrayMemory0() {
422
+ if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {
423
+ cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);
424
+ }
425
+ return cachedUint8ArrayMemory0;
244
426
  }
245
- let M = 0;
246
- function Z(I, A) {
247
- const g = A(I.length * 1, 1) >>> 0;
248
- return T().set(I, g / 1), M = I.length, g;
427
+ let WASM_VECTOR_LEN = 0;
428
+ function passArray8ToWasm0(arg, malloc) {
429
+ const ptr = malloc(arg.length * 1, 1) >>> 0;
430
+ getUint8ArrayMemory0().set(arg, ptr / 1);
431
+ WASM_VECTOR_LEN = arg.length;
432
+ return ptr;
249
433
  }
250
- function b(I, A) {
251
- return I = I >>> 0, T().subarray(I / 1, I / 1 + A);
434
+ function getArrayU8FromWasm0(ptr, len) {
435
+ ptr = ptr >>> 0;
436
+ return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len);
252
437
  }
253
- function sA(I, A, g, C) {
254
- const E = Z(I, r.__wbindgen_malloc), B = M, Q = r.dilate(E, B, A, g, C);
255
- var i = b(Q[0], Q[1]).slice();
256
- return r.__wbindgen_free(Q[0], Q[1] * 1, 1), i;
438
+ function blur(grayscale, width, height, kernel_size, sigma) {
439
+ const ptr0 = passArray8ToWasm0(grayscale, wasm.__wbindgen_malloc);
440
+ const len0 = WASM_VECTOR_LEN;
441
+ const ret = wasm.blur(ptr0, len0, width, height, kernel_size, sigma);
442
+ var v2 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
443
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
444
+ return v2;
257
445
  }
258
- let Y = null;
259
- function X() {
260
- return (Y === null || Y.byteLength === 0) && (Y = new Float32Array(r.memory.buffer)), Y;
446
+ let cachedFloat32ArrayMemory0 = null;
447
+ function getFloat32ArrayMemory0() {
448
+ if (cachedFloat32ArrayMemory0 === null || cachedFloat32ArrayMemory0.byteLength === 0) {
449
+ cachedFloat32ArrayMemory0 = new Float32Array(wasm.memory.buffer);
450
+ }
451
+ return cachedFloat32ArrayMemory0;
261
452
  }
262
- function tA(I, A) {
263
- const g = A(I.length * 4, 4) >>> 0;
264
- return X().set(I, g / 4), M = I.length, g;
453
+ function passArrayF32ToWasm0(arg, malloc) {
454
+ const ptr = malloc(arg.length * 4, 4) >>> 0;
455
+ getFloat32ArrayMemory0().set(arg, ptr / 4);
456
+ WASM_VECTOR_LEN = arg.length;
457
+ return ptr;
265
458
  }
266
- function aA(I, A, g, C, E) {
267
- const B = tA(I, r.__wbindgen_malloc), Q = M, i = r.hysteresis_thresholding(B, Q, A, g, C, E);
268
- var s = b(i[0], i[1]).slice();
269
- return r.__wbindgen_free(i[0], i[1] * 1, 1), s;
459
+ function hysteresis_thresholding(suppressed, width, height, low_threshold, high_threshold) {
460
+ const ptr0 = passArrayF32ToWasm0(suppressed, wasm.__wbindgen_malloc);
461
+ const len0 = WASM_VECTOR_LEN;
462
+ const ret = wasm.hysteresis_thresholding(ptr0, len0, width, height, low_threshold, high_threshold);
463
+ var v2 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
464
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
465
+ return v2;
270
466
  }
271
- function DA(I, A, g, C, E) {
272
- const B = Z(I, r.__wbindgen_malloc), Q = M, i = r.blur(B, Q, A, g, C, E);
273
- var s = b(i[0], i[1]).slice();
274
- return r.__wbindgen_free(i[0], i[1] * 1, 1), s;
467
+ function dilate(edges, width, height, kernel_size) {
468
+ const ptr0 = passArray8ToWasm0(edges, wasm.__wbindgen_malloc);
469
+ const len0 = WASM_VECTOR_LEN;
470
+ const ret = wasm.dilate(ptr0, len0, width, height, kernel_size);
471
+ var v2 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
472
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
473
+ return v2;
275
474
  }
276
- let d = null;
277
- function eA() {
278
- return (d === null || d.byteLength === 0) && (d = new Uint16Array(r.memory.buffer)), d;
475
+ let cachedUint16ArrayMemory0 = null;
476
+ function getUint16ArrayMemory0() {
477
+ if (cachedUint16ArrayMemory0 === null || cachedUint16ArrayMemory0.byteLength === 0) {
478
+ cachedUint16ArrayMemory0 = new Uint16Array(wasm.memory.buffer);
479
+ }
480
+ return cachedUint16ArrayMemory0;
279
481
  }
280
- function p(I, A) {
281
- const g = A(I.length * 2, 2) >>> 0;
282
- return eA().set(I, g / 2), M = I.length, g;
482
+ function passArray16ToWasm0(arg, malloc) {
483
+ const ptr = malloc(arg.length * 2, 2) >>> 0;
484
+ getUint16ArrayMemory0().set(arg, ptr / 2);
485
+ WASM_VECTOR_LEN = arg.length;
486
+ return ptr;
283
487
  }
284
- function cA(I, A) {
285
- return I = I >>> 0, X().subarray(I / 4, I / 4 + A);
488
+ function getArrayF32FromWasm0(ptr, len) {
489
+ ptr = ptr >>> 0;
490
+ return getFloat32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len);
286
491
  }
287
- function nA(I, A, g, C, E) {
288
- const B = p(I, r.__wbindgen_malloc), Q = M, i = p(A, r.__wbindgen_malloc), s = M, o = r.non_maximum_suppression(B, Q, i, s, g, C, E);
289
- var t = cA(o[0], o[1]).slice();
290
- return r.__wbindgen_free(o[0], o[1] * 4, 4), t;
492
+ function non_maximum_suppression(dx, dy, width, height, l2_gradient) {
493
+ const ptr0 = passArray16ToWasm0(dx, wasm.__wbindgen_malloc);
494
+ const len0 = WASM_VECTOR_LEN;
495
+ const ptr1 = passArray16ToWasm0(dy, wasm.__wbindgen_malloc);
496
+ const len1 = WASM_VECTOR_LEN;
497
+ const ret = wasm.non_maximum_suppression(ptr0, len0, ptr1, len1, width, height, l2_gradient);
498
+ var v3 = getArrayF32FromWasm0(ret[0], ret[1]).slice();
499
+ wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);
500
+ return v3;
291
501
  }
292
- async function yA(I, A) {
293
- if (typeof Response == "function" && I instanceof Response) {
294
- if (typeof WebAssembly.instantiateStreaming == "function")
502
+ async function __wbg_load(module, imports) {
503
+ if (typeof Response === "function" && module instanceof Response) {
504
+ if (typeof WebAssembly.instantiateStreaming === "function") {
295
505
  try {
296
- return await WebAssembly.instantiateStreaming(I, A);
297
- } catch (C) {
298
- if (I.headers.get("Content-Type") != "application/wasm")
299
- console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", C);
300
- else
301
- throw C;
506
+ return await WebAssembly.instantiateStreaming(module, imports);
507
+ } catch (e) {
508
+ if (module.headers.get("Content-Type") != "application/wasm") {
509
+ console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e);
510
+ } else {
511
+ throw e;
512
+ }
302
513
  }
303
- const g = await I.arrayBuffer();
304
- return await WebAssembly.instantiate(g, A);
514
+ }
515
+ const bytes = await module.arrayBuffer();
516
+ return await WebAssembly.instantiate(bytes, imports);
305
517
  } else {
306
- const g = await WebAssembly.instantiate(I, A);
307
- return g instanceof WebAssembly.Instance ? { instance: g, module: I } : g;
308
- }
309
- }
310
- function wA() {
311
- const I = {};
312
- return I.wbg = {}, I.wbg.__wbindgen_init_externref_table = function() {
313
- const A = r.__wbindgen_export_0, g = A.grow(4);
314
- A.set(0, void 0), A.set(g + 0, void 0), A.set(g + 1, null), A.set(g + 2, !0), A.set(g + 3, !1);
315
- }, I;
316
- }
317
- function hA(I, A) {
318
- return r = I.exports, P.__wbindgen_wasm_module = A, Y = null, d = null, L = null, r.__wbindgen_start(), r;
319
- }
320
- async function P(I) {
321
- if (r !== void 0) return r;
322
- typeof I < "u" && (Object.getPrototypeOf(I) === Object.prototype ? { module_or_path: I } = I : console.warn("using deprecated parameters for the initialization function; pass a single object instead")), typeof I > "u" && (I = new URL("data:application/wasm;base64,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QQhqIAIQKQALaAIBfwF+IwBBMGsiAyQAIAMgADYCACADIAE2AgQgA0ECNgIMIANBuJbAADYCCCADQgI3AhQgA0KAgICAICIEIANBBGqthDcDKCADIAQgA62ENwMgIAMgA0EgajYCECADQQhqIAIQKQALaAIBfwF+IwBBMGsiAyQAIAMgADYCACADIAE2AgQgA0ECNgIMIANB7JbAADYCCCADQgI3AhQgA0KAgICAICIEIANBBGqthDcDKCADIAQgA62ENwMgIAMgA0EgajYCECADQQhqIAIQKQALZQAjAEEwayIAJABBxJfAAC0AAARAIABBAjYCDCAAQbCSwAA2AgggAEIBNwIUIAAgATYCLCAAIABBLGqtQoCAgIAghDcDICAAIABBIGo2AhAgAEEIakHQksAAECkACyAAQTBqJAALQQEBfyACIAAoAgAgACgCCCIDa0sEQCAAIAMgAhAPIAAoAgghAwsgACgCBCADaiABIAIQCxogACACIANqNgIIQQALTQECf0HFl8AALQAAGiABKAIEIQIgASgCACEDQQhBBBAzIgFFBEBBBEEIED0ACyABIAI2AgQgASADNgIAIABB8JLAADYCBCAAIAE2AgALQQEBfyMAQSBrIgMkACADQQA2AhAgA0EBNgIEIANCBDcCCCADIAE2AhwgAyAANgIYIAMgA0EYajYCACADIAIQKQALrhIBEn8jAEEQayIXJAAgCCEMIwBB0ABrIgskACALQQhqIAAiCCABIhkgAiIRIAMgBiAHEAQgC0EUaiALKAIMIhwgCygCECACIAMQByACIANsIgBBAXQhBgJAAkACQCAAQQBIIAZB/v///wdLckUEQCAGRQ0BQcWXwAAtAAAaQQIhDSAGQQIQMyIBDQILIA0gBhAvAAtBACEGIAtBADYCKCALQoCAgIAgNwIgIAtBADYCNCALQoCAgIAgNwIsQQIhAUEBIRhBAiECDAELIAtBADYCKCALIAE2AiQgCyAANgIgQcWXwAAtAAAaAkACQAJAIAZBAhAzIgIEQEEAIQYgC0EANgI0IAsgAjYCMCALIAA2AiwgAEUEQEEBIRhBACENDAULIABFIRggCygCGCEBIAsoAhwhEiAAIQIDQCAGIBJPDQMgAS8BACENIAsoAigiECALKAIgRgRAIAtBIGoQEgsgCygCJCAQQQF0aiANOwEA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QQRqEBALIAYoAgggEEEDdGoiASACNgIEIAEgDDYCACAGIBBBAWo2AgwMAQsgBCAbX0UNACAMIBJqQQA6AAALIABBBGohACAMQQFqIQEgCyAMSw0ACyAJIBFqIREgByASaiESIgIgGUcNAAsMAQsgA0ECayEAIAdBAWohAiAHQQF0QQFrIQFBACEDA0AgASADaiIPIAIgA2pJDQYgDyATSw0EIAggD0kNAiADIAdqIQMgAEEBayIADQALCyAGKAIMIgJFDQcgB0EBaiEMQQEgB2shESAHQX9zIQ8gB0UNBgNAIAYgAkEBayICNgIMAkAgBigCCCACQQN0aiIAKAIEIAdsIAAoAgBqIgkgD2oiASAITw0AIAEgCmoiAC0AAA0AIABBAjoAACABIAEgB24iAiAHbGshASAGKAIMIgMgBigCBEYEQCAGQQRqEBALIAYoAgggA0EDdGoiACACNgIEIAAgATYCACAGIANBAWoiAjYCDAsCQCAJIAdrIgEgCE8NACABIApqIgAtAAANACAAQQI6AAAgASABIAduIgIgB2xrIQEgBigCDCIDIAYoAgRGBEAgBkEEahAQCyAGKAIIIANBA3RqIgAgAjYCBCAAIAE2AgAgBiADQQFqIgI2AgwLAkAgCSARaiIBIAhPDQAgASAKaiIALQAADQAgAEECOgAAIAEgASAHbiICIAdsayEBIAYoAgwiAyAGKAIERgRAIAZBBGoQEAsgBigCCCADQQN0aiIAIAI2AgQgACABNgIAIAYgA0EBaiICNgIMCwJAIAlBAWsiASAITw0AIAEgCmoiAC0AAA0AIABBAjoAACABIAEgB24iAiAHbGshASAGKAIMIgMgBigCBEYEQCAGQQRqEBALIAYoAgggA0EDdGoiACACNgIEIAAgATYCACAGIANBAWoiAjYCDAsCQCAJQQFqIgEgCE8NACABIApqIgAtAAANACAAQQI6AAAgASABIAduIgIgB2xrIQEgBigCDCIDIAYoAgRGBEAgBkEEahAQCyAGKAIIIANBA3RqIgAgAjYCBCAAIAE2AgAgBiADQQFqIgI2AgwLAkAgCSAWaiIBIAhPDQAgASAKaiIALQAADQAgAEECOgAAIAEgASAHbiICIAdsayEBIAYoAgwiAyAGKAIERgRAIAZBBGoQEAsgBigCCCADQQN0aiIAIAI2AgQgACAB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AAAPAAAAEwAAAExhenkgaW5zdGFuY2UgaGFzIHByZXZpb3VzbHkgYmVlbiBwb2lzb25lZAAAhAcQACoAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9vbmNlX2NlbGwtMS4yMS4zL3NyYy9saWIucnMAALgHEABaAAAACAMAABkAAAByZWVudHJhbnQgaW5pdAAAJAgQAA4AAAC4BxAAWgAAAHoCAAANAAAABAAAAAwAAAAEAAAABQAAAAYAAAAHAAAAL3J1c3QvZGVwcy9kbG1hbGxvYy0wLjIuNi9zcmMvZGxtYWxsb2MucnNhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA+PSBzaXplICsgbWluX292ZXJoZWFkAGQIEAApAAAAqAQAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA8PSBzaXplICsgbWF4X292ZXJoZWFkAABkCBAAKQAAAK4EAAANAAAAbWVtb3J5IGFsbG9jYXRpb24gb2YgIGJ5dGVzIGZhaWxlZAAADAkQABUAAAAhCRAADQAAAHN0ZC9zcmMvYWxsb2MucnNACRAAEAAAAGMBAAAJAAAABAAAAAwAAAAEAAAACAAAAAAAAAAIAAAABAAAAAkAAAAAAAAACAAAAAQAAAAKAAAACwAAAAwAAAANAAAADgAAABAAAAAEAAAADwAAABAAAAARAAAAEgAAAGNhcGFjaXR5IG92ZXJmbG93AAAAuAkQABEAAABhbGxvYy9zcmMvcmF3X3ZlYy5yc9QJEAAUAAAAGAAAAAUAAABpbmRleCBvdXQgb2YgYm91bmRzOiB0aGUgbGVuIGlzICBidXQgdGhlIGluZGV4IGlzIAAA+AkQACAAAAAYChAAEgAAADAwMDEwMjAzMDQwNTA2MDcwODA5MTAxMTEyMTMxNDE1MTYxNzE4MTkyMDIxMjIyMzI0MjUyNjI3MjgyOTMwMzEzMjMzMzQzNTM2MzczODM5NDA0MTQyNDM0NDQ1NDY0NzQ4NDk1MDUxNTI1MzU0NTU1NjU3NTg1OTYwNjE2MjYzNjQ2NTY2Njc2ODY5NzA3MTcyNzM3NDc1NzY3Nzc4Nzk4MDgxODI4Mzg0ODU4Njg3ODg4OTkwOTE5MjkzOTQ5NTk2OTc5ODk5IG91dCBvZiByYW5nZSBmb3Igc2xpY2Ugb2YgbGVuZ3RoIHJhbmdlIGVuZCBpbmRleCAAACYLEAAQAAAABAsQACIAAABzbGljZSBpbmRleCBzdGFydHMgYXQgIGJ1dCBlbmRzIGF0IABICxAAFgAAAF4LEAANAAAAYXR0ZW1wdCB0byBkaXZpZGUgYnkgemVybwAAAHwLEAAZAAAAAAAAPwAAAL8AQcCXwAALAQEAfAlwcm9kdWNlcnMCCGxhbmd1YWdlAQRSdXN0AAxwcm9jZXNzZWQtYnkDBXJ1c3RjHTEuODMuMCAoOTBiMzVhNjIzIDIwMjQtMTEtMjYpBndhbHJ1cwYwLjIzLjMMd2FzbS1iaW5kZ2VuEzAuMi4xMDAgKDI0MDVlYzJiNCkAUg90YXJnZXRfZmVhdHVyZXMFKw9tdXRhYmxlLWdsb2JhbHMrB3NpbWQxMjgrCHNpZ24tZXh0Kw9yZWZlcmVuY2UtdHlwZXMrCm11bHRpdmFsdWU=", import.meta.url));
323
- const A = wA();
324
- (typeof I == "string" || typeof Request == "function" && I instanceof Request || typeof URL == "function" && I instanceof URL) && (I = fetch(I));
325
- const { instance: g, module: C } = await yA(await I, A);
326
- return hA(g, C);
327
- }
328
- const H = P();
329
- function NA(I) {
330
- const { width: A, height: g, data: C } = I, E = new Uint8ClampedArray(A * g);
331
- for (let B = 0, Q = 0; B < C.length; B += 4, Q++)
332
- E[Q] = C[B] * 54 + C[B + 1] * 183 + C[B + 2] * 19 >> 8;
333
- return E;
334
- }
335
- function rA(I, A, g, C = 5, E = 0) {
336
- E === 0 && (E = 0.3 * ((C - 1) * 0.5 - 1) + 0.8);
337
- const B = Math.floor(C / 2), Q = FA(C, E), i = new Uint8ClampedArray(A * g), s = new Uint8ClampedArray(A * g);
338
- for (let o = 0; o < g; o++) {
339
- const t = o * A;
340
- for (let e = 0; e < A; e++) {
341
- let a = 0;
342
- for (let D = -B; D <= B; D++) {
343
- const c = Math.min(A - 1, Math.max(0, e + D));
344
- a += I[t + c] * Q[B + D];
518
+ const instance = await WebAssembly.instantiate(module, imports);
519
+ if (instance instanceof WebAssembly.Instance) {
520
+ return { instance, module };
521
+ } else {
522
+ return instance;
523
+ }
524
+ }
525
+ }
526
+ function __wbg_get_imports() {
527
+ const imports = {};
528
+ imports.wbg = {};
529
+ imports.wbg.__wbindgen_init_externref_table = function() {
530
+ const table = wasm.__wbindgen_export_0;
531
+ const offset = table.grow(4);
532
+ table.set(0, void 0);
533
+ table.set(offset + 0, void 0);
534
+ table.set(offset + 1, null);
535
+ table.set(offset + 2, true);
536
+ table.set(offset + 3, false);
537
+ };
538
+ return imports;
539
+ }
540
+ function __wbg_finalize_init(instance, module) {
541
+ wasm = instance.exports;
542
+ __wbg_init.__wbindgen_wasm_module = module;
543
+ cachedFloat32ArrayMemory0 = null;
544
+ cachedUint16ArrayMemory0 = null;
545
+ cachedUint8ArrayMemory0 = null;
546
+ wasm.__wbindgen_start();
547
+ return wasm;
548
+ }
549
+ async function __wbg_init(module_or_path) {
550
+ if (wasm !== void 0) return wasm;
551
+ if (typeof module_or_path !== "undefined") {
552
+ if (Object.getPrototypeOf(module_or_path) === Object.prototype) {
553
+ ({ module_or_path } = module_or_path);
554
+ } else {
555
+ console.warn("using deprecated parameters for the initialization function; pass a single object instead");
556
+ }
557
+ }
558
+ if (typeof module_or_path === "undefined") {
559
+ module_or_path = new URL("data:application/wasm;base64,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KAIARw0BQYCbwAAgADYCAA8LIAIgA0F+cTYCBCABIABBAXI2AgQgACABaiAANgIACyAAQYACSQ0CIAEgABALQQAhAUGgm8AAQaCbwAAoAgBBAWsiADYCACAADQRB6JjAACgCACIABEADQCABQQFqIQEgACgCCCIADQALC0Ggm8AAQf8fIAEgAUH/H00bNgIADwtBjJvAACABNgIAQYSbwABBhJvAACgCACAAaiIANgIAIAEgAEEBcjYCBEGIm8AAKAIAIAFGBEBBgJvAAEEANgIAQYibwABBADYCAAsgAEGYm8AAKAIAIgNNDQNBjJvAACgCACICRQ0DQQAhAEGEm8AAKAIAIgRBKUkNAkHgmMAAIQEDQCACIAEoAgAiBU8EQCACIAUgASgCBGpJDQQLIAEoAgghAQwACwALQYibwAAgATYCAEGAm8AAQYCbwAAoAgAgAGoiADYCACABIABBAXI2AgQgACABaiAANgIADwsCQEH4msAAKAIAIgJBASAAQQN2dCIDcUUEQEH4msAAIAIgA3I2AgAgAEH4AXFB8JjAAGoiACECDAELIABB+AFxIgBB8JjAAGohAiAAQfiYwABqKAIAIQALIAIgATYCCCAAIAE2AgwgASACNgIMIAEgADYCCA8LQeiYwAAoAgAiAQRAA0AgAEEBaiEAIAEoAggiAQ0ACwtBoJvAAEH/HyAAIABB/x9NGzYCACADIARPDQBBmJvAAEF/NgIACwu4BAEIfyMAQRBrIgMkACADIAE2AgQgAyAANgIAIANCoICAgA43AggCfwJAAkACQCACKAIQIgkEQCACKAIUIgANAQwCCyACKAIMIgBFDQEgAigCCCIBIABBA3QiAGohBCAAQQhrQQN2QQFqIQYgAigCACEAA0ACQCAAQQRqKAIAIgVFDQAgAygCACAAKAIAIAUgAygCBCgCDBEDAEUNAEEBDAULQQEgASgCACADIAFBBGooAgARAgANBBogAEEIaiEAIAQgAUEIaiIBRw0ACwwCCyAAQRhsIQogAEEBa0H/////AXFBAWohBiACKAIIIQQgAigCACEAA0ACQCAAQQRqKAIAIgFFDQAgAygCACAAKAIAIAEgAygCBCgCDBEDAEUNAEEBDAQLQQAhB0EAIQgCQAJAAkAgBSAJaiIBQQhqLwEAQQFrDgIBAgALIAFBCmovAQAhCAwB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DAELIAJBEGogACgCDCgCACIAQQhqKQIANwMAIAJBGGogAEEQaikCADcDACACIAApAgA3AwggASgCACABKAIEIAJBCGoQBgsgAkEgaiQAC2kBA38jAEEQayIBJAAgAUEEaiAAKAIAIgIgACgCBEEEIAJBAXQiAiACQQRNGyICQQRBBBARIAEoAgRBAUYEQCABKAIIIAEoAgwQLQALIAEoAgghAyAAIAI2AgAgACADNgIEIAFBEGokAAtpAQN/IwBBEGsiASQAIAFBBGogACgCACICIAAoAgRBBCACQQF0IgIgAkEETRsiAkEEQQgQESABKAIEQQFGBEAgASgCCCABKAIMEC0ACyABKAIIIQMgACACNgIAIAAgAzYCBCABQRBqJAALaQEDfyMAQRBrIgEkACABQQRqIAAoAgAiAiAAKAIEQQQgAkEBdCICIAJBBE0bIgJBAkECEBEgASgCBEEBRgRAIAEoAgggASgCDBAtAAsgASgCCCEDIAAgAjYCACAAIAM2AgQgAUEQaiQACxIAIwBBMGsiACQAIABBMGokAAtoAgF/AX4jAEEwayIDJAAgAyABNgIEIAMgADYCACADQQI2AgwgA0Gkl8AANgIIIANCAjcCFCADQoCAgIAwIgQgA62ENwMoIAMgBCADQQRqrYQ3AyAgAyADQSBqNgIQIANBCGogAhAmAAtHAQF/IAAoAgAgACgCCCIDayACSQRAIAAgAyACEBIgACgCCCEDCyACBEAgACgCBCADaiABIAL8CgAACyAAIAIgA2o2AghBAAtEAQJ/IAEoAgQhAiABKAIAIQNBCEEEEDUiAUUEQEEEQQgQOQALIAEgAjYCBCABIAM2AgAgAEGcksAANgIEIAAgATYCAAvGAgACQCAAIAJNBEAgACABTSABIAJLcg0BIwBBMGsiAiQAIAIgATYCBCACIAA2AgAgAkECNgIMIAJBmJbAADYCCCACQgI3AhQgAiACQQRqrUKAgICAMIQ3AyggAiACrUKAgICAMIQ3AyAgAiACQSBqNgIQIAJBCGogAxAmAAsjAEEwayIBJAAgASACNgIEIAEgADYCACABQQI2AgwgAUG8lsAANgIIIAFCAjcCFCABIAFBBGqtQoCAgIAwhDcDKCABIAGtQoCAgIAwhDcDICABIAFBIGo2AhAgAUEIaiADECYACyMAQTBrIgAkACAAIAI2AgQgACABNgIAIABBAjYCDCAAQeSVwAA2AgggAEICNwIUIAAgAEEEaq1CgICAgDCENwMoIAAgAK1CgICAgDCENwMgIAAgAEEgajYCECAAQQhqIAMQJgALQQEBfyMAQSBrIgMkACADQQA2AhAgA0EBNgIEIANCBDcCCCADIAE2AhwgAyAANgIYIAMgA0EYajYCACADIAIQJgALywwBD38jAEEQayIOJAAgCCEMIAkhFiAKIRdBACEIQQAhCSMAQdAAayILJAAgC0EIaiAAIhggASITIAIiCiADIAYgBxAEIAtBFGogCygCDCIZIAsoAhAgAiADEAcgAiADbCIBQQF0IQACfwJAAkAgAUEASCAAQf7///8HS3JFBEAgAEUNAUECIQggAEECEDUiAg0CCyAIIAAQLQALIAtBADYCKCALQoCAgIAgNwIgIAtBADYCNCALQoCAgIAgNwIsQQIhCEEBDAELIAtBADYCKCALIAI2AiQgCyABNgIgAkACQCAAQQIQNSIIBEAgC0EANgI0IAsgCDYCMCALIAE2AixBASABRQ0DGkEAIQAgCygCGCEIIAsoAhwhBiABIQIDQCAAIAZJBEAgCC8BACENIAsoAigiCSALKAIgRgRAIAtBIGoQFgsgCygCJCAJQQF0aiANOwEAIAsgCUEBajYCKCAAQQFqIAZPDQMgCEECai8BACENIAsoAjQiCSALKAIsRgRAIAtBLGoQFgsgCygCMCAJQQF0aiANOwEAIAsgCUEBaiIJNgI0IAhBBGohCCAAQQJqIQAgAkEBayICDQEMBAsLIAAgBkHcj8AAEBgAC0ECIAAQLQALIABBAWogBkHsj8AAEBgACyALKAIwIQhBAAshECALQThqIAsoAiQgCygCKCAIIAkgCiADIAxBAEcQAyALKAJAIQ8gCygCPCEUAkACQAJ/IBAEQEEBIQ1BAAwBCyABQQEQNiINRQ0BIAELIRUgC0EANgJMIAtCgICAgMAANwJEAkACQAJAAkACQCAKQQNrQX1LDQAgA0EBayIRQQJJDQAgBSAFlCAFIAwbIQUgBCAElCAEIAwbIQRBAiEAQQEhCQNAIAAhAiAJIApsIQxBAiEAQQEhCANAIAghBiAAIQggBiAMaiIAIA9PDQUCQCAFIBQgAEECdGoqAgAiB18EQCAAIAFPDQUgACANakECOgAAIAsoAkwiACALKAJERgRAIAtBxABqEBULIAsoAkggAEEDdGoiEiAJNgIEIBIgBjYCACALIABBAWo2AkwMAQsgBCAHX0UNACAAIAFPDQUgACANakEBOgAACyAIQQFqIgAgCkcNAAsgAiACIBFJIgZqIQAgAiEJIAYNAAsgCygCTCICRQ0AA0BBfyEJIAsgAkEBayICNgJMIAsoAkggAkEDdGoiACgCBCEPIAAoAgAhEQNAAkAgCSAPaiIGRSADIAZNcg0AIAYgCmwhEkF/IQADQAJAIAAgCXJFDQAgACARaiIIRSAIIApPcg0AIAEgCCASaiIMSwRAIAwgDWoiDC0AAEEBRw0BIAxBAjoAACALKAJMIgIgCygCREYEQCALQcQAahAVCyALKAJIIAJBA3RqIgwgBjYCBCAMIAg2AgAgCyACQQFqIgI2AkwMAQsgDCABQZyPwAAQGAALIABBAUYiCA0BQQEgAEEBaiAIGyIAQQFMDQALCyAJQQFGIgBFBEBBASAJQQFqIAAbIglBAUwNAQsLIAINAAsLIBAEQEEAIQhBASEJDAQLIAFBARA2IgkEQEEAIQAgAUEBRwRAIAFB/v///wdxIQIDQCAAIA1qIgYtAABBAkYEQCAAIAlqQf8BOgAACyAGQQFqLQAAQQJGBEAgACAJakEBakH/AToAAAsgAiAAQQJqIgBHDQALCwJAIAFBAXFFDQAgACANai0AAEECRw0AIAAgCWpB/wE6AAALIAEhCAwECwwECyAAIAFBzI/AABAYAAsgACABQbyPwAAQGAALIAAgD0Gsj8AAEBgACyALKAJEIgAEQCALKAJIIABBA3QQNAsgFQRAIA0gFRA0CwJAAkAgFkUEQCAJIQAMAQtBASEAIBBFBEAgAUEBEDYiAEUNAgsgCSABIAogAyAXIAAgARACIAhFDQAgCSAIEDQLIAsoAjgiAgRAIBQgAkECdBA0CyALKAIsIgIEQCALKAIwIAJBAXQQNAsgCygCICICBEAgCygCJCACQQF0EDQLIAsoAhQiAgRAIAsoAhggAkEBdBA0CyALKAIIIgIEQCAZIAIQNAsgEwRAIBggExA0CyAOIAE2AgQgDiAANgIAIAtB0ABqJAAMAgsLQQEgARAtAAsgDigCACAOKAIEIA5BEGokAAs4AAJAIAJBgIDEAEYNACAAIAIgASgCEBECAEUNAEEBDwsgA0UEQEEADwsgACADQQAgASgCDBEDAAs2AQF/IwBBIGsiASQAIAFBADYCGCABQQE2AgwgAUHolsAANgIIIAFCBDcCECABQQhqIAAQJgALyAEBAn8jAEEQayIIJAAjAEEQayIHJAAgB0EEaiAAIAEgAiADIAQgBSAGQQBHEAMgAwRAIAIgA0EBdBA0CyABBEAgACABQQF0EDQLAkAgBygCBCIBIAcoAgwiAE0EQCAHKAIIIQEMAQsgAUECdCECIAcoAgghAyAARQRAQQQhASADIAIQNAwBCyADIAJBBCAAQQJ0IgIQMSIBDQBBBCACEC0ACyAIIAA2AgQgCCABNgIAIAdBEGokACAIKAIAIAgoAgQgCEEQaiQAC6YBAQJ/IwBBEGsiByQAIwBBEGsiBiQAIAZBBGogACABIAIgAyAEIAUQBCABBEAgACABEDQLAkAgBigCBCICIAYoAgwiAE0EQCAGKAIIIQEMAQsgBigCCCEDIABFBEBBASEBIAMgAhA0DAELIAMgAkEBIAAQMSIBDQBBASAAEC0ACyAHIAA2AgQgByABNgIAIAZBEGokACAHKAIAIAcoAgQgB0EQaiQAC9YVAhZ/AX0jAEEQayITJAAgACEWIAEhEkEAIQAjAEEQayIGJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADIAIiCGwiCUEASA0AQQEhCiAJBEBBASEAIAlBARA1IgpFDQELIAkEQCAKQQEgCfwLAAtBgMAAQQQQNSIRBEAgBkEANgIMIAYgETYCCCAGQYAINgIEIANBAWsiGEECSQ0LIAhBAWshFyAIQQJrIg5BAnYhGSAOQXxxIhtBAXIhFCAOQQRPBEAgCEECdCIaIBlBBHRqIBZqQQRqIQ8gCCAKaiELIBYgGmohDEEAIQJBAiEAQQEhBwNAIAAhECAHIAhsIgEgF2oiACABQQFqIgNJIAAgEktyDQsgACAJSw0JQQAhAEEBIQEgDCEDA0AgACAOTw0IIA4gAGsiDUEAIA0gDk0bQQFqIQ0CQCAFIANBBGoqAgAiHF8EQCAAIAtqQQFqQQI6AAAgBigCBCACRgRAIAZBBGoQFSAGKAIIIRELIBEgAkEDdGoiFSAHNgIEIBUgAEEBajYCACAGIAJBAWoiAjYCDAwBCyAEIBxfRQ0AIAAgC2pBAWpBADoAAAsgDUECRg0HAkAgBSADQQhqKgIAIhxfBEAgACALakECakECOgAAIAYoAgQgAkYEQCAGQQRqEBULIAYoAggiESACQQN0aiIVIAc2AgQgFSAAQQJqNgIAIAYgAkEBaiICNgIMDAELIAQgHF9FDQAgACALakECakEAOgAACyANQQNGDQUCQCAFIANBDGoqAgAiHF8EQCAAIAtqQQNqQQI6AAAgBigCBCACRgRAIAZBBGoQFQsgBigCCCIRIAJBA3RqIhUgBzYCBCAVIABBA2o2AgAgBiACQQFqIgI2AgwMAQsgBCAcX0UNACAAIAtqQQNqQQA6AAALIA1BBEYNBiABIQ0CQCAFIANBEGoiAyoCACIcXwRAIAAgC2pBBGpBAjoAACAGKAIEIAJGBEAgBkEEahAVCyAGKAIIIhEgAkEDdGoiASAHNgIEIAEgAEEEajYCACAGIAJBAWoiAjYCDAwBCyAEIBxfRQ0AIAAgC2pBBGpBADoAAAsgDUEBaiEBIABBBGohACANIBlJDQALIA8hAyAUIQEgDiAbRwRAA0AgASEAAkAgBSADKgIAIhxfBEAgACALakECOgAAIAYoAgQgAkYEQCAGQQRqEBULIAYoAggiESACQQN0aiIBIAc2AgQgASAANgIAIAYgAkEBaiICNgIMDAELIAQgHF9FDQAgACALakEAOgAACyADQQRqIQMgAEEBaiEBIAAgDkkNAAsLIA8gGmohDyAIIAtqIQsgDCAaaiEMIBAgECAYSSIBaiEAIBAhByABDQALDAsLAkAgDiAbRwRAIAhBAnQiDCAZQQR0aiAWakEEaiEHIAggCmohC0EAIQJBAiEAQQEhDwwBCyAIQQFqIQMgCEEBdEEBayEHQQAhAkECIQADQCACIAdqIgEgAiADakkgASASS3INCiABIAlLDQggAiAIaiECIAAgGEkgAEEBaiEADQALDAwLA0AgACEQIAggD2wiASAXaiIAIAFBAWoiA0kgACASS3INCiAAIAlLDQggByEDIBQhAQNAIAEhAAJAIAMqAgAiHCAFYEUEQCAEIBxfRQ0BIAAgC2pBADoAAAwBCyAAIAtqQQI6AAAgBigCBCACRgRAIAZBBGoQFSAGKAIIIRELIBEgAkEDdGoiASAPNgIEIAEgADYCACAGIAJBAWoiAjYCDAsgA0EEaiEDIABBAWohASAAIA5JDQALIAcgDGohByAIIAtqIQsgECAQIBhJIgFqIQAgECEPIAENAAsMCgtBBEGAwAAQLQALIAAgCRAtAAsgAEECaiEADAILIABBA2ohAAwBCyAAQQFqIQALIAAgDkHQicAAEBgACyACIAhqQQFqIQMgCEEBdCACakEBayEACyADIAAgCUHAicAAEBsACyACIAhqQQFqIQMgCEEBdCACakEBayEACyADIAAgEkHgicAAEBsACyACRQ0AIAhBAWohD0EBIAhrIRAgCEF/cyEUIAgEQCAGKAIIIQEDQCAGIAJBAWsiADYCDCAGKAIEIQwCQCABIABBA3QiDWoiAygCBCAIbCADKAIAaiIDIBRqIgcgCU8NACAHIApqIgstAAANACALQQI6AAAgASANaiIAIAcgCG4iDTYCBCAAIAcgCCANbGs2AgAgBiACNgIMIAIhAAsCQCADIAhrIgIgCU8NACACIApqIgctAAANACAHQQI6AAAgAiACIAhuIgIgCGxrIQcgACAMRgRAIAZBBGoQFSAGKAIIIQELIAEgAEEDdGoiDCACNgIEIAwgBzYCACAGIABBAWoiADYCDAsCQCADIBBqIgIgCU8NACACIApqIgctAAANACAHQQI6AAAgAiACIAhuIgIgCGxrIQcgBigCBCAARgRAIAZBBGoQFQsgBigCCCIBIABBA3RqIgwgAjYCBCAMIAc2AgAgBiAAQQFqIgA2AgwLAkAgA0EBayICIAlPDQAgAiAKaiIHLQAADQAgB0ECOgAAIAIgAiAIbiICIAhsayEHIAYoAgQgAEYEQCAGQQRqEBULIAYoAggiASAAQQN0aiIMIAI2AgQgDCAHNgIAIAYgAEEBaiIANgIMCwJAIANBAWoiAiAJTw0AIAIgCmoiBy0AAA0AIAdBAjoAACACIAIgCG4iAiAIbGshByAGKAIEIABGBEAgBkEEahAVCyAGKAIIIgEgAEEDdGoiDCACNgIEIAwgBzYCACAGIABBAWoiADYCDAsCQCADIBdqIgIgCU8NACACIApqIgctAAANACAHQQI6AAAgAiACIAhuIgIgCGxrIQcgBigCBCAARgRAIAZBBGoQFQsgBigCCCIBIABBA3RqIgwgAjYCBCAMIAc2AgAgBiAAQQFqIgA2AgwLAkAgAyAIaiICIAlPDQAgAiAKaiIHLQAADQAgB0ECOgAAIAIgAiAIbiICIAhsayEHIAYoAgQgAEYEQCAGQQRqEBULIAYoAggiASAAQQN0aiIMIAI2AgQgDCAHNgIAIAYgAEEBaiIANgIMCyAJIAMgD2oiAk0EQCAAIgINAQwDCyACIApqIgMtAAAEQCAAIgINAQwDCyADQQI6AAAgAiACIAhuIgIgCGxrIQMgBigCBCAARgRAIAZBBGoQFQsgBigCCCIBIABBA3RqIgcgAjYCBCAHIAM2AgAgBiAAQQFqIgI2AgwgAg0ACwwBCyAGKAIIIAJBA3RqQQhrIQEDQCAJIAEoAgAiACAUaiIDSwRAIAMgCmoiAy0AAEUNAwsgACAJTyIHRQRAIAAgCmoiAy0AAEUNAwsgCSAAIBBqIgNLBEAgAyAKaiIDLQAARQ0DCyAJIABBAWsiA0sEQCADIApqIgMtAABFDQMLIAkgAEEBaiIDSwRAIAMgCmoiAy0AAEUNAwsgCSAAIBdqIgNLBEAgAyAKaiIDLQAARQ0DCyAHRQRAIAAgCmoiAy0AAEUNAwsgCSAAIA9qIgBLBEAgACAKaiIDLQAARQ0DCyABQQhrIQEgAkEBayICDQALCyAGKAIEIgAEQCAGKAIIIABBA3QQNAsgEgRAIBYgEkECdBA0CyATIAk2AgQgEyAKNgIAIAZBEGokAAwBCyADQQI6AABBsInAABAfAAsgEygCACATKAIEIBNBEGokAAvoDgIUfwF9IwBBEGsiEiQAIAAhFSABIRNBACEBIwBBEGsiByQAAkACQAJAAkACQAJAAkACQAJAIAIgA2wiCEEASA0AQQEhDEEBIQkCQCAIBEBBASENIAhBARA2IgxFDQIgCEEBEDUiCUUNAQsgCARAIAlBASAI/AsAC0GAwABBBBA1IgsEQCAHQQA2AgwgByALNgIIIAdBgAg2AgQgAkEBayIWQQJJDQcgA0EBayIXQQJJDQcgAiAMaiEUIAIgCWohD0ECIAJrIRggAkECdCIZIBVqQQRqIRAgAiERQQIhAEEBIQoDQCAAIQMgECENQQEhAANAIAAgEWoiDiATTw0HAkAgBSANKgIAIhpfBEAgCCAOTQ0HIAAgD2pBAjoAACAAIBRqQf8BOgAAIAcoAgQgBkYEQCAHQQRqEBUgBygCCCELCyALIAZBA3RqIgEgCjYCBCABIAA2AgAgByAGQQFqIgY2AgwgBiEBDAELIAQgGl9FDQAgCCAOTQ0HIAAgD2pBADoAAAsgDUEEaiENIBggAEEBaiIAakEBRw0ACyAQIBlqIRAgAiAUaiEUIAIgD2ohDyACIBFqIREgAyADIBdJIg1qIQAgAyEKIA0NAAsgAUUNByACQQFqIQ1BASACayEQIAJBf3MhESACRQ0GA0AgByABQQFrIgA2AgwgBygCBCEKAkAgCyAAQQN0Ig5qIgMoAgQgAmwgAygCAGoiAyARaiIGIAhPDQAgBiAJaiIPLQAADQAgD0ECOgAAIAYgDGpB/wE6AAAgBygCCCILIA5qIgAgBiACbiIONgIEIAAgBiACIA5sazYCACAHIAE2AgwgASEACwJAIAMgAmsiASAITw0AIAEgCWoiBi0AAA0AIAZBAjoAACABIAxqQf8BOgAAIAEgASACbiIBIAJsayEGIAAgCkYEQCAHQQRqEBULIAcoAggiCyAAQQN0aiIKIAE2AgQgCiAGNgIAIAcgAEEBaiIANgIMCwJAIAMgEGoiASAITw0AIAEgCWoiBi0AAA0AIAZBAjoAACABIAxqQf8BOgAAIAEgASACbiIBIAJsayEGIAcoAgQgAEYEQCAHQQRqEBULIAcoAggiCyAAQQN0aiIKIAE2AgQgCiAGNgIAIAcgAEEBaiIANgIMCwJAIANBAWsiASAITw0AIAEgCWoiBi0AAA0AIAZBAjoAACABIAxqQf8BOgAAIAEgASACbiIBIAJsayEGIAcoAgQgAEYEQCAHQQRqEBULIAcoAggiCyAAQQN0aiIKIAE2AgQgCiAGNgIAIAcgAEEBaiIANgIMCwJAIANBAWoiASAITw0AIAEgCWoiBi0AAA0AIAZBAjoAACABIAxqQf8BOgAAIAEgASACbiIBIAJsayEGIAcoAgQgAEYEQCAHQQRqEBULIAcoAggiCyAAQQN0aiIKIAE2AgQgCiAGNgIAIAcgAEEBaiIANgIMCwJAIAMgFmoiASAITw0AIAEgCWoiBi0AAA0AIAZBAjoAACABIAxqQf8BOgAAIAEgASACbiIBIAJsayEGIAcoAgQgAEYEQCAHQQRqEBULIAcoAggiCyAAQQN0aiIKIAE2AgQgCiAGNgIAIAcgAEEBaiIANgIMCwJAIAIgA2oiASAITw0AIAEgCWoiBi0AAA0AIAZBAjoAACABIAxqQf8BOgAAIAEgASACbiIBIAJsayEGIAcoAgQgAEYEQCAHQQRqEBULIAcoAggiCyAAQQN0aiIKIAE2AgQgCiAGNgIAIAcgAEEBaiIANgIMCyAIIAMgDWoiAU0EQCAAIgENAQwJCyABIAlqIgMtAAAEQCAAIgENAQwJCyADQQI6AAAgASAMakH/AToAACABIAEgAm4iASACbGshAyAHKAIEIABGBEAgB0EEahAVCyAHKAIIIgsgAEEDdGoiBiABNgIEIAYgAzYCACAHIABBAWoiATYCDCABDQALDAcLQQRBgMAAEC0AC0EBIAgQLQALIA0gCBAtAAsgDiAIQaCKwAAQGAALIA4gCEGQisAAEBgACyAOIBNBgIrAABAYAAsgCyABQQN0akEIayEKA0AgByABQQFrIgE2AgwgCCAKKAIAIgIgEWoiAEsEQCAAIAlqIgYtAABFDQQLIAIgCE8iA0UEQCACIAlqIgYtAABFDQMLIAggAiAQaiIASwRAIAAgCWoiBi0AAEUNBAsgCCACQQFrIgBLBEAgACAJaiIGLQAARQ0ECyAIIAJBAWoiAEsEQCAAIAlqIgYtAABFDQQLIAggAiAWaiIASwRAIAAgCWoiBi0AAEUNBAsgA0UEQCACIAlqIgYtAABFDQMLIAggAiANaiIASwRAIAAgCWoiBi0AAEUNBAsgCkEIayEKIAENAAsLIAcoAgQiAARAIAcoAgggAEEDdBA0CyAIBEAgCSAIEDQLIBMEQCAVIBNBAnQQNAsgEiAINgIEIBIgDDYCACAHQRBqJAAMAgsgAiEACyAGQQI6AAAgACAMakH/AToAAEHwicAAEB8ACyASKAIAIBIoAgQgEkEQaiQACy8AAkAgAWlBAUYgAEGAgICAeCABa01xRQ0AIAAEQCAAIAEQNSIBRQ0BCyABDwsAC4ABAQR/IwBBEGsiBSQAAkACQCACIANsIgZBAEgNAAJAIAZFBEBBASEHDAELQQEhCCAGQQEQNiIHRQ0BCyAAIAEgAiADIAQgByAGEAIgAQRAIAAgARA0CyAFIAY2AgQgBSAHNgIADAELIAggBhAtAAsgBSgCACAFKAIEIAVBEGokAAv6AQICfwF+IwBBEGsiAiQAIAJBATsBDCACIAE2AgggAiAANgIEIwBBEGsiASQAIAJBBGoiACkCACEEIAEgADYCDCABIAQ3AgQjAEEQayIAJAAgAUEEaiIBKAIAIgIoAgwhAwJAAkACQAJAIAIoAgQOAgABAgsgAw0BQQEhAkEAIQMMAgsgAw0AIAIoAgAiAigCBCEDIAIoAgAhAgwBCyAAQYCAgIB4NgIAIAAgATYCDCAAQYCSwAAgASgCBCABKAIIIgAtAAggAC0ACRAPAAsgACADNgIEIAAgAjYCACAAQeSRwAAgASgCBCABKAIIIgAtAAggAC0ACRAPAAuuAQECfyMAQRBrIgUkACMAQRBrIgQkACAEQQRqIAAgASACIAMQByABBEAgACABEDQLAkAgBCgCBCIBIAQoAgwiAE0EQCAEKAIIIQEMAQsgAUEBdCECIAQoAgghAyAARQRAQQIhASADIAIQNAwBCyADIAJBAiAAQQF0IgIQMSIBDQBBAiACEC0ACyAFIAA2AgQgBSABNgIAIARBEGokACAFKAIAIAUoAgQgBUEQaiQAC6AEAQd/IwBBEGsiBCQAIAAhBkEAIQACQCABRQRAQQEhBQwBCyABQQEQNiIFBEAgAUEISQ0BIAFBA3YhBwNAAkACQCAAIAFPDQAgACAFaiICQX9BACAAIAZqIgMtAABBAkYbOgAAIAEgAEEBaksEQCACQQFqQX9BACADQQFqLQAAQQJGGzoAACABIABBAmpLBEAgAkECakF/QQAgA0ECai0AAEECRhs6AAAgASAAQQNqSwRAIAJBA2pBf0EAIANBA2otAABBAkYbOgAAIAEgAEEEaksEQCACQQRqQX9BACADQQRqLQAAQQJGGzoAACABIABBBWpLBEAgAkEFakF/QQAgA0EFai0AAEECRhs6AAAgASAAQQZqSwRAIAJBBmpBf0EAIANBBmotAABBAkYbOgAAIABBB2oiCCABSQ0HIAghAAwGCyAAQQZqIQAMBQsgAEEFaiEADAQLIABBBGohAAwDCyAAQQNqIQAMAgsgAEECaiEADAELIABBAWohAAsgACABQaCJwAAQGAALIAJBB2pBf0EAIANBB2otAABBAkYbOgAAIABBCGohACAHQQFrIgcNAAsMAQtBASABEC0ACyABIAFB+P///wdxIgBHBEADQCAAIAVqQX9BACAAIAZqLQAAQQJGGzoAACAAQQFqIgAgAUkNAAsLIAEEQCAGIAEQNAsgBCABNgIEIAQgBTYCACAEKAIAIAQoAgQgBEEQaiQACyUBAX8gACgCACIBQYCAgIB4ckGAgICAeEcEQCAAKAIEIAEQNAsLFwEBfyAAKAIAIgEEQCAAKAIEIAEQNAsLHwAgAEEIakHwkMAAKQIANwIAIABB6JDAACkCADcCAAsfACAAQQhqQYCRwAApAgA3AgAgAEH4kMAAKQIANwIAC0MAIAAEQCAAIAEQOQALIwBBIGsiACQAIABBADYCGCAAQQE2AgwgAEHQk8AANgIIIABCBDcCECAAQQhqQdiTwAAQJgALHAAgAEEANgIQIABCADcCCCAAQoCAgIDAADcCAAsNACABBEAgACABEDQLCxYAIAAoAgAgASACIAAoAgQoAgwRAwAL5wYBBX8CfwJAAkACQAJAAkACQAJAIABBBGsiBygCACIIQXhxIgRBBEEIIAhBA3EiBRsgAWpPBEAgBUEAIAFBJ2oiBiAESRsNAQJAIAJBCU8EQCACIAMQCSICDQFBAAwKC0EAIQIgA0HM/3tLDQhBECADQQtqQXhxIANBC0kbIQEgAEEIayEGIAVFBEAgBkUgAUGAAklyIAQgAWtBgIAISyABIARPcnINByAADAoLIAQgBmohBQJAIAEgBEsEQCAFQYybwAAoAgBGDQFBiJvAACgCACAFRwRAIAUoAgQiCEECcQ0JIAhBeHEiCCAEaiIEIAFJDQkgBSAIEAogBCABayIFQRBPBEAgByABIAcoAgBBAXFyQQJyNgIAIAEgBmoiASAFQQNyNgIEIAQgBmoiBCAEKAIEQQFyNgIEIAEgBRAIDAkLIAcgBCAHKAIAQQFxckECcjYCACAEIAZqIgEgASgCBEEBcjYCBAwIC0GAm8AAKAIAIARqIgQgAUkNCAJAIAQgAWsiBUEPTQRAIAcgCEEBcSAEckECcjYCACAEIAZqIgEgASgCBEEBcjYCBEEAIQVBACEBDAELIAcgASAIQQFxckECcjYCACABIAZqIgEgBUEBcjYCBCAEIAZqIgQgBTYCACAEIAQoAgRBfnE2AgQLQYibwAAgATYCAEGAm8AAIAU2AgAMBwsgBCABayIEQQ9NDQYgByABIAhBAXFyQQJyNgIAIAEgBmoiASAEQQNyNgIEIAUgBSgCBEEBcjYCBCABIAQQCAwGC0GEm8AAKAIAIARqIgQgAUsNBAwGCyADIAEgASADSxsiAwRAIAIgACAD/AoAAAsgBygCACIDQXhxIgcgAUEEQQggA0EDcSIDG2pJDQIgA0UgBiAHT3INBkHsksAAQS5BnJPAABAcAAtBrJLAAEEuQdySwAAQHAALQeySwABBLkGck8AAEBwAC0GsksAAQS5B3JLAABAcAAsgByABIAhBAXFyQQJyNgIAIAEgBmoiBSAEIAFrIgFBAXI2AgRBhJvAACABNgIAQYybwAAgBTYCAAsgBkUNACAADAMLIAMQASIBRQ0BIANBfEF4IAcoAgAiAkEDcRsgAkF4cWoiAiACIANLGyICBEAgASAAIAL8CgAACyABIQILIAAQBQsgAgsLEAAgASAAKAIAIAAoAgQQMAsTACAAQZySwAA2AgQgACABNgIAC18BAn8CQAJAIABBBGsoAgAiAkF4cSIDQQRBCCACQQNxIgIbIAFqTwRAIAJBACADIAFBJ2pLGw0BIAAQBQwCC0GsksAAQS5B3JLAABAcAAtB7JLAAEEuQZyTwAAQHAALCxkAAn8gAUEJTwRAIAEgABAJDAELIAAQAQsLPgACQAJ/IAFBCU8EQCABIAAQCQwBCyAAEAELIgFFDQAgAUEEay0AAEEDcUUgAEVyDQAgAUEAIAD8CwALIAELDQAgAEHMkcAAIAEQBgsMACAAIAEpAgA3AwALGQAgACABQaSbwAAoAgAiAEECIAAbEQAAAAsJACAAQQA2AgALC88XAgBBgIDAAAu8F2Fzc2VydGlvbiBmYWlsZWQ6IG1pbiA8PSBtYXhzcmMvY2FubnkucnMAc3JjL2h5c3RlcmVzaXMucnMAc3JjL2dhdXNzaWFuX2JsdXIucnMAL3J1c3RjL2RlZDVjMDZjZjIxZDJiOTNiZmZkNWQ4ODRhYTZlOTY5MzRlZTQyMzQvbGlicmFyeS9jb3JlL3NyYy9jbXAucnMAc3JjL2dyYWRpZW50X2NhbGN1bGF0aW9uLnJzAHNyYy9kaWxhdGlvbi5ycwBzcmMvbm9uX21heGltdW1fc3VwcHJlc3Npb24ucnMAbGlicmFyeS9hbGxvYy9zcmMvcmF3X3ZlYy9tb2QucnMAL3J1c3QvZGVwcy9kbG1hbGxvYy0wLjIuMTAvc3JjL2RsbWFsbG9jLnJzAGxpYnJhcnkvc3RkL3NyYy9hbGxvYy5ycwAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9vbmNlX2NlbGwtMS4yMS4zL3NyYy9saWIucnMAAFAAEABHAAAAQgQAAAkAAAA7ABAAFAAAAPsAAAAfAAAAOwAQABQAAAAtAQAAGQAAADsAEAAUAAAAHwEAAA0AAAA7ABAAFAAAACABAAANAAAAOwAQABQAAAAhAQAADQAAADsAEAAUAAAAIgEAAA0AAAA7ABAAFAAAAE8AAAAbAAAAOwAQABQAAABQAAAAHwAAADsAEAAUAAAAeAAAABkAAAA7ABAAFAAAAGIAAAAhAAAAOwAQABQAAABFAQAAHwAAADsAEAAUAAAAfAEAAB8AAAA7ABAAFAAAAH4BAAAdAAAAOwAQABQAAAB/AQAAHAAAADsAEAAUAAAAUAEAAB8AAAA7ABAAFAAAAHIBAAAdAAAAOwAQABQAAABzAQAAHAAAADsAEAAUAAAAdAEAABwAAAA7ABAAFAAAAGgBAAANAAAAOwAQABQAAABpAQAADQAAADsAEAAUAAAAagEAAA0AAAA7ABAAFAAAAGsBAAANAAAAOwAQABQAAABHAQAAHQAAADsAEAAUAAAASQEAABwAAAA7ABAAFAAAAI8AAAAbAAAAOwAQABQAAACQAAAAHwAAADsAEAAUAAAAkwAAACIAAAA7ABAAFAAAAJUAAAAiAAAAOwAQABQAAAC9AAAALwAAADsAEAAUAAAAvgAAAC0AAAA7ABAAFAAAAL8AAAAtAAAAOwAQABQAAACfAAAAEQAAADsAEAAUAAAAoAAAABEAAAA7ABAAFAAAAKEAAAARAAAAOwAQABQAAACnAAAAEQAAADsAEAAUAAAA2AAAABsAAAA7ABAAFAAAANkAAAAfAAAAOwAQABQAAADgAAAAGQAAAEtlcm5lbCBzaXplIG11c3QgYmUgb2RkIGFuZCBncmVhdGVyIHRoYW4gMAAAFAQQACoAAAA7ABAAFAAAAJQBAAAJAAAASW5wdXQgYXJyYXkgc2l6ZSBkb2Vzbid0IG1hdGNoIHdpZHRoICogaGVpZ2h0AAAAWAQQAC0AAAA7ABAAFAAAAJEBAAAJAAAAKQAQABEAAACHAAAAHgAAACkAEAARAAAAaAAAABoAAAApABAAEQAAACQAAAAnAAAAKQAQABEAAAAtAAAAGwAAACkAEAARAAAAIwAAACQAAAApABAAEQAAANkAAAAaAAAAKQAQABEAAACyAAAAFwAAACkAEAARAAAAuwAAABkAAAApABAAEQAAALYAAAAZAAAAYXNzZXJ0aW9uIGZhaWxlZDogbWluIDw9IG1heFAAEABHAAAAQgQAAAkAAACYABAAGwAAAAwAAAAWAAAAmAAQABsAAAAMAAAAMAAAAJgAEAAbAAAADQAAABYAAACYABAAGwAAAA0AAAA0AAAAmAAQABsAAAAOAAAAEwAAAJgAEAAbAAAADwAAABMAAAC0ABAADwAAAGQAAAANAAAAtAAQAA8AAABfAAAAHwAAALQAEAAPAAAAVAAAAA0AAAC0ABAADwAAAE8AAAAfAAAAtAAQAA8AAAAzAAAADQAAALQAEAAPAAAALgAAAB8AAAC0ABAADwAAAB4AAAARAAAAtAAQAA8AAAAZAAAAGwAAAMQAEAAeAAAAWgAAACAAAADEABAAHgAAAGEAAAAWAAAAxAAQAB4AAABiAAAAFgAAAMQAEAAeAAAAeQAAACoAAADEABAAHgAAAHoAAAAqAAAAxAAQAB4AAAB2AAAAKgAAAMQAEAAeAAAAdwAAACoAAADEABAAHgAAAHEAAAAmAAAAxAAQAB4AAAByAAAAJgAAAMQAEAAeAAAAbgAAACYAAADEABAAHgAAAG8AAAAmAAAAxAAQAB4AAAAuAAAAEgAAAMQAEAAeAAAAMgAAAA0AAADEABAAHgAAADAAAAANAAAAxAAQAB4AAAATAAAAEwAAAMQAEAAeAAAAFAAAABMAAADEABAAHgAAABUAAAATAAAAxAAQAB4AAAAWAAAAEwAAAMQAEAAeAAAAGQAAABMAAADEABAAHgAAABoAAAATAAAAxAAQAB4AAAAbAAAAEwAAAMQAEAAeAAAAHAAAABMAAAAcABAADAAAACgAAAAgAAAAHAAQAAwAAAASAAAAFwAAABwAEAAMAAAAFwAAABkAAAAcABAADAAAABQAAAAZAAAAHAAQAAwAAABRAAAAHgAAABwAEAAMAAAAUgAAAB4AAABMYXp5IGluc3RhbmNlIGhhcyBwcmV2aW91c2x5IGJlZW4gcG9pc29uZWQAAPwHEAAqAAAASAEQAFoAAAAIAwAAGQAAAHJlZW50cmFudCBpbml0AABACBAADgAAAEgBEABaAAAAegIAAA0AAAB8/YsyV+ZX+QLfRL/jSOevbV3L1ixQ62N4QaZXcRuLuW1lbW9yeSBhbGxvY2F0aW9uIG9mICBieXRlcyBmYWlsZWQAAIgIEAAVAAAAnQgQAA0AAAAvARAAGAAAAGQBAAAJAAAABAAAAAwAAAAEAAAABQAAAAYAAAAHAAAAAAAAAAgAAAAEAAAACAAAAAkAAAAKAAAACwAAAAwAAAAQAAAABAAAAA0AAAAOAAAADwAAABAAAAAAAAAACAAAAAQAAAARAAAAYXNzZXJ0aW9uIGZhaWxlZDogcHNpemUgPj0gc2l6ZSArIG1pbl9vdmVyaGVhZAAABAEQACoAAACxBAAACQAAAGFzc2VydGlvbiBmYWlsZWQ6IHBzaXplIDw9IHNpemUgKyBtYXhfb3ZlcmhlYWQAAAQBEAAqAAAAtwQAAA0AAAAEAAAADAAAAAQAAAASAAAAY2FwYWNpdHkgb3ZlcmZsb3cAAAC8CRAAEQAAAOMAEAAgAAAAHAAAAAUAAAAwMDAxMDIwMzA0MDUwNjA3MDgwOTEwMTExMjEzMTQxNTE2MTcxODE5MjAyMTIyMjMyNDI1MjYyNzI4MjkzMDMxMzIzMzM0MzUzNjM3MzgzOTQwNDE0MjQzNDQ0NTQ2NDc0ODQ5NTA1MTUyNTM1NDU1NTY1NzU4NTk2MDYxNjI2MzY0NjU2NjY3Njg2OTcwNzE3MjczNzQ3NTc2Nzc3ODc5ODA4MTgyODM4NDg1ODY4Nzg4ODk5MDkxOTI5Mzk0OTU5Njk3OTg5OXJhbmdlIGVuZCBpbmRleCAgb3V0IG9mIHJhbmdlIGZvciBzbGljZSBvZiBsZW5ndGggAACwChAAEAAAAMAKEAAiAAAAc2xpY2UgaW5kZXggc3RhcnRzIGF0ICBidXQgZW5kcyBhdCAA9AoQABYAAAAKCxAADQAAAHJhbmdlIHN0YXJ0IGluZGV4IAAAKAsQABIAAADAChAAIgAAAGF0dGVtcHQgdG8gZGl2aWRlIGJ5IHplcm8AAABMCxAAGQAAAGluZGV4IG91dCBvZiBib3VuZHM6IHRoZSBsZW4gaXMgIGJ1dCB0aGUgaW5kZXggaXMgAABwCxAAIAAAAJALEAASAAAAAAAAPwAAAL8AQdSXwAALAQEAfAlwcm9kdWNlcnMCCGxhbmd1YWdlAQRSdXN0AAxwcm9jZXNzZWQtYnkDBXJ1c3RjHTEuOTIuMCAoZGVkNWMwNmNmIDIwMjUtMTItMDgpBndhbHJ1cwYwLjIzLjMMd2FzbS1iaW5kZ2VuEzAuMi4xMDAgKDI0MDVlYzJiNCkAdA90YXJnZXRfZmVhdHVyZXMHKw9tdXRhYmxlLWdsb2JhbHMrE25vbnRyYXBwaW5nLWZwdG9pbnQrB3NpbWQxMjgrC2J1bGstbWVtb3J5KwhzaWduLWV4dCsPcmVmZXJlbmNlLXR5cGVzKwptdWx0aXZhbHVl", import.meta.url);
560
+ }
561
+ const imports = __wbg_get_imports();
562
+ if (typeof module_or_path === "string" || typeof Request === "function" && module_or_path instanceof Request || typeof URL === "function" && module_or_path instanceof URL) {
563
+ module_or_path = fetch(module_or_path);
564
+ }
565
+ const { instance, module } = await __wbg_load(await module_or_path, imports);
566
+ return __wbg_finalize_init(instance, module);
567
+ }
568
+ let wasmReadyPromise = null;
569
+ function initializeWasm() {
570
+ if (!wasmReadyPromise) {
571
+ wasmReadyPromise = __wbg_init();
572
+ }
573
+ return wasmReadyPromise;
574
+ }
575
+ function convertToGrayscale(imageData) {
576
+ const { width, height, data } = imageData;
577
+ const grayscale = new Uint8ClampedArray(width * height);
578
+ for (let i = 0, j = 0; i < data.length; i += 4, j++) {
579
+ grayscale[j] = data[i] * 54 + data[i + 1] * 183 + data[i + 2] * 19 >> 8;
580
+ }
581
+ return grayscale;
582
+ }
583
+ function gaussianBlurGrayscale(grayscale, width, height, kernelSize = 5, sigma = 0) {
584
+ if (sigma === 0) {
585
+ sigma = 0.3 * ((kernelSize - 1) * 0.5 - 1) + 0.8;
586
+ }
587
+ const halfKernel = Math.floor(kernelSize / 2);
588
+ const kernel = createGaussianKernel(kernelSize, sigma);
589
+ const tempArray = new Uint8ClampedArray(width * height);
590
+ const blurred = new Uint8ClampedArray(width * height);
591
+ for (let y = 0; y < height; y++) {
592
+ const rowOffset = y * width;
593
+ for (let x = 0; x < width; x++) {
594
+ let sum = 0;
595
+ for (let k = -halfKernel; k <= halfKernel; k++) {
596
+ const xOffset = Math.min(width - 1, Math.max(0, x + k));
597
+ sum += grayscale[rowOffset + xOffset] * kernel[halfKernel + k];
345
598
  }
346
- i[t + e] = a;
599
+ tempArray[rowOffset + x] = sum;
347
600
  }
348
601
  }
349
- for (let o = 0; o < A; o++)
350
- for (let t = 0; t < g; t++) {
351
- let e = 0;
352
- for (let a = -B; a <= B; a++) {
353
- const D = Math.min(g - 1, Math.max(0, t + a));
354
- e += i[D * A + o] * Q[B + a];
602
+ for (let x = 0; x < width; x++) {
603
+ for (let y = 0; y < height; y++) {
604
+ let sum = 0;
605
+ for (let k = -halfKernel; k <= halfKernel; k++) {
606
+ const yOffset = Math.min(height - 1, Math.max(0, y + k));
607
+ sum += tempArray[yOffset * width + x] * kernel[halfKernel + k];
355
608
  }
356
- s[t * A + o] = Math.round(e);
357
- }
358
- return s;
359
- }
360
- function FA(I, A) {
361
- const g = new Float32Array(I), C = Math.floor(I / 2);
362
- let E = 0;
363
- for (let B = 0; B < I; B++) {
364
- const Q = B - C;
365
- g[B] = Math.exp(-(Q * Q) / (2 * A * A)), E += g[B];
366
- }
367
- for (let B = 0; B < I; B++)
368
- g[B] /= E;
369
- return g;
370
- }
371
- function GA(I, A, g) {
372
- const C = new Int16Array(A * g), E = new Int16Array(A * g);
373
- for (let B = 1; B < g - 1; B++) {
374
- const Q = B * A, i = (B - 1) * A, s = (B + 1) * A;
375
- for (let o = 1; o < A - 1; o++) {
376
- const t = Q + o, e = I[i + o - 1], a = I[i + o], D = I[i + o + 1], c = I[Q + o - 1], y = I[Q + o + 1], w = I[s + o - 1], n = I[s + o], h = I[s + o + 1], N = D - e + 2 * (y - c) + (h - w), F = w + 2 * n + h - (e + 2 * a + D);
377
- C[t] = N, E[t] = F;
378
- }
379
- }
380
- return { dx: C, dy: E };
381
- }
382
- function RA(I, A, g, C, E) {
383
- const B = new Float32Array(g * C), Q = new Float32Array(g * C);
384
- for (let i = 0; i < I.length; i++) {
385
- const s = I[i], o = A[i];
386
- E ? B[i] = Math.sqrt(s * s + o * o) : B[i] = Math.abs(s) + Math.abs(o);
387
- }
388
- for (let i = 1; i < C - 1; i++)
389
- for (let s = 1; s < g - 1; s++) {
390
- const o = i * g + s, t = B[o];
391
- if (t === 0) {
392
- Q[o] = 0;
609
+ blurred[y * width + x] = Math.round(sum);
610
+ }
611
+ }
612
+ return blurred;
613
+ }
614
+ function createGaussianKernel(size, sigma) {
615
+ const kernel = new Float32Array(size);
616
+ const halfSize = Math.floor(size / 2);
617
+ let sum = 0;
618
+ for (let i = 0; i < size; i++) {
619
+ const x = i - halfSize;
620
+ kernel[i] = Math.exp(-(x * x) / (2 * sigma * sigma));
621
+ sum += kernel[i];
622
+ }
623
+ for (let i = 0; i < size; i++) {
624
+ kernel[i] /= sum;
625
+ }
626
+ return kernel;
627
+ }
628
+ function calculateGradients(blurred, width, height) {
629
+ const dx = new Int16Array(width * height);
630
+ const dy = new Int16Array(width * height);
631
+ for (let y = 1; y < height - 1; y++) {
632
+ const rowOffset = y * width;
633
+ const prevRowOffset = (y - 1) * width;
634
+ const nextRowOffset = (y + 1) * width;
635
+ for (let x = 1; x < width - 1; x++) {
636
+ const currentIdx = rowOffset + x;
637
+ const p0 = blurred[prevRowOffset + x - 1];
638
+ const p1 = blurred[prevRowOffset + x];
639
+ const p2 = blurred[prevRowOffset + x + 1];
640
+ const p3 = blurred[rowOffset + x - 1];
641
+ const p5 = blurred[rowOffset + x + 1];
642
+ const p6 = blurred[nextRowOffset + x - 1];
643
+ const p7 = blurred[nextRowOffset + x];
644
+ const p8 = blurred[nextRowOffset + x + 1];
645
+ const gx = p2 - p0 + 2 * (p5 - p3) + (p8 - p6);
646
+ const gy = p6 + 2 * p7 + p8 - (p0 + 2 * p1 + p2);
647
+ dx[currentIdx] = gx;
648
+ dy[currentIdx] = gy;
649
+ }
650
+ }
651
+ return { dx, dy };
652
+ }
653
+ function nonMaximumSuppression(dx, dy, width, height, L2gradient) {
654
+ const magnitude = new Float32Array(width * height);
655
+ const suppressed = new Float32Array(width * height);
656
+ for (let i = 0; i < dx.length; i++) {
657
+ const gx = dx[i];
658
+ const gy = dy[i];
659
+ if (L2gradient) {
660
+ magnitude[i] = Math.sqrt(gx * gx + gy * gy);
661
+ } else {
662
+ magnitude[i] = Math.abs(gx) + Math.abs(gy);
663
+ }
664
+ }
665
+ for (let y = 1; y < height - 1; y++) {
666
+ for (let x = 1; x < width - 1; x++) {
667
+ const idx = y * width + x;
668
+ const mag = magnitude[idx];
669
+ if (mag === 0) {
670
+ suppressed[idx] = 0;
393
671
  continue;
394
672
  }
395
- const e = I[o], a = A[o];
396
- let D = 0, c = 0;
397
- const y = Math.abs(e), w = Math.abs(a);
398
- if (w > y * 2.4142)
399
- D = B[o - g], c = B[o + g];
400
- else if (y > w * 2.4142)
401
- D = B[o - 1], c = B[o + 1];
402
- else {
403
- const n = (e ^ a) < 0 ? -1 : 1;
404
- a > 0 ? (D = B[(i - 1) * g + (s - n)], c = B[(i + 1) * g + (s + n)]) : (D = B[(i + 1) * g + (s - n)], c = B[(i - 1) * g + (s + n)]), e > 0 && a > 0 || e < 0 && a < 0 ? (D = B[(i - 1) * g + (s + 1)], c = B[(i + 1) * g + (s - 1)]) : (D = B[(i - 1) * g + (s - 1)], c = B[(i + 1) * g + (s + 1)]);
673
+ const gx = dx[idx];
674
+ const gy = dy[idx];
675
+ let neighbor1 = 0, neighbor2 = 0;
676
+ const absGx = Math.abs(gx);
677
+ const absGy = Math.abs(gy);
678
+ if (absGy > absGx * 2.4142) {
679
+ neighbor1 = magnitude[idx - width];
680
+ neighbor2 = magnitude[idx + width];
681
+ } else if (absGx > absGy * 2.4142) {
682
+ neighbor1 = magnitude[idx - 1];
683
+ neighbor2 = magnitude[idx + 1];
684
+ } else {
685
+ const s = (gx ^ gy) < 0 ? -1 : 1;
686
+ if (gy > 0) {
687
+ neighbor1 = magnitude[(y - 1) * width + (x - s)];
688
+ neighbor2 = magnitude[(y + 1) * width + (x + s)];
689
+ } else {
690
+ neighbor1 = magnitude[(y + 1) * width + (x - s)];
691
+ neighbor2 = magnitude[(y - 1) * width + (x + s)];
692
+ }
693
+ if (gx > 0 && gy > 0 || gx < 0 && gy < 0) {
694
+ neighbor1 = magnitude[(y - 1) * width + (x + 1)];
695
+ neighbor2 = magnitude[(y + 1) * width + (x - 1)];
696
+ } else {
697
+ neighbor1 = magnitude[(y - 1) * width + (x - 1)];
698
+ neighbor2 = magnitude[(y + 1) * width + (x + 1)];
699
+ }
700
+ }
701
+ if (mag >= neighbor1 && mag >= neighbor2) {
702
+ suppressed[idx] = mag;
703
+ } else {
704
+ suppressed[idx] = 0;
705
+ }
706
+ }
707
+ }
708
+ return suppressed;
709
+ }
710
+ function hysteresisThresholding(suppressed, width, height, lowThreshold, highThreshold) {
711
+ const edgeMap = new Uint8Array(width * height);
712
+ const stack = [];
713
+ for (let y = 1; y < height - 1; y++) {
714
+ for (let x = 1; x < width - 1; x++) {
715
+ const idx = y * width + x;
716
+ const mag = suppressed[idx];
717
+ if (mag >= highThreshold) {
718
+ edgeMap[idx] = 2;
719
+ stack.push({ x, y });
720
+ } else if (mag >= lowThreshold) {
721
+ edgeMap[idx] = 0;
722
+ } else {
723
+ edgeMap[idx] = 1;
724
+ }
725
+ }
726
+ }
727
+ for (let x = 0; x < width; x++) {
728
+ edgeMap[x] = 1;
729
+ edgeMap[(height - 1) * width + x] = 1;
730
+ }
731
+ for (let y = 1; y < height - 1; y++) {
732
+ edgeMap[y * width] = 1;
733
+ edgeMap[y * width + width - 1] = 1;
734
+ }
735
+ const dxNeighbors = [-1, 0, 1, -1, 1, -1, 0, 1];
736
+ const dyNeighbors = [-1, -1, -1, 0, 0, 1, 1, 1];
737
+ while (stack.length > 0) {
738
+ const { x, y } = stack.pop();
739
+ for (let i = 0; i < 8; i++) {
740
+ const nx = x + dxNeighbors[i];
741
+ const ny = y + dyNeighbors[i];
742
+ const nidx = ny * width + nx;
743
+ if (edgeMap[nidx] === 0) {
744
+ edgeMap[nidx] = 2;
745
+ stack.push({ x: nx, y: ny });
405
746
  }
406
- t >= D && t >= c ? Q[o] = t : Q[o] = 0;
407
- }
408
- return Q;
409
- }
410
- function W(I, A, g, C, E) {
411
- const B = new Uint8Array(A * g), Q = [];
412
- for (let o = 1; o < g - 1; o++)
413
- for (let t = 1; t < A - 1; t++) {
414
- const e = o * A + t, a = I[e];
415
- a >= E ? (B[e] = 2, Q.push({ x: t, y: o })) : a >= C ? B[e] = 0 : B[e] = 1;
416
- }
417
- for (let o = 0; o < A; o++)
418
- B[o] = 1, B[(g - 1) * A + o] = 1;
419
- for (let o = 1; o < g - 1; o++)
420
- B[o * A] = 1, B[o * A + A - 1] = 1;
421
- const i = [-1, 0, 1, -1, 1, -1, 0, 1], s = [-1, -1, -1, 0, 0, 1, 1, 1];
422
- for (; Q.length > 0; ) {
423
- const { x: o, y: t } = Q.pop();
424
- for (let e = 0; e < 8; e++) {
425
- const a = o + i[e], D = t + s[e], c = D * A + a;
426
- B[c] === 0 && (B[c] = 2, Q.push({ x: a, y: D }));
427
- }
428
- }
429
- return B;
430
- }
431
- function kA(I, A, g, C = 5) {
432
- const E = Math.floor(C / 2), B = new Uint8ClampedArray(A * g), Q = new Uint8ClampedArray(A * g);
433
- for (let i = 0; i < g; i++) {
434
- const s = i * A;
435
- for (let o = 0; o < A; o++) {
436
- let t = 0;
437
- for (let e = -E; e <= E; e++) {
438
- const a = o + e;
439
- if (a >= 0 && a < A) {
440
- const D = I[s + a];
441
- D > t && (t = D);
747
+ }
748
+ }
749
+ return edgeMap;
750
+ }
751
+ function dilateEdges(edges, width, height, kernelSize = 5) {
752
+ const halfKernel = Math.floor(kernelSize / 2);
753
+ const temp = new Uint8ClampedArray(width * height);
754
+ const dilated = new Uint8ClampedArray(width * height);
755
+ for (let y = 0; y < height; y++) {
756
+ const rowOffset = y * width;
757
+ for (let x = 0; x < width; x++) {
758
+ let maxVal = 0;
759
+ for (let k = -halfKernel; k <= halfKernel; k++) {
760
+ const nx = x + k;
761
+ if (nx >= 0 && nx < width) {
762
+ const val = edges[rowOffset + nx];
763
+ if (val > maxVal) {
764
+ maxVal = val;
765
+ }
442
766
  }
443
767
  }
444
- B[s + o] = t;
768
+ temp[rowOffset + x] = maxVal;
445
769
  }
446
770
  }
447
- for (let i = 0; i < A; i++)
448
- for (let s = 0; s < g; s++) {
449
- let o = 0;
450
- for (let t = -E; t <= E; t++) {
451
- const e = s + t;
452
- if (e >= 0 && e < g) {
453
- const a = B[e * A + i];
454
- a > o && (o = a);
771
+ for (let x = 0; x < width; x++) {
772
+ for (let y = 0; y < height; y++) {
773
+ let maxVal = 0;
774
+ for (let k = -halfKernel; k <= halfKernel; k++) {
775
+ const ny = y + k;
776
+ if (ny >= 0 && ny < height) {
777
+ const val = temp[ny * width + x];
778
+ if (val > maxVal) {
779
+ maxVal = val;
780
+ }
455
781
  }
456
782
  }
457
- Q[s * A + i] = o;
458
- }
459
- return Q;
460
- }
461
- async function JA(I, A = {}) {
462
- const g = [], C = performance.now(), { width: E, height: B } = I;
463
- let Q = A.lowThreshold !== void 0 ? A.lowThreshold : 75, i = A.highThreshold !== void 0 ? A.highThreshold : 200;
464
- const s = A.kernelSize || 5, o = A.sigma || 0, t = A.L2gradient === void 0 ? !1 : A.L2gradient, e = A.applyDilation !== void 0 ? A.applyDilation : !0, a = A.dilationKernelSize || 5, D = A.useWasmHysteresis !== void 0 ? A.useWasmHysteresis : !1;
465
- Q >= i && (console.warn(`Canny Edge Detector: lowThreshold (${Q}) should be lower than highThreshold (${i}). Swapping them.`), [Q, i] = [i, Q]);
466
- let c = performance.now();
467
- const y = NA(I);
468
- let w = performance.now();
469
- g.push({ step: "Grayscale", ms: (w - c).toFixed(2) }), A.debug && (A.debug.grayscale = y);
470
- let n;
471
- c = performance.now();
472
- try {
473
- await H, n = DA(y, E, B, s, o);
474
- } catch {
475
- n = rA(y, E, B, s, o);
783
+ dilated[y * width + x] = maxVal;
784
+ }
476
785
  }
477
- w = performance.now(), g.push({ step: "Gaussian Blur", ms: (w - c).toFixed(2) }), A.debug && (A.debug.blurred = n), c = performance.now();
478
- let h, N;
786
+ return dilated;
787
+ }
788
+ async function cannyEdgeDetector(input, options = {}) {
789
+ const timings = [];
790
+ const tStart = performance.now();
791
+ const skipGrayscale = options.skipGrayscale || false;
792
+ let width, height, grayscale;
793
+ if (skipGrayscale) {
794
+ width = options.width;
795
+ height = options.height;
796
+ grayscale = input;
797
+ if (options.debug) options.debug.grayscale = grayscale;
798
+ } else {
799
+ width = input.width;
800
+ height = input.height;
801
+ let t02 = performance.now();
802
+ grayscale = convertToGrayscale(input);
803
+ let t12 = performance.now();
804
+ timings.push({ step: "Grayscale", ms: (t12 - t02).toFixed(2) });
805
+ if (options.debug) options.debug.grayscale = grayscale;
806
+ }
807
+ let lowThreshold = options.lowThreshold !== void 0 ? options.lowThreshold : 75;
808
+ let highThreshold = options.highThreshold !== void 0 ? options.highThreshold : 200;
809
+ const kernelSize = options.kernelSize || 5;
810
+ const sigma = options.sigma || 0;
811
+ const L2gradient = options.L2gradient === void 0 ? false : options.L2gradient;
812
+ const applyDilation = options.applyDilation !== void 0 ? options.applyDilation : true;
813
+ const dilationKernelSize = options.dilationKernelSize || 5;
814
+ const useWasmHysteresis = options.useWasmHysteresis !== void 0 ? options.useWasmHysteresis : false;
815
+ if (lowThreshold >= highThreshold) {
816
+ console.warn(`Canny Edge Detector: lowThreshold (${lowThreshold}) should be lower than highThreshold (${highThreshold}). Swapping them.`);
817
+ [lowThreshold, highThreshold] = [highThreshold, lowThreshold];
818
+ }
819
+ let t0, t1;
820
+ let blurred;
821
+ t0 = performance.now();
479
822
  {
480
- const R = GA(n, E, B);
481
- h = R.dx, N = R.dy;
823
+ try {
824
+ await initializeWasm();
825
+ blurred = blur(grayscale, width, height, kernelSize, sigma);
826
+ } catch (e) {
827
+ blurred = gaussianBlurGrayscale(grayscale, width, height, kernelSize, sigma);
828
+ }
482
829
  }
483
- w = performance.now(), g.push({ step: "Gradients", ms: (w - c).toFixed(2) }), c = performance.now();
484
- let F;
485
- try {
486
- await H, F = await nA(h, N, E, B, t);
487
- } catch {
488
- F = RA(h, N, E, B, t);
489
- }
490
- w = performance.now(), g.push({ step: "Non-Max Suppression", ms: (w - c).toFixed(2) }), c = performance.now();
491
- const G = t ? Q * Q : Q, S = t ? i * i : i;
492
- let J;
493
- if (D)
830
+ t1 = performance.now();
831
+ timings.push({ step: "Gaussian Blur", ms: (t1 - t0).toFixed(2) });
832
+ if (options.debug) {
833
+ options.debug.blurred = blurred;
834
+ }
835
+ t0 = performance.now();
836
+ let dx, dy;
837
+ {
838
+ const gradients = calculateGradients(blurred, width, height);
839
+ dx = gradients.dx;
840
+ dy = gradients.dy;
841
+ }
842
+ t1 = performance.now();
843
+ timings.push({ step: "Gradients", ms: (t1 - t0).toFixed(2) });
844
+ t0 = performance.now();
845
+ let suppressed;
846
+ {
494
847
  try {
495
- await H, J = aA(F, E, B, G, S);
496
- } catch (R) {
497
- console.warn("WASM hysteresis failed, falling back to JS:", R), J = W(F, E, B, G, S);
498
- }
499
- else
500
- J = W(F, E, B, G, S);
501
- w = performance.now(), g.push({ step: "Hysteresis", ms: (w - c).toFixed(2) }), c = performance.now();
502
- const k = new Uint8ClampedArray(E * B);
503
- for (let R = 0; R < J.length; R++)
504
- k[R] = J[R] === 2 ? 255 : 0;
505
- w = performance.now(), g.push({ step: "Binary Image", ms: (w - c).toFixed(2) }), c = performance.now();
506
- let f = k;
507
- if (e)
848
+ await initializeWasm();
849
+ suppressed = await non_maximum_suppression(dx, dy, width, height, L2gradient);
850
+ } catch (e) {
851
+ suppressed = nonMaximumSuppression(dx, dy, width, height, L2gradient);
852
+ }
853
+ }
854
+ t1 = performance.now();
855
+ timings.push({ step: "Non-Max Suppression", ms: (t1 - t0).toFixed(2) });
856
+ t0 = performance.now();
857
+ const finalLowThreshold = L2gradient ? lowThreshold * lowThreshold : lowThreshold;
858
+ const finalHighThreshold = L2gradient ? highThreshold * highThreshold : highThreshold;
859
+ let edgeMap;
860
+ if (useWasmHysteresis) {
508
861
  try {
509
- await H, f = sA(k, E, B, a);
510
- } catch {
511
- f = kA(k, E, B, a);
862
+ await initializeWasm();
863
+ edgeMap = hysteresis_thresholding(suppressed, width, height, finalLowThreshold, finalHighThreshold);
864
+ } catch (e) {
865
+ console.warn("WASM hysteresis failed, falling back to JS:", e);
866
+ edgeMap = hysteresisThresholding(suppressed, width, height, finalLowThreshold, finalHighThreshold);
512
867
  }
513
- if (w = performance.now(), g.push({ step: "Dilation", ms: (w - c).toFixed(2) }), A.debug) {
514
- A.debug.dx = h, A.debug.dy = N;
515
- const R = new Float32Array(E * B);
516
- for (let l = 0; l < h.length; l++) {
517
- const m = h[l], q = N[l];
518
- R[l] = t ? Math.sqrt(m * m + q * q) : Math.abs(m) + Math.abs(q);
868
+ } else {
869
+ edgeMap = hysteresisThresholding(suppressed, width, height, finalLowThreshold, finalHighThreshold);
870
+ }
871
+ t1 = performance.now();
872
+ timings.push({ step: "Hysteresis", ms: (t1 - t0).toFixed(2) });
873
+ t0 = performance.now();
874
+ const cannyEdges = new Uint8ClampedArray(width * height);
875
+ for (let i = 0; i < edgeMap.length; i++) {
876
+ cannyEdges[i] = edgeMap[i] === 2 ? 255 : 0;
877
+ }
878
+ t1 = performance.now();
879
+ timings.push({ step: "Binary Image", ms: (t1 - t0).toFixed(2) });
880
+ t0 = performance.now();
881
+ let finalEdges = cannyEdges;
882
+ if (applyDilation) {
883
+ {
884
+ try {
885
+ await initializeWasm();
886
+ finalEdges = dilate(cannyEdges, width, height, dilationKernelSize);
887
+ } catch (e) {
888
+ finalEdges = dilateEdges(cannyEdges, width, height, dilationKernelSize);
889
+ }
519
890
  }
520
- A.debug.magnitude = R, A.debug.suppressed = F, A.debug.edgeMap = J, A.debug.cannyEdges = k, A.debug.finalEdges = f, A.debug.timings = g;
521
891
  }
522
- const v = performance.now();
523
- return g.unshift({ step: "Total", ms: (v - C).toFixed(2) }), console.table(g), f;
892
+ t1 = performance.now();
893
+ timings.push({ step: "Dilation", ms: (t1 - t0).toFixed(2) });
894
+ if (options.debug) {
895
+ options.debug.dx = dx;
896
+ options.debug.dy = dy;
897
+ const magnitude = new Float32Array(width * height);
898
+ for (let i = 0; i < dx.length; i++) {
899
+ const gx = dx[i];
900
+ const gy = dy[i];
901
+ magnitude[i] = L2gradient ? Math.sqrt(gx * gx + gy * gy) : Math.abs(gx) + Math.abs(gy);
902
+ }
903
+ options.debug.magnitude = magnitude;
904
+ options.debug.suppressed = suppressed;
905
+ options.debug.edgeMap = edgeMap;
906
+ options.debug.cannyEdges = cannyEdges;
907
+ options.debug.finalEdges = finalEdges;
908
+ }
909
+ if (options.debug) {
910
+ options.debug.timings = timings;
911
+ } else if (!options.debug) {
912
+ options.debug = { timings };
913
+ }
914
+ const tEnd = performance.now();
915
+ timings.unshift({ step: "Edge Detection Total", ms: (tEnd - tStart).toFixed(2) });
916
+ return finalEdges;
524
917
  }
525
- function SA(I, A = 800) {
526
- const { width: g, height: C } = I, E = Math.max(g, C);
527
- if (E <= A)
528
- return {
529
- scaledImageData: I,
530
- scaleFactor: 1,
531
- originalDimensions: { width: g, height: C },
532
- scaledDimensions: { width: g, height: C }
918
+ async function initialize() {
919
+ return await initializeWasm();
920
+ }
921
+ class Scanner {
922
+ constructor(options = {}) {
923
+ this.defaultOptions = {
924
+ maxProcessingDimension: 800,
925
+ mode: "detect",
926
+ output: "canvas",
927
+ ...options
533
928
  };
534
- const B = A / E, Q = Math.round(g * B), i = Math.round(C * B), s = document.createElement("canvas");
535
- s.width = g, s.height = C, s.getContext("2d").putImageData(I, 0, 0);
536
- const t = document.createElement("canvas");
537
- t.width = Q, t.height = i;
538
- const e = t.getContext("2d");
539
- return e.imageSmoothingEnabled = !0, e.imageSmoothingQuality = "high", e.drawImage(s, 0, 0, g, C, 0, 0, Q, i), {
540
- scaledImageData: e.getImageData(0, 0, Q, i),
541
- scaleFactor: 1 / B,
542
- // Return inverse for compatibility with existing code
543
- originalDimensions: { width: g, height: C },
544
- scaledDimensions: { width: Q, height: i }
929
+ this.initialized = false;
930
+ }
931
+ /**
932
+ * Warm up the scanner (load WASM, etc.)
933
+ */
934
+ async initialize() {
935
+ if (this.initialized) return;
936
+ await initializeWasm();
937
+ this.initialized = true;
938
+ }
939
+ /**
940
+ * Scan an image for a document.
941
+ * @param {HTMLImageElement|HTMLCanvasElement|ImageData} image
942
+ * @param {Object} options Override default options
943
+ */
944
+ async scan(image, options = {}) {
945
+ if (!this.initialized) await this.initialize();
946
+ const combinedOptions = { ...this.defaultOptions, ...options };
947
+ return await scanDocument(image, combinedOptions);
948
+ }
949
+ /**
950
+ * Extract a document from an image using manual corners.
951
+ * @param {HTMLImageElement|HTMLCanvasElement|ImageData} image
952
+ * @param {Object} corners
953
+ * @param {Object} options
954
+ */
955
+ async extract(image, corners, options = {}) {
956
+ if (!this.initialized) await this.initialize();
957
+ const combinedOptions = { ...this.defaultOptions, ...options };
958
+ return await extractDocument(image, corners, combinedOptions);
959
+ }
960
+ }
961
+ async function prepareScaleAndGrayscale(image, maxDimension = 800) {
962
+ let originalWidth, originalHeight;
963
+ const isImageData = image && typeof image.width === "number" && typeof image.height === "number" && image.data;
964
+ if (isImageData) {
965
+ originalWidth = image.width;
966
+ originalHeight = image.height;
967
+ } else if (image) {
968
+ originalWidth = image.width || image.naturalWidth;
969
+ originalHeight = image.height || image.naturalHeight;
970
+ } else {
971
+ throw new Error("No image provided");
972
+ }
973
+ const maxCurrentDimension = Math.max(originalWidth, originalHeight);
974
+ let targetWidth, targetHeight, scaleFactor;
975
+ if (maxCurrentDimension <= maxDimension) {
976
+ targetWidth = originalWidth;
977
+ targetHeight = originalHeight;
978
+ scaleFactor = 1;
979
+ } else {
980
+ const scale = maxDimension / maxCurrentDimension;
981
+ targetWidth = Math.round(originalWidth * scale);
982
+ targetHeight = Math.round(originalHeight * scale);
983
+ scaleFactor = 1 / scale;
984
+ }
985
+ const useOffscreen = typeof OffscreenCanvas !== "undefined";
986
+ const canvas = useOffscreen ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement("canvas");
987
+ if (!useOffscreen) {
988
+ canvas.width = targetWidth;
989
+ canvas.height = targetHeight;
990
+ }
991
+ const ctx = canvas.getContext("2d", { willReadFrequently: true });
992
+ ctx.filter = "grayscale(1)";
993
+ ctx.imageSmoothingEnabled = true;
994
+ ctx.imageSmoothingQuality = "medium";
995
+ if (isImageData) {
996
+ const tempCanvas = useOffscreen ? new OffscreenCanvas(originalWidth, originalHeight) : document.createElement("canvas");
997
+ if (!useOffscreen) {
998
+ tempCanvas.width = originalWidth;
999
+ tempCanvas.height = originalHeight;
1000
+ }
1001
+ const tempCtx = tempCanvas.getContext("2d");
1002
+ tempCtx.putImageData(image, 0, 0);
1003
+ ctx.drawImage(tempCanvas, 0, 0, originalWidth, originalHeight, 0, 0, targetWidth, targetHeight);
1004
+ } else {
1005
+ ctx.drawImage(image, 0, 0, originalWidth, originalHeight, 0, 0, targetWidth, targetHeight);
1006
+ }
1007
+ const imageData = ctx.getImageData(0, 0, targetWidth, targetHeight);
1008
+ const grayscaleData = new Uint8ClampedArray(targetWidth * targetHeight);
1009
+ const data = imageData.data;
1010
+ for (let i = 0, j = 0; i < data.length; i += 4, j++) {
1011
+ grayscaleData[j] = data[i];
1012
+ }
1013
+ return {
1014
+ grayscaleData,
1015
+ imageData,
1016
+ // Keep full RGBA for debug visualization
1017
+ scaleFactor,
1018
+ originalDimensions: { width: originalWidth, height: originalHeight },
1019
+ scaledDimensions: { width: targetWidth, height: targetHeight }
545
1020
  };
546
1021
  }
547
- async function MA(I, A = {}) {
548
- const g = A.debug ? {} : null, C = A.maxProcessingDimension || 800, { scaledImageData: E, scaleFactor: B, originalDimensions: Q, scaledDimensions: i } = SA(I, C);
549
- g && (g.preprocessing = {
550
- originalDimensions: Q,
551
- scaledDimensions: i,
552
- scaleFactor: B,
553
- maxProcessingDimension: C
554
- });
555
- const { width: s, height: o } = E, t = await JA(E, {
556
- lowThreshold: A.lowThreshold || 75,
1022
+ async function detectDocumentInternal(grayscaleData, width, height, scaleFactor, options = {}) {
1023
+ const debugInfo = options.debug ? {} : { _timingsOnly: true };
1024
+ const timings = [];
1025
+ if (debugInfo && !debugInfo._timingsOnly) {
1026
+ debugInfo.preprocessing = {
1027
+ scaledDimensions: { width, height },
1028
+ scaleFactor,
1029
+ maxProcessingDimension: options.maxProcessingDimension || 800
1030
+ };
1031
+ }
1032
+ const edges = await cannyEdgeDetector(grayscaleData, {
1033
+ width,
1034
+ height,
1035
+ lowThreshold: options.lowThreshold || 75,
557
1036
  // Match OpenCV values
558
- highThreshold: A.highThreshold || 200,
1037
+ highThreshold: options.highThreshold || 200,
559
1038
  // Match OpenCV values
560
- dilationKernelSize: A.dilationKernelSize || 3,
1039
+ dilationKernelSize: options.dilationKernelSize || 3,
561
1040
  // Match OpenCV value
562
- dilationIterations: A.dilationIterations || 1,
563
- debug: g
564
- }), e = V(t, {
565
- minArea: (A.minArea || 1e3) / (B * B),
1041
+ dilationIterations: options.dilationIterations || 1,
1042
+ debug: debugInfo,
1043
+ skipGrayscale: true
1044
+ });
1045
+ if (debugInfo.timings) {
1046
+ debugInfo.timings.forEach((t) => {
1047
+ if (t.step !== "Edge Detection Total") timings.push(t);
1048
+ });
1049
+ }
1050
+ let t0 = performance.now();
1051
+ const contours = detectDocumentContour(edges, {
1052
+ minArea: (options.minArea || 1e3) / (scaleFactor * scaleFactor),
566
1053
  // Adjust minArea for scaled image
567
- debug: g,
568
- width: s,
569
- height: o
1054
+ debug: debugInfo,
1055
+ width,
1056
+ height
570
1057
  });
571
- if (!e || e.length === 0)
572
- return console.log("No document detected"), {
573
- success: !1,
1058
+ timings.push({ step: "Find Contours", ms: (performance.now() - t0).toFixed(2) });
1059
+ if (!contours || contours.length === 0) {
1060
+ console.log("No document detected");
1061
+ return {
1062
+ success: false,
574
1063
  message: "No document detected",
575
- debug: g
1064
+ debug: debugInfo._timingsOnly ? null : debugInfo,
1065
+ timings
576
1066
  };
577
- const a = e[0], D = EA(a, {
578
- epsilon: A.epsilon
1067
+ }
1068
+ const documentContour = contours[0];
1069
+ t0 = performance.now();
1070
+ const cornerPoints = findCornerPoints(documentContour, {
1071
+ epsilon: options.epsilon
579
1072
  // Pass epsilon for approximation
580
1073
  });
581
- let c = D;
582
- return B !== 1 && (c = {
583
- topLeft: { x: D.topLeft.x * B, y: D.topLeft.y * B },
584
- topRight: { x: D.topRight.x * B, y: D.topRight.y * B },
585
- bottomRight: { x: D.bottomRight.x * B, y: D.bottomRight.y * B },
586
- bottomLeft: { x: D.bottomLeft.x * B, y: D.bottomLeft.y * B }
587
- }), {
588
- success: !0,
589
- contour: a,
590
- corners: c,
591
- debug: g
1074
+ timings.push({ step: "Corner Detection", ms: (performance.now() - t0).toFixed(2) });
1075
+ let finalCorners = cornerPoints;
1076
+ if (scaleFactor !== 1) {
1077
+ finalCorners = {
1078
+ topLeft: { x: cornerPoints.topLeft.x * scaleFactor, y: cornerPoints.topLeft.y * scaleFactor },
1079
+ topRight: { x: cornerPoints.topRight.x * scaleFactor, y: cornerPoints.topRight.y * scaleFactor },
1080
+ bottomRight: { x: cornerPoints.bottomRight.x * scaleFactor, y: cornerPoints.bottomRight.y * scaleFactor },
1081
+ bottomLeft: { x: cornerPoints.bottomLeft.x * scaleFactor, y: cornerPoints.bottomLeft.y * scaleFactor }
1082
+ };
1083
+ }
1084
+ return {
1085
+ success: true,
1086
+ contour: documentContour,
1087
+ corners: finalCorners,
1088
+ debug: debugInfo._timingsOnly ? null : debugInfo,
1089
+ timings
592
1090
  };
593
1091
  }
594
- function fA(I, A) {
595
- function g(s) {
596
- const o = [];
597
- for (let t = 0; t < 4; t++) {
598
- const [e, a] = s[t];
599
- o.push([e, a, 1, 0, 0, 0, -e * A[t][0], -a * A[t][0]]), o.push([0, 0, 0, e, a, 1, -e * A[t][1], -a * A[t][1]]);
600
- }
601
- return o;
602
- }
603
- const C = g(I), E = [
604
- A[0][0],
605
- A[0][1],
606
- A[1][0],
607
- A[1][1],
608
- A[2][0],
609
- A[2][1],
610
- A[3][0],
611
- A[3][1]
1092
+ function getPerspectiveTransform(srcPoints, dstPoints) {
1093
+ function buildMatrix(points) {
1094
+ const matrix2 = [];
1095
+ for (let i = 0; i < 4; i++) {
1096
+ const [x, y] = points[i];
1097
+ matrix2.push([x, y, 1, 0, 0, 0, -x * dstPoints[i][0], -y * dstPoints[i][0]]);
1098
+ matrix2.push([0, 0, 0, x, y, 1, -x * dstPoints[i][1], -y * dstPoints[i][1]]);
1099
+ }
1100
+ return matrix2;
1101
+ }
1102
+ const A = buildMatrix(srcPoints);
1103
+ const b = [
1104
+ dstPoints[0][0],
1105
+ dstPoints[0][1],
1106
+ dstPoints[1][0],
1107
+ dstPoints[1][1],
1108
+ dstPoints[2][0],
1109
+ dstPoints[2][1],
1110
+ dstPoints[3][0],
1111
+ dstPoints[3][1]
612
1112
  ];
613
- function B(s, o) {
614
- const t = s.length, e = s[0].length, a = s.map((y) => y.slice()), D = o.slice();
615
- for (let y = 0; y < e; y++) {
616
- let w = y;
617
- for (let n = y + 1; n < t; n++)
618
- Math.abs(a[n][y]) > Math.abs(a[w][y]) && (w = n);
619
- [a[y], a[w]] = [a[w], a[y]], [D[y], D[w]] = [D[w], D[y]];
620
- for (let n = y + 1; n < t; n++) {
621
- const h = a[n][y] / a[y][y];
622
- for (let N = y; N < e; N++)
623
- a[n][N] -= h * a[y][N];
624
- D[n] -= h * D[y];
1113
+ function solve(A2, b2) {
1114
+ const m = A2.length;
1115
+ const n = A2[0].length;
1116
+ const M = A2.map((row) => row.slice());
1117
+ const B = b2.slice();
1118
+ for (let i = 0; i < n; i++) {
1119
+ let maxRow = i;
1120
+ for (let k = i + 1; k < m; k++) {
1121
+ if (Math.abs(M[k][i]) > Math.abs(M[maxRow][i])) maxRow = k;
1122
+ }
1123
+ [M[i], M[maxRow]] = [M[maxRow], M[i]];
1124
+ [B[i], B[maxRow]] = [B[maxRow], B[i]];
1125
+ for (let k = i + 1; k < m; k++) {
1126
+ const c = M[k][i] / M[i][i];
1127
+ for (let j = i; j < n; j++) {
1128
+ M[k][j] -= c * M[i][j];
1129
+ }
1130
+ B[k] -= c * B[i];
625
1131
  }
626
1132
  }
627
- const c = new Array(e);
628
- for (let y = e - 1; y >= 0; y--) {
629
- let w = D[y];
630
- for (let n = y + 1; n < e; n++)
631
- w -= a[y][n] * c[n];
632
- c[y] = w / a[y][y];
1133
+ const x = new Array(n);
1134
+ for (let i = n - 1; i >= 0; i--) {
1135
+ let sum = B[i];
1136
+ for (let j = i + 1; j < n; j++) {
1137
+ sum -= M[i][j] * x[j];
1138
+ }
1139
+ x[i] = sum / M[i][i];
633
1140
  }
634
- return c;
1141
+ return x;
635
1142
  }
636
- const Q = B(C, E);
637
- return [
638
- [Q[0], Q[1], Q[2]],
639
- [Q[3], Q[4], Q[5]],
640
- [Q[6], Q[7], 1]
1143
+ const h = solve(A, b);
1144
+ const matrix = [
1145
+ [h[0], h[1], h[2]],
1146
+ [h[3], h[4], h[5]],
1147
+ [h[6], h[7], 1]
641
1148
  ];
1149
+ return matrix;
642
1150
  }
643
- function j(I, A, g) {
644
- const { topLeft: C, topRight: E, bottomRight: B, bottomLeft: Q } = g, i = Math.hypot(B.x - Q.x, B.y - Q.y), s = Math.hypot(E.x - C.x, E.y - C.y), o = Math.round(Math.max(i, s)), t = Math.hypot(E.x - B.x, E.y - B.y), e = Math.hypot(C.x - Q.x, C.y - Q.y), a = Math.round(Math.max(t, e));
645
- I.canvas.width = o, I.canvas.height = a;
646
- const D = [
647
- [C.x, C.y],
648
- [E.x, E.y],
649
- [B.x, B.y],
650
- [Q.x, Q.y]
651
- ], c = [
1151
+ function unwarpImage(ctx, image, corners) {
1152
+ const { topLeft, topRight, bottomRight, bottomLeft } = corners;
1153
+ const widthA = Math.hypot(bottomRight.x - bottomLeft.x, bottomRight.y - bottomLeft.y);
1154
+ const widthB = Math.hypot(topRight.x - topLeft.x, topRight.y - topLeft.y);
1155
+ const maxWidth = Math.round(Math.max(widthA, widthB));
1156
+ const heightA = Math.hypot(topRight.x - bottomRight.x, topRight.y - bottomRight.y);
1157
+ const heightB = Math.hypot(topLeft.x - bottomLeft.x, topLeft.y - bottomLeft.y);
1158
+ const maxHeight = Math.round(Math.max(heightA, heightB));
1159
+ ctx.canvas.width = maxWidth;
1160
+ ctx.canvas.height = maxHeight;
1161
+ const srcPoints = [
1162
+ [topLeft.x, topLeft.y],
1163
+ [topRight.x, topRight.y],
1164
+ [bottomRight.x, bottomRight.y],
1165
+ [bottomLeft.x, bottomLeft.y]
1166
+ ];
1167
+ const dstPoints = [
652
1168
  [0, 0],
653
- [o - 1, 0],
654
- [o - 1, a - 1],
655
- [0, a - 1]
656
- ], y = fA(D, c);
657
- LA(I, A, y, o, a);
658
- }
659
- function lA(I) {
660
- const A = I[0][0], g = I[0][1], C = I[0][2], E = I[1][0], B = I[1][1], Q = I[1][2], i = I[2][0], s = I[2][1], o = I[2][2], t = B * o - Q * s, e = -(E * o - Q * i), a = E * s - B * i, D = -(g * o - C * s), c = A * o - C * i, y = -(A * s - g * i), w = g * Q - C * B, n = -(A * Q - C * E), h = A * B - g * E, N = A * t + g * e + C * a;
661
- if (N === 0) throw new Error("Singular matrix");
1169
+ [maxWidth - 1, 0],
1170
+ [maxWidth - 1, maxHeight - 1],
1171
+ [0, maxHeight - 1]
1172
+ ];
1173
+ const perspectiveMatrix = getPerspectiveTransform(srcPoints, dstPoints);
1174
+ warpTransform(ctx, image, perspectiveMatrix, maxWidth, maxHeight);
1175
+ }
1176
+ function invert3x3(m) {
1177
+ const a = m[0][0], b = m[0][1], c = m[0][2];
1178
+ const d = m[1][0], e = m[1][1], f = m[1][2];
1179
+ const g = m[2][0], h = m[2][1], i = m[2][2];
1180
+ const A = e * i - f * h;
1181
+ const B = -(d * i - f * g);
1182
+ const C = d * h - e * g;
1183
+ const D = -(b * i - c * h);
1184
+ const E = a * i - c * g;
1185
+ const F = -(a * h - b * g);
1186
+ const G = b * f - c * e;
1187
+ const H = -(a * f - c * d);
1188
+ const I = a * e - b * d;
1189
+ const det = a * A + b * B + c * C;
1190
+ if (det === 0) throw new Error("Singular matrix");
662
1191
  return [
663
- [t / N, D / N, w / N],
664
- [e / N, c / N, n / N],
665
- [a / N, y / N, h / N]
1192
+ [A / det, D / det, G / det],
1193
+ [B / det, E / det, H / det],
1194
+ [C / det, F / det, I / det]
666
1195
  ];
667
1196
  }
668
- function LA(I, A, g, C, E) {
669
- const B = lA(g), Q = document.createElement("canvas");
670
- Q.width = A.width || A.naturalWidth, Q.height = A.height || A.naturalHeight;
671
- const i = Q.getContext("2d");
672
- i.drawImage(A, 0, 0, Q.width, Q.height);
673
- const s = i.getImageData(0, 0, Q.width, Q.height), o = I.createImageData(C, E);
674
- for (let t = 0; t < E; t++)
675
- for (let e = 0; e < C; e++) {
676
- const a = B[2][0] * e + B[2][1] * t + B[2][2], D = (B[0][0] * e + B[0][1] * t + B[0][2]) / a, c = (B[1][0] * e + B[1][1] * t + B[1][2]) / a, y = Math.max(0, Math.min(Q.width - 2, D)), w = Math.max(0, Math.min(Q.height - 2, c)), n = Math.floor(y), h = Math.floor(w), N = y - n, F = w - h;
677
- for (let G = 0; G < 4; G++) {
678
- const S = s.data[(h * Q.width + n) * 4 + G], J = s.data[(h * Q.width + (n + 1)) * 4 + G], k = s.data[((h + 1) * Q.width + n) * 4 + G], f = s.data[((h + 1) * Q.width + (n + 1)) * 4 + G];
679
- o.data[(t * C + e) * 4 + G] = (1 - N) * (1 - F) * S + N * (1 - F) * J + (1 - N) * F * k + N * F * f;
680
- }
1197
+ function warpTransform(ctx, image, matrix, outWidth, outHeight) {
1198
+ const srcWidth = image.width || image.naturalWidth;
1199
+ const srcHeight = image.height || image.naturalHeight;
1200
+ const inv = invert3x3(matrix);
1201
+ function mapPoint(x, y) {
1202
+ const denom = inv[2][0] * x + inv[2][1] * y + inv[2][2];
1203
+ return {
1204
+ x: (inv[0][0] * x + inv[0][1] * y + inv[0][2]) / denom,
1205
+ y: (inv[1][0] * x + inv[1][1] * y + inv[1][2]) / denom
1206
+ };
1207
+ }
1208
+ const gridX = 64;
1209
+ const gridY = 64;
1210
+ const cellW = outWidth / gridX;
1211
+ const cellH = outHeight / gridY;
1212
+ const srcCanvas = document.createElement("canvas");
1213
+ srcCanvas.width = srcWidth;
1214
+ srcCanvas.height = srcHeight;
1215
+ const srcCtx = srcCanvas.getContext("2d");
1216
+ srcCtx.drawImage(image, 0, 0, srcWidth, srcHeight);
1217
+ ctx.imageSmoothingEnabled = true;
1218
+ ctx.imageSmoothingQuality = "high";
1219
+ ctx.save();
1220
+ for (let gy = 0; gy < gridY; gy++) {
1221
+ for (let gx = 0; gx < gridX; gx++) {
1222
+ const dx0 = gx * cellW;
1223
+ const dy0 = gy * cellH;
1224
+ const dx1 = (gx + 1) * cellW;
1225
+ const dy1 = (gy + 1) * cellH;
1226
+ const s00 = mapPoint(dx0, dy0);
1227
+ const s10 = mapPoint(dx1, dy0);
1228
+ const s01 = mapPoint(dx0, dy1);
1229
+ const s11 = mapPoint(dx1, dy1);
1230
+ drawTexturedTriangle(
1231
+ ctx,
1232
+ srcCanvas,
1233
+ s00.x,
1234
+ s00.y,
1235
+ s10.x,
1236
+ s10.y,
1237
+ s01.x,
1238
+ s01.y,
1239
+ // source triangle
1240
+ dx0,
1241
+ dy0,
1242
+ dx1,
1243
+ dy0,
1244
+ dx0,
1245
+ dy1
1246
+ // dest triangle
1247
+ );
1248
+ drawTexturedTriangle(
1249
+ ctx,
1250
+ srcCanvas,
1251
+ s10.x,
1252
+ s10.y,
1253
+ s11.x,
1254
+ s11.y,
1255
+ s01.x,
1256
+ s01.y,
1257
+ // source triangle
1258
+ dx1,
1259
+ dy0,
1260
+ dx1,
1261
+ dy1,
1262
+ dx0,
1263
+ dy1
1264
+ // dest triangle
1265
+ );
681
1266
  }
682
- I.putImageData(o, 0, 0);
1267
+ }
1268
+ ctx.restore();
683
1269
  }
684
- async function YA(I, A, g = {}) {
685
- const C = g.output || "canvas";
686
- if (!A || !A.topLeft || !A.topRight || !A.bottomRight || !A.bottomLeft)
1270
+ function drawTexturedTriangle(ctx, img, sx0, sy0, sx1, sy1, sx2, sy2, dx0, dy0, dx1, dy1, dx2, dy2) {
1271
+ const denom = (sx0 - sx2) * (sy1 - sy2) - (sx1 - sx2) * (sy0 - sy2);
1272
+ if (Math.abs(denom) < 1e-10) return;
1273
+ const invDenom = 1 / denom;
1274
+ const a = ((dx0 - dx2) * (sy1 - sy2) - (dx1 - dx2) * (sy0 - sy2)) * invDenom;
1275
+ const b = ((dx1 - dx2) * (sx0 - sx2) - (dx0 - dx2) * (sx1 - sx2)) * invDenom;
1276
+ const c = dx0 - a * sx0 - b * sy0;
1277
+ const d = ((dy0 - dy2) * (sy1 - sy2) - (dy1 - dy2) * (sy0 - sy2)) * invDenom;
1278
+ const e = ((dy1 - dy2) * (sx0 - sx2) - (dy0 - dy2) * (sx1 - sx2)) * invDenom;
1279
+ const f = dy0 - d * sx0 - e * sy0;
1280
+ ctx.save();
1281
+ const expand = 1;
1282
+ const centerX = (dx0 + dx1 + dx2) / 3;
1283
+ const centerY = (dy0 + dy1 + dy2) / 3;
1284
+ const grow = (x, y) => {
1285
+ const vx = x - centerX;
1286
+ const vy = y - centerY;
1287
+ const len = Math.sqrt(vx * vx + vy * vy);
1288
+ if (len < 1e-6) return { x, y };
1289
+ return {
1290
+ x: x + vx / len * expand,
1291
+ y: y + vy / len * expand
1292
+ };
1293
+ };
1294
+ const p0 = grow(dx0, dy0);
1295
+ const p1 = grow(dx1, dy1);
1296
+ const p2 = grow(dx2, dy2);
1297
+ ctx.beginPath();
1298
+ ctx.moveTo(p0.x, p0.y);
1299
+ ctx.lineTo(p1.x, p1.y);
1300
+ ctx.lineTo(p2.x, p2.y);
1301
+ ctx.closePath();
1302
+ ctx.clip();
1303
+ ctx.setTransform(a, d, b, e, c, f);
1304
+ ctx.drawImage(img, 0, 0);
1305
+ ctx.restore();
1306
+ }
1307
+ async function extractDocument(image, corners, options = {}) {
1308
+ const outputType = options.output || "canvas";
1309
+ if (!corners || !corners.topLeft || !corners.topRight || !corners.bottomRight || !corners.bottomLeft) {
687
1310
  return {
688
1311
  output: null,
689
1312
  corners: null,
690
- success: !1,
1313
+ success: false,
691
1314
  message: "Invalid corner points provided"
692
1315
  };
1316
+ }
693
1317
  try {
694
- const E = document.createElement("canvas"), B = E.getContext("2d");
695
- j(B, I, A);
696
- let Q;
697
- return C === "canvas" ? Q = E : C === "imagedata" ? Q = E.getContext("2d").getImageData(0, 0, E.width, E.height) : C === "dataurl" ? Q = E.toDataURL() : Q = E, {
698
- output: Q,
699
- corners: A,
700
- success: !0,
1318
+ const resultCanvas = document.createElement("canvas");
1319
+ const ctx = resultCanvas.getContext("2d");
1320
+ unwarpImage(ctx, image, corners);
1321
+ let output;
1322
+ if (outputType === "canvas") {
1323
+ output = resultCanvas;
1324
+ } else if (outputType === "imagedata") {
1325
+ output = resultCanvas.getContext("2d").getImageData(0, 0, resultCanvas.width, resultCanvas.height);
1326
+ } else if (outputType === "dataurl") {
1327
+ output = resultCanvas.toDataURL();
1328
+ } else {
1329
+ output = resultCanvas;
1330
+ }
1331
+ return {
1332
+ output,
1333
+ corners,
1334
+ success: true,
701
1335
  message: "Document extracted successfully"
702
1336
  };
703
- } catch (E) {
1337
+ } catch (error) {
704
1338
  return {
705
1339
  output: null,
706
- corners: A,
707
- success: !1,
708
- message: `Extraction failed: ${E.message}`
1340
+ corners,
1341
+ success: false,
1342
+ message: `Extraction failed: ${error.message}`
709
1343
  };
710
1344
  }
711
1345
  }
712
- async function dA(I, A = {}) {
713
- const g = A.mode || "detect", C = A.output || "canvas";
714
- A.debug;
715
- let E;
716
- if (I instanceof ImageData)
717
- E = I, I.width, I.height;
718
- else {
719
- const s = document.createElement("canvas");
720
- s.width = I.width || I.naturalWidth, s.height = I.height || I.naturalHeight;
721
- const o = s.getContext("2d");
722
- o.drawImage(I, 0, 0, s.width, s.height), E = o.getImageData(0, 0, s.width, s.height), s.width, s.height;
723
- }
724
- const B = await MA(E, A);
725
- if (!B.success)
1346
+ async function scanDocument(image, options = {}) {
1347
+ const timings = [];
1348
+ const totalStart = performance.now();
1349
+ const mode = options.mode || "detect";
1350
+ const outputType = options.output || "canvas";
1351
+ !!options.debug;
1352
+ const maxProcessingDimension = options.maxProcessingDimension || 800;
1353
+ let t0 = performance.now();
1354
+ const { grayscaleData, imageData, scaleFactor, originalDimensions, scaledDimensions } = await prepareScaleAndGrayscale(image, maxProcessingDimension);
1355
+ timings.push({ step: "Image Prep + Scale + Gray", ms: (performance.now() - t0).toFixed(2) });
1356
+ const detection = await detectDocumentInternal(
1357
+ grayscaleData,
1358
+ scaledDimensions.width,
1359
+ scaledDimensions.height,
1360
+ scaleFactor,
1361
+ options
1362
+ );
1363
+ if (detection.timings) {
1364
+ detection.timings.forEach((t) => timings.push(t));
1365
+ }
1366
+ if (!detection.success) {
1367
+ const totalEnd2 = performance.now();
1368
+ timings.unshift({ step: "Total", ms: (totalEnd2 - totalStart).toFixed(2) });
1369
+ console.table(timings);
726
1370
  return {
727
1371
  output: null,
728
1372
  corners: null,
729
1373
  contour: null,
730
- debug: B.debug,
731
- success: !1,
732
- message: B.message || "No document detected"
1374
+ debug: detection.debug,
1375
+ success: false,
1376
+ message: detection.message || "No document detected",
1377
+ timings
733
1378
  };
734
- let Q, i;
735
- if (g === "detect")
736
- i = null;
737
- else if (g === "extract") {
738
- Q = document.createElement("canvas");
739
- const s = Q.getContext("2d");
740
- j(s, I, B.corners);
741
- }
742
- return g !== "detect" && Q && (C === "canvas" ? i = Q : C === "imagedata" ? i = Q.getContext("2d").getImageData(0, 0, Q.width, Q.height) : C === "dataurl" ? i = Q.toDataURL() : i = Q), {
743
- output: i,
744
- corners: B.corners,
745
- contour: B.contour,
746
- debug: B.debug,
747
- success: !0,
748
- message: "Document detected"
1379
+ }
1380
+ let resultCanvas;
1381
+ let output;
1382
+ if (mode === "detect") {
1383
+ output = null;
1384
+ } else if (mode === "extract") {
1385
+ t0 = performance.now();
1386
+ resultCanvas = document.createElement("canvas");
1387
+ const ctx = resultCanvas.getContext("2d");
1388
+ unwarpImage(ctx, image, detection.corners);
1389
+ timings.push({ step: "Perspective Transform", ms: (performance.now() - t0).toFixed(2) });
1390
+ }
1391
+ if (mode !== "detect" && resultCanvas) {
1392
+ t0 = performance.now();
1393
+ if (outputType === "canvas") {
1394
+ output = resultCanvas;
1395
+ } else if (outputType === "imagedata") {
1396
+ output = resultCanvas.getContext("2d").getImageData(0, 0, resultCanvas.width, resultCanvas.height);
1397
+ } else if (outputType === "dataurl") {
1398
+ output = resultCanvas.toDataURL();
1399
+ } else {
1400
+ output = resultCanvas;
1401
+ }
1402
+ timings.push({ step: "Output Conversion", ms: (performance.now() - t0).toFixed(2) });
1403
+ }
1404
+ const totalEnd = performance.now();
1405
+ timings.unshift({ step: "Total", ms: (totalEnd - totalStart).toFixed(2) });
1406
+ console.table(timings);
1407
+ return {
1408
+ output,
1409
+ corners: detection.corners,
1410
+ contour: detection.contour,
1411
+ debug: detection.debug,
1412
+ success: true,
1413
+ message: "Document detected",
1414
+ timings
749
1415
  };
750
1416
  }
751
1417
  export {
752
- YA as extractDocument,
753
- dA as scanDocument
1418
+ Scanner,
1419
+ extractDocument,
1420
+ initialize,
1421
+ scanDocument
754
1422
  };
755
- //# sourceMappingURL=scanic.js.map