@pixerate/editor 0.97.0 → 0.99.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/THIRD_PARTY_NOTICES.md +4 -2
  2. package/dist/animation-editor/index.cjs +55 -53
  3. package/dist/animation-editor/index.cjs.map +1 -1
  4. package/dist/animation-editor/index.d.cts +3 -2
  5. package/dist/animation-editor/index.d.ts +3 -2
  6. package/dist/animation-editor/index.js +11 -9
  7. package/dist/animation-editor/index.js.map +1 -1
  8. package/dist/chunk-DWGZUSES.cjs +694 -0
  9. package/dist/chunk-DWGZUSES.cjs.map +1 -0
  10. package/dist/chunk-GX332W2C.js +181 -0
  11. package/dist/chunk-GX332W2C.js.map +1 -0
  12. package/dist/{chunk-7MD7C6XQ.cjs → chunk-JF5PXN7W.cjs} +96 -744
  13. package/dist/chunk-JF5PXN7W.cjs.map +1 -0
  14. package/dist/chunk-KKREERP2.js +694 -0
  15. package/dist/chunk-KKREERP2.js.map +1 -0
  16. package/dist/chunk-MUUXNRU4.cjs +181 -0
  17. package/dist/chunk-MUUXNRU4.cjs.map +1 -0
  18. package/dist/{chunk-OEVSVA6V.js → chunk-WIR377F6.js} +788 -22
  19. package/dist/chunk-WIR377F6.js.map +1 -0
  20. package/dist/{chunk-4AB5BHYK.cjs → chunk-WT6ZAWJP.cjs} +788 -22
  21. package/dist/chunk-WT6ZAWJP.cjs.map +1 -0
  22. package/dist/{chunk-4JLB2USO.js → chunk-YGZNGDIT.js} +45 -693
  23. package/dist/chunk-YGZNGDIT.js.map +1 -0
  24. package/dist/image-editor/index.cjs +1798 -333
  25. package/dist/image-editor/index.cjs.map +1 -1
  26. package/dist/image-editor/index.d.cts +482 -6
  27. package/dist/image-editor/index.d.ts +482 -6
  28. package/dist/image-editor/index.js +1488 -23
  29. package/dist/image-editor/index.js.map +1 -1
  30. package/dist/raster/index.cjs +23 -2
  31. package/dist/raster/index.cjs.map +1 -1
  32. package/dist/raster/index.d.cts +98 -2
  33. package/dist/raster/index.d.ts +98 -2
  34. package/dist/raster/index.js +23 -2
  35. package/dist/{svg-ymShkNtu.d.cts → svg-C9r284x8.d.cts} +6 -9
  36. package/dist/{svg-Dh17jCyA.d.ts → svg-MVKBqwD4.d.ts} +6 -9
  37. package/dist/types-CwMPoRMU.d.cts +40 -0
  38. package/dist/types-CwMPoRMU.d.ts +40 -0
  39. package/dist/vector/index.cjs +490 -554
  40. package/dist/vector/index.cjs.map +1 -1
  41. package/dist/vector/index.d.cts +154 -292
  42. package/dist/vector/index.d.ts +154 -292
  43. package/dist/vector/index.js +91 -155
  44. package/dist/vector/index.js.map +1 -1
  45. package/dist/warp-B8rAguzs.d.ts +165 -0
  46. package/dist/warp-nYs2DPrx.d.cts +165 -0
  47. package/package.json +1 -1
  48. package/skills/pixerate-image-editor/SKILL.md +49 -3
  49. package/dist/chunk-4AB5BHYK.cjs.map +0 -1
  50. package/dist/chunk-4JLB2USO.js.map +0 -1
  51. package/dist/chunk-7MD7C6XQ.cjs.map +0 -1
  52. package/dist/chunk-OEVSVA6V.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/geom/affine.ts","../src/geom/warp.ts"],"sourcesContent":["/**\n * Affine matrices in SVG order (`[a, b, c, d, e, f]`), shared by the vector and image editors.\n * Angles are degrees, clockwise on screen (y points down).\n */\nimport type { AffineMatrix, Vec2 } from './types';\n\nexport type { AffineMatrix };\n\nexport const IDENTITY_MATRIX: AffineMatrix = [1, 0, 0, 1, 0, 0];\n\n/** `a` then `b` (apply `a` first). */\nexport function multiplyMatrices(a: AffineMatrix, b: AffineMatrix): AffineMatrix {\n const [a0, a1, a2, a3, a4, a5] = a;\n const [b0, b1, b2, b3, b4, b5] = b;\n return [b0 * a0 + b2 * a1, b1 * a0 + b3 * a1, b0 * a2 + b2 * a3, b1 * a2 + b3 * a3, b0 * a4 + b2 * a5 + b4, b1 * a4 + b3 * a5 + b5];\n}\n\nexport const translateMatrix = (dx: number, dy: number): AffineMatrix => [1, 0, 0, 1, dx, dy];\n\nexport function scaleMatrix(sx: number, sy: number, origin: Vec2 = { x: 0, y: 0 }): AffineMatrix {\n return [sx, 0, 0, sy, origin.x - sx * origin.x, origin.y - sy * origin.y];\n}\n\n/** Rotation by `degrees` clockwise (y points down) around `origin`. */\nexport function rotateMatrix(degrees: number, origin: Vec2 = { x: 0, y: 0 }): AffineMatrix {\n const r = (degrees * Math.PI) / 180;\n const cos = Math.cos(r);\n const sin = Math.sin(r);\n return [cos, sin, -sin, cos, origin.x - cos * origin.x + sin * origin.y, origin.y - sin * origin.x - cos * origin.y];\n}\n\n/** `m` applied about `origin` instead of the coordinate origin. */\nexport function matrixAbout(m: AffineMatrix, origin: Vec2): AffineMatrix {\n return multiplyMatrices(multiplyMatrices(translateMatrix(-origin.x, -origin.y), m), translateMatrix(origin.x, origin.y));\n}\n\n/**\n * A skew by `ax` degrees horizontally (vertical lines lean right for positive angles:\n * x' = x + tan(ax)·y) and `ay` degrees vertically (y' = y + tan(ay)·x), about `origin`.\n */\nexport function skewMatrix(ax: number, ay: number, origin: Vec2 = { x: 0, y: 0 }): AffineMatrix {\n const tx = Math.tan((ax * Math.PI) / 180);\n const ty = Math.tan((ay * Math.PI) / 180);\n return matrixAbout([1, ty, tx, 1, 0, 0], origin);\n}\n\nexport function applyMatrix(m: AffineMatrix, p: Vec2): Vec2 {\n return { x: m[0] * p.x + m[2] * p.y + m[4], y: m[1] * p.x + m[3] * p.y + m[5] };\n}\n\nexport function isIdentityMatrix(m: AffineMatrix, eps = 1e-12): boolean {\n return Math.abs(m[0] - 1) < eps && Math.abs(m[1]) < eps && Math.abs(m[2]) < eps && Math.abs(m[3] - 1) < eps && Math.abs(m[4]) < eps && Math.abs(m[5]) < eps;\n}\n\n/** The inverse matrix (the identity for a singular one). */\nexport function invertMatrix(m: AffineMatrix): AffineMatrix {\n const [a, b, c, d, e, f] = m;\n const det = a * d - b * c;\n if (!det || !Number.isFinite(det)) return IDENTITY_MATRIX;\n return [d / det, -b / det, -c / det, a / det, (c * f - d * e) / det, (b * e - a * f) / det];\n}\n\n/** Applies only the linear part (for directions and offsets). */\nexport function applyMatrixLinear(m: AffineMatrix, v: Vec2): Vec2 {\n return { x: m[0] * v.x + m[2] * v.y, y: m[1] * v.x + m[3] * v.y };\n}\n\n/**\n * The rotation of a matrix in degrees, clockwise (y down), in (−180, 180]. For a mirrored\n * matrix it is the rotation left after undoing a horizontal flip, so a flipped rotated shape\n * keeps its angle.\n */\nexport function matrixRotation(m: AffineMatrix): number {\n const [a, b, c, d] = m;\n const mirrored = a * d - b * c < 0;\n const deg = ((mirrored ? Math.atan2(-b - c, d - a) : Math.atan2(b - c, a + d)) * 180) / Math.PI;\n return Math.abs(deg) < 1e-9 ? 0 : deg;\n}\n\n/**\n * Splits `m` into `residual` then `rigid` (`m = residual × rigid` in apply order): `rigid` is\n * the nearest rotation plus the translation, `residual` the linear rest (scale, skew,\n * reflection). An unrotated `m` gives an identity `rigid` and everything in `residual`.\n */\nexport function decomposeRigid(m: AffineMatrix): { rigid: AffineMatrix; residual: AffineMatrix } {\n const [a, b, c, d, e, f] = m;\n const deg = matrixRotation(m);\n if (deg === 0) return { rigid: IDENTITY_MATRIX, residual: m };\n const r = (deg * Math.PI) / 180;\n const cos = Math.cos(r);\n const sin = Math.sin(r);\n return {\n rigid: [cos, sin, -sin, cos, e, f],\n residual: [cos * a + sin * b, -sin * a + cos * b, cos * c + sin * d, -sin * c + cos * d, 0, 0],\n };\n}\n","/**\n * Warp geometry shared by the vector editor's envelopes and the image editor's Free Transform\n * warp: preset warp styles and editable Bézier meshes, both forward maps from a source box onto\n * the plane.\n *\n * - **Presets** (`WarpStyle`, Photoshop's fifteen with bend and horizontal / vertical distortion\n * in percent): each is one bicubic Bézier patch whose 4 × 4 control grid follows the bend\n * (`warpPresetGrid`). Every preset is the identity at bend 0 and continuous in it.\n * - **Meshes** (`WarpMesh`): a grid of bicubic patches. Splitting a mesh (`splitWarpMeshU` / `V`)\n * is an exact de Casteljau subdivision, so it never changes the shape, and a preset turns into\n * an editable mesh of any size exactly.\n *\n * Ported from ArtCraft (MIT OR Apache-2.0, © ArtCraft Team and contributors; see\n * THIRD_PARTY_NOTICES.md): photocraft `crates/geom/src/warp.rs` (`WarpStyle`, `StyleWarp`,\n * `rest_grid`, `edge_arc`, `arc_grid`, `blend_rows`, `preset_grid`, `bernstein`, `split_cubic`,\n * `BERN_INV`, and `BezierMesh`: `identity`, `fit`, `eval`, `split_u`, `split_v`, `remove_split_u`,\n * `transpose`, `map_points`, `param_at`, `pull`, `smooth_lines`, `drag_point`, `control_bounds`;\n * `Warp::map` and `Warp::to_mesh`).\n */\nimport type { Box, Vec2, WarpMesh, WarpStyle } from './types';\n\nexport type { WarpMesh, WarpStyle };\n\ntype P = [number, number];\n/** A single patch's control grid, `[row][column]`, in box units (0–1, y down). */\ntype Grid = P[][];\n\n/** The fifteen presets in Photoshop's menu order. */\nexport const WARP_STYLES: readonly WarpStyle[] = [\n 'arc',\n 'arcLower',\n 'arcUpper',\n 'arch',\n 'bulge',\n 'shellLower',\n 'shellUpper',\n 'flag',\n 'wave',\n 'fish',\n 'rise',\n 'fisheye',\n 'inflate',\n 'squeeze',\n 'twist'\n];\n\nexport const WARP_STYLE_LABELS: Readonly<Record<WarpStyle, string>> = {\n arc: 'Arc',\n arcLower: 'Arc Lower',\n arcUpper: 'Arc Upper',\n arch: 'Arch',\n bulge: 'Bulge',\n shellLower: 'Shell Lower',\n shellUpper: 'Shell Upper',\n flag: 'Flag',\n wave: 'Wave',\n fish: 'Fish',\n rise: 'Rise',\n fisheye: 'Fisheye',\n inflate: 'Inflate',\n squeeze: 'Squeeze',\n twist: 'Twist'\n};\n\n/** The rest grid (no warp). */\nfunction restGrid(): Grid {\n return [0, 1, 2, 3].map((j) => [0, 1, 2, 3].map((i): P => [i / 3, j / 3]));\n}\n\n/**\n * A horizontal edge at height `y` (box units, 0–1 across) bent into a circular arc of `|b|·π`\n * that keeps its chord, bowing up when `up === (b > 0)`. `h` is the box's height over its width,\n * so the arc is circular in pixels.\n */\nfunction edgeArc(y: number, b: number, up: boolean, h: number): P[] {\n if (Math.abs(b) < 1e-9) return [0, 1, 2, 3].map((i): P => [i / 3, y]);\n const th = Math.abs(b) * Math.PI;\n const k = (((4 / 3) * Math.tan(th / 4)) * 0.5) / Math.sin(th / 2);\n const s = b > 0 === up ? -1 : 1;\n const c = Math.cos(th / 2);\n const n = Math.sin(th / 2);\n const dy = (s * k * n) / h;\n return [\n [0, y],\n [k * c, y + dy],\n [1 - k * c, y + dy],\n [1, y]\n ];\n}\n\n/**\n * Arc: every row is a circular arc of `|b|·π` around one centre; the edge on the inside of the\n * bend keeps its chord and the rows' radii grow by the box height towards the other edge. Worked\n * in units of the box width (`h` = height / width) so the arcs are circular in pixels.\n */\nfunction arcGrid(b: number, h: number): Grid {\n if (Math.abs(b) < 1e-9) return restGrid();\n const up = b > 0;\n const th = Math.abs(b) * Math.PI;\n const r = 0.5 / Math.sin(th / 2);\n const k = (4 / 3) * Math.tan(th / 4);\n const s = up ? -1 : 1;\n const cy = up ? h + r * Math.cos(th / 2) : -r * Math.cos(th / 2);\n return [0, 1, 2, 3].map((j) => {\n const v = j / 3;\n const big = r + h * (up ? 1 - v : v);\n const at = (a: number): P => [0.5 + big * Math.sin(a), cy + s * big * Math.cos(a)];\n const tangent = (a: number): P => [Math.cos(a), -s * Math.sin(a)];\n const p0 = at(-th / 2);\n const p3 = at(th / 2);\n const t0 = tangent(-th / 2);\n const t1 = tangent(th / 2);\n const l = k * big;\n const pts: P[] = [p0, [p0[0] + l * t0[0], p0[1] + l * t0[1]], [p3[0] - l * t1[0], p3[1] - l * t1[1]], p3];\n return pts.map((p): P => [p[0], p[1] / h]);\n });\n}\n\n/** Rows blended from `top` to `bottom`. */\nfunction blendRows(top: P[], bottom: P[]): Grid {\n return [0, 1, 2, 3].map((j) => {\n const t = j / 3;\n return [0, 1, 2, 3].map((i): P => [top[i][0] + (bottom[i][0] - top[i][0]) * t, top[i][1] + (bottom[i][1] - top[i][1]) * t]);\n });\n}\n\nconst INNER: [number, number, number, number][] = [\n [1, 1, -1, -1],\n [1, 2, 1, -1],\n [2, 1, -1, 1],\n [2, 2, 1, 1]\n];\n\n/**\n * A preset as a Bézier control grid (rows of `[x, y]` in box units, y down). `b`, `hd`, `vd` are\n * the bend and the horizontal / vertical distortion as fractions (−1…1); `aspect` is the box's\n * height over its width. The arc family stays circular in pixels, the other offsets scale with the\n * box, and a vertical warp is the horizontal one with the axes (and distortions) swapped.\n */\nexport function warpPresetGrid(style: WarpStyle, b: number, hd: number, vd: number, vertical: boolean, aspect: number): [number, number][][] {\n // Height over width of the box the bend runs along (the transposed box when vertical); in that\n // frame the two distortions trade places too.\n const h = vertical ? 1 / aspect : aspect;\n if (vertical) [hd, vd] = [vd, hd];\n let g = restGrid();\n switch (style) {\n case 'arc':\n g = arcGrid(b, h);\n break;\n case 'arch':\n g = [0, 1, 2, 3].map((j) => edgeArc(j / 3, b, true, h));\n break;\n case 'bulge':\n g = blendRows(edgeArc(0, b, true, h), edgeArc(1, b, false, h));\n break;\n case 'arcLower':\n g = blendRows(g[0], edgeArc(1, b, false, h));\n break;\n case 'arcUpper':\n g = blendRows(edgeArc(0, b, true, h), g[3]);\n break;\n // The bulging edge and the outer points of the row next to it come from Arc (bent the other\n // way for Shell Lower); the rest stays put.\n case 'shellLower': {\n const a = arcGrid(-b, h);\n g[3] = a[3];\n g[2][0] = a[2][0];\n g[2][3] = a[2][3];\n break;\n }\n case 'shellUpper': {\n const a = arcGrid(b, h);\n g[0] = a[0];\n g[1][0] = a[1][0];\n g[1][3] = a[1][3];\n break;\n }\n case 'flag':\n for (const row of g) {\n row[1][1] -= 2 * b;\n row[2][1] += 2 * b;\n }\n break;\n case 'wave':\n for (const row of g.slice(1, 3)) {\n row[1][1] += (4 / 3) * b;\n row[2][1] -= (4 / 3) * b;\n }\n break;\n case 'fish':\n [-2, -2 / 3, 2 / 3, 2].forEach((f, j) => {\n g[j][1][1] += f * b;\n g[j][2][1] -= f * b;\n });\n break;\n case 'rise':\n for (const row of g) {\n row[0][1] += 2 * b;\n row[1][1] += 2 * b;\n }\n break;\n case 'fisheye':\n for (const [j, i, dx, dy] of INNER) {\n g[j][i][0] += (dx * 2 * b) / 3;\n g[j][i][1] += (dy * 2 * b) / 3;\n }\n break;\n // Edge midpoints move out (Inflate) or the sides in (Squeeze) by b/3, the inner points by b/9.\n case 'inflate':\n case 'squeeze': {\n const s = style === 'inflate' ? 1 : -1;\n for (const p of g[0].slice(1, 3)) p[1] -= b / 3;\n for (const p of g[3].slice(1, 3)) p[1] += b / 3;\n for (const row of g.slice(1, 3)) {\n row[0][0] -= (s * b) / 3;\n row[3][0] += (s * b) / 3;\n }\n for (const [j, i, dx, dy] of INNER) {\n g[j][i][0] += (s * dx * b) / 9;\n g[j][i][1] += (dy * b) / 9;\n }\n break;\n }\n // The inner points turn round the centre (the other way for a negative bend).\n case 'twist': {\n const a = Math.abs(b);\n if (b >= 0) {\n g[1][1][0] += a;\n g[1][2][1] += a;\n g[2][1][1] -= a;\n g[2][2][0] -= a;\n } else {\n g[1][1][1] += a;\n g[1][2][0] -= a;\n g[2][1][0] += a;\n g[2][2][1] -= a;\n }\n break;\n }\n }\n // Vertical distortion: the top and bottom rows scale about their end points' midpoint (by\n // 1 ∓ vd) and the middle rows follow by the blend of those two moves.\n if (vd !== 0) {\n const moved = (row: P[], s: number): P[] => {\n const m: P = [(row[0][0] + row[3][0]) / 2, (row[0][1] + row[3][1]) / 2];\n return row.map((p): P => [m[0] + (p[0] - m[0]) * s - p[0], m[1] + (p[1] - m[1]) * s - p[1]]);\n };\n const d0 = moved(g[0], 1 - vd);\n const d3 = moved(g[3], 1 + vd);\n g.forEach((row, j) => {\n const t = j / 3;\n row.forEach((p, i) => {\n p[0] += d0[i][0] + (d3[i][0] - d0[i][0]) * t;\n p[1] += d0[i][1] + (d3[i][1] - d0[i][1]) * t;\n });\n });\n }\n // Horizontal distortion: each column scales about its end points' midpoint by 1 + hd·(2i/3 − 1).\n if (hd !== 0) {\n for (let i = 0; i < 4; i++) {\n const s = 1 + hd * ((2 * i) / 3 - 1);\n const m: P = [(g[0][i][0] + g[3][i][0]) / 2, (g[0][i][1] + g[3][i][1]) / 2];\n for (const row of g) row[i] = [m[0] + (row[i][0] - m[0]) * s, m[1] + (row[i][1] - m[1]) * s];\n }\n }\n // Vertical orientation: the same grid with the axes swapped.\n if (vertical) g = [0, 1, 2, 3].map((j) => [0, 1, 2, 3].map((i): P => [g[i][j][1], g[i][j][0]]));\n return g;\n}\n\nfunction bernstein(t: number): [number, number, number, number] {\n const s = 1 - t;\n return [s * s * s, 3 * s * s * t, 3 * s * t * t, t * t * t];\n}\n\nexport const lerpVec2 = (a: Vec2, b: Vec2, t: number): Vec2 => ({ x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t });\n\n/** De Casteljau split of a cubic at `t`: 7 points (left 0..3, right 3..6). */\nfunction splitCubic(p: readonly Vec2[], t: number): Vec2[] {\n const a = lerpVec2(p[0], p[1], t);\n const b = lerpVec2(p[1], p[2], t);\n const c = lerpVec2(p[2], p[3], t);\n const d = lerpVec2(a, b, t);\n const e = lerpVec2(b, c, t);\n return [p[0], a, d, lerpVec2(d, e, t), e, c, p[3]];\n}\n\n/** Inverse of the Bernstein interpolation matrix at t = 0, ⅓, ⅔, 1 (rows: control point, columns: sample). */\nconst BERN_INV = [\n [1, 0, 0, 0],\n [-5 / 6, 3, -1.5, 1 / 3],\n [1 / 3, -1.5, 3, -5 / 6],\n [0, 0, 0, 1]\n];\n\n// ---------------------------------------------------------------------------\n// Presets\n// ---------------------------------------------------------------------------\n\n/** A preset warp's settings (bend and distortions in percent, −100…100). */\nexport interface WarpPreset {\n style: WarpStyle;\n bend: number;\n horizontal?: number;\n vertical?: number;\n /** Bend along the vertical axis. */\n orientation?: 'horizontal' | 'vertical';\n}\n\nconst pct = (v: number | undefined) => (typeof v === 'number' && Number.isFinite(v) ? Math.min(1, Math.max(-1, v / 100)) : 0);\n\n/**\n * A preset as one Bézier patch over `bounds` (points in the bounds' space), or null when it\n * changes nothing (an unknown style, all-zero amounts, or an empty box).\n */\nexport function warpPresetMesh(preset: WarpPreset, bounds: Box): WarpMesh | null {\n if (!WARP_STYLES.includes(preset.style)) return null;\n const { x, y, width: w, height: h } = bounds;\n if (!(w > 0 && h > 0)) return null;\n const b = pct(preset.bend);\n const hd = pct(preset.horizontal);\n const vd = pct(preset.vertical);\n if (b === 0 && hd === 0 && vd === 0) return null;\n const grid = warpPresetGrid(preset.style, b, hd, vd, preset.orientation === 'vertical', h / w);\n return { us: [0, 1], vs: [0, 1], points: grid.flat().map((p) => ({ x: x + p[0] * w, y: y + p[1] * h })) };\n}\n\n// ---------------------------------------------------------------------------\n// Meshes\n// ---------------------------------------------------------------------------\n\n/** Control points per row. */\nexport const warpMeshColumns = (m: WarpMesh) => 3 * (m.us.length - 1) + 1;\n/** Control point rows. */\nexport const warpMeshRows = (m: WarpMesh) => 3 * (m.vs.length - 1) + 1;\n\n/** Whether a mesh is well formed: knots from 0 to 1 increasing, the right number of finite points. */\nexport function isValidWarpMesh(m: unknown): m is WarpMesh {\n if (!m || typeof m !== 'object') return false;\n const { us, vs, points } = m as WarpMesh;\n const knots = (k: unknown): k is number[] =>\n Array.isArray(k) && k.length >= 2 && k.length <= 65 && k[0] === 0 && k[k.length - 1] === 1 && k.every((v, i) => typeof v === 'number' && (i === 0 || v > k[i - 1]));\n if (!knots(us) || !knots(vs) || !Array.isArray(points)) return false;\n return points.length === (3 * (us.length - 1) + 1) * (3 * (vs.length - 1) + 1) && points.every((p) => !!p && Number.isFinite(p.x) && Number.isFinite(p.y));\n}\n\n/** Fits a mesh with patch boundaries `us` / `vs` to the map `f` (box fractions → output) by interpolating it at each patch's thirds. Exact for bicubic maps (affine maps included). */\nexport function fitWarpMesh(f: (s: number, t: number) => Vec2, us: readonly number[], vs: readonly number[]): WarpMesh {\n const pc = us.length - 1;\n const pr = vs.length - 1;\n const nx = 3 * pc + 1;\n const points: Vec2[] = new Array((3 * pr + 1) * nx);\n for (let pj = 0; pj < pr; pj++) {\n for (let pi = 0; pi < pc; pi++) {\n const s: Vec2[][] = [0, 1, 2, 3].map((j) =>\n [0, 1, 2, 3].map((i) => f(us[pi] + ((us[pi + 1] - us[pi]) * i) / 3, vs[pj] + ((vs[pj + 1] - vs[pj]) * j) / 3))\n );\n for (let j = 0; j < 4; j++) {\n for (let i = 0; i < 4; i++) {\n let x = 0;\n let y = 0;\n for (let a = 0; a < 4; a++) {\n for (let b = 0; b < 4; b++) {\n const k = BERN_INV[j][a] * BERN_INV[i][b];\n x += k * s[a][b].x;\n y += k * s[a][b].y;\n }\n }\n points[(3 * pj + j) * nx + 3 * pi + i] = { x, y };\n }\n }\n }\n }\n return { us: us.slice(), vs: vs.slice(), points };\n}\n\n/** `n + 1` evenly spaced knots from 0 to 1. */\nexport const evenKnots = (n: number) => Array.from({ length: n + 1 }, (_, i) => i / n);\n/** A patch count rounded and clamped to 1–64. */\nexport const clampMeshCount = (n: number) => Math.min(64, Math.max(1, Math.round(Number.isFinite(n) ? n : 1)));\n\n/** The identity mesh over `bounds` with `columns × rows` patches. */\nexport function identityWarpMesh(bounds: Box, columns = 1, rows = 1): WarpMesh {\n return fitWarpMesh((s, t) => ({ x: bounds.x + s * bounds.width, y: bounds.y + t * bounds.height }), evenKnots(clampMeshCount(columns)), evenKnots(clampMeshCount(rows)));\n}\n\n/**\n * The patch holding box fraction `s` and the parameter inside it. Outside 0–1 the end patches\n * extrapolate (their polynomials continue), so handles past the box map smoothly.\n */\nfunction locate(knots: readonly number[], s: number): [number, number] {\n const n = knots.length - 1;\n let i = 0;\n while (i + 1 < n && s > knots[i + 1]) i++;\n const w = knots[i + 1] - knots[i];\n return [i, w > 0 ? (s - knots[i]) / w : 0];\n}\n\n/** The surface at box fractions `(s, t)`. */\nexport function evalWarpMesh(m: WarpMesh, s: number, t: number): Vec2 {\n const [pi, a] = locate(m.us, s);\n const [pj, b] = locate(m.vs, t);\n const ba = bernstein(a);\n const bb = bernstein(b);\n const nx = warpMeshColumns(m);\n let x = 0;\n let y = 0;\n for (let j = 0; j < 4; j++) {\n for (let i = 0; i < 4; i++) {\n const p = m.points[(3 * pj + j) * nx + 3 * pi + i];\n const k = ba[i] * bb[j];\n x += p.x * k;\n y += p.y * k;\n }\n }\n return { x, y };\n}\n\nfunction transposeMesh(m: WarpMesh): WarpMesh {\n const nx = warpMeshColumns(m);\n const ny = warpMeshRows(m);\n const points: Vec2[] = new Array(nx * ny);\n for (let j = 0; j < ny; j++) for (let i = 0; i < nx; i++) points[i * ny + j] = m.points[j * nx + i];\n return { us: m.vs.slice(), vs: m.us.slice(), points };\n}\n\n/** The mesh with the patch column holding `s` split at `s` (exact). Null when `s` is on or too close to a boundary. */\nexport function splitWarpMeshU(m: WarpMesh, s: number): WarpMesh | null {\n const [pi, a] = locate(m.us, s);\n if (!(a >= 0.01 && a <= 0.99)) return null;\n const nx = warpMeshColumns(m);\n const ny = warpMeshRows(m);\n const points: Vec2[] = [];\n for (let j = 0; j < ny; j++) {\n const row = m.points.slice(j * nx, (j + 1) * nx);\n points.push(...row.slice(0, 3 * pi), ...splitCubic(row.slice(3 * pi, 3 * pi + 4), a), ...row.slice(3 * pi + 4));\n }\n const us = m.us.slice();\n us.splice(pi + 1, 0, Math.min(1, Math.max(0, s)));\n return { us, vs: m.vs.slice(), points };\n}\n\n/** The mesh with the patch row holding `t` split at `t` (exact). */\nexport function splitWarpMeshV(m: WarpMesh, t: number): WarpMesh | null {\n const out = splitWarpMeshU(transposeMesh(m), t);\n return out && transposeMesh(out);\n}\n\n/**\n * The mesh without interior vertical boundary `k` (1 … us.length − 2), its two patch columns\n * merged: exact when they came from an unedited split; otherwise the outer control points stay and\n * the inner handles are extrapolated.\n */\nexport function removeWarpMeshSplitU(m: WarpMesh, k: number): WarpMesh | null {\n if (k <= 0 || k + 1 >= m.us.length) return null;\n const a = (m.us[k] - m.us[k - 1]) / (m.us[k + 1] - m.us[k - 1]);\n const nx = warpMeshColumns(m);\n const ny = warpMeshRows(m);\n const c0 = 3 * (k - 1);\n const points: Vec2[] = [];\n for (let j = 0; j < ny; j++) {\n const row = m.points.slice(j * nx, (j + 1) * nx);\n const [p0, q1, r2, p3] = [row[c0], row[c0 + 1], row[c0 + 5], row[c0 + 6]];\n // De Casteljau inverse: q1 = lerpVec2(p0, p1, a), r2 = lerpVec2(p2, p3, a).\n const p1 = { x: (q1.x - (1 - a) * p0.x) / a, y: (q1.y - (1 - a) * p0.y) / a };\n const p2 = { x: (r2.x - a * p3.x) / (1 - a), y: (r2.y - a * p3.y) / (1 - a) };\n points.push(...row.slice(0, c0), p0, p1, p2, p3, ...row.slice(c0 + 7));\n }\n const us = m.us.slice();\n us.splice(k, 1);\n return { us, vs: m.vs.slice(), points };\n}\n\n/** Removes interior horizontal boundary `k`. */\nexport function removeWarpMeshSplitV(m: WarpMesh, k: number): WarpMesh | null {\n const out = removeWarpMeshSplitU(transposeMesh(m), k);\n return out && transposeMesh(out);\n}\n\n/** Every control point through `f` (exact for affine maps). */\nexport function mapWarpMeshPoints(m: WarpMesh, f: (p: Vec2) => Vec2): WarpMesh {\n return { us: m.us.slice(), vs: m.vs.slice(), points: m.points.map((p) => f(p)) };\n}\n\n/**\n * The mesh with `columns × rows` patches over the same surface: split exactly when its knots are\n * a subset of the new even ones (a one-patch mesh always is), otherwise refitted.\n */\nexport function resizeWarpMesh(m: WarpMesh, columns: number, rows: number): WarpMesh {\n const cols = clampMeshCount(columns);\n const rws = clampMeshCount(rows);\n if (m.us.length - 1 === cols && m.vs.length - 1 === rws) return m;\n const us = evenKnots(cols);\n const vs = evenKnots(rws);\n const has = (list: number[], v: number) => list.some((k) => Math.abs(k - v) < 1e-12);\n if (m.us.every((u) => has(us, u)) && m.vs.every((v) => has(vs, v))) {\n let out: WarpMesh | null = m;\n for (const u of us) if (!has(out.us, u)) out = splitWarpMeshU(out, u) ?? out;\n for (const v of vs) if (!has(out.vs, v)) out = splitWarpMeshV(out, v) ?? out;\n return out;\n }\n return fitWarpMesh((s, t) => evalWarpMesh(m, s, t), us, vs);\n}\n\n/** Bounding box of the control points (the surface lies inside it). */\nexport function warpMeshControlBounds(m: WarpMesh): Box {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const p of m.points) {\n minX = Math.min(minX, p.x);\n minY = Math.min(minY, p.y);\n maxX = Math.max(maxX, p.x);\n maxY = Math.max(maxY, p.y);\n }\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\n/** Box fractions `(s, t)` whose surface point is nearest `p` (a coarse search, then Newton steps). */\nexport function warpMeshParamAt(m: WarpMesh, p: Vec2): { s: number; t: number; distance: number } {\n const n = 48;\n let best = { s: 0.5, t: 0.5, d: Infinity };\n for (let j = 0; j <= n; j++) {\n for (let i = 0; i <= n; i++) {\n const q = evalWarpMesh(m, i / n, j / n);\n const d = (q.x - p.x) ** 2 + (q.y - p.y) ** 2;\n if (d < best.d) best = { s: i / n, t: j / n, d };\n }\n }\n let { s, t } = best;\n for (let k = 0; k < 12; k++) {\n const h = 1e-5;\n const q = evalWarpMesh(m, s, t);\n const qs = evalWarpMesh(m, s + h, t);\n const qt = evalWarpMesh(m, s, t + h);\n const a = (qs.x - q.x) / h;\n const b = (qt.x - q.x) / h;\n const c = (qs.y - q.y) / h;\n const d = (qt.y - q.y) / h;\n const det = a * d - b * c;\n if (Math.abs(det) < 1e-12) break;\n const ex = p.x - q.x;\n const ey = p.y - q.y;\n s = Math.min(1, Math.max(0, s + (d * ex - b * ey) / det));\n t = Math.min(1, Math.max(0, t + (a * ey - c * ex) / det));\n }\n const q = evalWarpMesh(m, s, t);\n return { s, t, distance: Math.hypot(q.x - p.x, q.y - p.y) };\n}\n\n/**\n * Makes the tangent equal on both sides of every interior grid line for the control points in\n * columns `i0..i1` and rows `j0..j1` (exclusive ends): each pair of handles takes the average of\n * the two tangents it had. In place.\n */\nfunction smoothLines(m: WarpMesh, i0: number, i1: number, j0: number, j1: number) {\n const nx = warpMeshColumns(m);\n i1 = Math.min(i1, nx);\n j1 = Math.min(j1, warpMeshRows(m));\n const triples: [number, number, number, number, number][] = [];\n for (let a = 1; a < m.us.length - 1; a++) {\n if (3 * a >= i0 && 3 * a < i1)\n for (let j = j0; j < j1; j++) triples.push([j * nx + 3 * a - 1, j * nx + 3 * a, j * nx + 3 * a + 1, m.us[a] - m.us[a - 1], m.us[a + 1] - m.us[a]]);\n }\n for (let b = 1; b < m.vs.length - 1; b++) {\n if (3 * b >= j0 && 3 * b < j1)\n for (let i = i0; i < i1; i++) triples.push([(3 * b - 1) * nx + i, 3 * b * nx + i, (3 * b + 1) * nx + i, m.vs[b] - m.vs[b - 1], m.vs[b + 1] - m.vs[b]]);\n }\n for (const [l, c, r, hl, hr] of triples) {\n const pl = m.points[l];\n const pc = m.points[c];\n const pr = m.points[r];\n const tx = ((pc.x - pl.x) / hl + (pr.x - pc.x) / hr) / 2;\n const ty = ((pc.y - pl.y) / hl + (pr.y - pc.y) / hr) / 2;\n m.points[l] = { x: pc.x - tx * hl, y: pc.y - ty * hl };\n m.points[r] = { x: pc.x + tx * hr, y: pc.y + ty * hr };\n }\n}\n\n/**\n * `base` with control point `index` dragged by `d`, keeping the surface smooth across the grid\n * lines: an anchor moves with the eight points around it as one block; a handle moves with the two\n * points beside it across its line, and the handle opposite it on the same anchor turns the other\n * way (with its two neighbours), so the line keeps passing straight through the anchor. An inner\n * point of a patch moves alone.\n */\nexport function dragWarpMeshPoint(base: WarpMesh, index: number, d: Vec2): WarpMesh {\n if (index < 0 || index >= base.points.length || !Number.isFinite(d.x) || !Number.isFinite(d.y)) return base;\n const out: WarpMesh = { us: base.us.slice(), vs: base.vs.slice(), points: base.points.slice() };\n const nx = warpMeshColumns(base);\n const ny = warpMeshRows(base);\n const i = index % nx;\n const j = Math.floor(index / nx);\n const shift = (ii: number, jj: number, v: Vec2) => {\n if (ii < 0 || jj < 0 || ii >= nx || jj >= ny) return;\n const p = out.points[jj * nx + ii];\n out.points[jj * nx + ii] = { x: p.x + v.x, y: p.y + v.y };\n };\n // Spans either side of interior knot `k`.\n const span = (knots: number[], k: number): [number, number] | null => (k > 0 && k + 1 < knots.length ? [knots[k] - knots[k - 1], knots[k + 1] - knots[k]] : null);\n const ri = i % 3;\n const rj = j % 3;\n if (ri === 0 && rj === 0) {\n for (let dj = -1; dj <= 1; dj++) for (let di = -1; di <= 1; di++) shift(i + di, j + dj, d);\n } else if (ri === 0) {\n // A handle along a vertical line: it takes the two points beside it across the line.\n for (let di = -1; di <= 1; di++) shift(i + di, j, d);\n // The opposite handle of the same anchor turns the other way.\n const sp = span(base.vs, Math.floor(j / 3) + (rj === 2 ? 1 : 0));\n if (sp) {\n const [other, k] = rj === 1 ? [j - 2, sp[0] / sp[1]] : [j + 2, sp[1] / sp[0]];\n for (let di = -1; di <= 1; di++) shift(i + di, other, { x: -d.x * k, y: -d.y * k });\n }\n } else if (rj === 0) {\n // A handle along a horizontal line, likewise.\n for (let dj = -1; dj <= 1; dj++) shift(i, j + dj, d);\n const sp = span(base.us, Math.floor(i / 3) + (ri === 2 ? 1 : 0));\n if (sp) {\n const [other, k] = ri === 1 ? [i - 2, sp[0] / sp[1]] : [i + 2, sp[1] / sp[0]];\n for (let dj = -1; dj <= 1; dj++) shift(other, j + dj, { x: -d.x * k, y: -d.y * k });\n }\n } else shift(i, j, d);\n return out;\n}\n\n/**\n * `base` with its surface point at box fractions `(s, t)` pulled by `d`, the way dragging inside a\n * patch works: interior anchors within about two cells follow by a share of `d` that fades with\n * distance (each with its block of handles, so grid lines stay smooth); the outer border stays\n * pinned unless the grab is near it, and then it bows; the four corners never move. The grabbed\n * patch's inner points (and, near the border, the border's handles) make up the rest, so the\n * grabbed point lands exactly at its start + `d`.\n */\nexport function pullWarpMesh(base: WarpMesh, s: number, t: number, d: Vec2): WarpMesh {\n /** Within this distance of the border (box fractions) a grab starts to drag the border with it. */\n const BORDER_ZONE = 0.12;\n /** Falloff radius, in the grabbed patch's size. */\n const REACH = 1.8;\n if (!Number.isFinite(d.x) || !Number.isFinite(d.y)) return base;\n const m: WarpMesh = { us: base.us.slice(), vs: base.vs.slice(), points: base.points.slice() };\n const cols = m.us.length - 1;\n const rows = m.vs.length - 1;\n const [pi, a] = locate(m.us, s);\n const [pj, b] = locate(m.vs, t);\n const ba = bernstein(a);\n const bb = bernstein(b);\n const nx = warpMeshColumns(m);\n const ny = warpMeshRows(m);\n const anchor = (ai: number, aj: number) => base.points[3 * aj * nx + 3 * ai] ?? { x: 0, y: 0 };\n const at0 = evalWarpMesh(base, s, t);\n const target = { x: at0.x + d.x, y: at0.y + d.y };\n // The grabbed patch's size and how far inside it the grab is (1 in the middle, 0 on its edges).\n let size = 1;\n for (const k of ['x', 'y'] as const) {\n const vals = [anchor(pi, pj)[k], anchor(pi + 1, pj)[k], anchor(pi, pj + 1)[k], anchor(pi + 1, pj + 1)[k]];\n size = Math.max(size, Math.max(...vals) - Math.min(...vals));\n }\n const radius = REACH * size;\n const innerW = (ba[1] + ba[2]) * (bb[1] + bb[2]);\n const interior = Math.min(1, Math.max(0, innerW / 0.5625));\n const toBorder = Math.min(s, 1 - s, t, 1 - t);\n const nearBorder = Math.min(1, Math.max(0, 1 - toBorder / BORDER_ZONE));\n const meshCorner = (ai: number, aj: number) => (ai === 0 || ai === cols) && (aj === 0 || aj === rows);\n const onBorder = (ai: number, aj: number) => ai === 0 || ai === cols || aj === 0 || aj === rows;\n const reach = (ai: number, aj: number, wa: number, wb: number) => (meshCorner(ai, aj) ? 0 : wa * wb * (onBorder(ai, aj) ? nearBorder : 1));\n const corner: [number, number, number][] = [\n [pi, pj, reach(pi, pj, ba[0] + ba[1], bb[0] + bb[1])],\n [pi + 1, pj, reach(pi + 1, pj, ba[2] + ba[3], bb[0] + bb[1])],\n [pi, pj + 1, reach(pi, pj + 1, ba[0] + ba[1], bb[2] + bb[3])],\n [pi + 1, pj + 1, reach(pi + 1, pj + 1, ba[2] + ba[3], bb[2] + bb[3])]\n ];\n // Share of `d` for each anchor.\n const share = new Array((cols + 1) * (rows + 1)).fill(0);\n for (let aj = 0; aj <= rows; aj++) {\n for (let ai = 0; ai <= cols; ai++) {\n const p = anchor(ai, aj);\n const x = Math.min(1, Math.max(0, Math.hypot(p.x - at0.x, p.y - at0.y) / radius));\n const fall = 0.5 * (1 + Math.cos(Math.PI * x));\n const edge = meshCorner(ai, aj) ? 0 : onBorder(ai, aj) ? nearBorder : 1;\n share[aj * (cols + 1) + ai] = fall * edge;\n }\n }\n // The grabbed patch's own corners: near one, that corner follows the pointer.\n for (const [ai, aj, w] of corner) share[aj * (cols + 1) + ai] = Math.max(share[aj * (cols + 1) + ai], (1 - interior) * w);\n const move = (idx: number, k: number, v: Vec2) => {\n const p = m.points[idx];\n m.points[idx] = { x: p.x + v.x * k, y: p.y + v.y * k };\n };\n // Every control point moves with the anchor it is closest to.\n for (let j = 0; j < ny; j++) {\n for (let i = 0; i < nx; i++) {\n const ai = Math.min(cols, Math.floor((i + 1) / 3));\n const aj = Math.min(rows, Math.floor((j + 1) / 3));\n move(j * nx + i, share[aj * (cols + 1) + ai], d);\n }\n }\n // Close the gap exactly with three groups that share the work: the grabbed patch's four inner\n // points, the corner blocks, and (near the border) the border's own handles. Closing nudges the\n // tangents across the grid lines, so they are evened out again and the gap re-closed.\n let norm = 0;\n for (const j of [1, 2]) for (const i of [1, 2]) norm += (ba[i] * bb[j]) ** 2;\n const cornerNorm = corner.reduce((acc, c) => acc + c[2] * c[2], 0);\n // With no free corner to help (a one-patch grid grabbed away from its border) the inner points do all of it.\n const innerPart = cornerNorm > 1e-12 ? Math.min(1, innerW / 0.15) : 1;\n const edgeHandles: [number, number][] = [];\n for (const k of [1, 2]) {\n if (pi === 0) edgeHandles.push([(3 * pj + k) * nx + 3 * pi, ba[0] * bb[k]]);\n if (pi + 1 === cols) edgeHandles.push([(3 * pj + k) * nx + 3 * pi + 3, ba[3] * bb[k]]);\n if (pj === 0) edgeHandles.push([3 * pj * nx + 3 * pi + k, ba[k] * bb[0]]);\n if (pj + 1 === rows) edgeHandles.push([(3 * pj + 3) * nx + 3 * pi + k, ba[k] * bb[3]]);\n }\n const edgeNorm = edgeHandles.reduce((acc, e) => acc + e[1] * e[1], 0);\n const edgePart = edgeNorm > 1e-12 ? nearBorder : 0;\n const innerShare = (1 - edgePart) * innerPart;\n const cornerShare = (1 - edgePart) * (1 - innerPart);\n for (let iter = 0; iter < 60; iter++) {\n const now = evalWarpMesh(m, s, t);\n const rem = { x: target.x - now.x, y: target.y - now.y };\n if (Math.hypot(rem.x, rem.y) < 1e-9) break;\n if (innerShare > 0 && norm > 0) for (const j of [1, 2]) for (const i of [1, 2]) move((3 * pj + j) * nx + 3 * pi + i, ((ba[i] * bb[j]) / norm) * innerShare, rem);\n if (edgePart > 0) for (const [idx, w] of edgeHandles) move(idx, (w / edgeNorm) * edgePart, rem);\n if (cornerShare > 0 && cornerNorm > 0) {\n for (const [ai, aj, w] of corner) {\n const k = (w / cornerNorm) * cornerShare;\n for (let dj = -1; dj <= 1; dj++) {\n for (let di = -1; di <= 1; di++) {\n const i = 3 * ai + di;\n const j = 3 * aj + dj;\n if (i >= 0 && j >= 0 && i < nx && j < ny) move(j * nx + i, k, rem);\n }\n }\n }\n }\n for (let k = 0; k < 3; k++) smoothLines(m, Math.max(0, 3 * pi - 3), 3 * pi + 7, Math.max(0, 3 * pj - 3), 3 * pj + 7);\n }\n return m;\n}\n\n/**\n * The control points an editor shows: the anchors (where grid lines cross) and the handles along\n * the grid lines, each with the anchor it belongs to. Points inside a patch are left out (drag\n * inside a patch to pull the surface instead).\n */\nexport function warpMeshEditPoints(m: WarpMesh): { anchors: number[]; handles: { index: number; anchor: number }[] } {\n const nx = warpMeshColumns(m);\n const ny = warpMeshRows(m);\n const anchors: number[] = [];\n const handles: { index: number; anchor: number }[] = [];\n for (let j = 0; j < ny; j++) {\n for (let i = 0; i < nx; i++) {\n const ri = i % 3;\n const rj = j % 3;\n if (ri === 0 && rj === 0) anchors.push(j * nx + i);\n else if (ri === 0) handles.push({ index: j * nx + i, anchor: (rj === 1 ? j - 1 : j + 1) * nx + i });\n else if (rj === 0) handles.push({ index: j * nx + i, anchor: j * nx + (ri === 1 ? i - 1 : i + 1) });\n }\n }\n return { anchors, handles };\n}\n\n/** The mesh's grid lines (patch borders) as cubics `[p0, p1, p2, p3]`. */\nexport function warpMeshGridCurves(m: WarpMesh): Vec2[][] {\n const nx = warpMeshColumns(m);\n const ny = warpMeshRows(m);\n const pt = (i: number, j: number) => m.points[j * nx + i];\n const out: Vec2[][] = [];\n for (let j = 0; j < ny; j += 3) for (let i = 0; i + 3 < nx; i += 3) out.push([pt(i, j), pt(i + 1, j), pt(i + 2, j), pt(i + 3, j)]);\n for (let i = 0; i < nx; i += 3) for (let j = 0; j + 3 < ny; j += 3) out.push([pt(i, j), pt(i, j + 1), pt(i, j + 2), pt(i, j + 3)]);\n return out;\n}\n"],"mappings":"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","names":["q"]}
@@ -0,0 +1,181 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/geom/homography.ts
2
+ var IDENTITY_HOMOGRAPHY = [1, 0, 0, 0, 1, 0, 0, 0, 1];
3
+ function solve8(rows) {
4
+ const m = rows.map((r) => r.slice());
5
+ for (let col = 0; col < 8; col++) {
6
+ let pivot = col;
7
+ for (let r = col + 1; r < 8; r++) if (Math.abs(m[r][col]) > Math.abs(m[pivot][col])) pivot = r;
8
+ if (!(Math.abs(m[pivot][col]) >= 1e-12)) return null;
9
+ [m[col], m[pivot]] = [m[pivot], m[col]];
10
+ const p = m[col];
11
+ for (let r = 0; r < 8; r++) {
12
+ if (r === col) continue;
13
+ const f = m[r][col] / p[col];
14
+ if (f !== 0) for (let k = 0; k < 9; k++) m[r][k] -= f * p[k];
15
+ }
16
+ }
17
+ const out = [];
18
+ for (let i = 0; i < 8; i++) {
19
+ const v = m[i][8] / m[i][i];
20
+ if (!Number.isFinite(v)) return null;
21
+ out.push(v);
22
+ }
23
+ return out;
24
+ }
25
+ function applyHomography(h, p) {
26
+ const w = h[6] * p.x + h[7] * p.y + h[8];
27
+ if (!Number.isFinite(w) || Math.abs(w) < 1e-12) return null;
28
+ const x = (h[0] * p.x + h[1] * p.y + h[2]) / w;
29
+ const y = (h[3] * p.x + h[4] * p.y + h[5]) / w;
30
+ return Number.isFinite(x) && Number.isFinite(y) ? { x, y } : null;
31
+ }
32
+ function homographyW(h, p) {
33
+ return h[6] * p.x + h[7] * p.y + h[8];
34
+ }
35
+ var finite = (p) => Number.isFinite(p.x) && Number.isFinite(p.y);
36
+ function homographyFromPoints(from, to) {
37
+ if (from.length !== 4 || to.length !== 4 || ![...from, ...to].every(finite)) return null;
38
+ const rows = [];
39
+ for (let i = 0; i < 4; i++) {
40
+ const { x, y } = from[i];
41
+ const { x: u, y: v } = to[i];
42
+ rows.push([x, y, 1, 0, 0, 0, -u * x, -u * y, u]);
43
+ rows.push([0, 0, 0, x, y, 1, -v * x, -v * y, v]);
44
+ }
45
+ const h = solve8(rows);
46
+ if (!h) return null;
47
+ const out = [h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7], 1];
48
+ for (let i = 0; i < 4; i++) {
49
+ const r = applyHomography(out, from[i]);
50
+ const q = to[i];
51
+ const scale = 1 + Math.max(Math.abs(q.x), Math.abs(q.y));
52
+ if (!r || Math.abs(r.x - q.x) > 1e-6 * scale || Math.abs(r.y - q.y) > 1e-6 * scale) return null;
53
+ }
54
+ return out;
55
+ }
56
+ function homographyKeepsQuad(h, quad) {
57
+ const ws = quad.map((p) => h[6] * p.x + h[7] * p.y + h[8]);
58
+ return ws.every((w) => w > 1e-9) || ws.every((w) => w < -1e-9);
59
+ }
60
+ function orderQuad(points) {
61
+ if (points.length !== 4 || !points.every(finite)) return null;
62
+ const cx = points.reduce((s, p) => s + p.x, 0) / 4;
63
+ const cy = points.reduce((s, p) => s + p.y, 0) / 4;
64
+ const q = points.slice().sort((a, b) => Math.atan2(a.y - cy, a.x - cx) - Math.atan2(b.y - cy, b.x - cx));
65
+ let first = 0;
66
+ for (let i = 1; i < 4; i++) if (q[i].x + q[i].y < q[first].x + q[first].y) first = i;
67
+ const ordered = [...q.slice(first), ...q.slice(0, first)];
68
+ const cross = (o, a, b) => (a.x - o.x) * (b.y - o.y) - (a.y - o.y) * (b.x - o.x);
69
+ const turns = ordered.map((_, i) => cross(ordered[i], ordered[(i + 1) % 4], ordered[(i + 2) % 4]));
70
+ const area = turns.reduce((s, t) => s + t, 0) / 2;
71
+ const xs = ordered.map((p) => p.x);
72
+ const ys = ordered.map((p) => p.y);
73
+ const size = Math.max(Math.max(...xs) - Math.min(...xs), Math.max(...ys) - Math.min(...ys));
74
+ const convex = turns.every((t) => t > 1e-9 * size * size);
75
+ return convex && area > 1e-6 * size * size ? ordered : null;
76
+ }
77
+ function multiplyHomographies(a, b) {
78
+ const r = new Array(9);
79
+ for (let i = 0; i < 3; i++) for (let j = 0; j < 3; j++) r[i * 3 + j] = b[i * 3] * a[j] + b[i * 3 + 1] * a[3 + j] + b[i * 3 + 2] * a[6 + j];
80
+ return r;
81
+ }
82
+ function invertHomography(m) {
83
+ const c = [
84
+ m[4] * m[8] - m[5] * m[7],
85
+ m[2] * m[7] - m[1] * m[8],
86
+ m[1] * m[5] - m[2] * m[4],
87
+ m[5] * m[6] - m[3] * m[8],
88
+ m[0] * m[8] - m[2] * m[6],
89
+ m[2] * m[3] - m[0] * m[5],
90
+ m[3] * m[7] - m[4] * m[6],
91
+ m[1] * m[6] - m[0] * m[7],
92
+ m[0] * m[4] - m[1] * m[3]
93
+ ];
94
+ const det = m[0] * c[0] + m[1] * c[3] + m[2] * c[6];
95
+ if (!(Math.abs(det) >= 1e-12) || !Number.isFinite(det)) return null;
96
+ return c.map((v) => v / det);
97
+ }
98
+ function homographyFromAffine(m) {
99
+ return [m[0], m[2], m[4], m[1], m[3], m[5], 0, 0, 1];
100
+ }
101
+ function affineFromHomography(h, eps = 1e-12) {
102
+ if (Math.abs(h[6]) > eps * Math.abs(h[8]) || Math.abs(h[7]) > eps * Math.abs(h[8]) || !h[8]) return null;
103
+ const w = h[8];
104
+ return [h[0] / w, h[3] / w, h[1] / w, h[4] / w, h[2] / w, h[5] / w];
105
+ }
106
+ function isIdentityHomography(h, eps = 1e-9) {
107
+ const w = h[8];
108
+ if (Math.abs(w) < 1e-12) return false;
109
+ const id = IDENTITY_HOMOGRAPHY;
110
+ for (let i = 0; i < 8; i++) if (Math.abs(h[i] / w - id[i]) > eps) return false;
111
+ return true;
112
+ }
113
+ function squareToQuad(q) {
114
+ const [p0, p1, p2, p3] = q;
115
+ const sx = p0.x - p1.x + p2.x - p3.x;
116
+ const sy = p0.y - p1.y + p2.y - p3.y;
117
+ if (Math.abs(sx) < 1e-12 && Math.abs(sy) < 1e-12) {
118
+ return [p1.x - p0.x, p3.x - p0.x, p0.x, p1.y - p0.y, p3.y - p0.y, p0.y, 0, 0, 1];
119
+ }
120
+ const dx1 = p1.x - p2.x;
121
+ const dx2 = p3.x - p2.x;
122
+ const dy1 = p1.y - p2.y;
123
+ const dy2 = p3.y - p2.y;
124
+ const den = dx1 * dy2 - dx2 * dy1;
125
+ if (Math.abs(den) < 1e-12) return null;
126
+ const g = (sx * dy2 - dx2 * sy) / den;
127
+ const h = (dx1 * sy - sx * dy1) / den;
128
+ return [p1.x - p0.x + g * p1.x, p3.x - p0.x + h * p3.x, p0.x, p1.y - p0.y + g * p1.y, p3.y - p0.y + h * p3.y, p0.y, g, h, 1];
129
+ }
130
+ function rectToQuad(r, quad) {
131
+ if (!(r.width > 0 && r.height > 0) || quad.length !== 4 || !quad.every(finite)) return null;
132
+ const toUnit = [1 / r.width, 0, -r.x / r.width, 0, 1 / r.height, -r.y / r.height, 0, 0, 1];
133
+ const sq = squareToQuad(quad);
134
+ if (!sq) return null;
135
+ const h = multiplyHomographies(toUnit, sq);
136
+ return invertHomography(h) ? h : null;
137
+ }
138
+ function boxQuad(r) {
139
+ return [
140
+ { x: r.x, y: r.y },
141
+ { x: r.x + r.width, y: r.y },
142
+ { x: r.x + r.width, y: r.y + r.height },
143
+ { x: r.x, y: r.y + r.height }
144
+ ];
145
+ }
146
+ function homographyFrontSide(h, r) {
147
+ const ahead = boxQuad(r).filter((p) => homographyW(h, p) > 0).length;
148
+ if (ahead >= 3) return 1;
149
+ if (ahead <= 1) return -1;
150
+ return homographyW(h, { x: r.x + r.width / 2, y: r.y + r.height / 2 }) >= 0 ? 1 : -1;
151
+ }
152
+ var OUTPUT_LIMIT = 1 << 20;
153
+ function cornerBounds(corners) {
154
+ const lim = OUTPUT_LIMIT;
155
+ const xs = corners.map((c) => c.x);
156
+ const ys = corners.map((c) => c.y);
157
+ const x0 = Math.floor(Math.max(-lim, Math.min(...xs))) - 1;
158
+ const y0 = Math.floor(Math.max(-lim, Math.min(...ys))) - 1;
159
+ const x1 = Math.ceil(Math.min(lim, Math.max(...xs))) + 1;
160
+ const y1 = Math.ceil(Math.min(lim, Math.max(...ys))) + 1;
161
+ return { x: x0, y: y0, width: x1 - x0, height: y1 - y0 };
162
+ }
163
+
164
+
165
+
166
+
167
+
168
+
169
+
170
+
171
+
172
+
173
+
174
+
175
+
176
+
177
+
178
+
179
+
180
+ exports.solve8 = solve8; exports.applyHomography = applyHomography; exports.homographyW = homographyW; exports.homographyFromPoints = homographyFromPoints; exports.homographyKeepsQuad = homographyKeepsQuad; exports.orderQuad = orderQuad; exports.multiplyHomographies = multiplyHomographies; exports.invertHomography = invertHomography; exports.homographyFromAffine = homographyFromAffine; exports.affineFromHomography = affineFromHomography; exports.isIdentityHomography = isIdentityHomography; exports.rectToQuad = rectToQuad; exports.boxQuad = boxQuad; exports.homographyFrontSide = homographyFrontSide; exports.cornerBounds = cornerBounds;
181
+ //# sourceMappingURL=chunk-MUUXNRU4.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/editor/editor/packages/core/dist/chunk-MUUXNRU4.cjs","../src/geom/homography.ts"],"names":[],"mappings":"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","file":"/home/runner/work/editor/editor/packages/core/dist/chunk-MUUXNRU4.cjs","sourcesContent":[null,"/**\n * Perspective (projective) maps between quadrilaterals: Free Distort and Perspective in both the\n * vector and the image editor. Pure maths; degenerate or non-finite input gives `null` instead of\n * NaNs.\n *\n * Ported from ArtCraft (MIT OR Apache-2.0, © ArtCraft Team and contributors; see\n * THIRD_PARTY_NOTICES.md): pdfcraft `crates/geom/src/perspective.rs` (`Homography::from_points`,\n * `Homography::apply`, `solve8`, `order_quad`) and photocraft `crates/algo/src/transform.rs`\n * (`Homography::square_to_quad`, `rect_to_quad`, `inverse`, `mul`, `local_scale`, `front_side`,\n * `warp_output_bounds`, `convex_quad`).\n */\nimport type { AffineMatrix, Box, Homography, Quad, Vec2 } from './types';\n\nexport type { Homography };\n\nexport const IDENTITY_HOMOGRAPHY: Homography = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n\n/**\n * Gaussian elimination with partial pivoting on an 8×8 system (the 9th column of each row is the\n * right-hand side). Null when the system is singular.\n */\nexport function solve8(rows: readonly (readonly number[])[]): number[] | null {\n const m = rows.map((r) => r.slice());\n for (let col = 0; col < 8; col++) {\n let pivot = col;\n for (let r = col + 1; r < 8; r++) if (Math.abs(m[r][col]) > Math.abs(m[pivot][col])) pivot = r;\n if (!(Math.abs(m[pivot][col]) >= 1e-12)) return null;\n [m[col], m[pivot]] = [m[pivot], m[col]];\n const p = m[col];\n for (let r = 0; r < 8; r++) {\n if (r === col) continue;\n const f = m[r][col] / p[col];\n if (f !== 0) for (let k = 0; k < 9; k++) m[r][k] -= f * p[k];\n }\n }\n const out: number[] = [];\n for (let i = 0; i < 8; i++) {\n const v = m[i][8] / m[i][i];\n if (!Number.isFinite(v)) return null;\n out.push(v);\n }\n return out;\n}\n\n/** The image of `p`, or null where the map sends it to infinity. */\nexport function applyHomography(h: Homography, p: Vec2): Vec2 | null {\n const w = h[6] * p.x + h[7] * p.y + h[8];\n if (!Number.isFinite(w) || Math.abs(w) < 1e-12) return null;\n const x = (h[0] * p.x + h[1] * p.y + h[2]) / w;\n const y = (h[3] * p.x + h[4] * p.y + h[5]) / w;\n return Number.isFinite(x) && Number.isFinite(y) ? { x, y } : null;\n}\n\n/** The homogeneous `w` of `p`: its sign is the side of the horizon `p` maps to (0 on it). */\nexport function homographyW(h: Homography, p: Vec2): number {\n return h[6] * p.x + h[7] * p.y + h[8];\n}\n\nconst finite = (p: Vec2) => Number.isFinite(p.x) && Number.isFinite(p.y);\n\n/**\n * The projective map that takes each of `from` to the point at the same index of `to`. Null when\n * three of either set are collinear or a coordinate is not finite.\n */\nexport function homographyFromPoints(from: readonly Vec2[], to: readonly Vec2[]): Homography | null {\n if (from.length !== 4 || to.length !== 4 || ![...from, ...to].every(finite)) return null;\n // x' = (h0 x + h1 y + h2) / (h6 x + h7 y + 1), y' likewise with h3..h5: eight unknowns, two\n // equations per point pair.\n const rows: number[][] = [];\n for (let i = 0; i < 4; i++) {\n const { x, y } = from[i];\n const { x: u, y: v } = to[i];\n rows.push([x, y, 1, 0, 0, 0, -u * x, -u * y, u]);\n rows.push([0, 0, 0, x, y, 1, -v * x, -v * y, v]);\n }\n const h = solve8(rows);\n if (!h) return null;\n const out: Homography = [h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7], 1];\n // Collinear points can leave a solvable but singular system: check the map really takes the\n // four points where they should go.\n for (let i = 0; i < 4; i++) {\n const r = applyHomography(out, from[i]);\n const q = to[i];\n const scale = 1 + Math.max(Math.abs(q.x), Math.abs(q.y));\n if (!r || Math.abs(r.x - q.x) > 1e-6 * scale || Math.abs(r.y - q.y) > 1e-6 * scale) return null;\n }\n return out;\n}\n\n/**\n * Whether `h` maps the whole convex quad `quad` without sending any of it through infinity (the\n * denominator keeps one sign over it): what a usable distortion needs.\n */\nexport function homographyKeepsQuad(h: Homography, quad: readonly Vec2[]): boolean {\n const ws = quad.map((p) => h[6] * p.x + h[7] * p.y + h[8]);\n return ws.every((w) => w > 1e-9) || ws.every((w) => w < -1e-9);\n}\n\n/**\n * The four corners in reading order for a y-down space: top-left, top-right, bottom-right,\n * bottom-left, whatever order they come in. Null unless they form a convex quadrilateral with a\n * non-negligible area.\n */\nexport function orderQuad(points: readonly Vec2[]): Vec2[] | null {\n if (points.length !== 4 || !points.every(finite)) return null;\n const cx = points.reduce((s, p) => s + p.x, 0) / 4;\n const cy = points.reduce((s, p) => s + p.y, 0) / 4;\n // Ascending angle about the centre is clockwise on screen (y down).\n const q = points.slice().sort((a, b) => Math.atan2(a.y - cy, a.x - cx) - Math.atan2(b.y - cy, b.x - cx));\n let first = 0;\n for (let i = 1; i < 4; i++) if (q[i].x + q[i].y < q[first].x + q[first].y) first = i;\n const ordered = [...q.slice(first), ...q.slice(0, first)];\n const cross = (o: Vec2, a: Vec2, b: Vec2) => (a.x - o.x) * (b.y - o.y) - (a.y - o.y) * (b.x - o.x);\n const turns = ordered.map((_, i) => cross(ordered[i], ordered[(i + 1) % 4], ordered[(i + 2) % 4]));\n const area = turns.reduce((s, t) => s + t, 0) / 2;\n const xs = ordered.map((p) => p.x);\n const ys = ordered.map((p) => p.y);\n const size = Math.max(Math.max(...xs) - Math.min(...xs), Math.max(...ys) - Math.min(...ys));\n const convex = turns.every((t) => t > 1e-9 * size * size);\n return convex && area > 1e-6 * size * size ? ordered : null;\n}\n\n/** `a` then `b` (apply `a` first). */\nexport function multiplyHomographies(a: Homography, b: Homography): Homography {\n // Row-major column-vector maps: (b ∘ a) = B · A.\n const r = new Array<number>(9);\n for (let i = 0; i < 3; i++) for (let j = 0; j < 3; j++) r[i * 3 + j] = b[i * 3] * a[j] + b[i * 3 + 1] * a[3 + j] + b[i * 3 + 2] * a[6 + j];\n return r as unknown as Homography;\n}\n\n/** The inverse map, or null for a singular one. */\nexport function invertHomography(m: Homography): Homography | null {\n const c = [\n m[4] * m[8] - m[5] * m[7],\n m[2] * m[7] - m[1] * m[8],\n m[1] * m[5] - m[2] * m[4],\n m[5] * m[6] - m[3] * m[8],\n m[0] * m[8] - m[2] * m[6],\n m[2] * m[3] - m[0] * m[5],\n m[3] * m[7] - m[4] * m[6],\n m[1] * m[6] - m[0] * m[7],\n m[0] * m[4] - m[1] * m[3],\n ];\n const det = m[0] * c[0] + m[1] * c[3] + m[2] * c[6];\n if (!(Math.abs(det) >= 1e-12) || !Number.isFinite(det)) return null;\n return c.map((v) => v / det) as unknown as Homography;\n}\n\n/** An affine matrix (SVG order) as a homography. */\nexport function homographyFromAffine(m: AffineMatrix): Homography {\n return [m[0], m[2], m[4], m[1], m[3], m[5], 0, 0, 1];\n}\n\n/** The affine matrix of `h` when it is affine (no perspective part), else null. */\nexport function affineFromHomography(h: Homography, eps = 1e-12): AffineMatrix | null {\n if (Math.abs(h[6]) > eps * Math.abs(h[8]) || Math.abs(h[7]) > eps * Math.abs(h[8]) || !h[8]) return null;\n const w = h[8];\n return [h[0] / w, h[3] / w, h[1] / w, h[4] / w, h[2] / w, h[5] / w];\n}\n\nexport function isIdentityHomography(h: Homography, eps = 1e-9): boolean {\n const w = h[8];\n if (Math.abs(w) < 1e-12) return false;\n const id = IDENTITY_HOMOGRAPHY;\n for (let i = 0; i < 8; i++) if (Math.abs(h[i] / w - id[i]) > eps) return false;\n return true;\n}\n\n/** Unit square → quad (corners (0,0), (1,0), (1,1), (0,1) to TL, TR, BR, BL); null when degenerate. */\nfunction squareToQuad(q: readonly Vec2[]): Homography | null {\n const [p0, p1, p2, p3] = q;\n const sx = p0.x - p1.x + p2.x - p3.x;\n const sy = p0.y - p1.y + p2.y - p3.y;\n if (Math.abs(sx) < 1e-12 && Math.abs(sy) < 1e-12) {\n return [p1.x - p0.x, p3.x - p0.x, p0.x, p1.y - p0.y, p3.y - p0.y, p0.y, 0, 0, 1];\n }\n const dx1 = p1.x - p2.x;\n const dx2 = p3.x - p2.x;\n const dy1 = p1.y - p2.y;\n const dy2 = p3.y - p2.y;\n const den = dx1 * dy2 - dx2 * dy1;\n if (Math.abs(den) < 1e-12) return null;\n const g = (sx * dy2 - dx2 * sy) / den;\n const h = (dx1 * sy - sx * dy1) / den;\n return [p1.x - p0.x + g * p1.x, p3.x - p0.x + h * p3.x, p0.x, p1.y - p0.y + g * p1.y, p3.y - p0.y + h * p3.y, p0.y, g, h, 1];\n}\n\n/**\n * The map taking box `r`'s corners onto `quad` (TL, TR, BR, BL), exact for parallelograms (then\n * affine). Null for an empty box, a non-finite or degenerate quad, or a singular result.\n */\nexport function rectToQuad(r: Box, quad: readonly Vec2[]): Homography | null {\n if (!(r.width > 0 && r.height > 0) || quad.length !== 4 || !quad.every(finite)) return null;\n const toUnit: Homography = [1 / r.width, 0, -r.x / r.width, 0, 1 / r.height, -r.y / r.height, 0, 0, 1];\n const sq = squareToQuad(quad);\n if (!sq) return null;\n const h = multiplyHomographies(toUnit, sq);\n return invertHomography(h) ? h : null;\n}\n\n/** Box `r`'s corners as a quad (TL, TR, BR, BL). */\nexport function boxQuad(r: Box): Quad {\n return [\n { x: r.x, y: r.y },\n { x: r.x + r.width, y: r.y },\n { x: r.x + r.width, y: r.y + r.height },\n { x: r.x, y: r.y + r.height },\n ];\n}\n\n/** Approximate linear scale of the map near `p` (square root of the Jacobian determinant). */\nexport function homographyLocalScale(h: Homography, p: Vec2): number {\n const e = 0.5;\n const a = applyHomography(h, { x: p.x - e, y: p.y });\n const b = applyHomography(h, { x: p.x + e, y: p.y });\n const c = applyHomography(h, { x: p.x, y: p.y - e });\n const d = applyHomography(h, { x: p.x, y: p.y + e });\n if (!a || !b || !c || !d) return 0;\n const jx = { x: b.x - a.x, y: b.y - a.y };\n const jy = { x: d.x - c.x, y: d.y - c.y };\n return Math.sqrt(Math.abs(jx.x * jy.y - jx.y * jy.x));\n}\n\n/**\n * The side of the horizon (+1 or −1) most of box `r`'s corners map to (the centre's on a tie). A\n * Distort dragged past the horizon maps the rest of the source to the far side, where it would\n * show as a mirrored copy wrapped round infinity; resampling keeps to this side, as Photoshop does.\n */\nexport function homographyFrontSide(h: Homography, r: Box): 1 | -1 {\n const ahead = boxQuad(r).filter((p) => homographyW(h, p) > 0).length;\n if (ahead >= 3) return 1;\n if (ahead <= 1) return -1;\n return homographyW(h, { x: r.x + r.width / 2, y: r.y + r.height / 2 }) >= 0 ? 1 : -1;\n}\n\n/** Most pixels a side of a warped result may span (±2²⁰), as photocraft clamps. */\nconst OUTPUT_LIMIT = 1 << 20;\n\n/**\n * The integer box a warp of box `r` through `h` fills: the warped corners plus a pixel for filter\n * support, each side clamped to ±2²⁰. Null when a corner maps to infinity or `h` is singular.\n */\nexport function warpOutputBounds(r: Box, h: Homography): Box | null {\n if (!(r.width > 0 && r.height > 0) || !invertHomography(h)) return null;\n const corners = boxQuad(r).map((p) => applyHomography(h, p));\n if (corners.some((c) => !c)) return null;\n return cornerBounds(corners as Vec2[]);\n}\n\n/** The integer box around `corners`, grown by a pixel and clamped to ±2²⁰. */\nexport function cornerBounds(corners: readonly Vec2[]): Box {\n const lim = OUTPUT_LIMIT;\n const xs = corners.map((c) => c.x);\n const ys = corners.map((c) => c.y);\n const x0 = Math.floor(Math.max(-lim, Math.min(...xs))) - 1;\n const y0 = Math.floor(Math.max(-lim, Math.min(...ys))) - 1;\n const x1 = Math.ceil(Math.min(lim, Math.max(...xs))) + 1;\n const y1 = Math.ceil(Math.min(lim, Math.max(...ys))) + 1;\n return { x: x0, y: y0, width: x1 - x0, height: y1 - y0 };\n}\n\n/**\n * Whether `q` (TL, TR, BR, BL) is strictly convex with every corner turn above ~0.06°, wound\n * clockwise on screen (y down), finite and at least 1 px² in area.\n */\nexport function isConvexQuad(q: readonly Vec2[]): boolean {\n if (q.length !== 4 || !q.every(finite)) return false;\n let area2 = 0;\n for (let i = 0; i < 4; i++) {\n const a = q[i];\n const b = q[(i + 1) % 4];\n const c = q[(i + 2) % 4];\n const e1 = { x: b.x - a.x, y: b.y - a.y };\n const e2 = { x: c.x - b.x, y: c.y - b.y };\n const cross = e1.x * e2.y - e1.y * e2.x;\n if (!(cross > 1e-3 * Math.hypot(e1.x, e1.y) * Math.hypot(e2.x, e2.y))) return false;\n area2 += a.x * b.y - b.x * a.y;\n }\n return Number.isFinite(area2) && area2 >= 2;\n}\n"]}