pa_font 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +112 -0
- package/dist/paFont.cjs +10 -10
- package/dist/paFont.cjs.map +1 -1
- package/dist/paFont.js +9 -9
- package/dist/paFont.js.map +1 -1
- package/paFont.d.ts +3 -3
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# @hanyongpa/pa-font
|
|
2
|
+
|
|
3
|
+
OpenType 폰트를 polygon, region, point 데이터로 바꿔 쓰기 위한 작은 geometry 라이브러리입니다.
|
|
4
|
+
|
|
5
|
+
현재 `package.json` 기준 패키지 이름은 `@hanyongpa/pa-font`로 잡아두었습니다. 실제 publish 전에 원하는 scope나 이름이 있으면 이 값만 바꾸면 됩니다.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @hanyongpa/pa-font
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Quick Start
|
|
14
|
+
|
|
15
|
+
```js
|
|
16
|
+
import paFont from "@hanyongpa/pa-font";
|
|
17
|
+
|
|
18
|
+
const font = await paFont.load("/assets/font.otf");
|
|
19
|
+
|
|
20
|
+
const shape = font.text("안녕", {
|
|
21
|
+
x: 0,
|
|
22
|
+
y: 200,
|
|
23
|
+
size: 160,
|
|
24
|
+
flatten: 1,
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const regions = shape.toRegions();
|
|
28
|
+
const points = shape.toPoints({ step: 8 });
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Core Flow
|
|
32
|
+
|
|
33
|
+
1. `paFont.load(...)`로 폰트를 로드합니다.
|
|
34
|
+
2. `font.text(...)` 또는 `font.glyph(...)`로 `PAShape`를 만듭니다.
|
|
35
|
+
3. `shape.toShape(...)`, `shape.toRegions(...)`, `shape.toPoints(...)` 중 필요한 결과를 꺼냅니다.
|
|
36
|
+
|
|
37
|
+
## Loading Fonts
|
|
38
|
+
|
|
39
|
+
브라우저에서 가장 단순한 방식:
|
|
40
|
+
|
|
41
|
+
```js
|
|
42
|
+
const font = await paFont.load("/assets/font.otf");
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
모듈 상대 경로를 기준으로 읽고 싶을 때:
|
|
46
|
+
|
|
47
|
+
```js
|
|
48
|
+
const font = await paFont.load("./font.otf", {
|
|
49
|
+
base: import.meta.url,
|
|
50
|
+
});
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Node에서 바이트로 읽어 넘길 때:
|
|
54
|
+
|
|
55
|
+
```js
|
|
56
|
+
import { readFile } from "node:fs/promises";
|
|
57
|
+
import paFont from "@hanyongpa/pa-font";
|
|
58
|
+
|
|
59
|
+
const bytes = await readFile("./fonts/font.otf");
|
|
60
|
+
const font = await paFont.load(bytes);
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Public API
|
|
64
|
+
|
|
65
|
+
### `font.text(value, options)`
|
|
66
|
+
|
|
67
|
+
문자열 전체를 하나의 `PAShape`로 만듭니다.
|
|
68
|
+
|
|
69
|
+
### `font.glyph(value, options)`
|
|
70
|
+
|
|
71
|
+
한 글자만 `PAShape`로 만듭니다.
|
|
72
|
+
|
|
73
|
+
### `font.metrics(value, options)`
|
|
74
|
+
|
|
75
|
+
텍스트 폭과 bounding box만 빠르게 계산합니다.
|
|
76
|
+
|
|
77
|
+
### `shape.toShape({ step, openWidth })`
|
|
78
|
+
|
|
79
|
+
hole 열기와 재샘플링을 적용한 뒤 새 `PAShape`를 반환합니다.
|
|
80
|
+
|
|
81
|
+
### `shape.toRegions({ step, openWidth })`
|
|
82
|
+
|
|
83
|
+
최종 도형을 plain polygon data로 반환합니다.
|
|
84
|
+
|
|
85
|
+
```js
|
|
86
|
+
const regions = font.glyph("영", { size: 160 }).toRegions({
|
|
87
|
+
step: 8,
|
|
88
|
+
openWidth: 1,
|
|
89
|
+
});
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### `shape.toPoints({ step, openWidth, includeHoles })`
|
|
93
|
+
|
|
94
|
+
경계를 점 데이터로 샘플링합니다.
|
|
95
|
+
|
|
96
|
+
### `shape.glyphs()`
|
|
97
|
+
|
|
98
|
+
문장 shape를 글자별 shape 배열로 분리합니다.
|
|
99
|
+
|
|
100
|
+
## Build
|
|
101
|
+
|
|
102
|
+
라이브러리 빌드:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
npm run build
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
패키징 확인:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
npm run pack:check
|
|
112
|
+
```
|
package/dist/paFont.cjs
CHANGED
|
@@ -1087,7 +1087,7 @@ function resampleOpenPath(path, step) {
|
|
|
1087
1087
|
}
|
|
1088
1088
|
//#endregion
|
|
1089
1089
|
//#region src/paFont/paFont.js
|
|
1090
|
-
var
|
|
1090
|
+
var paFont = class paFont {
|
|
1091
1091
|
constructor(font) {
|
|
1092
1092
|
this.font = font;
|
|
1093
1093
|
this.unitsPerEm = font.unitsPerEm ?? 1e3;
|
|
@@ -1096,10 +1096,10 @@ var PAFont = class PAFont {
|
|
|
1096
1096
|
}
|
|
1097
1097
|
static async load(source, options = {}) {
|
|
1098
1098
|
const opts = normalizeLoadOptions(options);
|
|
1099
|
-
if (source instanceof ArrayBuffer || ArrayBuffer.isView(source)) return new
|
|
1100
|
-
if (typeof window !== "undefined") return new
|
|
1099
|
+
if (source instanceof ArrayBuffer || ArrayBuffer.isView(source)) return new paFont((0, opentype_js.parse)(toArrayBuffer(source)));
|
|
1100
|
+
if (typeof window !== "undefined") return new paFont((0, opentype_js.parse)(await fetchFontBytes(resolveBrowserFontSource(source, opts.base))));
|
|
1101
1101
|
const { target, loadOptions } = await resolveNodeFontSource(source, opts.base);
|
|
1102
|
-
return new
|
|
1102
|
+
return new paFont(await (0, opentype_js.load)(target, void 0, loadOptions));
|
|
1103
1103
|
}
|
|
1104
1104
|
text(value, options = {}) {
|
|
1105
1105
|
const opts = normalizeTextOptions(options);
|
|
@@ -1159,18 +1159,18 @@ async function fetchFontBytes(source) {
|
|
|
1159
1159
|
}
|
|
1160
1160
|
function normalizeLoadOptions(options = {}) {
|
|
1161
1161
|
if (options == null) return {};
|
|
1162
|
-
if (typeof options !== "object" || Array.isArray(options)) throw new TypeError("
|
|
1162
|
+
if (typeof options !== "object" || Array.isArray(options)) throw new TypeError("paFont.load() options must be an object.");
|
|
1163
1163
|
return options;
|
|
1164
1164
|
}
|
|
1165
1165
|
function resolveBrowserFontSource(source, base) {
|
|
1166
1166
|
if (source instanceof URL) return source.href;
|
|
1167
|
-
if (typeof source !== "string") throw new TypeError("
|
|
1167
|
+
if (typeof source !== "string") throw new TypeError("paFont.load() expects a string, URL, ArrayBuffer, or ArrayBufferView.");
|
|
1168
1168
|
if (base == null) return source;
|
|
1169
1169
|
return new URL(source, normalizeBase(base)).href;
|
|
1170
1170
|
}
|
|
1171
1171
|
async function resolveNodeFontSource(source, base) {
|
|
1172
1172
|
if (source instanceof URL) return toNodeLoadTarget(source);
|
|
1173
|
-
if (typeof source !== "string") throw new TypeError("
|
|
1173
|
+
if (typeof source !== "string") throw new TypeError("paFont.load() expects a string, URL, ArrayBuffer, or ArrayBufferView.");
|
|
1174
1174
|
if (base == null) {
|
|
1175
1175
|
if (isLoadableUrlString(source)) return toNodeLoadTarget(new URL(source));
|
|
1176
1176
|
return {
|
|
@@ -1183,7 +1183,7 @@ async function resolveNodeFontSource(source, base) {
|
|
|
1183
1183
|
function normalizeBase(base) {
|
|
1184
1184
|
if (base instanceof URL) return base;
|
|
1185
1185
|
if (typeof base === "string") return base;
|
|
1186
|
-
throw new TypeError("
|
|
1186
|
+
throw new TypeError("paFont.load() option \"base\" must be a string or URL.");
|
|
1187
1187
|
}
|
|
1188
1188
|
async function toNodeLoadTarget(url) {
|
|
1189
1189
|
if (url.protocol === "file:") return {
|
|
@@ -1214,8 +1214,8 @@ function isHtmlSignature(signature) {
|
|
|
1214
1214
|
return signature === "<!do" || signature === "<htm";
|
|
1215
1215
|
}
|
|
1216
1216
|
//#endregion
|
|
1217
|
-
exports.PAFont = PAFont;
|
|
1218
1217
|
exports.PAShape = PAShape;
|
|
1219
|
-
exports.default =
|
|
1218
|
+
exports.default = paFont;
|
|
1219
|
+
exports.paFont = paFont;
|
|
1220
1220
|
|
|
1221
1221
|
//# sourceMappingURL=paFont.cjs.map
|
package/dist/paFont.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paFont.cjs","names":[],"sources":["../src/paFont/geometry.js","../src/paFont/core.js","../src/paFont/shape.js","../src/paFont/paFont.js"],"sourcesContent":["export function toScreenPoint(point, scale) {\n return [point.x * scale, -point.y * scale];\n}\n\nexport function cloneRawPoint(point) {\n return { x: point.x, y: point.y };\n}\n\nexport function pushUniquePoint(points, point) {\n if (points.length === 0 || !pointsEqual2D(points[points.length - 1], point)) {\n points.push(point);\n }\n}\n\nexport function flattenQuadratic(p0, p1, p2, tolerance, out, depth = 0) {\n if (depth >= 12 || quadFlatness(p0, p1, p2) <= tolerance) {\n pushUniquePoint(out, p2);\n return;\n }\n\n const p01 = midpoint(p0, p1);\n const p12 = midpoint(p1, p2);\n const p012 = midpoint(p01, p12);\n\n flattenQuadratic(p0, p01, p012, tolerance, out, depth + 1);\n flattenQuadratic(p012, p12, p2, tolerance, out, depth + 1);\n}\n\nexport function flattenCubic(p0, p1, p2, p3, tolerance, out, depth = 0) {\n if (depth >= 12 || cubicFlatness(p0, p1, p2, p3) <= tolerance) {\n pushUniquePoint(out, p3);\n return;\n }\n\n const p01 = midpoint(p0, p1);\n const p12 = midpoint(p1, p2);\n const p23 = midpoint(p2, p3);\n const p012 = midpoint(p01, p12);\n const p123 = midpoint(p12, p23);\n const p0123 = midpoint(p012, p123);\n\n flattenCubic(p0, p01, p012, p0123, tolerance, out, depth + 1);\n flattenCubic(p0123, p123, p23, p3, tolerance, out, depth + 1);\n}\n\nfunction quadFlatness(p0, p1, p2) {\n return pointToLineDistance(p1, p0, p2);\n}\n\nfunction cubicFlatness(p0, p1, p2, p3) {\n return Math.max(\n pointToLineDistance(p1, p0, p3),\n pointToLineDistance(p2, p0, p3)\n );\n}\n\nfunction pointToLineDistance(point, lineStart, lineEnd) {\n const dx = lineEnd[0] - lineStart[0];\n const dy = lineEnd[1] - lineStart[1];\n const lengthSq = dx * dx + dy * dy;\n\n if (lengthSq === 0) {\n return distance(point, lineStart);\n }\n\n const area = Math.abs(\n dx * (lineStart[1] - point[1]) - (lineStart[0] - point[0]) * dy\n );\n\n return area / Math.sqrt(lengthSq);\n}\n\nexport function midpoint(a, b) {\n return [(a[0] + b[0]) * 0.5, (a[1] + b[1]) * 0.5];\n}\n\nexport function signedArea(ring) {\n let area = 0;\n\n for (let index = 0; index < ring.length; index += 1) {\n const current = ring[index];\n const next = ring[(index + 1) % ring.length];\n area += current[0] * next[1] - next[0] * current[1];\n }\n\n return area * 0.5;\n}\n\nexport function pointInRing(point, ring) {\n let inside = false;\n\n for (let i = 0, j = ring.length - 1; i < ring.length; j = i, i += 1) {\n const xi = ring[i][0];\n const yi = ring[i][1];\n const xj = ring[j][0];\n const yj = ring[j][1];\n const intersects =\n yi > point[1] !== yj > point[1] &&\n point[0] < ((xj - xi) * (point[1] - yi)) / (yj - yi || 1e-9) + xi;\n\n if (intersects) {\n inside = !inside;\n }\n }\n\n return inside;\n}\n\nexport function hitPart(point, part, epsilon) {\n if (!rectContainsPoint(part.bbox, point, epsilon)) {\n return \"outside\";\n }\n\n if (isPointOnRingEdge(point, part.outer, epsilon)) {\n return \"edge\";\n }\n\n if (!pointInRing(point, part.outer)) {\n return \"outside\";\n }\n\n for (const hole of part.holes) {\n if (isPointOnRingEdge(point, hole, epsilon)) {\n return \"edge\";\n }\n\n if (pointInRing(point, hole)) {\n return \"hole\";\n }\n }\n\n return \"fill\";\n}\n\nfunction isPointOnRingEdge(point, ring, epsilon) {\n for (let index = 0; index < ring.length; index += 1) {\n const a = ring[index];\n const b = ring[(index + 1) % ring.length];\n\n if (distancePointToSegment(point, a, b) <= epsilon) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction distancePointToSegment(point, a, b) {\n const dx = b[0] - a[0];\n const dy = b[1] - a[1];\n const lengthSq = dx * dx + dy * dy;\n\n if (lengthSq === 0) {\n return distance(point, a);\n }\n\n let t = ((point[0] - a[0]) * dx + (point[1] - a[1]) * dy) / lengthSq;\n t = Math.max(0, Math.min(1, t));\n\n const projection = [a[0] + dx * t, a[1] + dy * t];\n return distance(point, projection);\n}\n\nexport function distance(a, b) {\n const dx = a[0] - b[0];\n const dy = a[1] - b[1];\n return Math.sqrt(dx * dx + dy * dy);\n}\n\nexport function sampleRing(ring, step, callback) {\n for (let index = 0; index < ring.length; index += 1) {\n const a = ring[index];\n const b = ring[(index + 1) % ring.length];\n const segmentLength = distance(a, b);\n const divisions = Math.max(1, Math.ceil(segmentLength / step));\n\n for (let offset = 0; offset < divisions; offset += 1) {\n if (index > 0 || offset > 0) {\n const t = offset / divisions;\n callback([\n a[0] + (b[0] - a[0]) * t,\n a[1] + (b[1] - a[1]) * t,\n ]);\n } else {\n callback([a[0], a[1]]);\n }\n }\n }\n}\n\nexport function ringBounds(ring) {\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n\n ring.forEach((point) => {\n minX = Math.min(minX, point[0]);\n minY = Math.min(minY, point[1]);\n maxX = Math.max(maxX, point[0]);\n maxY = Math.max(maxY, point[1]);\n });\n\n return {\n x: minX,\n y: minY,\n w: maxX - minX,\n h: maxY - minY,\n };\n}\n\nexport function translateRing(ring, tx, ty) {\n return ring.map((point) => [point[0] + tx, point[1] + ty]);\n}\n\nexport function translateRect(rect, tx, ty) {\n return {\n x: rect.x + tx,\n y: rect.y + ty,\n w: rect.w,\n h: rect.h,\n };\n}\n\nexport function copyRing(ring) {\n return ring.map((point) => [point[0], point[1]]);\n}\n\nexport function combineRects(rects) {\n if (rects.length === 0) {\n return null;\n }\n\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n\n rects.forEach((rect) => {\n minX = Math.min(minX, rect.x);\n minY = Math.min(minY, rect.y);\n maxX = Math.max(maxX, rect.x + rect.w);\n maxY = Math.max(maxY, rect.y + rect.h);\n });\n\n return {\n x: minX,\n y: minY,\n w: maxX - minX,\n h: maxY - minY,\n };\n}\n\nexport function rectContainsRect(outer, inner, epsilon = 1e-6) {\n return (\n inner.x >= outer.x - epsilon &&\n inner.y >= outer.y - epsilon &&\n inner.x + inner.w <= outer.x + outer.w + epsilon &&\n inner.y + inner.h <= outer.y + outer.h + epsilon\n );\n}\n\nexport function rectContainsPoint(rect, point, epsilon = 0) {\n return (\n point[0] >= rect.x - epsilon &&\n point[0] <= rect.x + rect.w + epsilon &&\n point[1] >= rect.y - epsilon &&\n point[1] <= rect.y + rect.h + epsilon\n );\n}\n\nexport function emptyRect() {\n return { x: 0, y: 0, w: 0, h: 0 };\n}\n\nexport function normalizeNumber(value, fallback) {\n return Number.isFinite(value) ? value : fallback;\n}\n\nexport function normalizePositive(value, fallback) {\n return Number.isFinite(value) && value > 0 ? value : fallback;\n}\n\nexport function samePoint(a, b) {\n return a.x === b.x && a.y === b.y;\n}\n\nexport function pointsEqual2D(a, b) {\n return a[0] === b[0] && a[1] === b[1];\n}\n\nexport function pointsAlmostEqual2D(a, b, epsilon = 1e-6) {\n return Math.abs(a[0] - b[0]) <= epsilon && Math.abs(a[1] - b[1]) <= epsilon;\n}\n\nexport function ringPerimeter(ring) {\n let total = 0;\n\n for (let index = 0; index < ring.length; index += 1) {\n total += distance(ring[index], ring[(index + 1) % ring.length]);\n }\n\n return total;\n}\n\nexport function polylineLength(path) {\n let total = 0;\n\n for (let index = 0; index < path.length - 1; index += 1) {\n total += distance(path[index], path[index + 1]);\n }\n\n return total;\n}\n\nexport function pointAtClosedPathDistance(ring, distanceAlong) {\n const perimeter = ringPerimeter(ring);\n\n if (perimeter <= 1e-9) {\n return [ring[0][0], ring[0][1]];\n }\n\n let remaining = mod(distanceAlong, perimeter);\n\n for (let index = 0; index < ring.length; index += 1) {\n const start = ring[index];\n const end = ring[(index + 1) % ring.length];\n const segmentLength = distance(start, end);\n\n if (segmentLength <= 1e-9) {\n continue;\n }\n\n if (remaining <= segmentLength) {\n const t = remaining / segmentLength;\n return [\n start[0] + (end[0] - start[0]) * t,\n start[1] + (end[1] - start[1]) * t,\n ];\n }\n\n remaining -= segmentLength;\n }\n\n return [ring[ring.length - 1][0], ring[ring.length - 1][1]];\n}\n\nexport function pointAtOpenPathDistance(path, distanceAlong) {\n if (distanceAlong <= 0) {\n return [path[0][0], path[0][1]];\n }\n\n let remaining = distanceAlong;\n\n for (let index = 0; index < path.length - 1; index += 1) {\n const start = path[index];\n const end = path[index + 1];\n const segmentLength = distance(start, end);\n\n if (segmentLength <= 1e-9) {\n continue;\n }\n\n if (remaining <= segmentLength) {\n const t = remaining / segmentLength;\n return [\n start[0] + (end[0] - start[0]) * t,\n start[1] + (end[1] - start[1]) * t,\n ];\n }\n\n remaining -= segmentLength;\n }\n\n return [path[path.length - 1][0], path[path.length - 1][1]];\n}\n\nexport function segmentIntersectsRing(a, b, ring, ignoredEdges, epsilon) {\n for (let index = 0; index < ring.length; index += 1) {\n if (ignoredEdges.has(index)) {\n continue;\n }\n\n const c = ring[index];\n const d = ring[(index + 1) % ring.length];\n\n if (segmentsIntersect(a, b, c, d, epsilon)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction segmentsIntersect(a, b, c, d, epsilon) {\n const o1 = orientation(a, b, c);\n const o2 = orientation(a, b, d);\n const o3 = orientation(c, d, a);\n const o4 = orientation(c, d, b);\n\n if (\n ((o1 > epsilon && o2 < -epsilon) || (o1 < -epsilon && o2 > epsilon)) &&\n ((o3 > epsilon && o4 < -epsilon) || (o3 < -epsilon && o4 > epsilon))\n ) {\n return true;\n }\n\n if (Math.abs(o1) <= epsilon && pointOnSegment(c, a, b, epsilon)) {\n return true;\n }\n\n if (Math.abs(o2) <= epsilon && pointOnSegment(d, a, b, epsilon)) {\n return true;\n }\n\n if (Math.abs(o3) <= epsilon && pointOnSegment(a, c, d, epsilon)) {\n return true;\n }\n\n if (Math.abs(o4) <= epsilon && pointOnSegment(b, c, d, epsilon)) {\n return true;\n }\n\n return false;\n}\n\nfunction orientation(a, b, c) {\n return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\n}\n\nfunction pointOnSegment(point, start, end, epsilon) {\n return (\n point[0] >= Math.min(start[0], end[0]) - epsilon &&\n point[0] <= Math.max(start[0], end[0]) + epsilon &&\n point[1] >= Math.min(start[1], end[1]) - epsilon &&\n point[1] <= Math.max(start[1], end[1]) + epsilon\n );\n}\n\nexport function mod(value, divisor) {\n return ((value % divisor) + divisor) % divisor;\n}\n","import {\n cloneRawPoint,\n combineRects,\n copyRing,\n emptyRect,\n flattenCubic,\n flattenQuadratic,\n normalizeNumber,\n normalizePositive,\n pointInRing,\n pointsEqual2D,\n pushUniquePoint,\n rectContainsRect,\n ringBounds,\n samePoint,\n signedArea,\n toScreenPoint,\n translateRect,\n translateRing,\n} from \"./geometry.js\";\n\nexport function layoutGlyphs(font, value, opts) {\n const glyphs = [];\n const renderOptions = toRenderOptions(opts);\n const endX = font.forEachGlyph(\n value,\n opts.x,\n opts.y,\n opts.size,\n renderOptions,\n (glyph, x, y, size) => {\n glyphs.push({\n glyph,\n x,\n y,\n size,\n index: glyphs.length,\n });\n }\n );\n\n return {\n text: value,\n glyphs,\n metrics: {\n width: endX - opts.x,\n x: opts.x,\n y: opts.y,\n size: opts.size,\n },\n };\n}\n\nexport function measureText(font, value, opts) {\n const renderOptions = toRenderOptions(opts);\n const path = font.getPath(value, opts.x, opts.y, opts.size, renderOptions);\n const box = path.getBoundingBox();\n\n return {\n width: font.getAdvanceWidth(value, opts.size, renderOptions),\n bbox: {\n x: box.x1,\n y: box.y1,\n w: box.x2 - box.x1,\n h: box.y2 - box.y1,\n },\n };\n}\n\nexport function buildGlyphTopology(glyph, fallbackUnitsPerEm) {\n const commands = glyph.path?.commands ?? [];\n const contours = [];\n let contourId = 0;\n let current = null;\n\n const finishCurrentContour = () => {\n if (!current || current.segments.length === 0) {\n current = null;\n return;\n }\n\n if (!samePoint(current.cursor, current.start)) {\n current.segments.push({\n type: \"L\",\n from: cloneRawPoint(current.cursor),\n to: cloneRawPoint(current.start),\n });\n current.cursor = cloneRawPoint(current.start);\n }\n\n contours.push({\n id: contourId++,\n start: cloneRawPoint(current.start),\n segments: current.segments,\n });\n current = null;\n };\n\n commands.forEach((cmd) => {\n if (cmd.type === \"M\") {\n finishCurrentContour();\n current = {\n start: { x: cmd.x, y: cmd.y },\n cursor: { x: cmd.x, y: cmd.y },\n segments: [],\n };\n return;\n }\n\n if (!current) {\n return;\n }\n\n if (cmd.type === \"L\") {\n const to = { x: cmd.x, y: cmd.y };\n current.segments.push({\n type: \"L\",\n from: cloneRawPoint(current.cursor),\n to,\n });\n current.cursor = cloneRawPoint(to);\n return;\n }\n\n if (cmd.type === \"Q\") {\n const to = { x: cmd.x, y: cmd.y };\n current.segments.push({\n type: \"Q\",\n from: cloneRawPoint(current.cursor),\n c1: { x: cmd.x1, y: cmd.y1 },\n to,\n });\n current.cursor = cloneRawPoint(to);\n return;\n }\n\n if (cmd.type === \"C\") {\n const to = { x: cmd.x, y: cmd.y };\n current.segments.push({\n type: \"C\",\n from: cloneRawPoint(current.cursor),\n c1: { x: cmd.x1, y: cmd.y1 },\n c2: { x: cmd.x2, y: cmd.y2 },\n to,\n });\n current.cursor = cloneRawPoint(to);\n return;\n }\n\n if (cmd.type === \"Z\") {\n finishCurrentContour();\n }\n });\n\n finishCurrentContour();\n\n return {\n glyphIndex: glyph.index,\n advanceWidth: glyph.advanceWidth ?? 0,\n unitsPerEm: glyph.path?.unitsPerEm ?? fallbackUnitsPerEm ?? 1000,\n contours,\n };\n}\n\nexport function flattenGlyphTopology(topology, options) {\n const scale = options.size / topology.unitsPerEm;\n const contours = topology.contours\n .map((contour) => flattenContour(contour, scale, options.flatten))\n .filter(Boolean);\n const classifiedContours = classifyContours(contours);\n const parts = buildParts(classifiedContours);\n const bbox = combineRects(parts.map((part) => part.bbox)) ?? emptyRect();\n\n return {\n glyphIndex: topology.glyphIndex,\n advanceWidth: topology.advanceWidth * scale,\n contours: classifiedContours,\n parts,\n bbox,\n };\n}\n\nfunction flattenContour(contour, scale, tolerance) {\n const ring = [];\n const start = toScreenPoint(contour.start, scale);\n pushUniquePoint(ring, start);\n\n contour.segments.forEach((segment) => {\n if (segment.type === \"L\") {\n pushUniquePoint(ring, toScreenPoint(segment.to, scale));\n return;\n }\n\n if (segment.type === \"Q\") {\n flattenQuadratic(\n toScreenPoint(segment.from, scale),\n toScreenPoint(segment.c1, scale),\n toScreenPoint(segment.to, scale),\n tolerance,\n ring\n );\n return;\n }\n\n if (segment.type === \"C\") {\n flattenCubic(\n toScreenPoint(segment.from, scale),\n toScreenPoint(segment.c1, scale),\n toScreenPoint(segment.c2, scale),\n toScreenPoint(segment.to, scale),\n tolerance,\n ring\n );\n }\n });\n\n if (ring.length > 1 && pointsEqual2D(ring[0], ring[ring.length - 1])) {\n ring.pop();\n }\n\n if (ring.length < 3) {\n return null;\n }\n\n const bbox = ringBounds(ring);\n const area = signedArea(ring);\n\n return {\n id: contour.id,\n ring,\n bbox,\n area,\n };\n}\n\nfunction classifyContours(contours) {\n const result = contours.map((contour) => ({\n ...contour,\n parentId: null,\n depth: 0,\n role: \"outer\",\n }));\n\n result.forEach((child) => {\n let parent = null;\n let parentArea = Number.POSITIVE_INFINITY;\n\n result.forEach((candidate) => {\n if (candidate.id === child.id) {\n return;\n }\n\n if (Math.abs(candidate.area) <= Math.abs(child.area)) {\n return;\n }\n\n if (!rectContainsRect(candidate.bbox, child.bbox)) {\n return;\n }\n\n if (!pointInRing(child.ring[0], candidate.ring)) {\n return;\n }\n\n const candidateArea = Math.abs(candidate.area);\n if (candidateArea < parentArea) {\n parent = candidate;\n parentArea = candidateArea;\n }\n });\n\n if (parent) {\n child.parentId = parent.id;\n }\n });\n\n const byId = new Map(result.map((contour) => [contour.id, contour]));\n\n const resolveDepth = (contour) => {\n if (contour.parentId == null) {\n return 0;\n }\n\n const parent = byId.get(contour.parentId);\n return resolveDepth(parent) + 1;\n };\n\n result.forEach((contour) => {\n contour.depth = resolveDepth(contour);\n contour.role = contour.depth % 2 === 0 ? \"outer\" : \"hole\";\n });\n\n return result;\n}\n\nfunction buildParts(contours) {\n return contours\n .filter((contour) => contour.role === \"outer\")\n .map((outer) => {\n const holeContours = contours.filter(\n (contour) => contour.parentId === outer.id && contour.role === \"hole\"\n );\n\n return {\n outer: copyRing(outer.ring),\n holes: holeContours.map((hole) => copyRing(hole.ring)),\n bbox: { ...outer.bbox },\n area:\n Math.abs(outer.area) -\n holeContours.reduce((sum, hole) => sum + Math.abs(hole.area), 0),\n };\n });\n}\n\nexport function translateGlyphGeometry(geometry, tx, ty, glyphPosition) {\n const parts = geometry.parts.map((part, partIndex) => ({\n outer: translateRing(part.outer, tx, ty),\n holes: part.holes.map((hole) => translateRing(hole, tx, ty)),\n bbox: translateRect(part.bbox, tx, ty),\n area: part.area,\n glyphPosition,\n partIndex,\n }));\n\n const contours = geometry.contours.map((contour) => ({\n id: `${glyphPosition}:${contour.id}`,\n sourceId: contour.id,\n glyphPosition,\n parentId:\n contour.parentId == null ? null : `${glyphPosition}:${contour.parentId}`,\n depth: contour.depth,\n role: contour.role,\n area: contour.area,\n bbox: translateRect(contour.bbox, tx, ty),\n ring: translateRing(contour.ring, tx, ty),\n }));\n\n return {\n parts,\n contours,\n bbox: translateRect(geometry.bbox, tx, ty),\n };\n}\n\nexport function normalizeTextOptions(options = {}) {\n const size = normalizePositive(options.size, 72);\n\n return {\n x: normalizeNumber(options.x, 0),\n y: normalizeNumber(options.y, 0),\n size,\n flatten: normalizePositive(options.flatten, 1.25),\n edgeEpsilon:\n options.edgeEpsilon == null\n ? defaultEdgeEpsilon(size)\n : normalizePositive(options.edgeEpsilon, defaultEdgeEpsilon(size)),\n kerning: options.kerning !== false,\n letterSpacing:\n options.letterSpacing == null\n ? undefined\n : normalizeNumber(options.letterSpacing, 0),\n tracking:\n options.tracking == null\n ? undefined\n : normalizeNumber(options.tracking, 0),\n script: options.script,\n language: options.language,\n features: options.features,\n };\n}\n\nfunction defaultEdgeEpsilon(size) {\n return Math.min(1, Math.max(0.01, size * 0.0025));\n}\n\nfunction toRenderOptions(opts) {\n const renderOptions = {\n kerning: opts.kerning,\n };\n\n if (opts.letterSpacing != null) {\n renderOptions.letterSpacing = opts.letterSpacing;\n }\n\n if (opts.tracking != null) {\n renderOptions.tracking = opts.tracking;\n }\n\n if (opts.script) {\n renderOptions.script = opts.script;\n }\n\n if (opts.language) {\n renderOptions.language = opts.language;\n }\n\n if (opts.features) {\n renderOptions.features = opts.features;\n }\n\n return renderOptions;\n}\n\nexport function toArrayBuffer(value) {\n if (value instanceof ArrayBuffer) {\n return value;\n }\n\n if (ArrayBuffer.isView(value)) {\n return value.buffer.slice(value.byteOffset, value.byteOffset + value.byteLength);\n }\n\n return value;\n}\n","import {\n combineRects,\n copyRing,\n distance,\n emptyRect,\n hitPart,\n midpoint,\n mod,\n normalizePositive,\n pointAtClosedPathDistance,\n pointAtOpenPathDistance,\n pointInRing,\n pointsAlmostEqual2D,\n polylineLength,\n rectContainsPoint,\n ringBounds,\n ringPerimeter,\n sampleRing,\n segmentIntersectsRing,\n signedArea,\n} from \"./geometry.js\";\nimport { translateGlyphGeometry } from \"./core.js\";\n\nexport class PAShape {\n constructor({ text, parts, contours, glyphs, bbox, metrics, edgeEpsilon }) {\n this.text = text;\n this.parts = parts;\n this.bbox = bbox;\n this.metrics = metrics;\n this.edgeEpsilon = edgeEpsilon;\n this.raw = {\n contours,\n glyphs,\n };\n this._cache = {\n glyphs: null,\n openHoles: new Map(),\n resample: new Map(),\n shapes: new Map(),\n regionViews: null,\n };\n }\n\n get polygons() {\n return this.parts.map((part) => [part.outer, ...part.holes]);\n }\n\n [Symbol.iterator]() {\n return this._getRegionViews()[Symbol.iterator]();\n }\n\n glyphs() {\n if (this._cache.glyphs) {\n return this._cache.glyphs;\n }\n\n if (!Array.isArray(this.raw.glyphs) || this.raw.glyphs.length <= 1) {\n this._cache.glyphs = [this];\n return this._cache.glyphs;\n }\n\n this._cache.glyphs = this.raw.glyphs.map((_, glyphPosition) =>\n createGlyphShape(this, glyphPosition)\n );\n\n return this._cache.glyphs;\n }\n\n toShape(options = {}) {\n return resolveShapeVariant(this, options);\n }\n\n toRegions(options = {}) {\n const shape = this.toShape(options);\n return createRegionCollection(shape);\n }\n\n openHoles(width) {\n const slitWidth = normalizePositive(width, 0);\n\n if (slitWidth <= 0 || !this.parts.some((part) => part.holes.length > 0)) {\n return this;\n }\n\n const cacheKey = toCacheKey(slitWidth);\n const cached = this._cache.openHoles.get(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n const geometryEpsilon = resolveGeometryEpsilon(slitWidth);\n\n const shape = createDerivedShape(\n this,\n this.parts.map((part) => openPartWithSlit(part, slitWidth, geometryEpsilon))\n );\n\n this._cache.openHoles.set(cacheKey, shape);\n return shape;\n }\n\n resample(step) {\n const spacing = normalizePositive(step, 0);\n\n if (spacing <= 0) {\n return this;\n }\n\n const cacheKey = toCacheKey(spacing);\n const cached = this._cache.resample.get(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n const shape = createDerivedShape(\n this,\n this.parts.map((part) => resamplePart(part, spacing))\n );\n\n this._cache.resample.set(cacheKey, shape);\n return shape;\n }\n\n hit(x, y, epsilon = this.edgeEpsilon) {\n const point = [x, y];\n\n if (!rectContainsPoint(this.bbox, point, epsilon)) {\n return \"outside\";\n }\n\n let holeHit = false;\n\n for (const part of this.parts) {\n const result = hitPart(point, part, epsilon);\n\n if (result === \"edge\" || result === \"fill\") {\n return result;\n }\n\n if (result === \"hole\") {\n holeHit = true;\n }\n }\n\n return holeHit ? \"hole\" : \"outside\";\n }\n\n contains(x, y, epsilon = this.edgeEpsilon) {\n return this.hit(x, y, epsilon) === \"fill\";\n }\n\n toPoints(options = {}) {\n const opts = normalizePointOptions(options);\n const shape =\n opts.openWidth > 0 ? this.toShape({ openWidth: opts.openWidth }) : this;\n const step = opts.step;\n const includeHoles = opts.includeHoles;\n const sampled = [];\n\n shape.parts.forEach((part, partIndex) => {\n sampleRing(part.outer, step, (point) => {\n sampled.push({\n x: point[0],\n y: point[1],\n partIndex,\n hole: false,\n });\n });\n\n if (!includeHoles) {\n return;\n }\n\n part.holes.forEach((hole, holeIndex) => {\n sampleRing(hole, step, (point) => {\n sampled.push({\n x: point[0],\n y: point[1],\n partIndex,\n hole: true,\n holeIndex,\n });\n });\n });\n });\n\n return sampled;\n }\n\n _getRegionViews() {\n if (!this._cache.regionViews) {\n this._cache.regionViews = this.parts.map((part) =>\n Object.freeze({\n outer: part.outer,\n holes: part.holes,\n bbox: part.bbox,\n })\n );\n }\n\n return this._cache.regionViews;\n }\n}\n\nexport function createTextShape(layout, opts, fontInstance) {\n const parts = [];\n const contours = [];\n const glyphs = [];\n\n layout.glyphs.forEach((item, glyphPosition) => {\n const localGeometry = fontInstance._getFlattenedGlyph(item.glyph, opts);\n const translated = translateGlyphGeometry(\n localGeometry,\n item.x,\n item.y,\n glyphPosition\n );\n\n parts.push(...translated.parts);\n contours.push(...translated.contours);\n glyphs.push({\n position: glyphPosition,\n glyphIndex: item.glyph.index,\n x: item.x,\n y: item.y,\n size: item.size,\n bbox: translated.bbox,\n partCount: translated.parts.length,\n });\n });\n\n const bbox = combineRects(parts.map((part) => part.bbox)) ?? emptyRect();\n\n return new PAShape({\n text: layout.text,\n parts,\n contours,\n glyphs,\n bbox,\n metrics: {\n ...layout.metrics,\n bbox,\n },\n edgeEpsilon: opts.edgeEpsilon,\n });\n}\n\nfunction createGlyphShape(shape, glyphPosition) {\n const glyphMeta = shape.raw.glyphs?.[glyphPosition] ?? null;\n const parts = copyParts(\n shape.parts.filter((part) => part.glyphPosition === glyphPosition)\n );\n const contours = copyContours(\n (shape.raw.contours ?? []).filter(\n (contour) => contour.glyphPosition === glyphPosition\n )\n );\n const bbox =\n combineRects(parts.map((part) => part.bbox)) ??\n (glyphMeta?.bbox ? { ...glyphMeta.bbox } : emptyRect());\n\n return new PAShape({\n text: extractGlyphText(shape.text, glyphPosition, shape.raw.glyphs?.length ?? 0),\n parts,\n contours,\n glyphs: glyphMeta ? [{ ...glyphMeta, bbox, partCount: parts.length }] : [],\n bbox,\n metrics: {\n x: glyphMeta?.x ?? shape.metrics?.x ?? 0,\n y: glyphMeta?.y ?? shape.metrics?.y ?? 0,\n size: glyphMeta?.size ?? shape.metrics?.size ?? 0,\n width: bbox.w,\n bbox,\n },\n edgeEpsilon: shape.edgeEpsilon,\n });\n}\n\nfunction createDerivedShape(shape, parts) {\n const copiedParts = copyParts(parts);\n const bbox = combineRects(copiedParts.map((part) => part.bbox)) ?? emptyRect();\n const glyphs = (shape.raw.glyphs ?? []).map((glyph, glyphPosition) => {\n const glyphParts = copiedParts.filter(\n (part) => part.glyphPosition === glyphPosition\n );\n\n return {\n ...glyph,\n bbox:\n combineRects(glyphParts.map((part) => part.bbox)) ??\n (glyph.bbox ? { ...glyph.bbox } : emptyRect()),\n partCount: glyphParts.length,\n };\n });\n\n return new PAShape({\n text: shape.text,\n parts: copiedParts,\n contours: [],\n glyphs,\n bbox,\n metrics: {\n ...shape.metrics,\n bbox,\n },\n edgeEpsilon: shape.edgeEpsilon,\n });\n}\n\nfunction createRegionCollection(shape) {\n return shape.parts.map((part) => ({\n outer: copyRing(part.outer),\n holes: part.holes.map((hole) => copyRing(hole)),\n bbox: { ...part.bbox },\n }));\n}\n\nfunction copyParts(parts) {\n return parts.map((part) => copyPart(part));\n}\n\nfunction copyPart(part) {\n return {\n ...part,\n outer: copyRing(part.outer),\n holes: part.holes.map((hole) => copyRing(hole)),\n anchors: part.anchors ? part.anchors.map((point) => [point[0], point[1]]) : undefined,\n bbox: { ...part.bbox },\n };\n}\n\nfunction copyContours(contours) {\n return contours.map((contour) => ({\n ...contour,\n bbox: { ...contour.bbox },\n ring: copyRing(contour.ring),\n }));\n}\n\nfunction extractGlyphText(text, glyphPosition, glyphCount) {\n if (glyphCount <= 1) {\n return text;\n }\n\n const glyphText = Array.from(text ?? \"\")[glyphPosition];\n return glyphText ?? \"\";\n}\n\nfunction normalizePointOptions(options = {}) {\n if (options == null) {\n return {\n step: 8,\n openWidth: 0,\n includeHoles: true,\n };\n }\n\n if (typeof options !== \"object\" || Array.isArray(options)) {\n throw new TypeError(\"toPoints() expects an options object.\");\n }\n\n return {\n step: normalizePositive(options.step, 8),\n openWidth: normalizePositive(options.openWidth, 0),\n includeHoles: options.includeHoles !== false,\n };\n}\n\nfunction normalizeShapeOptions(options = {}) {\n if (options == null) {\n return {\n step: 0,\n openWidth: 0,\n };\n }\n\n if (typeof options !== \"object\" || Array.isArray(options)) {\n throw new TypeError(\n \"toShape() and toRegions() expect an options object.\",\n );\n }\n\n return {\n step: normalizePositive(options.step, 0),\n openWidth: normalizePositive(options.openWidth, 0),\n };\n}\n\nfunction resolveShapeVariant(shape, options = {}) {\n const normalized = normalizeShapeOptions(options);\n\n if (normalized.step <= 0 && normalized.openWidth <= 0) {\n return shape;\n }\n\n const cacheKey = `${toCacheKey(normalized.step)}:${toCacheKey(normalized.openWidth)}`;\n const cached = shape._cache.shapes.get(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n let next = shape;\n\n if (normalized.openWidth > 0) {\n next = next.openHoles(normalized.openWidth);\n }\n\n if (normalized.step > 0) {\n next = next.resample(normalized.step);\n }\n\n shape._cache.shapes.set(cacheKey, next);\n return next;\n}\n\nfunction toCacheKey(value) {\n return normalizePositive(value, 0).toFixed(6);\n}\n\nfunction resolveGeometryEpsilon(width) {\n return Math.max(1e-4, normalizePositive(width, 1) * 1e-3);\n}\n\nfunction openPartWithSlit(part, width, epsilon) {\n if (!part.holes || part.holes.length === 0) {\n return copyPart(part);\n }\n\n let outer = copyRing(part.outer);\n const holes = part.holes.map((hole) => copyRing(hole));\n const anchors = [];\n\n while (holes.length > 0) {\n let selectedHoleIndex = -1;\n let selectedBridge = null;\n\n holes.forEach((hole, holeIndex) => {\n const blockers = holes.filter((_, index) => index !== holeIndex);\n const candidate = findBestHoleBridge(outer, hole, blockers, epsilon);\n\n if (\n candidate &&\n (!selectedBridge || candidate.distance < selectedBridge.distance)\n ) {\n selectedBridge = candidate;\n selectedHoleIndex = holeIndex;\n }\n });\n\n if (!selectedBridge || selectedHoleIndex === -1) {\n break;\n }\n\n const [hole] = holes.splice(selectedHoleIndex, 1);\n const merged = mergeHoleIntoOuter(outer, hole, selectedBridge, width, epsilon);\n outer = merged.ring;\n anchors.push(...merged.anchors);\n }\n\n return {\n ...part,\n outer,\n holes,\n anchors,\n bbox: ringBounds(outer),\n area:\n Math.abs(signedArea(outer)) -\n holes.reduce((sum, hole) => sum + Math.abs(signedArea(hole)), 0),\n };\n}\n\nfunction resamplePart(part, step) {\n const outer = resampleRing(part.outer, step, part.anchors ?? []);\n const holes = part.holes.map((hole) => resampleRing(hole, step));\n\n return {\n ...part,\n outer,\n holes,\n anchors: part.anchors ? part.anchors.map((point) => [point[0], point[1]]) : undefined,\n bbox: ringBounds(outer),\n area:\n Math.abs(signedArea(outer)) -\n holes.reduce((sum, hole) => sum + Math.abs(signedArea(hole)), 0),\n };\n}\n\nfunction findBestHoleBridge(outer, hole, blockers, epsilon) {\n let best = null;\n\n outer.forEach((outerPoint, outerIndex) => {\n hole.forEach((holePoint, holeIndex) => {\n if (\n !isVisibleBridge(\n outer,\n hole,\n blockers,\n outerPoint,\n holePoint,\n outerIndex,\n holeIndex,\n epsilon\n )\n ) {\n return;\n }\n\n const candidate = {\n outerIndex,\n holeIndex,\n distance: distance(outerPoint, holePoint),\n };\n\n if (!best || candidate.distance < best.distance) {\n best = candidate;\n }\n });\n });\n\n if (best) {\n return best;\n }\n\n return findNearestBridge(outer, hole);\n}\n\nfunction findNearestBridge(outer, hole) {\n let best = null;\n\n outer.forEach((outerPoint, outerIndex) => {\n hole.forEach((holePoint, holeIndex) => {\n const candidate = {\n outerIndex,\n holeIndex,\n distance: distance(outerPoint, holePoint),\n };\n\n if (!best || candidate.distance < best.distance) {\n best = candidate;\n }\n });\n });\n\n return best;\n}\n\nfunction isVisibleBridge(\n outer,\n hole,\n blockers,\n outerPoint,\n holePoint,\n outerIndex,\n holeIndex,\n epsilon\n) {\n if (distance(outerPoint, holePoint) <= epsilon) {\n return false;\n }\n\n const bridgeMidpoint = midpoint(outerPoint, holePoint);\n\n if (!pointInRing(bridgeMidpoint, outer) || pointInRing(bridgeMidpoint, hole)) {\n return false;\n }\n\n if (blockers.some((blocker) => pointInRing(bridgeMidpoint, blocker))) {\n return false;\n }\n\n if (\n segmentIntersectsRing(\n outerPoint,\n holePoint,\n outer,\n new Set([outerIndex, mod(outerIndex - 1, outer.length)]),\n epsilon\n )\n ) {\n return false;\n }\n\n if (\n segmentIntersectsRing(\n outerPoint,\n holePoint,\n hole,\n new Set([holeIndex, mod(holeIndex - 1, hole.length)]),\n epsilon\n )\n ) {\n return false;\n }\n\n return !blockers.some((blocker) =>\n segmentIntersectsRing(outerPoint, holePoint, blocker, new Set(), epsilon)\n );\n}\n\nfunction mergeHoleIntoOuter(outer, hole, bridge, width, epsilon) {\n const slitWidth = clampSlitWidth(width, outer, hole, epsilon);\n const outerCut = createRingCut(outer, bridge.outerIndex, slitWidth, epsilon);\n const holeCut = createRingCut(hole, bridge.holeIndex, slitWidth, epsilon);\n const outerPath = ringPath(\n outerCut.ring,\n outerCut.afterIndex,\n outerCut.beforeIndex\n );\n const holePath = ringPath(\n holeCut.ring,\n holeCut.afterIndex,\n holeCut.beforeIndex\n );\n const merged = [];\n\n appendPath(merged, outerPath, epsilon);\n appendPath(merged, holePath, epsilon);\n\n if (\n merged.length > 1 &&\n pointsAlmostEqual2D(merged[0], merged[merged.length - 1], epsilon)\n ) {\n merged.pop();\n }\n\n return {\n ring: merged,\n anchors: [\n outerCut.ring[outerCut.beforeIndex],\n holeCut.ring[holeCut.beforeIndex],\n holeCut.ring[holeCut.afterIndex],\n outerCut.ring[outerCut.afterIndex],\n ].map((point) => [point[0], point[1]]),\n };\n}\n\nfunction clampSlitWidth(width, outer, hole, epsilon) {\n const minPerimeter = Math.min(ringPerimeter(outer), ringPerimeter(hole));\n return Math.max(\n epsilon * 2,\n Math.min(width, Math.max(minPerimeter * 0.24, epsilon * 2))\n );\n}\n\nfunction createRingCut(ring, anchorIndex, width, epsilon) {\n const beforeCut = moveAlongRing(ring, anchorIndex, -width * 0.5, epsilon);\n const afterCut = moveAlongRing(ring, anchorIndex, width * 0.5, epsilon);\n\n return insertRingCutPoints(ring, beforeCut, afterCut, epsilon);\n}\n\nfunction moveAlongRing(ring, anchorIndex, offset, epsilon) {\n if (!Number.isFinite(offset) || Math.abs(offset) <= epsilon) {\n return {\n point: [ring[anchorIndex][0], ring[anchorIndex][1]],\n vertexIndex: anchorIndex,\n t: 0,\n };\n }\n\n let remaining = Math.abs(offset);\n let currentIndex = anchorIndex;\n const direction = offset > 0 ? 1 : -1;\n\n while (remaining > epsilon) {\n const nextIndex =\n direction > 0 ? (currentIndex + 1) % ring.length : mod(currentIndex - 1, ring.length);\n const segmentIndex = direction > 0 ? currentIndex : nextIndex;\n const segmentStart = ring[segmentIndex];\n const segmentEnd = ring[(segmentIndex + 1) % ring.length];\n const segmentLength = distance(segmentStart, segmentEnd);\n\n if (segmentLength <= epsilon) {\n currentIndex = direction > 0 ? nextIndex : segmentIndex;\n continue;\n }\n\n if (remaining < segmentLength - epsilon) {\n const t = remaining / segmentLength;\n const ratio = direction > 0 ? t : 1 - t;\n return {\n point: [\n segmentStart[0] + (segmentEnd[0] - segmentStart[0]) * ratio,\n segmentStart[1] + (segmentEnd[1] - segmentStart[1]) * ratio,\n ],\n segmentIndex,\n t: ratio,\n };\n }\n\n remaining -= segmentLength;\n currentIndex = direction > 0 ? nextIndex : segmentIndex;\n }\n\n return {\n point: [ring[currentIndex][0], ring[currentIndex][1]],\n vertexIndex: currentIndex,\n t: 0,\n };\n}\n\nfunction insertRingCutPoints(ring, beforeCut, afterCut, epsilon) {\n const cuts = [\n normalizeCutLocation(\"before\", ring, beforeCut, epsilon),\n normalizeCutLocation(\"after\", ring, afterCut, epsilon),\n ];\n const insertsBySegment = new Map();\n const cutIndices = {};\n const augmented = [];\n\n cuts.forEach((cut) => {\n if (cut.vertexIndex != null) {\n return;\n }\n\n const existing = insertsBySegment.get(cut.segmentIndex) ?? [];\n existing.push(cut);\n insertsBySegment.set(cut.segmentIndex, existing);\n });\n\n for (let index = 0; index < ring.length; index += 1) {\n augmented.push([ring[index][0], ring[index][1]]);\n\n cuts.forEach((cut) => {\n if (cut.vertexIndex === index) {\n cutIndices[cut.name] = augmented.length - 1;\n }\n });\n\n const segmentCuts = (insertsBySegment.get(index) ?? []).sort(\n (a, b) => a.t - b.t\n );\n\n segmentCuts.forEach((cut) => {\n augmented.push([cut.point[0], cut.point[1]]);\n cutIndices[cut.name] = augmented.length - 1;\n });\n }\n\n return {\n ring: augmented,\n beforeIndex: cutIndices.before,\n afterIndex: cutIndices.after,\n };\n}\n\nfunction normalizeCutLocation(name, ring, cut, epsilon) {\n if (cut.vertexIndex != null) {\n return {\n ...cut,\n name,\n };\n }\n\n const segmentStart = ring[cut.segmentIndex];\n const segmentEnd = ring[(cut.segmentIndex + 1) % ring.length];\n\n if (distance(cut.point, segmentStart) <= epsilon) {\n return {\n point: [segmentStart[0], segmentStart[1]],\n vertexIndex: cut.segmentIndex,\n t: 0,\n name,\n };\n }\n\n if (distance(cut.point, segmentEnd) <= epsilon) {\n return {\n point: [segmentEnd[0], segmentEnd[1]],\n vertexIndex: (cut.segmentIndex + 1) % ring.length,\n t: 1,\n name,\n };\n }\n\n return {\n ...cut,\n name,\n };\n}\n\nfunction ringPath(ring, startIndex, endIndex) {\n if (startIndex == null || endIndex == null) {\n return copyRing(ring);\n }\n\n const path = [ring[startIndex]];\n let cursor = startIndex;\n\n while (cursor !== endIndex) {\n cursor = (cursor + 1) % ring.length;\n path.push(ring[cursor]);\n }\n\n return path;\n}\n\nfunction appendPath(target, path, epsilon) {\n path.forEach((point) => {\n if (\n target.length === 0 ||\n !pointsAlmostEqual2D(target[target.length - 1], point, epsilon)\n ) {\n target.push([point[0], point[1]]);\n }\n });\n}\n\nfunction resampleRing(ring, step, anchors = []) {\n if (ring.length < 3) {\n return copyRing(ring);\n }\n\n const normalizedAnchors = normalizeAnchorPoints(ring, anchors);\n\n if (normalizedAnchors.length >= 2) {\n return resampleRingWithAnchors(ring, step, normalizedAnchors);\n }\n\n return resampleClosedPath(ring, step);\n}\n\nfunction normalizeAnchorPoints(ring, anchors) {\n const indices = anchors\n .map((anchor) => findRingPointIndex(ring, anchor))\n .filter((index) => index >= 0)\n .sort((a, b) => a - b);\n\n return indices.filter((index, position) => index !== indices[position - 1]);\n}\n\nfunction findRingPointIndex(ring, point, epsilon = 1e-6) {\n for (let index = 0; index < ring.length; index += 1) {\n if (pointsAlmostEqual2D(ring[index], point, epsilon)) {\n return index;\n }\n }\n\n return -1;\n}\n\nfunction resampleRingWithAnchors(ring, step, anchorIndices) {\n const result = [];\n\n for (let index = 0; index < anchorIndices.length; index += 1) {\n const startIndex = anchorIndices[index];\n const endIndex = anchorIndices[(index + 1) % anchorIndices.length];\n const path = ringPath(ring, startIndex, endIndex);\n const sampled = resampleOpenPath(path, step);\n\n appendPath(result, sampled, 1e-6);\n }\n\n if (\n result.length > 1 &&\n pointsAlmostEqual2D(result[0], result[result.length - 1], 1e-6)\n ) {\n result.pop();\n }\n\n if (result.length < 3 || result.length >= ring.length) {\n return copyRing(ring);\n }\n\n return result;\n}\n\nfunction resampleClosedPath(ring, step) {\n const perimeter = ringPerimeter(ring);\n\n if (perimeter <= 1e-9) {\n return copyRing(ring);\n }\n\n const pointCount = Math.max(3, Math.round(perimeter / step));\n\n if (pointCount >= ring.length) {\n return copyRing(ring);\n }\n\n const sampled = [];\n\n for (let index = 0; index < pointCount; index += 1) {\n const point = pointAtClosedPathDistance(ring, (perimeter * index) / pointCount);\n\n if (\n sampled.length === 0 ||\n !pointsAlmostEqual2D(sampled[sampled.length - 1], point, 1e-6)\n ) {\n sampled.push(point);\n }\n }\n\n if (sampled.length < 3 || sampled.length >= ring.length) {\n return copyRing(ring);\n }\n\n return sampled;\n}\n\nfunction resampleOpenPath(path, step) {\n if (path.length <= 2) {\n return path.map((point) => [point[0], point[1]]);\n }\n\n const length = polylineLength(path);\n\n if (length <= step) {\n return [\n [path[0][0], path[0][1]],\n [path[path.length - 1][0], path[path.length - 1][1]],\n ];\n }\n\n const divisionCount = Math.max(1, Math.round(length / step));\n const sampled = [];\n\n for (let index = 0; index <= divisionCount; index += 1) {\n const point = pointAtOpenPathDistance(path, (length * index) / divisionCount);\n\n if (\n sampled.length === 0 ||\n !pointsAlmostEqual2D(sampled[sampled.length - 1], point, 1e-6)\n ) {\n sampled.push(point);\n }\n }\n\n return sampled;\n}\n","import { load as loadFont, parse as parseFont } from \"opentype.js\";\nimport {\n buildGlyphTopology,\n flattenGlyphTopology,\n layoutGlyphs,\n measureText,\n normalizeTextOptions,\n toArrayBuffer,\n} from \"./core.js\";\nimport { createTextShape } from \"./shape.js\";\n\nexport class PAFont {\n constructor(font) {\n this.font = font;\n this.unitsPerEm = font.unitsPerEm ?? 1000;\n this._glyphTopologyCache = new Map();\n this._glyphFlatCache = new Map();\n }\n\n static async load(source, options = {}) {\n const opts = normalizeLoadOptions(options);\n\n if (source instanceof ArrayBuffer || ArrayBuffer.isView(source)) {\n return new PAFont(parseFont(toArrayBuffer(source)));\n }\n\n if (typeof window !== \"undefined\") {\n const requestUrl = resolveBrowserFontSource(source, opts.base);\n const bytes = await fetchFontBytes(requestUrl);\n return new PAFont(parseFont(bytes));\n }\n\n const { target, loadOptions } = await resolveNodeFontSource(\n source,\n opts.base,\n );\n const font = await loadFont(target, undefined, loadOptions);\n return new PAFont(font);\n }\n\n text(value, options = {}) {\n const opts = normalizeTextOptions(options);\n const layout = this._layoutText(String(value ?? \"\"), opts);\n return createTextShape(layout, opts, this);\n }\n\n glyph(value, options = {}) {\n const opts = normalizeTextOptions(options);\n const glyph = this.font.charToGlyph(String(value ?? \"\"));\n const layout = {\n text: String(value ?? \"\"),\n glyphs: [\n {\n glyph,\n x: opts.x,\n y: opts.y,\n size: opts.size,\n index: 0,\n },\n ],\n metrics: {\n width: (glyph.advanceWidth ?? 0) * (opts.size / this.unitsPerEm),\n x: opts.x,\n y: opts.y,\n size: opts.size,\n },\n };\n\n return createTextShape(layout, opts, this);\n }\n\n metrics(value, options = {}) {\n const opts = normalizeTextOptions(options);\n return measureText(this.font, String(value ?? \"\"), opts);\n }\n\n _getGlyphTopology(glyph) {\n const key = String(glyph.index);\n\n if (!this._glyphTopologyCache.has(key)) {\n this._glyphTopologyCache.set(\n key,\n buildGlyphTopology(glyph, this.unitsPerEm),\n );\n }\n\n return this._glyphTopologyCache.get(key);\n }\n\n _getFlattenedGlyph(glyph, opts) {\n const key = `${glyph.index}:${opts.size}:${opts.flatten}`;\n\n if (!this._glyphFlatCache.has(key)) {\n const topology = this._getGlyphTopology(glyph);\n this._glyphFlatCache.set(\n key,\n flattenGlyphTopology(topology, {\n size: opts.size,\n flatten: opts.flatten,\n }),\n );\n }\n\n return this._glyphFlatCache.get(key);\n }\n\n _layoutText(value, opts) {\n return layoutGlyphs(this.font, value, opts);\n }\n}\n\nasync function fetchFontBytes(source) {\n const response = await fetch(source);\n\n if (!response.ok) {\n throw new Error(\n `Failed to load font from ${source}: ${response.status} ${response.statusText}`,\n );\n }\n\n const bytes = await response.arrayBuffer();\n const signature = readSignature(bytes);\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n\n if (contentType.includes(\"text/html\") || isHtmlSignature(signature)) {\n throw new Error(\n `Font URL returned HTML instead of font data: ${source}. Use a public font URL like \"/assets/font.otf\", or pass { base: import.meta.url } when loading a module-relative string path. Plain string paths in the browser are resolved from the current page URL.`,\n );\n }\n\n return bytes;\n}\n\nfunction normalizeLoadOptions(options = {}) {\n if (options == null) {\n return {};\n }\n\n if (typeof options !== \"object\" || Array.isArray(options)) {\n throw new TypeError(\"PAFont.load() options must be an object.\");\n }\n\n return options;\n}\n\nfunction resolveBrowserFontSource(source, base) {\n if (source instanceof URL) {\n return source.href;\n }\n\n if (typeof source !== \"string\") {\n throw new TypeError(\n \"PAFont.load() expects a string, URL, ArrayBuffer, or ArrayBufferView.\",\n );\n }\n\n if (base == null) {\n return source;\n }\n\n return new URL(source, normalizeBase(base)).href;\n}\n\nasync function resolveNodeFontSource(source, base) {\n if (source instanceof URL) {\n return toNodeLoadTarget(source);\n }\n\n if (typeof source !== \"string\") {\n throw new TypeError(\n \"PAFont.load() expects a string, URL, ArrayBuffer, or ArrayBufferView.\",\n );\n }\n\n if (base == null) {\n if (isLoadableUrlString(source)) {\n return toNodeLoadTarget(new URL(source));\n }\n\n return {\n target: source,\n loadOptions: undefined,\n };\n }\n\n return toNodeLoadTarget(new URL(source, normalizeBase(base)));\n}\n\nfunction normalizeBase(base) {\n if (base instanceof URL) {\n return base;\n }\n\n if (typeof base === \"string\") {\n return base;\n }\n\n throw new TypeError('PAFont.load() option \"base\" must be a string or URL.');\n}\n\nasync function toNodeLoadTarget(url) {\n if (url.protocol === \"file:\") {\n return {\n target: fileUrlToPath(url),\n loadOptions: undefined,\n };\n }\n\n return {\n target: url.href,\n loadOptions: {\n isUrl: true,\n },\n };\n}\n\nfunction fileUrlToPath(url) {\n const pathname = decodeURIComponent(url.pathname);\n\n if (/^\\/[a-zA-Z]:/.test(pathname)) {\n return pathname.slice(1);\n }\n\n if (url.hostname) {\n return `//${url.hostname}${pathname}`;\n }\n\n return pathname;\n}\n\nfunction isLoadableUrlString(value) {\n return (\n value.startsWith(\"http://\") ||\n value.startsWith(\"https://\") ||\n value.startsWith(\"file://\")\n );\n}\n\nfunction readSignature(bytes) {\n const view = new Uint8Array(bytes, 0, Math.min(4, bytes.byteLength));\n let signature = \"\";\n\n for (const value of view) {\n signature += String.fromCharCode(value);\n }\n\n return signature.toLowerCase();\n}\n\nfunction isHtmlSignature(signature) {\n return signature === \"<!do\" || signature === \"<htm\";\n}\n\nexport { PAFont as pa_Font };\nexport default PAFont;\n"],"mappings":";;;;;;AAAA,SAAgB,cAAc,OAAO,OAAO;AAC1C,QAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,IAAI,MAAM;;AAG5C,SAAgB,cAAc,OAAO;AACnC,QAAO;EAAE,GAAG,MAAM;EAAG,GAAG,MAAM;EAAG;;AAGnC,SAAgB,gBAAgB,QAAQ,OAAO;AAC7C,KAAI,OAAO,WAAW,KAAK,CAAC,cAAc,OAAO,OAAO,SAAS,IAAI,MAAM,CACzE,QAAO,KAAK,MAAM;;AAItB,SAAgB,iBAAiB,IAAI,IAAI,IAAI,WAAW,KAAK,QAAQ,GAAG;AACtE,KAAI,SAAS,MAAM,aAAa,IAAI,IAAI,GAAG,IAAI,WAAW;AACxD,kBAAgB,KAAK,GAAG;AACxB;;CAGF,MAAM,MAAM,SAAS,IAAI,GAAG;CAC5B,MAAM,MAAM,SAAS,IAAI,GAAG;CAC5B,MAAM,OAAO,SAAS,KAAK,IAAI;AAE/B,kBAAiB,IAAI,KAAK,MAAM,WAAW,KAAK,QAAQ,EAAE;AAC1D,kBAAiB,MAAM,KAAK,IAAI,WAAW,KAAK,QAAQ,EAAE;;AAG5D,SAAgB,aAAa,IAAI,IAAI,IAAI,IAAI,WAAW,KAAK,QAAQ,GAAG;AACtE,KAAI,SAAS,MAAM,cAAc,IAAI,IAAI,IAAI,GAAG,IAAI,WAAW;AAC7D,kBAAgB,KAAK,GAAG;AACxB;;CAGF,MAAM,MAAM,SAAS,IAAI,GAAG;CAC5B,MAAM,MAAM,SAAS,IAAI,GAAG;CAC5B,MAAM,MAAM,SAAS,IAAI,GAAG;CAC5B,MAAM,OAAO,SAAS,KAAK,IAAI;CAC/B,MAAM,OAAO,SAAS,KAAK,IAAI;CAC/B,MAAM,QAAQ,SAAS,MAAM,KAAK;AAElC,cAAa,IAAI,KAAK,MAAM,OAAO,WAAW,KAAK,QAAQ,EAAE;AAC7D,cAAa,OAAO,MAAM,KAAK,IAAI,WAAW,KAAK,QAAQ,EAAE;;AAG/D,SAAS,aAAa,IAAI,IAAI,IAAI;AAChC,QAAO,oBAAoB,IAAI,IAAI,GAAG;;AAGxC,SAAS,cAAc,IAAI,IAAI,IAAI,IAAI;AACrC,QAAO,KAAK,IACV,oBAAoB,IAAI,IAAI,GAAG,EAC/B,oBAAoB,IAAI,IAAI,GAAG,CAChC;;AAGH,SAAS,oBAAoB,OAAO,WAAW,SAAS;CACtD,MAAM,KAAK,QAAQ,KAAK,UAAU;CAClC,MAAM,KAAK,QAAQ,KAAK,UAAU;CAClC,MAAM,WAAW,KAAK,KAAK,KAAK;AAEhC,KAAI,aAAa,EACf,QAAO,SAAS,OAAO,UAAU;AAOnC,QAJa,KAAK,IAChB,MAAM,UAAU,KAAK,MAAM,OAAO,UAAU,KAAK,MAAM,MAAM,GAC9D,GAEa,KAAK,KAAK,SAAS;;AAGnC,SAAgB,SAAS,GAAG,GAAG;AAC7B,QAAO,EAAE,EAAE,KAAK,EAAE,MAAM,KAAM,EAAE,KAAK,EAAE,MAAM,GAAI;;AAGnD,SAAgB,WAAW,MAAM;CAC/B,IAAI,OAAO;AAEX,MAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACnD,MAAM,UAAU,KAAK;EACrB,MAAM,OAAO,MAAM,QAAQ,KAAK,KAAK;AACrC,UAAQ,QAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,QAAQ;;AAGnD,QAAO,OAAO;;AAGhB,SAAgB,YAAY,OAAO,MAAM;CACvC,IAAI,SAAS;AAEb,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,SAAS,GAAG,IAAI,KAAK,QAAQ,IAAI,GAAG,KAAK,GAAG;EACnE,MAAM,KAAK,KAAK,GAAG;EACnB,MAAM,KAAK,KAAK,GAAG;EACnB,MAAM,KAAK,KAAK,GAAG;EACnB,MAAM,KAAK,KAAK,GAAG;AAKnB,MAHE,KAAK,MAAM,OAAO,KAAK,MAAM,MAC7B,MAAM,MAAO,KAAK,OAAO,MAAM,KAAK,OAAQ,KAAK,MAAM,QAAQ,GAG/D,UAAS,CAAC;;AAId,QAAO;;AAGT,SAAgB,QAAQ,OAAO,MAAM,SAAS;AAC5C,KAAI,CAAC,kBAAkB,KAAK,MAAM,OAAO,QAAQ,CAC/C,QAAO;AAGT,KAAI,kBAAkB,OAAO,KAAK,OAAO,QAAQ,CAC/C,QAAO;AAGT,KAAI,CAAC,YAAY,OAAO,KAAK,MAAM,CACjC,QAAO;AAGT,MAAK,MAAM,QAAQ,KAAK,OAAO;AAC7B,MAAI,kBAAkB,OAAO,MAAM,QAAQ,CACzC,QAAO;AAGT,MAAI,YAAY,OAAO,KAAK,CAC1B,QAAO;;AAIX,QAAO;;AAGT,SAAS,kBAAkB,OAAO,MAAM,SAAS;AAC/C,MAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACnD,MAAM,IAAI,KAAK;EACf,MAAM,IAAI,MAAM,QAAQ,KAAK,KAAK;AAElC,MAAI,uBAAuB,OAAO,GAAG,EAAE,IAAI,QACzC,QAAO;;AAIX,QAAO;;AAGT,SAAS,uBAAuB,OAAO,GAAG,GAAG;CAC3C,MAAM,KAAK,EAAE,KAAK,EAAE;CACpB,MAAM,KAAK,EAAE,KAAK,EAAE;CACpB,MAAM,WAAW,KAAK,KAAK,KAAK;AAEhC,KAAI,aAAa,EACf,QAAO,SAAS,OAAO,EAAE;CAG3B,IAAI,MAAM,MAAM,KAAK,EAAE,MAAM,MAAM,MAAM,KAAK,EAAE,MAAM,MAAM;AAC5D,KAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC;AAG/B,QAAO,SAAS,OADG,CAAC,EAAE,KAAK,KAAK,GAAG,EAAE,KAAK,KAAK,EAAE,CACf;;AAGpC,SAAgB,SAAS,GAAG,GAAG;CAC7B,MAAM,KAAK,EAAE,KAAK,EAAE;CACpB,MAAM,KAAK,EAAE,KAAK,EAAE;AACpB,QAAO,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;;AAGrC,SAAgB,WAAW,MAAM,MAAM,UAAU;AAC/C,MAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACnD,MAAM,IAAI,KAAK;EACf,MAAM,IAAI,MAAM,QAAQ,KAAK,KAAK;EAClC,MAAM,gBAAgB,SAAS,GAAG,EAAE;EACpC,MAAM,YAAY,KAAK,IAAI,GAAG,KAAK,KAAK,gBAAgB,KAAK,CAAC;AAE9D,OAAK,IAAI,SAAS,GAAG,SAAS,WAAW,UAAU,EACjD,KAAI,QAAQ,KAAK,SAAS,GAAG;GAC3B,MAAM,IAAI,SAAS;AACnB,YAAS,CACP,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GACvB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EACxB,CAAC;QAEF,UAAS,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC;;;AAM9B,SAAgB,WAAW,MAAM;CAC/B,IAAI,OAAO,OAAO;CAClB,IAAI,OAAO,OAAO;CAClB,IAAI,OAAO,OAAO;CAClB,IAAI,OAAO,OAAO;AAElB,MAAK,SAAS,UAAU;AACtB,SAAO,KAAK,IAAI,MAAM,MAAM,GAAG;AAC/B,SAAO,KAAK,IAAI,MAAM,MAAM,GAAG;AAC/B,SAAO,KAAK,IAAI,MAAM,MAAM,GAAG;AAC/B,SAAO,KAAK,IAAI,MAAM,MAAM,GAAG;GAC/B;AAEF,QAAO;EACL,GAAG;EACH,GAAG;EACH,GAAG,OAAO;EACV,GAAG,OAAO;EACX;;AAGH,SAAgB,cAAc,MAAM,IAAI,IAAI;AAC1C,QAAO,KAAK,KAAK,UAAU,CAAC,MAAM,KAAK,IAAI,MAAM,KAAK,GAAG,CAAC;;AAG5D,SAAgB,cAAc,MAAM,IAAI,IAAI;AAC1C,QAAO;EACL,GAAG,KAAK,IAAI;EACZ,GAAG,KAAK,IAAI;EACZ,GAAG,KAAK;EACR,GAAG,KAAK;EACT;;AAGH,SAAgB,SAAS,MAAM;AAC7B,QAAO,KAAK,KAAK,UAAU,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC;;AAGlD,SAAgB,aAAa,OAAO;AAClC,KAAI,MAAM,WAAW,EACnB,QAAO;CAGT,IAAI,OAAO,OAAO;CAClB,IAAI,OAAO,OAAO;CAClB,IAAI,OAAO,OAAO;CAClB,IAAI,OAAO,OAAO;AAElB,OAAM,SAAS,SAAS;AACtB,SAAO,KAAK,IAAI,MAAM,KAAK,EAAE;AAC7B,SAAO,KAAK,IAAI,MAAM,KAAK,EAAE;AAC7B,SAAO,KAAK,IAAI,MAAM,KAAK,IAAI,KAAK,EAAE;AACtC,SAAO,KAAK,IAAI,MAAM,KAAK,IAAI,KAAK,EAAE;GACtC;AAEF,QAAO;EACL,GAAG;EACH,GAAG;EACH,GAAG,OAAO;EACV,GAAG,OAAO;EACX;;AAGH,SAAgB,iBAAiB,OAAO,OAAO,UAAU,MAAM;AAC7D,QACE,MAAM,KAAK,MAAM,IAAI,WACrB,MAAM,KAAK,MAAM,IAAI,WACrB,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,IAAI,WACzC,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,IAAI;;AAI7C,SAAgB,kBAAkB,MAAM,OAAO,UAAU,GAAG;AAC1D,QACE,MAAM,MAAM,KAAK,IAAI,WACrB,MAAM,MAAM,KAAK,IAAI,KAAK,IAAI,WAC9B,MAAM,MAAM,KAAK,IAAI,WACrB,MAAM,MAAM,KAAK,IAAI,KAAK,IAAI;;AAIlC,SAAgB,YAAY;AAC1B,QAAO;EAAE,GAAG;EAAG,GAAG;EAAG,GAAG;EAAG,GAAG;EAAG;;AAGnC,SAAgB,gBAAgB,OAAO,UAAU;AAC/C,QAAO,OAAO,SAAS,MAAM,GAAG,QAAQ;;AAG1C,SAAgB,kBAAkB,OAAO,UAAU;AACjD,QAAO,OAAO,SAAS,MAAM,IAAI,QAAQ,IAAI,QAAQ;;AAGvD,SAAgB,UAAU,GAAG,GAAG;AAC9B,QAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;;AAGlC,SAAgB,cAAc,GAAG,GAAG;AAClC,QAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;;AAGrC,SAAgB,oBAAoB,GAAG,GAAG,UAAU,MAAM;AACxD,QAAO,KAAK,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,WAAW,KAAK,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI;;AAGtE,SAAgB,cAAc,MAAM;CAClC,IAAI,QAAQ;AAEZ,MAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,EAChD,UAAS,SAAS,KAAK,QAAQ,MAAM,QAAQ,KAAK,KAAK,QAAQ;AAGjE,QAAO;;AAGT,SAAgB,eAAe,MAAM;CACnC,IAAI,QAAQ;AAEZ,MAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,SAAS,GAAG,SAAS,EACpD,UAAS,SAAS,KAAK,QAAQ,KAAK,QAAQ,GAAG;AAGjD,QAAO;;AAGT,SAAgB,0BAA0B,MAAM,eAAe;CAC7D,MAAM,YAAY,cAAc,KAAK;AAErC,KAAI,aAAa,KACf,QAAO,CAAC,KAAK,GAAG,IAAI,KAAK,GAAG,GAAG;CAGjC,IAAI,YAAY,IAAI,eAAe,UAAU;AAE7C,MAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACnD,MAAM,QAAQ,KAAK;EACnB,MAAM,MAAM,MAAM,QAAQ,KAAK,KAAK;EACpC,MAAM,gBAAgB,SAAS,OAAO,IAAI;AAE1C,MAAI,iBAAiB,KACnB;AAGF,MAAI,aAAa,eAAe;GAC9B,MAAM,IAAI,YAAY;AACtB,UAAO,CACL,MAAM,MAAM,IAAI,KAAK,MAAM,MAAM,GACjC,MAAM,MAAM,IAAI,KAAK,MAAM,MAAM,EAClC;;AAGH,eAAa;;AAGf,QAAO,CAAC,KAAK,KAAK,SAAS,GAAG,IAAI,KAAK,KAAK,SAAS,GAAG,GAAG;;AAG7D,SAAgB,wBAAwB,MAAM,eAAe;AAC3D,KAAI,iBAAiB,EACnB,QAAO,CAAC,KAAK,GAAG,IAAI,KAAK,GAAG,GAAG;CAGjC,IAAI,YAAY;AAEhB,MAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,SAAS,GAAG,SAAS,GAAG;EACvD,MAAM,QAAQ,KAAK;EACnB,MAAM,MAAM,KAAK,QAAQ;EACzB,MAAM,gBAAgB,SAAS,OAAO,IAAI;AAE1C,MAAI,iBAAiB,KACnB;AAGF,MAAI,aAAa,eAAe;GAC9B,MAAM,IAAI,YAAY;AACtB,UAAO,CACL,MAAM,MAAM,IAAI,KAAK,MAAM,MAAM,GACjC,MAAM,MAAM,IAAI,KAAK,MAAM,MAAM,EAClC;;AAGH,eAAa;;AAGf,QAAO,CAAC,KAAK,KAAK,SAAS,GAAG,IAAI,KAAK,KAAK,SAAS,GAAG,GAAG;;AAG7D,SAAgB,sBAAsB,GAAG,GAAG,MAAM,cAAc,SAAS;AACvE,MAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,MAAI,aAAa,IAAI,MAAM,CACzB;EAGF,MAAM,IAAI,KAAK;EACf,MAAM,IAAI,MAAM,QAAQ,KAAK,KAAK;AAElC,MAAI,kBAAkB,GAAG,GAAG,GAAG,GAAG,QAAQ,CACxC,QAAO;;AAIX,QAAO;;AAGT,SAAS,kBAAkB,GAAG,GAAG,GAAG,GAAG,SAAS;CAC9C,MAAM,KAAK,YAAY,GAAG,GAAG,EAAE;CAC/B,MAAM,KAAK,YAAY,GAAG,GAAG,EAAE;CAC/B,MAAM,KAAK,YAAY,GAAG,GAAG,EAAE;CAC/B,MAAM,KAAK,YAAY,GAAG,GAAG,EAAE;AAE/B,MACI,KAAK,WAAW,KAAK,CAAC,WAAa,KAAK,CAAC,WAAW,KAAK,aACzD,KAAK,WAAW,KAAK,CAAC,WAAa,KAAK,CAAC,WAAW,KAAK,SAE3D,QAAO;AAGT,KAAI,KAAK,IAAI,GAAG,IAAI,WAAW,eAAe,GAAG,GAAG,GAAG,QAAQ,CAC7D,QAAO;AAGT,KAAI,KAAK,IAAI,GAAG,IAAI,WAAW,eAAe,GAAG,GAAG,GAAG,QAAQ,CAC7D,QAAO;AAGT,KAAI,KAAK,IAAI,GAAG,IAAI,WAAW,eAAe,GAAG,GAAG,GAAG,QAAQ,CAC7D,QAAO;AAGT,KAAI,KAAK,IAAI,GAAG,IAAI,WAAW,eAAe,GAAG,GAAG,GAAG,QAAQ,CAC7D,QAAO;AAGT,QAAO;;AAGT,SAAS,YAAY,GAAG,GAAG,GAAG;AAC5B,SAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE;;AAGnE,SAAS,eAAe,OAAO,OAAO,KAAK,SAAS;AAClD,QACE,MAAM,MAAM,KAAK,IAAI,MAAM,IAAI,IAAI,GAAG,GAAG,WACzC,MAAM,MAAM,KAAK,IAAI,MAAM,IAAI,IAAI,GAAG,GAAG,WACzC,MAAM,MAAM,KAAK,IAAI,MAAM,IAAI,IAAI,GAAG,GAAG,WACzC,MAAM,MAAM,KAAK,IAAI,MAAM,IAAI,IAAI,GAAG,GAAG;;AAI7C,SAAgB,IAAI,OAAO,SAAS;AAClC,SAAS,QAAQ,UAAW,WAAW;;;;ACnazC,SAAgB,aAAa,MAAM,OAAO,MAAM;CAC9C,MAAM,SAAS,EAAE;CACjB,MAAM,gBAAgB,gBAAgB,KAAK;AAkB3C,QAAO;EACL,MAAM;EACN;EACA,SAAS;GACP,OArBS,KAAK,aAChB,OACA,KAAK,GACL,KAAK,GACL,KAAK,MACL,gBACC,OAAO,GAAG,GAAG,SAAS;AACrB,WAAO,KAAK;KACV;KACA;KACA;KACA;KACA,OAAO,OAAO;KACf,CAAC;KAEL,GAMiB,KAAK;GACnB,GAAG,KAAK;GACR,GAAG,KAAK;GACR,MAAM,KAAK;GACZ;EACF;;AAGH,SAAgB,YAAY,MAAM,OAAO,MAAM;CAC7C,MAAM,gBAAgB,gBAAgB,KAAK;CAE3C,MAAM,MADO,KAAK,QAAQ,OAAO,KAAK,GAAG,KAAK,GAAG,KAAK,MAAM,cAAc,CACzD,gBAAgB;AAEjC,QAAO;EACL,OAAO,KAAK,gBAAgB,OAAO,KAAK,MAAM,cAAc;EAC5D,MAAM;GACJ,GAAG,IAAI;GACP,GAAG,IAAI;GACP,GAAG,IAAI,KAAK,IAAI;GAChB,GAAG,IAAI,KAAK,IAAI;GACjB;EACF;;AAGH,SAAgB,mBAAmB,OAAO,oBAAoB;CAC5D,MAAM,WAAW,MAAM,MAAM,YAAY,EAAE;CAC3C,MAAM,WAAW,EAAE;CACnB,IAAI,YAAY;CAChB,IAAI,UAAU;CAEd,MAAM,6BAA6B;AACjC,MAAI,CAAC,WAAW,QAAQ,SAAS,WAAW,GAAG;AAC7C,aAAU;AACV;;AAGF,MAAI,CAAC,UAAU,QAAQ,QAAQ,QAAQ,MAAM,EAAE;AAC7C,WAAQ,SAAS,KAAK;IACpB,MAAM;IACN,MAAM,cAAc,QAAQ,OAAO;IACnC,IAAI,cAAc,QAAQ,MAAM;IACjC,CAAC;AACF,WAAQ,SAAS,cAAc,QAAQ,MAAM;;AAG/C,WAAS,KAAK;GACZ,IAAI;GACJ,OAAO,cAAc,QAAQ,MAAM;GACnC,UAAU,QAAQ;GACnB,CAAC;AACF,YAAU;;AAGZ,UAAS,SAAS,QAAQ;AACxB,MAAI,IAAI,SAAS,KAAK;AACpB,yBAAsB;AACtB,aAAU;IACR,OAAO;KAAE,GAAG,IAAI;KAAG,GAAG,IAAI;KAAG;IAC7B,QAAQ;KAAE,GAAG,IAAI;KAAG,GAAG,IAAI;KAAG;IAC9B,UAAU,EAAE;IACb;AACD;;AAGF,MAAI,CAAC,QACH;AAGF,MAAI,IAAI,SAAS,KAAK;GACpB,MAAM,KAAK;IAAE,GAAG,IAAI;IAAG,GAAG,IAAI;IAAG;AACjC,WAAQ,SAAS,KAAK;IACpB,MAAM;IACN,MAAM,cAAc,QAAQ,OAAO;IACnC;IACD,CAAC;AACF,WAAQ,SAAS,cAAc,GAAG;AAClC;;AAGF,MAAI,IAAI,SAAS,KAAK;GACpB,MAAM,KAAK;IAAE,GAAG,IAAI;IAAG,GAAG,IAAI;IAAG;AACjC,WAAQ,SAAS,KAAK;IACpB,MAAM;IACN,MAAM,cAAc,QAAQ,OAAO;IACnC,IAAI;KAAE,GAAG,IAAI;KAAI,GAAG,IAAI;KAAI;IAC5B;IACD,CAAC;AACF,WAAQ,SAAS,cAAc,GAAG;AAClC;;AAGF,MAAI,IAAI,SAAS,KAAK;GACpB,MAAM,KAAK;IAAE,GAAG,IAAI;IAAG,GAAG,IAAI;IAAG;AACjC,WAAQ,SAAS,KAAK;IACpB,MAAM;IACN,MAAM,cAAc,QAAQ,OAAO;IACnC,IAAI;KAAE,GAAG,IAAI;KAAI,GAAG,IAAI;KAAI;IAC5B,IAAI;KAAE,GAAG,IAAI;KAAI,GAAG,IAAI;KAAI;IAC5B;IACD,CAAC;AACF,WAAQ,SAAS,cAAc,GAAG;AAClC;;AAGF,MAAI,IAAI,SAAS,IACf,uBAAsB;GAExB;AAEF,uBAAsB;AAEtB,QAAO;EACL,YAAY,MAAM;EAClB,cAAc,MAAM,gBAAgB;EACpC,YAAY,MAAM,MAAM,cAAc,sBAAsB;EAC5D;EACD;;AAGH,SAAgB,qBAAqB,UAAU,SAAS;CACtD,MAAM,QAAQ,QAAQ,OAAO,SAAS;CAItC,MAAM,qBAAqB,iBAHV,SAAS,SACvB,KAAK,YAAY,eAAe,SAAS,OAAO,QAAQ,QAAQ,CAAC,CACjE,OAAO,QAAQ,CACmC;CACrD,MAAM,QAAQ,WAAW,mBAAmB;CAC5C,MAAM,OAAO,aAAa,MAAM,KAAK,SAAS,KAAK,KAAK,CAAC,IAAI,WAAW;AAExE,QAAO;EACL,YAAY,SAAS;EACrB,cAAc,SAAS,eAAe;EACtC,UAAU;EACV;EACA;EACD;;AAGH,SAAS,eAAe,SAAS,OAAO,WAAW;CACjD,MAAM,OAAO,EAAE;AAEf,iBAAgB,MADF,cAAc,QAAQ,OAAO,MAAM,CACrB;AAE5B,SAAQ,SAAS,SAAS,YAAY;AACpC,MAAI,QAAQ,SAAS,KAAK;AACxB,mBAAgB,MAAM,cAAc,QAAQ,IAAI,MAAM,CAAC;AACvD;;AAGF,MAAI,QAAQ,SAAS,KAAK;AACxB,oBACE,cAAc,QAAQ,MAAM,MAAM,EAClC,cAAc,QAAQ,IAAI,MAAM,EAChC,cAAc,QAAQ,IAAI,MAAM,EAChC,WACA,KACD;AACD;;AAGF,MAAI,QAAQ,SAAS,IACnB,cACE,cAAc,QAAQ,MAAM,MAAM,EAClC,cAAc,QAAQ,IAAI,MAAM,EAChC,cAAc,QAAQ,IAAI,MAAM,EAChC,cAAc,QAAQ,IAAI,MAAM,EAChC,WACA,KACD;GAEH;AAEF,KAAI,KAAK,SAAS,KAAK,cAAc,KAAK,IAAI,KAAK,KAAK,SAAS,GAAG,CAClE,MAAK,KAAK;AAGZ,KAAI,KAAK,SAAS,EAChB,QAAO;CAGT,MAAM,OAAO,WAAW,KAAK;CAC7B,MAAM,OAAO,WAAW,KAAK;AAE7B,QAAO;EACL,IAAI,QAAQ;EACZ;EACA;EACA;EACD;;AAGH,SAAS,iBAAiB,UAAU;CAClC,MAAM,SAAS,SAAS,KAAK,aAAa;EACxC,GAAG;EACH,UAAU;EACV,OAAO;EACP,MAAM;EACP,EAAE;AAEH,QAAO,SAAS,UAAU;EACxB,IAAI,SAAS;EACb,IAAI,aAAa,OAAO;AAExB,SAAO,SAAS,cAAc;AAC5B,OAAI,UAAU,OAAO,MAAM,GACzB;AAGF,OAAI,KAAK,IAAI,UAAU,KAAK,IAAI,KAAK,IAAI,MAAM,KAAK,CAClD;AAGF,OAAI,CAAC,iBAAiB,UAAU,MAAM,MAAM,KAAK,CAC/C;AAGF,OAAI,CAAC,YAAY,MAAM,KAAK,IAAI,UAAU,KAAK,CAC7C;GAGF,MAAM,gBAAgB,KAAK,IAAI,UAAU,KAAK;AAC9C,OAAI,gBAAgB,YAAY;AAC9B,aAAS;AACT,iBAAa;;IAEf;AAEF,MAAI,OACF,OAAM,WAAW,OAAO;GAE1B;CAEF,MAAM,OAAO,IAAI,IAAI,OAAO,KAAK,YAAY,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC;CAEpE,MAAM,gBAAgB,YAAY;AAChC,MAAI,QAAQ,YAAY,KACtB,QAAO;AAIT,SAAO,aADQ,KAAK,IAAI,QAAQ,SAAS,CACd,GAAG;;AAGhC,QAAO,SAAS,YAAY;AAC1B,UAAQ,QAAQ,aAAa,QAAQ;AACrC,UAAQ,OAAO,QAAQ,QAAQ,MAAM,IAAI,UAAU;GACnD;AAEF,QAAO;;AAGT,SAAS,WAAW,UAAU;AAC5B,QAAO,SACJ,QAAQ,YAAY,QAAQ,SAAS,QAAQ,CAC7C,KAAK,UAAU;EACd,MAAM,eAAe,SAAS,QAC3B,YAAY,QAAQ,aAAa,MAAM,MAAM,QAAQ,SAAS,OAChE;AAED,SAAO;GACL,OAAO,SAAS,MAAM,KAAK;GAC3B,OAAO,aAAa,KAAK,SAAS,SAAS,KAAK,KAAK,CAAC;GACtD,MAAM,EAAE,GAAG,MAAM,MAAM;GACvB,MACE,KAAK,IAAI,MAAM,KAAK,GACpB,aAAa,QAAQ,KAAK,SAAS,MAAM,KAAK,IAAI,KAAK,KAAK,EAAE,EAAE;GACnE;GACD;;AAGN,SAAgB,uBAAuB,UAAU,IAAI,IAAI,eAAe;AAuBtE,QAAO;EACL,OAvBY,SAAS,MAAM,KAAK,MAAM,eAAe;GACrD,OAAO,cAAc,KAAK,OAAO,IAAI,GAAG;GACxC,OAAO,KAAK,MAAM,KAAK,SAAS,cAAc,MAAM,IAAI,GAAG,CAAC;GAC5D,MAAM,cAAc,KAAK,MAAM,IAAI,GAAG;GACtC,MAAM,KAAK;GACX;GACA;GACD,EAAE;EAiBD,UAfe,SAAS,SAAS,KAAK,aAAa;GACnD,IAAI,GAAG,cAAc,GAAG,QAAQ;GAChC,UAAU,QAAQ;GAClB;GACA,UACE,QAAQ,YAAY,OAAO,OAAO,GAAG,cAAc,GAAG,QAAQ;GAChE,OAAO,QAAQ;GACf,MAAM,QAAQ;GACd,MAAM,QAAQ;GACd,MAAM,cAAc,QAAQ,MAAM,IAAI,GAAG;GACzC,MAAM,cAAc,QAAQ,MAAM,IAAI,GAAG;GAC1C,EAAE;EAKD,MAAM,cAAc,SAAS,MAAM,IAAI,GAAG;EAC3C;;AAGH,SAAgB,qBAAqB,UAAU,EAAE,EAAE;CACjD,MAAM,OAAO,kBAAkB,QAAQ,MAAM,GAAG;AAEhD,QAAO;EACL,GAAG,gBAAgB,QAAQ,GAAG,EAAE;EAChC,GAAG,gBAAgB,QAAQ,GAAG,EAAE;EAChC;EACA,SAAS,kBAAkB,QAAQ,SAAS,KAAK;EACjD,aACE,QAAQ,eAAe,OACnB,mBAAmB,KAAK,GACxB,kBAAkB,QAAQ,aAAa,mBAAmB,KAAK,CAAC;EACtE,SAAS,QAAQ,YAAY;EAC7B,eACE,QAAQ,iBAAiB,OACrB,KAAA,IACA,gBAAgB,QAAQ,eAAe,EAAE;EAC/C,UACE,QAAQ,YAAY,OAChB,KAAA,IACA,gBAAgB,QAAQ,UAAU,EAAE;EAC1C,QAAQ,QAAQ;EAChB,UAAU,QAAQ;EAClB,UAAU,QAAQ;EACnB;;AAGH,SAAS,mBAAmB,MAAM;AAChC,QAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAM,OAAO,MAAO,CAAC;;AAGnD,SAAS,gBAAgB,MAAM;CAC7B,MAAM,gBAAgB,EACpB,SAAS,KAAK,SACf;AAED,KAAI,KAAK,iBAAiB,KACxB,eAAc,gBAAgB,KAAK;AAGrC,KAAI,KAAK,YAAY,KACnB,eAAc,WAAW,KAAK;AAGhC,KAAI,KAAK,OACP,eAAc,SAAS,KAAK;AAG9B,KAAI,KAAK,SACP,eAAc,WAAW,KAAK;AAGhC,KAAI,KAAK,SACP,eAAc,WAAW,KAAK;AAGhC,QAAO;;AAGT,SAAgB,cAAc,OAAO;AACnC,KAAI,iBAAiB,YACnB,QAAO;AAGT,KAAI,YAAY,OAAO,MAAM,CAC3B,QAAO,MAAM,OAAO,MAAM,MAAM,YAAY,MAAM,aAAa,MAAM,WAAW;AAGlF,QAAO;;;;ACrYT,IAAa,UAAb,MAAqB;CACnB,YAAY,EAAE,MAAM,OAAO,UAAU,QAAQ,MAAM,SAAS,eAAe;AACzE,OAAK,OAAO;AACZ,OAAK,QAAQ;AACb,OAAK,OAAO;AACZ,OAAK,UAAU;AACf,OAAK,cAAc;AACnB,OAAK,MAAM;GACT;GACA;GACD;AACD,OAAK,SAAS;GACZ,QAAQ;GACR,2BAAW,IAAI,KAAK;GACpB,0BAAU,IAAI,KAAK;GACnB,wBAAQ,IAAI,KAAK;GACjB,aAAa;GACd;;CAGH,IAAI,WAAW;AACb,SAAO,KAAK,MAAM,KAAK,SAAS,CAAC,KAAK,OAAO,GAAG,KAAK,MAAM,CAAC;;CAG9D,CAAC,OAAO,YAAY;AAClB,SAAO,KAAK,iBAAiB,CAAC,OAAO,WAAW;;CAGlD,SAAS;AACP,MAAI,KAAK,OAAO,OACd,QAAO,KAAK,OAAO;AAGrB,MAAI,CAAC,MAAM,QAAQ,KAAK,IAAI,OAAO,IAAI,KAAK,IAAI,OAAO,UAAU,GAAG;AAClE,QAAK,OAAO,SAAS,CAAC,KAAK;AAC3B,UAAO,KAAK,OAAO;;AAGrB,OAAK,OAAO,SAAS,KAAK,IAAI,OAAO,KAAK,GAAG,kBAC3C,iBAAiB,MAAM,cAAc,CACtC;AAED,SAAO,KAAK,OAAO;;CAGrB,QAAQ,UAAU,EAAE,EAAE;AACpB,SAAO,oBAAoB,MAAM,QAAQ;;CAG3C,UAAU,UAAU,EAAE,EAAE;AAEtB,SAAO,uBADO,KAAK,QAAQ,QAAQ,CACC;;CAGtC,UAAU,OAAO;EACf,MAAM,YAAY,kBAAkB,OAAO,EAAE;AAE7C,MAAI,aAAa,KAAK,CAAC,KAAK,MAAM,MAAM,SAAS,KAAK,MAAM,SAAS,EAAE,CACrE,QAAO;EAGT,MAAM,WAAW,WAAW,UAAU;EACtC,MAAM,SAAS,KAAK,OAAO,UAAU,IAAI,SAAS;AAElD,MAAI,OACF,QAAO;EAGT,MAAM,kBAAkB,uBAAuB,UAAU;EAEzD,MAAM,QAAQ,mBACZ,MACA,KAAK,MAAM,KAAK,SAAS,iBAAiB,MAAM,WAAW,gBAAgB,CAAC,CAC7E;AAED,OAAK,OAAO,UAAU,IAAI,UAAU,MAAM;AAC1C,SAAO;;CAGT,SAAS,MAAM;EACb,MAAM,UAAU,kBAAkB,MAAM,EAAE;AAE1C,MAAI,WAAW,EACb,QAAO;EAGT,MAAM,WAAW,WAAW,QAAQ;EACpC,MAAM,SAAS,KAAK,OAAO,SAAS,IAAI,SAAS;AAEjD,MAAI,OACF,QAAO;EAGT,MAAM,QAAQ,mBACZ,MACA,KAAK,MAAM,KAAK,SAAS,aAAa,MAAM,QAAQ,CAAC,CACtD;AAED,OAAK,OAAO,SAAS,IAAI,UAAU,MAAM;AACzC,SAAO;;CAGT,IAAI,GAAG,GAAG,UAAU,KAAK,aAAa;EACpC,MAAM,QAAQ,CAAC,GAAG,EAAE;AAEpB,MAAI,CAAC,kBAAkB,KAAK,MAAM,OAAO,QAAQ,CAC/C,QAAO;EAGT,IAAI,UAAU;AAEd,OAAK,MAAM,QAAQ,KAAK,OAAO;GAC7B,MAAM,SAAS,QAAQ,OAAO,MAAM,QAAQ;AAE5C,OAAI,WAAW,UAAU,WAAW,OAClC,QAAO;AAGT,OAAI,WAAW,OACb,WAAU;;AAId,SAAO,UAAU,SAAS;;CAG5B,SAAS,GAAG,GAAG,UAAU,KAAK,aAAa;AACzC,SAAO,KAAK,IAAI,GAAG,GAAG,QAAQ,KAAK;;CAGrC,SAAS,UAAU,EAAE,EAAE;EACrB,MAAM,OAAO,sBAAsB,QAAQ;EAC3C,MAAM,QACJ,KAAK,YAAY,IAAI,KAAK,QAAQ,EAAE,WAAW,KAAK,WAAW,CAAC,GAAG;EACrE,MAAM,OAAO,KAAK;EAClB,MAAM,eAAe,KAAK;EAC1B,MAAM,UAAU,EAAE;AAElB,QAAM,MAAM,SAAS,MAAM,cAAc;AACvC,cAAW,KAAK,OAAO,OAAO,UAAU;AACtC,YAAQ,KAAK;KACX,GAAG,MAAM;KACT,GAAG,MAAM;KACT;KACA,MAAM;KACP,CAAC;KACF;AAEF,OAAI,CAAC,aACH;AAGF,QAAK,MAAM,SAAS,MAAM,cAAc;AACtC,eAAW,MAAM,OAAO,UAAU;AAChC,aAAQ,KAAK;MACX,GAAG,MAAM;MACT,GAAG,MAAM;MACT;MACA,MAAM;MACN;MACD,CAAC;MACF;KACF;IACF;AAEF,SAAO;;CAGT,kBAAkB;AAChB,MAAI,CAAC,KAAK,OAAO,YACf,MAAK,OAAO,cAAc,KAAK,MAAM,KAAK,SACxC,OAAO,OAAO;GACZ,OAAO,KAAK;GACZ,OAAO,KAAK;GACZ,MAAM,KAAK;GACZ,CAAC,CACH;AAGH,SAAO,KAAK,OAAO;;;AAIvB,SAAgB,gBAAgB,QAAQ,MAAM,cAAc;CAC1D,MAAM,QAAQ,EAAE;CAChB,MAAM,WAAW,EAAE;CACnB,MAAM,SAAS,EAAE;AAEjB,QAAO,OAAO,SAAS,MAAM,kBAAkB;EAE7C,MAAM,aAAa,uBADG,aAAa,mBAAmB,KAAK,OAAO,KAAK,EAGrE,KAAK,GACL,KAAK,GACL,cACD;AAED,QAAM,KAAK,GAAG,WAAW,MAAM;AAC/B,WAAS,KAAK,GAAG,WAAW,SAAS;AACrC,SAAO,KAAK;GACV,UAAU;GACV,YAAY,KAAK,MAAM;GACvB,GAAG,KAAK;GACR,GAAG,KAAK;GACR,MAAM,KAAK;GACX,MAAM,WAAW;GACjB,WAAW,WAAW,MAAM;GAC7B,CAAC;GACF;CAEF,MAAM,OAAO,aAAa,MAAM,KAAK,SAAS,KAAK,KAAK,CAAC,IAAI,WAAW;AAExE,QAAO,IAAI,QAAQ;EACjB,MAAM,OAAO;EACb;EACA;EACA;EACA;EACA,SAAS;GACP,GAAG,OAAO;GACV;GACD;EACD,aAAa,KAAK;EACnB,CAAC;;AAGJ,SAAS,iBAAiB,OAAO,eAAe;CAC9C,MAAM,YAAY,MAAM,IAAI,SAAS,kBAAkB;CACvD,MAAM,QAAQ,UACZ,MAAM,MAAM,QAAQ,SAAS,KAAK,kBAAkB,cAAc,CACnE;CACD,MAAM,WAAW,cACd,MAAM,IAAI,YAAY,EAAE,EAAE,QACxB,YAAY,QAAQ,kBAAkB,cACxC,CACF;CACD,MAAM,OACJ,aAAa,MAAM,KAAK,SAAS,KAAK,KAAK,CAAC,KAC3C,WAAW,OAAO,EAAE,GAAG,UAAU,MAAM,GAAG,WAAW;AAExD,QAAO,IAAI,QAAQ;EACjB,MAAM,iBAAiB,MAAM,MAAM,eAAe,MAAM,IAAI,QAAQ,UAAU,EAAE;EAChF;EACA;EACA,QAAQ,YAAY,CAAC;GAAE,GAAG;GAAW;GAAM,WAAW,MAAM;GAAQ,CAAC,GAAG,EAAE;EAC1E;EACA,SAAS;GACP,GAAG,WAAW,KAAK,MAAM,SAAS,KAAK;GACvC,GAAG,WAAW,KAAK,MAAM,SAAS,KAAK;GACvC,MAAM,WAAW,QAAQ,MAAM,SAAS,QAAQ;GAChD,OAAO,KAAK;GACZ;GACD;EACD,aAAa,MAAM;EACpB,CAAC;;AAGJ,SAAS,mBAAmB,OAAO,OAAO;CACxC,MAAM,cAAc,UAAU,MAAM;CACpC,MAAM,OAAO,aAAa,YAAY,KAAK,SAAS,KAAK,KAAK,CAAC,IAAI,WAAW;CAC9E,MAAM,UAAU,MAAM,IAAI,UAAU,EAAE,EAAE,KAAK,OAAO,kBAAkB;EACpE,MAAM,aAAa,YAAY,QAC5B,SAAS,KAAK,kBAAkB,cAClC;AAED,SAAO;GACL,GAAG;GACH,MACE,aAAa,WAAW,KAAK,SAAS,KAAK,KAAK,CAAC,KAChD,MAAM,OAAO,EAAE,GAAG,MAAM,MAAM,GAAG,WAAW;GAC/C,WAAW,WAAW;GACvB;GACD;AAEF,QAAO,IAAI,QAAQ;EACjB,MAAM,MAAM;EACZ,OAAO;EACP,UAAU,EAAE;EACZ;EACA;EACA,SAAS;GACP,GAAG,MAAM;GACT;GACD;EACD,aAAa,MAAM;EACpB,CAAC;;AAGJ,SAAS,uBAAuB,OAAO;AACrC,QAAO,MAAM,MAAM,KAAK,UAAU;EAChC,OAAO,SAAS,KAAK,MAAM;EAC3B,OAAO,KAAK,MAAM,KAAK,SAAS,SAAS,KAAK,CAAC;EAC/C,MAAM,EAAE,GAAG,KAAK,MAAM;EACvB,EAAE;;AAGL,SAAS,UAAU,OAAO;AACxB,QAAO,MAAM,KAAK,SAAS,SAAS,KAAK,CAAC;;AAG5C,SAAS,SAAS,MAAM;AACtB,QAAO;EACL,GAAG;EACH,OAAO,SAAS,KAAK,MAAM;EAC3B,OAAO,KAAK,MAAM,KAAK,SAAS,SAAS,KAAK,CAAC;EAC/C,SAAS,KAAK,UAAU,KAAK,QAAQ,KAAK,UAAU,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC,GAAG,KAAA;EAC5E,MAAM,EAAE,GAAG,KAAK,MAAM;EACvB;;AAGH,SAAS,aAAa,UAAU;AAC9B,QAAO,SAAS,KAAK,aAAa;EAChC,GAAG;EACH,MAAM,EAAE,GAAG,QAAQ,MAAM;EACzB,MAAM,SAAS,QAAQ,KAAK;EAC7B,EAAE;;AAGL,SAAS,iBAAiB,MAAM,eAAe,YAAY;AACzD,KAAI,cAAc,EAChB,QAAO;AAIT,QADkB,MAAM,KAAK,QAAQ,GAAG,CAAC,kBACrB;;AAGtB,SAAS,sBAAsB,UAAU,EAAE,EAAE;AAC3C,KAAI,WAAW,KACb,QAAO;EACL,MAAM;EACN,WAAW;EACX,cAAc;EACf;AAGH,KAAI,OAAO,YAAY,YAAY,MAAM,QAAQ,QAAQ,CACvD,OAAM,IAAI,UAAU,wCAAwC;AAG9D,QAAO;EACL,MAAM,kBAAkB,QAAQ,MAAM,EAAE;EACxC,WAAW,kBAAkB,QAAQ,WAAW,EAAE;EAClD,cAAc,QAAQ,iBAAiB;EACxC;;AAGH,SAAS,sBAAsB,UAAU,EAAE,EAAE;AAC3C,KAAI,WAAW,KACb,QAAO;EACL,MAAM;EACN,WAAW;EACZ;AAGH,KAAI,OAAO,YAAY,YAAY,MAAM,QAAQ,QAAQ,CACvD,OAAM,IAAI,UACR,sDACD;AAGH,QAAO;EACL,MAAM,kBAAkB,QAAQ,MAAM,EAAE;EACxC,WAAW,kBAAkB,QAAQ,WAAW,EAAE;EACnD;;AAGH,SAAS,oBAAoB,OAAO,UAAU,EAAE,EAAE;CAChD,MAAM,aAAa,sBAAsB,QAAQ;AAEjD,KAAI,WAAW,QAAQ,KAAK,WAAW,aAAa,EAClD,QAAO;CAGT,MAAM,WAAW,GAAG,WAAW,WAAW,KAAK,CAAC,GAAG,WAAW,WAAW,UAAU;CACnF,MAAM,SAAS,MAAM,OAAO,OAAO,IAAI,SAAS;AAEhD,KAAI,OACF,QAAO;CAGT,IAAI,OAAO;AAEX,KAAI,WAAW,YAAY,EACzB,QAAO,KAAK,UAAU,WAAW,UAAU;AAG7C,KAAI,WAAW,OAAO,EACpB,QAAO,KAAK,SAAS,WAAW,KAAK;AAGvC,OAAM,OAAO,OAAO,IAAI,UAAU,KAAK;AACvC,QAAO;;AAGT,SAAS,WAAW,OAAO;AACzB,QAAO,kBAAkB,OAAO,EAAE,CAAC,QAAQ,EAAE;;AAG/C,SAAS,uBAAuB,OAAO;AACrC,QAAO,KAAK,IAAI,MAAM,kBAAkB,OAAO,EAAE,GAAG,KAAK;;AAG3D,SAAS,iBAAiB,MAAM,OAAO,SAAS;AAC9C,KAAI,CAAC,KAAK,SAAS,KAAK,MAAM,WAAW,EACvC,QAAO,SAAS,KAAK;CAGvB,IAAI,QAAQ,SAAS,KAAK,MAAM;CAChC,MAAM,QAAQ,KAAK,MAAM,KAAK,SAAS,SAAS,KAAK,CAAC;CACtD,MAAM,UAAU,EAAE;AAElB,QAAO,MAAM,SAAS,GAAG;EACvB,IAAI,oBAAoB;EACxB,IAAI,iBAAiB;AAErB,QAAM,SAAS,MAAM,cAAc;GACjC,MAAM,WAAW,MAAM,QAAQ,GAAG,UAAU,UAAU,UAAU;GAChE,MAAM,YAAY,mBAAmB,OAAO,MAAM,UAAU,QAAQ;AAEpE,OACE,cACC,CAAC,kBAAkB,UAAU,WAAW,eAAe,WACxD;AACA,qBAAiB;AACjB,wBAAoB;;IAEtB;AAEF,MAAI,CAAC,kBAAkB,sBAAsB,GAC3C;EAGF,MAAM,CAAC,QAAQ,MAAM,OAAO,mBAAmB,EAAE;EACjD,MAAM,SAAS,mBAAmB,OAAO,MAAM,gBAAgB,OAAO,QAAQ;AAC9E,UAAQ,OAAO;AACf,UAAQ,KAAK,GAAG,OAAO,QAAQ;;AAGjC,QAAO;EACL,GAAG;EACH;EACA;EACA;EACA,MAAM,WAAW,MAAM;EACvB,MACE,KAAK,IAAI,WAAW,MAAM,CAAC,GAC3B,MAAM,QAAQ,KAAK,SAAS,MAAM,KAAK,IAAI,WAAW,KAAK,CAAC,EAAE,EAAE;EACnE;;AAGH,SAAS,aAAa,MAAM,MAAM;CAChC,MAAM,QAAQ,aAAa,KAAK,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;CAChE,MAAM,QAAQ,KAAK,MAAM,KAAK,SAAS,aAAa,MAAM,KAAK,CAAC;AAEhE,QAAO;EACL,GAAG;EACH;EACA;EACA,SAAS,KAAK,UAAU,KAAK,QAAQ,KAAK,UAAU,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC,GAAG,KAAA;EAC5E,MAAM,WAAW,MAAM;EACvB,MACE,KAAK,IAAI,WAAW,MAAM,CAAC,GAC3B,MAAM,QAAQ,KAAK,SAAS,MAAM,KAAK,IAAI,WAAW,KAAK,CAAC,EAAE,EAAE;EACnE;;AAGH,SAAS,mBAAmB,OAAO,MAAM,UAAU,SAAS;CAC1D,IAAI,OAAO;AAEX,OAAM,SAAS,YAAY,eAAe;AACxC,OAAK,SAAS,WAAW,cAAc;AACrC,OACE,CAAC,gBACC,OACA,MACA,UACA,YACA,WACA,YACA,WACA,QACD,CAED;GAGF,MAAM,YAAY;IAChB;IACA;IACA,UAAU,SAAS,YAAY,UAAU;IAC1C;AAED,OAAI,CAAC,QAAQ,UAAU,WAAW,KAAK,SACrC,QAAO;IAET;GACF;AAEF,KAAI,KACF,QAAO;AAGT,QAAO,kBAAkB,OAAO,KAAK;;AAGvC,SAAS,kBAAkB,OAAO,MAAM;CACtC,IAAI,OAAO;AAEX,OAAM,SAAS,YAAY,eAAe;AACxC,OAAK,SAAS,WAAW,cAAc;GACrC,MAAM,YAAY;IAChB;IACA;IACA,UAAU,SAAS,YAAY,UAAU;IAC1C;AAED,OAAI,CAAC,QAAQ,UAAU,WAAW,KAAK,SACrC,QAAO;IAET;GACF;AAEF,QAAO;;AAGT,SAAS,gBACP,OACA,MACA,UACA,YACA,WACA,YACA,WACA,SACA;AACA,KAAI,SAAS,YAAY,UAAU,IAAI,QACrC,QAAO;CAGT,MAAM,iBAAiB,SAAS,YAAY,UAAU;AAEtD,KAAI,CAAC,YAAY,gBAAgB,MAAM,IAAI,YAAY,gBAAgB,KAAK,CAC1E,QAAO;AAGT,KAAI,SAAS,MAAM,YAAY,YAAY,gBAAgB,QAAQ,CAAC,CAClE,QAAO;AAGT,KACE,sBACE,YACA,WACA,OACA,IAAI,IAAI,CAAC,YAAY,IAAI,aAAa,GAAG,MAAM,OAAO,CAAC,CAAC,EACxD,QACD,CAED,QAAO;AAGT,KACE,sBACE,YACA,WACA,MACA,IAAI,IAAI,CAAC,WAAW,IAAI,YAAY,GAAG,KAAK,OAAO,CAAC,CAAC,EACrD,QACD,CAED,QAAO;AAGT,QAAO,CAAC,SAAS,MAAM,YACrB,sBAAsB,YAAY,WAAW,yBAAS,IAAI,KAAK,EAAE,QAAQ,CAC1E;;AAGH,SAAS,mBAAmB,OAAO,MAAM,QAAQ,OAAO,SAAS;CAC/D,MAAM,YAAY,eAAe,OAAO,OAAO,MAAM,QAAQ;CAC7D,MAAM,WAAW,cAAc,OAAO,OAAO,YAAY,WAAW,QAAQ;CAC5E,MAAM,UAAU,cAAc,MAAM,OAAO,WAAW,WAAW,QAAQ;CACzE,MAAM,YAAY,SAChB,SAAS,MACT,SAAS,YACT,SAAS,YACV;CACD,MAAM,WAAW,SACf,QAAQ,MACR,QAAQ,YACR,QAAQ,YACT;CACD,MAAM,SAAS,EAAE;AAEjB,YAAW,QAAQ,WAAW,QAAQ;AACtC,YAAW,QAAQ,UAAU,QAAQ;AAErC,KACE,OAAO,SAAS,KAChB,oBAAoB,OAAO,IAAI,OAAO,OAAO,SAAS,IAAI,QAAQ,CAElE,QAAO,KAAK;AAGd,QAAO;EACL,MAAM;EACN,SAAS;GACP,SAAS,KAAK,SAAS;GACvB,QAAQ,KAAK,QAAQ;GACrB,QAAQ,KAAK,QAAQ;GACrB,SAAS,KAAK,SAAS;GACxB,CAAC,KAAK,UAAU,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC;EACvC;;AAGH,SAAS,eAAe,OAAO,OAAO,MAAM,SAAS;CACnD,MAAM,eAAe,KAAK,IAAI,cAAc,MAAM,EAAE,cAAc,KAAK,CAAC;AACxE,QAAO,KAAK,IACV,UAAU,GACV,KAAK,IAAI,OAAO,KAAK,IAAI,eAAe,KAAM,UAAU,EAAE,CAAC,CAC5D;;AAGH,SAAS,cAAc,MAAM,aAAa,OAAO,SAAS;AAIxD,QAAO,oBAAoB,MAHT,cAAc,MAAM,aAAa,CAAC,QAAQ,IAAK,QAAQ,EACxD,cAAc,MAAM,aAAa,QAAQ,IAAK,QAAQ,EAEjB,QAAQ;;AAGhE,SAAS,cAAc,MAAM,aAAa,QAAQ,SAAS;AACzD,KAAI,CAAC,OAAO,SAAS,OAAO,IAAI,KAAK,IAAI,OAAO,IAAI,QAClD,QAAO;EACL,OAAO,CAAC,KAAK,aAAa,IAAI,KAAK,aAAa,GAAG;EACnD,aAAa;EACb,GAAG;EACJ;CAGH,IAAI,YAAY,KAAK,IAAI,OAAO;CAChC,IAAI,eAAe;CACnB,MAAM,YAAY,SAAS,IAAI,IAAI;AAEnC,QAAO,YAAY,SAAS;EAC1B,MAAM,YACJ,YAAY,KAAK,eAAe,KAAK,KAAK,SAAS,IAAI,eAAe,GAAG,KAAK,OAAO;EACvF,MAAM,eAAe,YAAY,IAAI,eAAe;EACpD,MAAM,eAAe,KAAK;EAC1B,MAAM,aAAa,MAAM,eAAe,KAAK,KAAK;EAClD,MAAM,gBAAgB,SAAS,cAAc,WAAW;AAExD,MAAI,iBAAiB,SAAS;AAC5B,kBAAe,YAAY,IAAI,YAAY;AAC3C;;AAGF,MAAI,YAAY,gBAAgB,SAAS;GACvC,MAAM,IAAI,YAAY;GACtB,MAAM,QAAQ,YAAY,IAAI,IAAI,IAAI;AACtC,UAAO;IACL,OAAO,CACL,aAAa,MAAM,WAAW,KAAK,aAAa,MAAM,OACtD,aAAa,MAAM,WAAW,KAAK,aAAa,MAAM,MACvD;IACD;IACA,GAAG;IACJ;;AAGH,eAAa;AACb,iBAAe,YAAY,IAAI,YAAY;;AAG7C,QAAO;EACL,OAAO,CAAC,KAAK,cAAc,IAAI,KAAK,cAAc,GAAG;EACrD,aAAa;EACb,GAAG;EACJ;;AAGH,SAAS,oBAAoB,MAAM,WAAW,UAAU,SAAS;CAC/D,MAAM,OAAO,CACX,qBAAqB,UAAU,MAAM,WAAW,QAAQ,EACxD,qBAAqB,SAAS,MAAM,UAAU,QAAQ,CACvD;CACD,MAAM,mCAAmB,IAAI,KAAK;CAClC,MAAM,aAAa,EAAE;CACrB,MAAM,YAAY,EAAE;AAEpB,MAAK,SAAS,QAAQ;AACpB,MAAI,IAAI,eAAe,KACrB;EAGF,MAAM,WAAW,iBAAiB,IAAI,IAAI,aAAa,IAAI,EAAE;AAC7D,WAAS,KAAK,IAAI;AAClB,mBAAiB,IAAI,IAAI,cAAc,SAAS;GAChD;AAEF,MAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,YAAU,KAAK,CAAC,KAAK,OAAO,IAAI,KAAK,OAAO,GAAG,CAAC;AAEhD,OAAK,SAAS,QAAQ;AACpB,OAAI,IAAI,gBAAgB,MACtB,YAAW,IAAI,QAAQ,UAAU,SAAS;IAE5C;AAMF,GAJqB,iBAAiB,IAAI,MAAM,IAAI,EAAE,EAAE,MACrD,GAAG,MAAM,EAAE,IAAI,EAAE,EACnB,CAEW,SAAS,QAAQ;AAC3B,aAAU,KAAK,CAAC,IAAI,MAAM,IAAI,IAAI,MAAM,GAAG,CAAC;AAC5C,cAAW,IAAI,QAAQ,UAAU,SAAS;IAC1C;;AAGJ,QAAO;EACL,MAAM;EACN,aAAa,WAAW;EACxB,YAAY,WAAW;EACxB;;AAGH,SAAS,qBAAqB,MAAM,MAAM,KAAK,SAAS;AACtD,KAAI,IAAI,eAAe,KACrB,QAAO;EACL,GAAG;EACH;EACD;CAGH,MAAM,eAAe,KAAK,IAAI;CAC9B,MAAM,aAAa,MAAM,IAAI,eAAe,KAAK,KAAK;AAEtD,KAAI,SAAS,IAAI,OAAO,aAAa,IAAI,QACvC,QAAO;EACL,OAAO,CAAC,aAAa,IAAI,aAAa,GAAG;EACzC,aAAa,IAAI;EACjB,GAAG;EACH;EACD;AAGH,KAAI,SAAS,IAAI,OAAO,WAAW,IAAI,QACrC,QAAO;EACL,OAAO,CAAC,WAAW,IAAI,WAAW,GAAG;EACrC,cAAc,IAAI,eAAe,KAAK,KAAK;EAC3C,GAAG;EACH;EACD;AAGH,QAAO;EACL,GAAG;EACH;EACD;;AAGH,SAAS,SAAS,MAAM,YAAY,UAAU;AAC5C,KAAI,cAAc,QAAQ,YAAY,KACpC,QAAO,SAAS,KAAK;CAGvB,MAAM,OAAO,CAAC,KAAK,YAAY;CAC/B,IAAI,SAAS;AAEb,QAAO,WAAW,UAAU;AAC1B,YAAU,SAAS,KAAK,KAAK;AAC7B,OAAK,KAAK,KAAK,QAAQ;;AAGzB,QAAO;;AAGT,SAAS,WAAW,QAAQ,MAAM,SAAS;AACzC,MAAK,SAAS,UAAU;AACtB,MACE,OAAO,WAAW,KAClB,CAAC,oBAAoB,OAAO,OAAO,SAAS,IAAI,OAAO,QAAQ,CAE/D,QAAO,KAAK,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC;GAEnC;;AAGJ,SAAS,aAAa,MAAM,MAAM,UAAU,EAAE,EAAE;AAC9C,KAAI,KAAK,SAAS,EAChB,QAAO,SAAS,KAAK;CAGvB,MAAM,oBAAoB,sBAAsB,MAAM,QAAQ;AAE9D,KAAI,kBAAkB,UAAU,EAC9B,QAAO,wBAAwB,MAAM,MAAM,kBAAkB;AAG/D,QAAO,mBAAmB,MAAM,KAAK;;AAGvC,SAAS,sBAAsB,MAAM,SAAS;CAC5C,MAAM,UAAU,QACb,KAAK,WAAW,mBAAmB,MAAM,OAAO,CAAC,CACjD,QAAQ,UAAU,SAAS,EAAE,CAC7B,MAAM,GAAG,MAAM,IAAI,EAAE;AAExB,QAAO,QAAQ,QAAQ,OAAO,aAAa,UAAU,QAAQ,WAAW,GAAG;;AAG7E,SAAS,mBAAmB,MAAM,OAAO,UAAU,MAAM;AACvD,MAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,EAChD,KAAI,oBAAoB,KAAK,QAAQ,OAAO,QAAQ,CAClD,QAAO;AAIX,QAAO;;AAGT,SAAS,wBAAwB,MAAM,MAAM,eAAe;CAC1D,MAAM,SAAS,EAAE;AAEjB,MAAK,IAAI,QAAQ,GAAG,QAAQ,cAAc,QAAQ,SAAS,GAAG;EAC5D,MAAM,aAAa,cAAc;EACjC,MAAM,WAAW,eAAe,QAAQ,KAAK,cAAc;AAI3D,aAAW,QAFK,iBADH,SAAS,MAAM,YAAY,SAAS,EACV,KAAK,EAEhB,KAAK;;AAGnC,KACE,OAAO,SAAS,KAChB,oBAAoB,OAAO,IAAI,OAAO,OAAO,SAAS,IAAI,KAAK,CAE/D,QAAO,KAAK;AAGd,KAAI,OAAO,SAAS,KAAK,OAAO,UAAU,KAAK,OAC7C,QAAO,SAAS,KAAK;AAGvB,QAAO;;AAGT,SAAS,mBAAmB,MAAM,MAAM;CACtC,MAAM,YAAY,cAAc,KAAK;AAErC,KAAI,aAAa,KACf,QAAO,SAAS,KAAK;CAGvB,MAAM,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,YAAY,KAAK,CAAC;AAE5D,KAAI,cAAc,KAAK,OACrB,QAAO,SAAS,KAAK;CAGvB,MAAM,UAAU,EAAE;AAElB,MAAK,IAAI,QAAQ,GAAG,QAAQ,YAAY,SAAS,GAAG;EAClD,MAAM,QAAQ,0BAA0B,MAAO,YAAY,QAAS,WAAW;AAE/E,MACE,QAAQ,WAAW,KACnB,CAAC,oBAAoB,QAAQ,QAAQ,SAAS,IAAI,OAAO,KAAK,CAE9D,SAAQ,KAAK,MAAM;;AAIvB,KAAI,QAAQ,SAAS,KAAK,QAAQ,UAAU,KAAK,OAC/C,QAAO,SAAS,KAAK;AAGvB,QAAO;;AAGT,SAAS,iBAAiB,MAAM,MAAM;AACpC,KAAI,KAAK,UAAU,EACjB,QAAO,KAAK,KAAK,UAAU,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC;CAGlD,MAAM,SAAS,eAAe,KAAK;AAEnC,KAAI,UAAU,KACZ,QAAO,CACL,CAAC,KAAK,GAAG,IAAI,KAAK,GAAG,GAAG,EACxB,CAAC,KAAK,KAAK,SAAS,GAAG,IAAI,KAAK,KAAK,SAAS,GAAG,GAAG,CACrD;CAGH,MAAM,gBAAgB,KAAK,IAAI,GAAG,KAAK,MAAM,SAAS,KAAK,CAAC;CAC5D,MAAM,UAAU,EAAE;AAElB,MAAK,IAAI,QAAQ,GAAG,SAAS,eAAe,SAAS,GAAG;EACtD,MAAM,QAAQ,wBAAwB,MAAO,SAAS,QAAS,cAAc;AAE7E,MACE,QAAQ,WAAW,KACnB,CAAC,oBAAoB,QAAQ,QAAQ,SAAS,IAAI,OAAO,KAAK,CAE9D,SAAQ,KAAK,MAAM;;AAIvB,QAAO;;;;ACx5BT,IAAa,SAAb,MAAa,OAAO;CAClB,YAAY,MAAM;AAChB,OAAK,OAAO;AACZ,OAAK,aAAa,KAAK,cAAc;AACrC,OAAK,sCAAsB,IAAI,KAAK;AACpC,OAAK,kCAAkB,IAAI,KAAK;;CAGlC,aAAa,KAAK,QAAQ,UAAU,EAAE,EAAE;EACtC,MAAM,OAAO,qBAAqB,QAAQ;AAE1C,MAAI,kBAAkB,eAAe,YAAY,OAAO,OAAO,CAC7D,QAAO,IAAI,QAAA,GAAA,YAAA,OAAiB,cAAc,OAAO,CAAC,CAAC;AAGrD,MAAI,OAAO,WAAW,YAGpB,QAAO,IAAI,QAAA,GAAA,YAAA,OADG,MAAM,eADD,yBAAyB,QAAQ,KAAK,KAAK,CAChB,CACZ,CAAC;EAGrC,MAAM,EAAE,QAAQ,gBAAgB,MAAM,sBACpC,QACA,KAAK,KACN;AAED,SAAO,IAAI,OADE,OAAA,GAAA,YAAA,MAAe,QAAQ,KAAA,GAAW,YAAY,CACpC;;CAGzB,KAAK,OAAO,UAAU,EAAE,EAAE;EACxB,MAAM,OAAO,qBAAqB,QAAQ;AAE1C,SAAO,gBADQ,KAAK,YAAY,OAAO,SAAS,GAAG,EAAE,KAAK,EAC3B,MAAM,KAAK;;CAG5C,MAAM,OAAO,UAAU,EAAE,EAAE;EACzB,MAAM,OAAO,qBAAqB,QAAQ;EAC1C,MAAM,QAAQ,KAAK,KAAK,YAAY,OAAO,SAAS,GAAG,CAAC;AAoBxD,SAAO,gBAnBQ;GACb,MAAM,OAAO,SAAS,GAAG;GACzB,QAAQ,CACN;IACE;IACA,GAAG,KAAK;IACR,GAAG,KAAK;IACR,MAAM,KAAK;IACX,OAAO;IACR,CACF;GACD,SAAS;IACP,QAAQ,MAAM,gBAAgB,MAAM,KAAK,OAAO,KAAK;IACrD,GAAG,KAAK;IACR,GAAG,KAAK;IACR,MAAM,KAAK;IACZ;GACF,EAE8B,MAAM,KAAK;;CAG5C,QAAQ,OAAO,UAAU,EAAE,EAAE;EAC3B,MAAM,OAAO,qBAAqB,QAAQ;AAC1C,SAAO,YAAY,KAAK,MAAM,OAAO,SAAS,GAAG,EAAE,KAAK;;CAG1D,kBAAkB,OAAO;EACvB,MAAM,MAAM,OAAO,MAAM,MAAM;AAE/B,MAAI,CAAC,KAAK,oBAAoB,IAAI,IAAI,CACpC,MAAK,oBAAoB,IACvB,KACA,mBAAmB,OAAO,KAAK,WAAW,CAC3C;AAGH,SAAO,KAAK,oBAAoB,IAAI,IAAI;;CAG1C,mBAAmB,OAAO,MAAM;EAC9B,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,KAAK,KAAK,GAAG,KAAK;AAEhD,MAAI,CAAC,KAAK,gBAAgB,IAAI,IAAI,EAAE;GAClC,MAAM,WAAW,KAAK,kBAAkB,MAAM;AAC9C,QAAK,gBAAgB,IACnB,KACA,qBAAqB,UAAU;IAC7B,MAAM,KAAK;IACX,SAAS,KAAK;IACf,CAAC,CACH;;AAGH,SAAO,KAAK,gBAAgB,IAAI,IAAI;;CAGtC,YAAY,OAAO,MAAM;AACvB,SAAO,aAAa,KAAK,MAAM,OAAO,KAAK;;;AAI/C,eAAe,eAAe,QAAQ;CACpC,MAAM,WAAW,MAAM,MAAM,OAAO;AAEpC,KAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MACR,4BAA4B,OAAO,IAAI,SAAS,OAAO,GAAG,SAAS,aACpE;CAGH,MAAM,QAAQ,MAAM,SAAS,aAAa;CAC1C,MAAM,YAAY,cAAc,MAAM;AAGtC,MAFoB,SAAS,QAAQ,IAAI,eAAe,IAAI,IAE5C,SAAS,YAAY,IAAI,gBAAgB,UAAU,CACjE,OAAM,IAAI,MACR,gDAAgD,OAAO,0MACxD;AAGH,QAAO;;AAGT,SAAS,qBAAqB,UAAU,EAAE,EAAE;AAC1C,KAAI,WAAW,KACb,QAAO,EAAE;AAGX,KAAI,OAAO,YAAY,YAAY,MAAM,QAAQ,QAAQ,CACvD,OAAM,IAAI,UAAU,2CAA2C;AAGjE,QAAO;;AAGT,SAAS,yBAAyB,QAAQ,MAAM;AAC9C,KAAI,kBAAkB,IACpB,QAAO,OAAO;AAGhB,KAAI,OAAO,WAAW,SACpB,OAAM,IAAI,UACR,wEACD;AAGH,KAAI,QAAQ,KACV,QAAO;AAGT,QAAO,IAAI,IAAI,QAAQ,cAAc,KAAK,CAAC,CAAC;;AAG9C,eAAe,sBAAsB,QAAQ,MAAM;AACjD,KAAI,kBAAkB,IACpB,QAAO,iBAAiB,OAAO;AAGjC,KAAI,OAAO,WAAW,SACpB,OAAM,IAAI,UACR,wEACD;AAGH,KAAI,QAAQ,MAAM;AAChB,MAAI,oBAAoB,OAAO,CAC7B,QAAO,iBAAiB,IAAI,IAAI,OAAO,CAAC;AAG1C,SAAO;GACL,QAAQ;GACR,aAAa,KAAA;GACd;;AAGH,QAAO,iBAAiB,IAAI,IAAI,QAAQ,cAAc,KAAK,CAAC,CAAC;;AAG/D,SAAS,cAAc,MAAM;AAC3B,KAAI,gBAAgB,IAClB,QAAO;AAGT,KAAI,OAAO,SAAS,SAClB,QAAO;AAGT,OAAM,IAAI,UAAU,yDAAuD;;AAG7E,eAAe,iBAAiB,KAAK;AACnC,KAAI,IAAI,aAAa,QACnB,QAAO;EACL,QAAQ,cAAc,IAAI;EAC1B,aAAa,KAAA;EACd;AAGH,QAAO;EACL,QAAQ,IAAI;EACZ,aAAa,EACX,OAAO,MACR;EACF;;AAGH,SAAS,cAAc,KAAK;CAC1B,MAAM,WAAW,mBAAmB,IAAI,SAAS;AAEjD,KAAI,eAAe,KAAK,SAAS,CAC/B,QAAO,SAAS,MAAM,EAAE;AAG1B,KAAI,IAAI,SACN,QAAO,KAAK,IAAI,WAAW;AAG7B,QAAO;;AAGT,SAAS,oBAAoB,OAAO;AAClC,QACE,MAAM,WAAW,UAAU,IAC3B,MAAM,WAAW,WAAW,IAC5B,MAAM,WAAW,UAAU;;AAI/B,SAAS,cAAc,OAAO;CAC5B,MAAM,OAAO,IAAI,WAAW,OAAO,GAAG,KAAK,IAAI,GAAG,MAAM,WAAW,CAAC;CACpE,IAAI,YAAY;AAEhB,MAAK,MAAM,SAAS,KAClB,cAAa,OAAO,aAAa,MAAM;AAGzC,QAAO,UAAU,aAAa;;AAGhC,SAAS,gBAAgB,WAAW;AAClC,QAAO,cAAc,UAAU,cAAc"}
|
|
1
|
+
{"version":3,"file":"paFont.cjs","names":[],"sources":["../src/paFont/geometry.js","../src/paFont/core.js","../src/paFont/shape.js","../src/paFont/paFont.js"],"sourcesContent":["export function toScreenPoint(point, scale) {\n return [point.x * scale, -point.y * scale];\n}\n\nexport function cloneRawPoint(point) {\n return { x: point.x, y: point.y };\n}\n\nexport function pushUniquePoint(points, point) {\n if (points.length === 0 || !pointsEqual2D(points[points.length - 1], point)) {\n points.push(point);\n }\n}\n\nexport function flattenQuadratic(p0, p1, p2, tolerance, out, depth = 0) {\n if (depth >= 12 || quadFlatness(p0, p1, p2) <= tolerance) {\n pushUniquePoint(out, p2);\n return;\n }\n\n const p01 = midpoint(p0, p1);\n const p12 = midpoint(p1, p2);\n const p012 = midpoint(p01, p12);\n\n flattenQuadratic(p0, p01, p012, tolerance, out, depth + 1);\n flattenQuadratic(p012, p12, p2, tolerance, out, depth + 1);\n}\n\nexport function flattenCubic(p0, p1, p2, p3, tolerance, out, depth = 0) {\n if (depth >= 12 || cubicFlatness(p0, p1, p2, p3) <= tolerance) {\n pushUniquePoint(out, p3);\n return;\n }\n\n const p01 = midpoint(p0, p1);\n const p12 = midpoint(p1, p2);\n const p23 = midpoint(p2, p3);\n const p012 = midpoint(p01, p12);\n const p123 = midpoint(p12, p23);\n const p0123 = midpoint(p012, p123);\n\n flattenCubic(p0, p01, p012, p0123, tolerance, out, depth + 1);\n flattenCubic(p0123, p123, p23, p3, tolerance, out, depth + 1);\n}\n\nfunction quadFlatness(p0, p1, p2) {\n return pointToLineDistance(p1, p0, p2);\n}\n\nfunction cubicFlatness(p0, p1, p2, p3) {\n return Math.max(\n pointToLineDistance(p1, p0, p3),\n pointToLineDistance(p2, p0, p3)\n );\n}\n\nfunction pointToLineDistance(point, lineStart, lineEnd) {\n const dx = lineEnd[0] - lineStart[0];\n const dy = lineEnd[1] - lineStart[1];\n const lengthSq = dx * dx + dy * dy;\n\n if (lengthSq === 0) {\n return distance(point, lineStart);\n }\n\n const area = Math.abs(\n dx * (lineStart[1] - point[1]) - (lineStart[0] - point[0]) * dy\n );\n\n return area / Math.sqrt(lengthSq);\n}\n\nexport function midpoint(a, b) {\n return [(a[0] + b[0]) * 0.5, (a[1] + b[1]) * 0.5];\n}\n\nexport function signedArea(ring) {\n let area = 0;\n\n for (let index = 0; index < ring.length; index += 1) {\n const current = ring[index];\n const next = ring[(index + 1) % ring.length];\n area += current[0] * next[1] - next[0] * current[1];\n }\n\n return area * 0.5;\n}\n\nexport function pointInRing(point, ring) {\n let inside = false;\n\n for (let i = 0, j = ring.length - 1; i < ring.length; j = i, i += 1) {\n const xi = ring[i][0];\n const yi = ring[i][1];\n const xj = ring[j][0];\n const yj = ring[j][1];\n const intersects =\n yi > point[1] !== yj > point[1] &&\n point[0] < ((xj - xi) * (point[1] - yi)) / (yj - yi || 1e-9) + xi;\n\n if (intersects) {\n inside = !inside;\n }\n }\n\n return inside;\n}\n\nexport function hitPart(point, part, epsilon) {\n if (!rectContainsPoint(part.bbox, point, epsilon)) {\n return \"outside\";\n }\n\n if (isPointOnRingEdge(point, part.outer, epsilon)) {\n return \"edge\";\n }\n\n if (!pointInRing(point, part.outer)) {\n return \"outside\";\n }\n\n for (const hole of part.holes) {\n if (isPointOnRingEdge(point, hole, epsilon)) {\n return \"edge\";\n }\n\n if (pointInRing(point, hole)) {\n return \"hole\";\n }\n }\n\n return \"fill\";\n}\n\nfunction isPointOnRingEdge(point, ring, epsilon) {\n for (let index = 0; index < ring.length; index += 1) {\n const a = ring[index];\n const b = ring[(index + 1) % ring.length];\n\n if (distancePointToSegment(point, a, b) <= epsilon) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction distancePointToSegment(point, a, b) {\n const dx = b[0] - a[0];\n const dy = b[1] - a[1];\n const lengthSq = dx * dx + dy * dy;\n\n if (lengthSq === 0) {\n return distance(point, a);\n }\n\n let t = ((point[0] - a[0]) * dx + (point[1] - a[1]) * dy) / lengthSq;\n t = Math.max(0, Math.min(1, t));\n\n const projection = [a[0] + dx * t, a[1] + dy * t];\n return distance(point, projection);\n}\n\nexport function distance(a, b) {\n const dx = a[0] - b[0];\n const dy = a[1] - b[1];\n return Math.sqrt(dx * dx + dy * dy);\n}\n\nexport function sampleRing(ring, step, callback) {\n for (let index = 0; index < ring.length; index += 1) {\n const a = ring[index];\n const b = ring[(index + 1) % ring.length];\n const segmentLength = distance(a, b);\n const divisions = Math.max(1, Math.ceil(segmentLength / step));\n\n for (let offset = 0; offset < divisions; offset += 1) {\n if (index > 0 || offset > 0) {\n const t = offset / divisions;\n callback([\n a[0] + (b[0] - a[0]) * t,\n a[1] + (b[1] - a[1]) * t,\n ]);\n } else {\n callback([a[0], a[1]]);\n }\n }\n }\n}\n\nexport function ringBounds(ring) {\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n\n ring.forEach((point) => {\n minX = Math.min(minX, point[0]);\n minY = Math.min(minY, point[1]);\n maxX = Math.max(maxX, point[0]);\n maxY = Math.max(maxY, point[1]);\n });\n\n return {\n x: minX,\n y: minY,\n w: maxX - minX,\n h: maxY - minY,\n };\n}\n\nexport function translateRing(ring, tx, ty) {\n return ring.map((point) => [point[0] + tx, point[1] + ty]);\n}\n\nexport function translateRect(rect, tx, ty) {\n return {\n x: rect.x + tx,\n y: rect.y + ty,\n w: rect.w,\n h: rect.h,\n };\n}\n\nexport function copyRing(ring) {\n return ring.map((point) => [point[0], point[1]]);\n}\n\nexport function combineRects(rects) {\n if (rects.length === 0) {\n return null;\n }\n\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n\n rects.forEach((rect) => {\n minX = Math.min(minX, rect.x);\n minY = Math.min(minY, rect.y);\n maxX = Math.max(maxX, rect.x + rect.w);\n maxY = Math.max(maxY, rect.y + rect.h);\n });\n\n return {\n x: minX,\n y: minY,\n w: maxX - minX,\n h: maxY - minY,\n };\n}\n\nexport function rectContainsRect(outer, inner, epsilon = 1e-6) {\n return (\n inner.x >= outer.x - epsilon &&\n inner.y >= outer.y - epsilon &&\n inner.x + inner.w <= outer.x + outer.w + epsilon &&\n inner.y + inner.h <= outer.y + outer.h + epsilon\n );\n}\n\nexport function rectContainsPoint(rect, point, epsilon = 0) {\n return (\n point[0] >= rect.x - epsilon &&\n point[0] <= rect.x + rect.w + epsilon &&\n point[1] >= rect.y - epsilon &&\n point[1] <= rect.y + rect.h + epsilon\n );\n}\n\nexport function emptyRect() {\n return { x: 0, y: 0, w: 0, h: 0 };\n}\n\nexport function normalizeNumber(value, fallback) {\n return Number.isFinite(value) ? value : fallback;\n}\n\nexport function normalizePositive(value, fallback) {\n return Number.isFinite(value) && value > 0 ? value : fallback;\n}\n\nexport function samePoint(a, b) {\n return a.x === b.x && a.y === b.y;\n}\n\nexport function pointsEqual2D(a, b) {\n return a[0] === b[0] && a[1] === b[1];\n}\n\nexport function pointsAlmostEqual2D(a, b, epsilon = 1e-6) {\n return Math.abs(a[0] - b[0]) <= epsilon && Math.abs(a[1] - b[1]) <= epsilon;\n}\n\nexport function ringPerimeter(ring) {\n let total = 0;\n\n for (let index = 0; index < ring.length; index += 1) {\n total += distance(ring[index], ring[(index + 1) % ring.length]);\n }\n\n return total;\n}\n\nexport function polylineLength(path) {\n let total = 0;\n\n for (let index = 0; index < path.length - 1; index += 1) {\n total += distance(path[index], path[index + 1]);\n }\n\n return total;\n}\n\nexport function pointAtClosedPathDistance(ring, distanceAlong) {\n const perimeter = ringPerimeter(ring);\n\n if (perimeter <= 1e-9) {\n return [ring[0][0], ring[0][1]];\n }\n\n let remaining = mod(distanceAlong, perimeter);\n\n for (let index = 0; index < ring.length; index += 1) {\n const start = ring[index];\n const end = ring[(index + 1) % ring.length];\n const segmentLength = distance(start, end);\n\n if (segmentLength <= 1e-9) {\n continue;\n }\n\n if (remaining <= segmentLength) {\n const t = remaining / segmentLength;\n return [\n start[0] + (end[0] - start[0]) * t,\n start[1] + (end[1] - start[1]) * t,\n ];\n }\n\n remaining -= segmentLength;\n }\n\n return [ring[ring.length - 1][0], ring[ring.length - 1][1]];\n}\n\nexport function pointAtOpenPathDistance(path, distanceAlong) {\n if (distanceAlong <= 0) {\n return [path[0][0], path[0][1]];\n }\n\n let remaining = distanceAlong;\n\n for (let index = 0; index < path.length - 1; index += 1) {\n const start = path[index];\n const end = path[index + 1];\n const segmentLength = distance(start, end);\n\n if (segmentLength <= 1e-9) {\n continue;\n }\n\n if (remaining <= segmentLength) {\n const t = remaining / segmentLength;\n return [\n start[0] + (end[0] - start[0]) * t,\n start[1] + (end[1] - start[1]) * t,\n ];\n }\n\n remaining -= segmentLength;\n }\n\n return [path[path.length - 1][0], path[path.length - 1][1]];\n}\n\nexport function segmentIntersectsRing(a, b, ring, ignoredEdges, epsilon) {\n for (let index = 0; index < ring.length; index += 1) {\n if (ignoredEdges.has(index)) {\n continue;\n }\n\n const c = ring[index];\n const d = ring[(index + 1) % ring.length];\n\n if (segmentsIntersect(a, b, c, d, epsilon)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction segmentsIntersect(a, b, c, d, epsilon) {\n const o1 = orientation(a, b, c);\n const o2 = orientation(a, b, d);\n const o3 = orientation(c, d, a);\n const o4 = orientation(c, d, b);\n\n if (\n ((o1 > epsilon && o2 < -epsilon) || (o1 < -epsilon && o2 > epsilon)) &&\n ((o3 > epsilon && o4 < -epsilon) || (o3 < -epsilon && o4 > epsilon))\n ) {\n return true;\n }\n\n if (Math.abs(o1) <= epsilon && pointOnSegment(c, a, b, epsilon)) {\n return true;\n }\n\n if (Math.abs(o2) <= epsilon && pointOnSegment(d, a, b, epsilon)) {\n return true;\n }\n\n if (Math.abs(o3) <= epsilon && pointOnSegment(a, c, d, epsilon)) {\n return true;\n }\n\n if (Math.abs(o4) <= epsilon && pointOnSegment(b, c, d, epsilon)) {\n return true;\n }\n\n return false;\n}\n\nfunction orientation(a, b, c) {\n return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\n}\n\nfunction pointOnSegment(point, start, end, epsilon) {\n return (\n point[0] >= Math.min(start[0], end[0]) - epsilon &&\n point[0] <= Math.max(start[0], end[0]) + epsilon &&\n point[1] >= Math.min(start[1], end[1]) - epsilon &&\n point[1] <= Math.max(start[1], end[1]) + epsilon\n );\n}\n\nexport function mod(value, divisor) {\n return ((value % divisor) + divisor) % divisor;\n}\n","import {\n cloneRawPoint,\n combineRects,\n copyRing,\n emptyRect,\n flattenCubic,\n flattenQuadratic,\n normalizeNumber,\n normalizePositive,\n pointInRing,\n pointsEqual2D,\n pushUniquePoint,\n rectContainsRect,\n ringBounds,\n samePoint,\n signedArea,\n toScreenPoint,\n translateRect,\n translateRing,\n} from \"./geometry.js\";\n\nexport function layoutGlyphs(font, value, opts) {\n const glyphs = [];\n const renderOptions = toRenderOptions(opts);\n const endX = font.forEachGlyph(\n value,\n opts.x,\n opts.y,\n opts.size,\n renderOptions,\n (glyph, x, y, size) => {\n glyphs.push({\n glyph,\n x,\n y,\n size,\n index: glyphs.length,\n });\n }\n );\n\n return {\n text: value,\n glyphs,\n metrics: {\n width: endX - opts.x,\n x: opts.x,\n y: opts.y,\n size: opts.size,\n },\n };\n}\n\nexport function measureText(font, value, opts) {\n const renderOptions = toRenderOptions(opts);\n const path = font.getPath(value, opts.x, opts.y, opts.size, renderOptions);\n const box = path.getBoundingBox();\n\n return {\n width: font.getAdvanceWidth(value, opts.size, renderOptions),\n bbox: {\n x: box.x1,\n y: box.y1,\n w: box.x2 - box.x1,\n h: box.y2 - box.y1,\n },\n };\n}\n\nexport function buildGlyphTopology(glyph, fallbackUnitsPerEm) {\n const commands = glyph.path?.commands ?? [];\n const contours = [];\n let contourId = 0;\n let current = null;\n\n const finishCurrentContour = () => {\n if (!current || current.segments.length === 0) {\n current = null;\n return;\n }\n\n if (!samePoint(current.cursor, current.start)) {\n current.segments.push({\n type: \"L\",\n from: cloneRawPoint(current.cursor),\n to: cloneRawPoint(current.start),\n });\n current.cursor = cloneRawPoint(current.start);\n }\n\n contours.push({\n id: contourId++,\n start: cloneRawPoint(current.start),\n segments: current.segments,\n });\n current = null;\n };\n\n commands.forEach((cmd) => {\n if (cmd.type === \"M\") {\n finishCurrentContour();\n current = {\n start: { x: cmd.x, y: cmd.y },\n cursor: { x: cmd.x, y: cmd.y },\n segments: [],\n };\n return;\n }\n\n if (!current) {\n return;\n }\n\n if (cmd.type === \"L\") {\n const to = { x: cmd.x, y: cmd.y };\n current.segments.push({\n type: \"L\",\n from: cloneRawPoint(current.cursor),\n to,\n });\n current.cursor = cloneRawPoint(to);\n return;\n }\n\n if (cmd.type === \"Q\") {\n const to = { x: cmd.x, y: cmd.y };\n current.segments.push({\n type: \"Q\",\n from: cloneRawPoint(current.cursor),\n c1: { x: cmd.x1, y: cmd.y1 },\n to,\n });\n current.cursor = cloneRawPoint(to);\n return;\n }\n\n if (cmd.type === \"C\") {\n const to = { x: cmd.x, y: cmd.y };\n current.segments.push({\n type: \"C\",\n from: cloneRawPoint(current.cursor),\n c1: { x: cmd.x1, y: cmd.y1 },\n c2: { x: cmd.x2, y: cmd.y2 },\n to,\n });\n current.cursor = cloneRawPoint(to);\n return;\n }\n\n if (cmd.type === \"Z\") {\n finishCurrentContour();\n }\n });\n\n finishCurrentContour();\n\n return {\n glyphIndex: glyph.index,\n advanceWidth: glyph.advanceWidth ?? 0,\n unitsPerEm: glyph.path?.unitsPerEm ?? fallbackUnitsPerEm ?? 1000,\n contours,\n };\n}\n\nexport function flattenGlyphTopology(topology, options) {\n const scale = options.size / topology.unitsPerEm;\n const contours = topology.contours\n .map((contour) => flattenContour(contour, scale, options.flatten))\n .filter(Boolean);\n const classifiedContours = classifyContours(contours);\n const parts = buildParts(classifiedContours);\n const bbox = combineRects(parts.map((part) => part.bbox)) ?? emptyRect();\n\n return {\n glyphIndex: topology.glyphIndex,\n advanceWidth: topology.advanceWidth * scale,\n contours: classifiedContours,\n parts,\n bbox,\n };\n}\n\nfunction flattenContour(contour, scale, tolerance) {\n const ring = [];\n const start = toScreenPoint(contour.start, scale);\n pushUniquePoint(ring, start);\n\n contour.segments.forEach((segment) => {\n if (segment.type === \"L\") {\n pushUniquePoint(ring, toScreenPoint(segment.to, scale));\n return;\n }\n\n if (segment.type === \"Q\") {\n flattenQuadratic(\n toScreenPoint(segment.from, scale),\n toScreenPoint(segment.c1, scale),\n toScreenPoint(segment.to, scale),\n tolerance,\n ring\n );\n return;\n }\n\n if (segment.type === \"C\") {\n flattenCubic(\n toScreenPoint(segment.from, scale),\n toScreenPoint(segment.c1, scale),\n toScreenPoint(segment.c2, scale),\n toScreenPoint(segment.to, scale),\n tolerance,\n ring\n );\n }\n });\n\n if (ring.length > 1 && pointsEqual2D(ring[0], ring[ring.length - 1])) {\n ring.pop();\n }\n\n if (ring.length < 3) {\n return null;\n }\n\n const bbox = ringBounds(ring);\n const area = signedArea(ring);\n\n return {\n id: contour.id,\n ring,\n bbox,\n area,\n };\n}\n\nfunction classifyContours(contours) {\n const result = contours.map((contour) => ({\n ...contour,\n parentId: null,\n depth: 0,\n role: \"outer\",\n }));\n\n result.forEach((child) => {\n let parent = null;\n let parentArea = Number.POSITIVE_INFINITY;\n\n result.forEach((candidate) => {\n if (candidate.id === child.id) {\n return;\n }\n\n if (Math.abs(candidate.area) <= Math.abs(child.area)) {\n return;\n }\n\n if (!rectContainsRect(candidate.bbox, child.bbox)) {\n return;\n }\n\n if (!pointInRing(child.ring[0], candidate.ring)) {\n return;\n }\n\n const candidateArea = Math.abs(candidate.area);\n if (candidateArea < parentArea) {\n parent = candidate;\n parentArea = candidateArea;\n }\n });\n\n if (parent) {\n child.parentId = parent.id;\n }\n });\n\n const byId = new Map(result.map((contour) => [contour.id, contour]));\n\n const resolveDepth = (contour) => {\n if (contour.parentId == null) {\n return 0;\n }\n\n const parent = byId.get(contour.parentId);\n return resolveDepth(parent) + 1;\n };\n\n result.forEach((contour) => {\n contour.depth = resolveDepth(contour);\n contour.role = contour.depth % 2 === 0 ? \"outer\" : \"hole\";\n });\n\n return result;\n}\n\nfunction buildParts(contours) {\n return contours\n .filter((contour) => contour.role === \"outer\")\n .map((outer) => {\n const holeContours = contours.filter(\n (contour) => contour.parentId === outer.id && contour.role === \"hole\"\n );\n\n return {\n outer: copyRing(outer.ring),\n holes: holeContours.map((hole) => copyRing(hole.ring)),\n bbox: { ...outer.bbox },\n area:\n Math.abs(outer.area) -\n holeContours.reduce((sum, hole) => sum + Math.abs(hole.area), 0),\n };\n });\n}\n\nexport function translateGlyphGeometry(geometry, tx, ty, glyphPosition) {\n const parts = geometry.parts.map((part, partIndex) => ({\n outer: translateRing(part.outer, tx, ty),\n holes: part.holes.map((hole) => translateRing(hole, tx, ty)),\n bbox: translateRect(part.bbox, tx, ty),\n area: part.area,\n glyphPosition,\n partIndex,\n }));\n\n const contours = geometry.contours.map((contour) => ({\n id: `${glyphPosition}:${contour.id}`,\n sourceId: contour.id,\n glyphPosition,\n parentId:\n contour.parentId == null ? null : `${glyphPosition}:${contour.parentId}`,\n depth: contour.depth,\n role: contour.role,\n area: contour.area,\n bbox: translateRect(contour.bbox, tx, ty),\n ring: translateRing(contour.ring, tx, ty),\n }));\n\n return {\n parts,\n contours,\n bbox: translateRect(geometry.bbox, tx, ty),\n };\n}\n\nexport function normalizeTextOptions(options = {}) {\n const size = normalizePositive(options.size, 72);\n\n return {\n x: normalizeNumber(options.x, 0),\n y: normalizeNumber(options.y, 0),\n size,\n flatten: normalizePositive(options.flatten, 1.25),\n edgeEpsilon:\n options.edgeEpsilon == null\n ? defaultEdgeEpsilon(size)\n : normalizePositive(options.edgeEpsilon, defaultEdgeEpsilon(size)),\n kerning: options.kerning !== false,\n letterSpacing:\n options.letterSpacing == null\n ? undefined\n : normalizeNumber(options.letterSpacing, 0),\n tracking:\n options.tracking == null\n ? undefined\n : normalizeNumber(options.tracking, 0),\n script: options.script,\n language: options.language,\n features: options.features,\n };\n}\n\nfunction defaultEdgeEpsilon(size) {\n return Math.min(1, Math.max(0.01, size * 0.0025));\n}\n\nfunction toRenderOptions(opts) {\n const renderOptions = {\n kerning: opts.kerning,\n };\n\n if (opts.letterSpacing != null) {\n renderOptions.letterSpacing = opts.letterSpacing;\n }\n\n if (opts.tracking != null) {\n renderOptions.tracking = opts.tracking;\n }\n\n if (opts.script) {\n renderOptions.script = opts.script;\n }\n\n if (opts.language) {\n renderOptions.language = opts.language;\n }\n\n if (opts.features) {\n renderOptions.features = opts.features;\n }\n\n return renderOptions;\n}\n\nexport function toArrayBuffer(value) {\n if (value instanceof ArrayBuffer) {\n return value;\n }\n\n if (ArrayBuffer.isView(value)) {\n return value.buffer.slice(value.byteOffset, value.byteOffset + value.byteLength);\n }\n\n return value;\n}\n","import {\n combineRects,\n copyRing,\n distance,\n emptyRect,\n hitPart,\n midpoint,\n mod,\n normalizePositive,\n pointAtClosedPathDistance,\n pointAtOpenPathDistance,\n pointInRing,\n pointsAlmostEqual2D,\n polylineLength,\n rectContainsPoint,\n ringBounds,\n ringPerimeter,\n sampleRing,\n segmentIntersectsRing,\n signedArea,\n} from \"./geometry.js\";\nimport { translateGlyphGeometry } from \"./core.js\";\n\nexport class PAShape {\n constructor({ text, parts, contours, glyphs, bbox, metrics, edgeEpsilon }) {\n this.text = text;\n this.parts = parts;\n this.bbox = bbox;\n this.metrics = metrics;\n this.edgeEpsilon = edgeEpsilon;\n this.raw = {\n contours,\n glyphs,\n };\n this._cache = {\n glyphs: null,\n openHoles: new Map(),\n resample: new Map(),\n shapes: new Map(),\n regionViews: null,\n };\n }\n\n get polygons() {\n return this.parts.map((part) => [part.outer, ...part.holes]);\n }\n\n [Symbol.iterator]() {\n return this._getRegionViews()[Symbol.iterator]();\n }\n\n glyphs() {\n if (this._cache.glyphs) {\n return this._cache.glyphs;\n }\n\n if (!Array.isArray(this.raw.glyphs) || this.raw.glyphs.length <= 1) {\n this._cache.glyphs = [this];\n return this._cache.glyphs;\n }\n\n this._cache.glyphs = this.raw.glyphs.map((_, glyphPosition) =>\n createGlyphShape(this, glyphPosition)\n );\n\n return this._cache.glyphs;\n }\n\n toShape(options = {}) {\n return resolveShapeVariant(this, options);\n }\n\n toRegions(options = {}) {\n const shape = this.toShape(options);\n return createRegionCollection(shape);\n }\n\n openHoles(width) {\n const slitWidth = normalizePositive(width, 0);\n\n if (slitWidth <= 0 || !this.parts.some((part) => part.holes.length > 0)) {\n return this;\n }\n\n const cacheKey = toCacheKey(slitWidth);\n const cached = this._cache.openHoles.get(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n const geometryEpsilon = resolveGeometryEpsilon(slitWidth);\n\n const shape = createDerivedShape(\n this,\n this.parts.map((part) => openPartWithSlit(part, slitWidth, geometryEpsilon))\n );\n\n this._cache.openHoles.set(cacheKey, shape);\n return shape;\n }\n\n resample(step) {\n const spacing = normalizePositive(step, 0);\n\n if (spacing <= 0) {\n return this;\n }\n\n const cacheKey = toCacheKey(spacing);\n const cached = this._cache.resample.get(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n const shape = createDerivedShape(\n this,\n this.parts.map((part) => resamplePart(part, spacing))\n );\n\n this._cache.resample.set(cacheKey, shape);\n return shape;\n }\n\n hit(x, y, epsilon = this.edgeEpsilon) {\n const point = [x, y];\n\n if (!rectContainsPoint(this.bbox, point, epsilon)) {\n return \"outside\";\n }\n\n let holeHit = false;\n\n for (const part of this.parts) {\n const result = hitPart(point, part, epsilon);\n\n if (result === \"edge\" || result === \"fill\") {\n return result;\n }\n\n if (result === \"hole\") {\n holeHit = true;\n }\n }\n\n return holeHit ? \"hole\" : \"outside\";\n }\n\n contains(x, y, epsilon = this.edgeEpsilon) {\n return this.hit(x, y, epsilon) === \"fill\";\n }\n\n toPoints(options = {}) {\n const opts = normalizePointOptions(options);\n const shape =\n opts.openWidth > 0 ? this.toShape({ openWidth: opts.openWidth }) : this;\n const step = opts.step;\n const includeHoles = opts.includeHoles;\n const sampled = [];\n\n shape.parts.forEach((part, partIndex) => {\n sampleRing(part.outer, step, (point) => {\n sampled.push({\n x: point[0],\n y: point[1],\n partIndex,\n hole: false,\n });\n });\n\n if (!includeHoles) {\n return;\n }\n\n part.holes.forEach((hole, holeIndex) => {\n sampleRing(hole, step, (point) => {\n sampled.push({\n x: point[0],\n y: point[1],\n partIndex,\n hole: true,\n holeIndex,\n });\n });\n });\n });\n\n return sampled;\n }\n\n _getRegionViews() {\n if (!this._cache.regionViews) {\n this._cache.regionViews = this.parts.map((part) =>\n Object.freeze({\n outer: part.outer,\n holes: part.holes,\n bbox: part.bbox,\n })\n );\n }\n\n return this._cache.regionViews;\n }\n}\n\nexport function createTextShape(layout, opts, fontInstance) {\n const parts = [];\n const contours = [];\n const glyphs = [];\n\n layout.glyphs.forEach((item, glyphPosition) => {\n const localGeometry = fontInstance._getFlattenedGlyph(item.glyph, opts);\n const translated = translateGlyphGeometry(\n localGeometry,\n item.x,\n item.y,\n glyphPosition\n );\n\n parts.push(...translated.parts);\n contours.push(...translated.contours);\n glyphs.push({\n position: glyphPosition,\n glyphIndex: item.glyph.index,\n x: item.x,\n y: item.y,\n size: item.size,\n bbox: translated.bbox,\n partCount: translated.parts.length,\n });\n });\n\n const bbox = combineRects(parts.map((part) => part.bbox)) ?? emptyRect();\n\n return new PAShape({\n text: layout.text,\n parts,\n contours,\n glyphs,\n bbox,\n metrics: {\n ...layout.metrics,\n bbox,\n },\n edgeEpsilon: opts.edgeEpsilon,\n });\n}\n\nfunction createGlyphShape(shape, glyphPosition) {\n const glyphMeta = shape.raw.glyphs?.[glyphPosition] ?? null;\n const parts = copyParts(\n shape.parts.filter((part) => part.glyphPosition === glyphPosition)\n );\n const contours = copyContours(\n (shape.raw.contours ?? []).filter(\n (contour) => contour.glyphPosition === glyphPosition\n )\n );\n const bbox =\n combineRects(parts.map((part) => part.bbox)) ??\n (glyphMeta?.bbox ? { ...glyphMeta.bbox } : emptyRect());\n\n return new PAShape({\n text: extractGlyphText(shape.text, glyphPosition, shape.raw.glyphs?.length ?? 0),\n parts,\n contours,\n glyphs: glyphMeta ? [{ ...glyphMeta, bbox, partCount: parts.length }] : [],\n bbox,\n metrics: {\n x: glyphMeta?.x ?? shape.metrics?.x ?? 0,\n y: glyphMeta?.y ?? shape.metrics?.y ?? 0,\n size: glyphMeta?.size ?? shape.metrics?.size ?? 0,\n width: bbox.w,\n bbox,\n },\n edgeEpsilon: shape.edgeEpsilon,\n });\n}\n\nfunction createDerivedShape(shape, parts) {\n const copiedParts = copyParts(parts);\n const bbox = combineRects(copiedParts.map((part) => part.bbox)) ?? emptyRect();\n const glyphs = (shape.raw.glyphs ?? []).map((glyph, glyphPosition) => {\n const glyphParts = copiedParts.filter(\n (part) => part.glyphPosition === glyphPosition\n );\n\n return {\n ...glyph,\n bbox:\n combineRects(glyphParts.map((part) => part.bbox)) ??\n (glyph.bbox ? { ...glyph.bbox } : emptyRect()),\n partCount: glyphParts.length,\n };\n });\n\n return new PAShape({\n text: shape.text,\n parts: copiedParts,\n contours: [],\n glyphs,\n bbox,\n metrics: {\n ...shape.metrics,\n bbox,\n },\n edgeEpsilon: shape.edgeEpsilon,\n });\n}\n\nfunction createRegionCollection(shape) {\n return shape.parts.map((part) => ({\n outer: copyRing(part.outer),\n holes: part.holes.map((hole) => copyRing(hole)),\n bbox: { ...part.bbox },\n }));\n}\n\nfunction copyParts(parts) {\n return parts.map((part) => copyPart(part));\n}\n\nfunction copyPart(part) {\n return {\n ...part,\n outer: copyRing(part.outer),\n holes: part.holes.map((hole) => copyRing(hole)),\n anchors: part.anchors ? part.anchors.map((point) => [point[0], point[1]]) : undefined,\n bbox: { ...part.bbox },\n };\n}\n\nfunction copyContours(contours) {\n return contours.map((contour) => ({\n ...contour,\n bbox: { ...contour.bbox },\n ring: copyRing(contour.ring),\n }));\n}\n\nfunction extractGlyphText(text, glyphPosition, glyphCount) {\n if (glyphCount <= 1) {\n return text;\n }\n\n const glyphText = Array.from(text ?? \"\")[glyphPosition];\n return glyphText ?? \"\";\n}\n\nfunction normalizePointOptions(options = {}) {\n if (options == null) {\n return {\n step: 8,\n openWidth: 0,\n includeHoles: true,\n };\n }\n\n if (typeof options !== \"object\" || Array.isArray(options)) {\n throw new TypeError(\"toPoints() expects an options object.\");\n }\n\n return {\n step: normalizePositive(options.step, 8),\n openWidth: normalizePositive(options.openWidth, 0),\n includeHoles: options.includeHoles !== false,\n };\n}\n\nfunction normalizeShapeOptions(options = {}) {\n if (options == null) {\n return {\n step: 0,\n openWidth: 0,\n };\n }\n\n if (typeof options !== \"object\" || Array.isArray(options)) {\n throw new TypeError(\n \"toShape() and toRegions() expect an options object.\",\n );\n }\n\n return {\n step: normalizePositive(options.step, 0),\n openWidth: normalizePositive(options.openWidth, 0),\n };\n}\n\nfunction resolveShapeVariant(shape, options = {}) {\n const normalized = normalizeShapeOptions(options);\n\n if (normalized.step <= 0 && normalized.openWidth <= 0) {\n return shape;\n }\n\n const cacheKey = `${toCacheKey(normalized.step)}:${toCacheKey(normalized.openWidth)}`;\n const cached = shape._cache.shapes.get(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n let next = shape;\n\n if (normalized.openWidth > 0) {\n next = next.openHoles(normalized.openWidth);\n }\n\n if (normalized.step > 0) {\n next = next.resample(normalized.step);\n }\n\n shape._cache.shapes.set(cacheKey, next);\n return next;\n}\n\nfunction toCacheKey(value) {\n return normalizePositive(value, 0).toFixed(6);\n}\n\nfunction resolveGeometryEpsilon(width) {\n return Math.max(1e-4, normalizePositive(width, 1) * 1e-3);\n}\n\nfunction openPartWithSlit(part, width, epsilon) {\n if (!part.holes || part.holes.length === 0) {\n return copyPart(part);\n }\n\n let outer = copyRing(part.outer);\n const holes = part.holes.map((hole) => copyRing(hole));\n const anchors = [];\n\n while (holes.length > 0) {\n let selectedHoleIndex = -1;\n let selectedBridge = null;\n\n holes.forEach((hole, holeIndex) => {\n const blockers = holes.filter((_, index) => index !== holeIndex);\n const candidate = findBestHoleBridge(outer, hole, blockers, epsilon);\n\n if (\n candidate &&\n (!selectedBridge || candidate.distance < selectedBridge.distance)\n ) {\n selectedBridge = candidate;\n selectedHoleIndex = holeIndex;\n }\n });\n\n if (!selectedBridge || selectedHoleIndex === -1) {\n break;\n }\n\n const [hole] = holes.splice(selectedHoleIndex, 1);\n const merged = mergeHoleIntoOuter(outer, hole, selectedBridge, width, epsilon);\n outer = merged.ring;\n anchors.push(...merged.anchors);\n }\n\n return {\n ...part,\n outer,\n holes,\n anchors,\n bbox: ringBounds(outer),\n area:\n Math.abs(signedArea(outer)) -\n holes.reduce((sum, hole) => sum + Math.abs(signedArea(hole)), 0),\n };\n}\n\nfunction resamplePart(part, step) {\n const outer = resampleRing(part.outer, step, part.anchors ?? []);\n const holes = part.holes.map((hole) => resampleRing(hole, step));\n\n return {\n ...part,\n outer,\n holes,\n anchors: part.anchors ? part.anchors.map((point) => [point[0], point[1]]) : undefined,\n bbox: ringBounds(outer),\n area:\n Math.abs(signedArea(outer)) -\n holes.reduce((sum, hole) => sum + Math.abs(signedArea(hole)), 0),\n };\n}\n\nfunction findBestHoleBridge(outer, hole, blockers, epsilon) {\n let best = null;\n\n outer.forEach((outerPoint, outerIndex) => {\n hole.forEach((holePoint, holeIndex) => {\n if (\n !isVisibleBridge(\n outer,\n hole,\n blockers,\n outerPoint,\n holePoint,\n outerIndex,\n holeIndex,\n epsilon\n )\n ) {\n return;\n }\n\n const candidate = {\n outerIndex,\n holeIndex,\n distance: distance(outerPoint, holePoint),\n };\n\n if (!best || candidate.distance < best.distance) {\n best = candidate;\n }\n });\n });\n\n if (best) {\n return best;\n }\n\n return findNearestBridge(outer, hole);\n}\n\nfunction findNearestBridge(outer, hole) {\n let best = null;\n\n outer.forEach((outerPoint, outerIndex) => {\n hole.forEach((holePoint, holeIndex) => {\n const candidate = {\n outerIndex,\n holeIndex,\n distance: distance(outerPoint, holePoint),\n };\n\n if (!best || candidate.distance < best.distance) {\n best = candidate;\n }\n });\n });\n\n return best;\n}\n\nfunction isVisibleBridge(\n outer,\n hole,\n blockers,\n outerPoint,\n holePoint,\n outerIndex,\n holeIndex,\n epsilon\n) {\n if (distance(outerPoint, holePoint) <= epsilon) {\n return false;\n }\n\n const bridgeMidpoint = midpoint(outerPoint, holePoint);\n\n if (!pointInRing(bridgeMidpoint, outer) || pointInRing(bridgeMidpoint, hole)) {\n return false;\n }\n\n if (blockers.some((blocker) => pointInRing(bridgeMidpoint, blocker))) {\n return false;\n }\n\n if (\n segmentIntersectsRing(\n outerPoint,\n holePoint,\n outer,\n new Set([outerIndex, mod(outerIndex - 1, outer.length)]),\n epsilon\n )\n ) {\n return false;\n }\n\n if (\n segmentIntersectsRing(\n outerPoint,\n holePoint,\n hole,\n new Set([holeIndex, mod(holeIndex - 1, hole.length)]),\n epsilon\n )\n ) {\n return false;\n }\n\n return !blockers.some((blocker) =>\n segmentIntersectsRing(outerPoint, holePoint, blocker, new Set(), epsilon)\n );\n}\n\nfunction mergeHoleIntoOuter(outer, hole, bridge, width, epsilon) {\n const slitWidth = clampSlitWidth(width, outer, hole, epsilon);\n const outerCut = createRingCut(outer, bridge.outerIndex, slitWidth, epsilon);\n const holeCut = createRingCut(hole, bridge.holeIndex, slitWidth, epsilon);\n const outerPath = ringPath(\n outerCut.ring,\n outerCut.afterIndex,\n outerCut.beforeIndex\n );\n const holePath = ringPath(\n holeCut.ring,\n holeCut.afterIndex,\n holeCut.beforeIndex\n );\n const merged = [];\n\n appendPath(merged, outerPath, epsilon);\n appendPath(merged, holePath, epsilon);\n\n if (\n merged.length > 1 &&\n pointsAlmostEqual2D(merged[0], merged[merged.length - 1], epsilon)\n ) {\n merged.pop();\n }\n\n return {\n ring: merged,\n anchors: [\n outerCut.ring[outerCut.beforeIndex],\n holeCut.ring[holeCut.beforeIndex],\n holeCut.ring[holeCut.afterIndex],\n outerCut.ring[outerCut.afterIndex],\n ].map((point) => [point[0], point[1]]),\n };\n}\n\nfunction clampSlitWidth(width, outer, hole, epsilon) {\n const minPerimeter = Math.min(ringPerimeter(outer), ringPerimeter(hole));\n return Math.max(\n epsilon * 2,\n Math.min(width, Math.max(minPerimeter * 0.24, epsilon * 2))\n );\n}\n\nfunction createRingCut(ring, anchorIndex, width, epsilon) {\n const beforeCut = moveAlongRing(ring, anchorIndex, -width * 0.5, epsilon);\n const afterCut = moveAlongRing(ring, anchorIndex, width * 0.5, epsilon);\n\n return insertRingCutPoints(ring, beforeCut, afterCut, epsilon);\n}\n\nfunction moveAlongRing(ring, anchorIndex, offset, epsilon) {\n if (!Number.isFinite(offset) || Math.abs(offset) <= epsilon) {\n return {\n point: [ring[anchorIndex][0], ring[anchorIndex][1]],\n vertexIndex: anchorIndex,\n t: 0,\n };\n }\n\n let remaining = Math.abs(offset);\n let currentIndex = anchorIndex;\n const direction = offset > 0 ? 1 : -1;\n\n while (remaining > epsilon) {\n const nextIndex =\n direction > 0 ? (currentIndex + 1) % ring.length : mod(currentIndex - 1, ring.length);\n const segmentIndex = direction > 0 ? currentIndex : nextIndex;\n const segmentStart = ring[segmentIndex];\n const segmentEnd = ring[(segmentIndex + 1) % ring.length];\n const segmentLength = distance(segmentStart, segmentEnd);\n\n if (segmentLength <= epsilon) {\n currentIndex = direction > 0 ? nextIndex : segmentIndex;\n continue;\n }\n\n if (remaining < segmentLength - epsilon) {\n const t = remaining / segmentLength;\n const ratio = direction > 0 ? t : 1 - t;\n return {\n point: [\n segmentStart[0] + (segmentEnd[0] - segmentStart[0]) * ratio,\n segmentStart[1] + (segmentEnd[1] - segmentStart[1]) * ratio,\n ],\n segmentIndex,\n t: ratio,\n };\n }\n\n remaining -= segmentLength;\n currentIndex = direction > 0 ? nextIndex : segmentIndex;\n }\n\n return {\n point: [ring[currentIndex][0], ring[currentIndex][1]],\n vertexIndex: currentIndex,\n t: 0,\n };\n}\n\nfunction insertRingCutPoints(ring, beforeCut, afterCut, epsilon) {\n const cuts = [\n normalizeCutLocation(\"before\", ring, beforeCut, epsilon),\n normalizeCutLocation(\"after\", ring, afterCut, epsilon),\n ];\n const insertsBySegment = new Map();\n const cutIndices = {};\n const augmented = [];\n\n cuts.forEach((cut) => {\n if (cut.vertexIndex != null) {\n return;\n }\n\n const existing = insertsBySegment.get(cut.segmentIndex) ?? [];\n existing.push(cut);\n insertsBySegment.set(cut.segmentIndex, existing);\n });\n\n for (let index = 0; index < ring.length; index += 1) {\n augmented.push([ring[index][0], ring[index][1]]);\n\n cuts.forEach((cut) => {\n if (cut.vertexIndex === index) {\n cutIndices[cut.name] = augmented.length - 1;\n }\n });\n\n const segmentCuts = (insertsBySegment.get(index) ?? []).sort(\n (a, b) => a.t - b.t\n );\n\n segmentCuts.forEach((cut) => {\n augmented.push([cut.point[0], cut.point[1]]);\n cutIndices[cut.name] = augmented.length - 1;\n });\n }\n\n return {\n ring: augmented,\n beforeIndex: cutIndices.before,\n afterIndex: cutIndices.after,\n };\n}\n\nfunction normalizeCutLocation(name, ring, cut, epsilon) {\n if (cut.vertexIndex != null) {\n return {\n ...cut,\n name,\n };\n }\n\n const segmentStart = ring[cut.segmentIndex];\n const segmentEnd = ring[(cut.segmentIndex + 1) % ring.length];\n\n if (distance(cut.point, segmentStart) <= epsilon) {\n return {\n point: [segmentStart[0], segmentStart[1]],\n vertexIndex: cut.segmentIndex,\n t: 0,\n name,\n };\n }\n\n if (distance(cut.point, segmentEnd) <= epsilon) {\n return {\n point: [segmentEnd[0], segmentEnd[1]],\n vertexIndex: (cut.segmentIndex + 1) % ring.length,\n t: 1,\n name,\n };\n }\n\n return {\n ...cut,\n name,\n };\n}\n\nfunction ringPath(ring, startIndex, endIndex) {\n if (startIndex == null || endIndex == null) {\n return copyRing(ring);\n }\n\n const path = [ring[startIndex]];\n let cursor = startIndex;\n\n while (cursor !== endIndex) {\n cursor = (cursor + 1) % ring.length;\n path.push(ring[cursor]);\n }\n\n return path;\n}\n\nfunction appendPath(target, path, epsilon) {\n path.forEach((point) => {\n if (\n target.length === 0 ||\n !pointsAlmostEqual2D(target[target.length - 1], point, epsilon)\n ) {\n target.push([point[0], point[1]]);\n }\n });\n}\n\nfunction resampleRing(ring, step, anchors = []) {\n if (ring.length < 3) {\n return copyRing(ring);\n }\n\n const normalizedAnchors = normalizeAnchorPoints(ring, anchors);\n\n if (normalizedAnchors.length >= 2) {\n return resampleRingWithAnchors(ring, step, normalizedAnchors);\n }\n\n return resampleClosedPath(ring, step);\n}\n\nfunction normalizeAnchorPoints(ring, anchors) {\n const indices = anchors\n .map((anchor) => findRingPointIndex(ring, anchor))\n .filter((index) => index >= 0)\n .sort((a, b) => a - b);\n\n return indices.filter((index, position) => index !== indices[position - 1]);\n}\n\nfunction findRingPointIndex(ring, point, epsilon = 1e-6) {\n for (let index = 0; index < ring.length; index += 1) {\n if (pointsAlmostEqual2D(ring[index], point, epsilon)) {\n return index;\n }\n }\n\n return -1;\n}\n\nfunction resampleRingWithAnchors(ring, step, anchorIndices) {\n const result = [];\n\n for (let index = 0; index < anchorIndices.length; index += 1) {\n const startIndex = anchorIndices[index];\n const endIndex = anchorIndices[(index + 1) % anchorIndices.length];\n const path = ringPath(ring, startIndex, endIndex);\n const sampled = resampleOpenPath(path, step);\n\n appendPath(result, sampled, 1e-6);\n }\n\n if (\n result.length > 1 &&\n pointsAlmostEqual2D(result[0], result[result.length - 1], 1e-6)\n ) {\n result.pop();\n }\n\n if (result.length < 3 || result.length >= ring.length) {\n return copyRing(ring);\n }\n\n return result;\n}\n\nfunction resampleClosedPath(ring, step) {\n const perimeter = ringPerimeter(ring);\n\n if (perimeter <= 1e-9) {\n return copyRing(ring);\n }\n\n const pointCount = Math.max(3, Math.round(perimeter / step));\n\n if (pointCount >= ring.length) {\n return copyRing(ring);\n }\n\n const sampled = [];\n\n for (let index = 0; index < pointCount; index += 1) {\n const point = pointAtClosedPathDistance(ring, (perimeter * index) / pointCount);\n\n if (\n sampled.length === 0 ||\n !pointsAlmostEqual2D(sampled[sampled.length - 1], point, 1e-6)\n ) {\n sampled.push(point);\n }\n }\n\n if (sampled.length < 3 || sampled.length >= ring.length) {\n return copyRing(ring);\n }\n\n return sampled;\n}\n\nfunction resampleOpenPath(path, step) {\n if (path.length <= 2) {\n return path.map((point) => [point[0], point[1]]);\n }\n\n const length = polylineLength(path);\n\n if (length <= step) {\n return [\n [path[0][0], path[0][1]],\n [path[path.length - 1][0], path[path.length - 1][1]],\n ];\n }\n\n const divisionCount = Math.max(1, Math.round(length / step));\n const sampled = [];\n\n for (let index = 0; index <= divisionCount; index += 1) {\n const point = pointAtOpenPathDistance(path, (length * index) / divisionCount);\n\n if (\n sampled.length === 0 ||\n !pointsAlmostEqual2D(sampled[sampled.length - 1], point, 1e-6)\n ) {\n sampled.push(point);\n }\n }\n\n return sampled;\n}\n","import { load as loadFont, parse as parseFont } from \"opentype.js\";\nimport {\n buildGlyphTopology,\n flattenGlyphTopology,\n layoutGlyphs,\n measureText,\n normalizeTextOptions,\n toArrayBuffer,\n} from \"./core.js\";\nimport { createTextShape } from \"./shape.js\";\n\nexport class paFont {\n constructor(font) {\n this.font = font;\n this.unitsPerEm = font.unitsPerEm ?? 1000;\n this._glyphTopologyCache = new Map();\n this._glyphFlatCache = new Map();\n }\n\n static async load(source, options = {}) {\n const opts = normalizeLoadOptions(options);\n\n if (source instanceof ArrayBuffer || ArrayBuffer.isView(source)) {\n return new paFont(parseFont(toArrayBuffer(source)));\n }\n\n if (typeof window !== \"undefined\") {\n const requestUrl = resolveBrowserFontSource(source, opts.base);\n const bytes = await fetchFontBytes(requestUrl);\n return new paFont(parseFont(bytes));\n }\n\n const { target, loadOptions } = await resolveNodeFontSource(\n source,\n opts.base,\n );\n const font = await loadFont(target, undefined, loadOptions);\n return new paFont(font);\n }\n\n text(value, options = {}) {\n const opts = normalizeTextOptions(options);\n const layout = this._layoutText(String(value ?? \"\"), opts);\n return createTextShape(layout, opts, this);\n }\n\n glyph(value, options = {}) {\n const opts = normalizeTextOptions(options);\n const glyph = this.font.charToGlyph(String(value ?? \"\"));\n const layout = {\n text: String(value ?? \"\"),\n glyphs: [\n {\n glyph,\n x: opts.x,\n y: opts.y,\n size: opts.size,\n index: 0,\n },\n ],\n metrics: {\n width: (glyph.advanceWidth ?? 0) * (opts.size / this.unitsPerEm),\n x: opts.x,\n y: opts.y,\n size: opts.size,\n },\n };\n\n return createTextShape(layout, opts, this);\n }\n\n metrics(value, options = {}) {\n const opts = normalizeTextOptions(options);\n return measureText(this.font, String(value ?? \"\"), opts);\n }\n\n _getGlyphTopology(glyph) {\n const key = String(glyph.index);\n\n if (!this._glyphTopologyCache.has(key)) {\n this._glyphTopologyCache.set(\n key,\n buildGlyphTopology(glyph, this.unitsPerEm),\n );\n }\n\n return this._glyphTopologyCache.get(key);\n }\n\n _getFlattenedGlyph(glyph, opts) {\n const key = `${glyph.index}:${opts.size}:${opts.flatten}`;\n\n if (!this._glyphFlatCache.has(key)) {\n const topology = this._getGlyphTopology(glyph);\n this._glyphFlatCache.set(\n key,\n flattenGlyphTopology(topology, {\n size: opts.size,\n flatten: opts.flatten,\n }),\n );\n }\n\n return this._glyphFlatCache.get(key);\n }\n\n _layoutText(value, opts) {\n return layoutGlyphs(this.font, value, opts);\n }\n}\n\nasync function fetchFontBytes(source) {\n const response = await fetch(source);\n\n if (!response.ok) {\n throw new Error(\n `Failed to load font from ${source}: ${response.status} ${response.statusText}`,\n );\n }\n\n const bytes = await response.arrayBuffer();\n const signature = readSignature(bytes);\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n\n if (contentType.includes(\"text/html\") || isHtmlSignature(signature)) {\n throw new Error(\n `Font URL returned HTML instead of font data: ${source}. Use a public font URL like \"/assets/font.otf\", or pass { base: import.meta.url } when loading a module-relative string path. Plain string paths in the browser are resolved from the current page URL.`,\n );\n }\n\n return bytes;\n}\n\nfunction normalizeLoadOptions(options = {}) {\n if (options == null) {\n return {};\n }\n\n if (typeof options !== \"object\" || Array.isArray(options)) {\n throw new TypeError(\"paFont.load() options must be an object.\");\n }\n\n return options;\n}\n\nfunction resolveBrowserFontSource(source, base) {\n if (source instanceof URL) {\n return source.href;\n }\n\n if (typeof source !== \"string\") {\n throw new TypeError(\n \"paFont.load() expects a string, URL, ArrayBuffer, or ArrayBufferView.\",\n );\n }\n\n if (base == null) {\n return source;\n }\n\n return new URL(source, normalizeBase(base)).href;\n}\n\nasync function resolveNodeFontSource(source, base) {\n if (source instanceof URL) {\n return toNodeLoadTarget(source);\n }\n\n if (typeof source !== \"string\") {\n throw new TypeError(\n \"paFont.load() expects a string, URL, ArrayBuffer, or ArrayBufferView.\",\n );\n }\n\n if (base == null) {\n if (isLoadableUrlString(source)) {\n return toNodeLoadTarget(new URL(source));\n }\n\n return {\n target: source,\n loadOptions: undefined,\n };\n }\n\n return toNodeLoadTarget(new URL(source, normalizeBase(base)));\n}\n\nfunction normalizeBase(base) {\n if (base instanceof URL) {\n return base;\n }\n\n if (typeof base === \"string\") {\n return base;\n }\n\n throw new TypeError('paFont.load() option \"base\" must be a string or URL.');\n}\n\nasync function toNodeLoadTarget(url) {\n if (url.protocol === \"file:\") {\n return {\n target: fileUrlToPath(url),\n loadOptions: undefined,\n };\n }\n\n return {\n target: url.href,\n loadOptions: {\n isUrl: true,\n },\n };\n}\n\nfunction fileUrlToPath(url) {\n const pathname = decodeURIComponent(url.pathname);\n\n if (/^\\/[a-zA-Z]:/.test(pathname)) {\n return pathname.slice(1);\n }\n\n if (url.hostname) {\n return `//${url.hostname}${pathname}`;\n }\n\n return pathname;\n}\n\nfunction isLoadableUrlString(value) {\n return (\n value.startsWith(\"http://\") ||\n value.startsWith(\"https://\") ||\n value.startsWith(\"file://\")\n );\n}\n\nfunction readSignature(bytes) {\n const view = new Uint8Array(bytes, 0, Math.min(4, bytes.byteLength));\n let signature = \"\";\n\n for (const value of view) {\n signature += String.fromCharCode(value);\n }\n\n return signature.toLowerCase();\n}\n\nfunction isHtmlSignature(signature) {\n return signature === \"<!do\" || signature === \"<htm\";\n}\n\nexport default paFont;\n"],"mappings":"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"}
|
package/dist/paFont.js
CHANGED
|
@@ -1083,7 +1083,7 @@ function resampleOpenPath(path, step) {
|
|
|
1083
1083
|
}
|
|
1084
1084
|
//#endregion
|
|
1085
1085
|
//#region src/paFont/paFont.js
|
|
1086
|
-
var
|
|
1086
|
+
var paFont = class paFont {
|
|
1087
1087
|
constructor(font) {
|
|
1088
1088
|
this.font = font;
|
|
1089
1089
|
this.unitsPerEm = font.unitsPerEm ?? 1e3;
|
|
@@ -1092,10 +1092,10 @@ var PAFont = class PAFont {
|
|
|
1092
1092
|
}
|
|
1093
1093
|
static async load(source, options = {}) {
|
|
1094
1094
|
const opts = normalizeLoadOptions(options);
|
|
1095
|
-
if (source instanceof ArrayBuffer || ArrayBuffer.isView(source)) return new
|
|
1096
|
-
if (typeof window !== "undefined") return new
|
|
1095
|
+
if (source instanceof ArrayBuffer || ArrayBuffer.isView(source)) return new paFont(parse(toArrayBuffer(source)));
|
|
1096
|
+
if (typeof window !== "undefined") return new paFont(parse(await fetchFontBytes(resolveBrowserFontSource(source, opts.base))));
|
|
1097
1097
|
const { target, loadOptions } = await resolveNodeFontSource(source, opts.base);
|
|
1098
|
-
return new
|
|
1098
|
+
return new paFont(await load(target, void 0, loadOptions));
|
|
1099
1099
|
}
|
|
1100
1100
|
text(value, options = {}) {
|
|
1101
1101
|
const opts = normalizeTextOptions(options);
|
|
@@ -1155,18 +1155,18 @@ async function fetchFontBytes(source) {
|
|
|
1155
1155
|
}
|
|
1156
1156
|
function normalizeLoadOptions(options = {}) {
|
|
1157
1157
|
if (options == null) return {};
|
|
1158
|
-
if (typeof options !== "object" || Array.isArray(options)) throw new TypeError("
|
|
1158
|
+
if (typeof options !== "object" || Array.isArray(options)) throw new TypeError("paFont.load() options must be an object.");
|
|
1159
1159
|
return options;
|
|
1160
1160
|
}
|
|
1161
1161
|
function resolveBrowserFontSource(source, base) {
|
|
1162
1162
|
if (source instanceof URL) return source.href;
|
|
1163
|
-
if (typeof source !== "string") throw new TypeError("
|
|
1163
|
+
if (typeof source !== "string") throw new TypeError("paFont.load() expects a string, URL, ArrayBuffer, or ArrayBufferView.");
|
|
1164
1164
|
if (base == null) return source;
|
|
1165
1165
|
return new URL(source, normalizeBase(base)).href;
|
|
1166
1166
|
}
|
|
1167
1167
|
async function resolveNodeFontSource(source, base) {
|
|
1168
1168
|
if (source instanceof URL) return toNodeLoadTarget(source);
|
|
1169
|
-
if (typeof source !== "string") throw new TypeError("
|
|
1169
|
+
if (typeof source !== "string") throw new TypeError("paFont.load() expects a string, URL, ArrayBuffer, or ArrayBufferView.");
|
|
1170
1170
|
if (base == null) {
|
|
1171
1171
|
if (isLoadableUrlString(source)) return toNodeLoadTarget(new URL(source));
|
|
1172
1172
|
return {
|
|
@@ -1179,7 +1179,7 @@ async function resolveNodeFontSource(source, base) {
|
|
|
1179
1179
|
function normalizeBase(base) {
|
|
1180
1180
|
if (base instanceof URL) return base;
|
|
1181
1181
|
if (typeof base === "string") return base;
|
|
1182
|
-
throw new TypeError("
|
|
1182
|
+
throw new TypeError("paFont.load() option \"base\" must be a string or URL.");
|
|
1183
1183
|
}
|
|
1184
1184
|
async function toNodeLoadTarget(url) {
|
|
1185
1185
|
if (url.protocol === "file:") return {
|
|
@@ -1210,6 +1210,6 @@ function isHtmlSignature(signature) {
|
|
|
1210
1210
|
return signature === "<!do" || signature === "<htm";
|
|
1211
1211
|
}
|
|
1212
1212
|
//#endregion
|
|
1213
|
-
export {
|
|
1213
|
+
export { PAShape, paFont as default, paFont };
|
|
1214
1214
|
|
|
1215
1215
|
//# sourceMappingURL=paFont.js.map
|
package/dist/paFont.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paFont.js","names":["parseFont","loadFont"],"sources":["../src/paFont/geometry.js","../src/paFont/core.js","../src/paFont/shape.js","../src/paFont/paFont.js"],"sourcesContent":["export function toScreenPoint(point, scale) {\n return [point.x * scale, -point.y * scale];\n}\n\nexport function cloneRawPoint(point) {\n return { x: point.x, y: point.y };\n}\n\nexport function pushUniquePoint(points, point) {\n if (points.length === 0 || !pointsEqual2D(points[points.length - 1], point)) {\n points.push(point);\n }\n}\n\nexport function flattenQuadratic(p0, p1, p2, tolerance, out, depth = 0) {\n if (depth >= 12 || quadFlatness(p0, p1, p2) <= tolerance) {\n pushUniquePoint(out, p2);\n return;\n }\n\n const p01 = midpoint(p0, p1);\n const p12 = midpoint(p1, p2);\n const p012 = midpoint(p01, p12);\n\n flattenQuadratic(p0, p01, p012, tolerance, out, depth + 1);\n flattenQuadratic(p012, p12, p2, tolerance, out, depth + 1);\n}\n\nexport function flattenCubic(p0, p1, p2, p3, tolerance, out, depth = 0) {\n if (depth >= 12 || cubicFlatness(p0, p1, p2, p3) <= tolerance) {\n pushUniquePoint(out, p3);\n return;\n }\n\n const p01 = midpoint(p0, p1);\n const p12 = midpoint(p1, p2);\n const p23 = midpoint(p2, p3);\n const p012 = midpoint(p01, p12);\n const p123 = midpoint(p12, p23);\n const p0123 = midpoint(p012, p123);\n\n flattenCubic(p0, p01, p012, p0123, tolerance, out, depth + 1);\n flattenCubic(p0123, p123, p23, p3, tolerance, out, depth + 1);\n}\n\nfunction quadFlatness(p0, p1, p2) {\n return pointToLineDistance(p1, p0, p2);\n}\n\nfunction cubicFlatness(p0, p1, p2, p3) {\n return Math.max(\n pointToLineDistance(p1, p0, p3),\n pointToLineDistance(p2, p0, p3)\n );\n}\n\nfunction pointToLineDistance(point, lineStart, lineEnd) {\n const dx = lineEnd[0] - lineStart[0];\n const dy = lineEnd[1] - lineStart[1];\n const lengthSq = dx * dx + dy * dy;\n\n if (lengthSq === 0) {\n return distance(point, lineStart);\n }\n\n const area = Math.abs(\n dx * (lineStart[1] - point[1]) - (lineStart[0] - point[0]) * dy\n );\n\n return area / Math.sqrt(lengthSq);\n}\n\nexport function midpoint(a, b) {\n return [(a[0] + b[0]) * 0.5, (a[1] + b[1]) * 0.5];\n}\n\nexport function signedArea(ring) {\n let area = 0;\n\n for (let index = 0; index < ring.length; index += 1) {\n const current = ring[index];\n const next = ring[(index + 1) % ring.length];\n area += current[0] * next[1] - next[0] * current[1];\n }\n\n return area * 0.5;\n}\n\nexport function pointInRing(point, ring) {\n let inside = false;\n\n for (let i = 0, j = ring.length - 1; i < ring.length; j = i, i += 1) {\n const xi = ring[i][0];\n const yi = ring[i][1];\n const xj = ring[j][0];\n const yj = ring[j][1];\n const intersects =\n yi > point[1] !== yj > point[1] &&\n point[0] < ((xj - xi) * (point[1] - yi)) / (yj - yi || 1e-9) + xi;\n\n if (intersects) {\n inside = !inside;\n }\n }\n\n return inside;\n}\n\nexport function hitPart(point, part, epsilon) {\n if (!rectContainsPoint(part.bbox, point, epsilon)) {\n return \"outside\";\n }\n\n if (isPointOnRingEdge(point, part.outer, epsilon)) {\n return \"edge\";\n }\n\n if (!pointInRing(point, part.outer)) {\n return \"outside\";\n }\n\n for (const hole of part.holes) {\n if (isPointOnRingEdge(point, hole, epsilon)) {\n return \"edge\";\n }\n\n if (pointInRing(point, hole)) {\n return \"hole\";\n }\n }\n\n return \"fill\";\n}\n\nfunction isPointOnRingEdge(point, ring, epsilon) {\n for (let index = 0; index < ring.length; index += 1) {\n const a = ring[index];\n const b = ring[(index + 1) % ring.length];\n\n if (distancePointToSegment(point, a, b) <= epsilon) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction distancePointToSegment(point, a, b) {\n const dx = b[0] - a[0];\n const dy = b[1] - a[1];\n const lengthSq = dx * dx + dy * dy;\n\n if (lengthSq === 0) {\n return distance(point, a);\n }\n\n let t = ((point[0] - a[0]) * dx + (point[1] - a[1]) * dy) / lengthSq;\n t = Math.max(0, Math.min(1, t));\n\n const projection = [a[0] + dx * t, a[1] + dy * t];\n return distance(point, projection);\n}\n\nexport function distance(a, b) {\n const dx = a[0] - b[0];\n const dy = a[1] - b[1];\n return Math.sqrt(dx * dx + dy * dy);\n}\n\nexport function sampleRing(ring, step, callback) {\n for (let index = 0; index < ring.length; index += 1) {\n const a = ring[index];\n const b = ring[(index + 1) % ring.length];\n const segmentLength = distance(a, b);\n const divisions = Math.max(1, Math.ceil(segmentLength / step));\n\n for (let offset = 0; offset < divisions; offset += 1) {\n if (index > 0 || offset > 0) {\n const t = offset / divisions;\n callback([\n a[0] + (b[0] - a[0]) * t,\n a[1] + (b[1] - a[1]) * t,\n ]);\n } else {\n callback([a[0], a[1]]);\n }\n }\n }\n}\n\nexport function ringBounds(ring) {\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n\n ring.forEach((point) => {\n minX = Math.min(minX, point[0]);\n minY = Math.min(minY, point[1]);\n maxX = Math.max(maxX, point[0]);\n maxY = Math.max(maxY, point[1]);\n });\n\n return {\n x: minX,\n y: minY,\n w: maxX - minX,\n h: maxY - minY,\n };\n}\n\nexport function translateRing(ring, tx, ty) {\n return ring.map((point) => [point[0] + tx, point[1] + ty]);\n}\n\nexport function translateRect(rect, tx, ty) {\n return {\n x: rect.x + tx,\n y: rect.y + ty,\n w: rect.w,\n h: rect.h,\n };\n}\n\nexport function copyRing(ring) {\n return ring.map((point) => [point[0], point[1]]);\n}\n\nexport function combineRects(rects) {\n if (rects.length === 0) {\n return null;\n }\n\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n\n rects.forEach((rect) => {\n minX = Math.min(minX, rect.x);\n minY = Math.min(minY, rect.y);\n maxX = Math.max(maxX, rect.x + rect.w);\n maxY = Math.max(maxY, rect.y + rect.h);\n });\n\n return {\n x: minX,\n y: minY,\n w: maxX - minX,\n h: maxY - minY,\n };\n}\n\nexport function rectContainsRect(outer, inner, epsilon = 1e-6) {\n return (\n inner.x >= outer.x - epsilon &&\n inner.y >= outer.y - epsilon &&\n inner.x + inner.w <= outer.x + outer.w + epsilon &&\n inner.y + inner.h <= outer.y + outer.h + epsilon\n );\n}\n\nexport function rectContainsPoint(rect, point, epsilon = 0) {\n return (\n point[0] >= rect.x - epsilon &&\n point[0] <= rect.x + rect.w + epsilon &&\n point[1] >= rect.y - epsilon &&\n point[1] <= rect.y + rect.h + epsilon\n );\n}\n\nexport function emptyRect() {\n return { x: 0, y: 0, w: 0, h: 0 };\n}\n\nexport function normalizeNumber(value, fallback) {\n return Number.isFinite(value) ? value : fallback;\n}\n\nexport function normalizePositive(value, fallback) {\n return Number.isFinite(value) && value > 0 ? value : fallback;\n}\n\nexport function samePoint(a, b) {\n return a.x === b.x && a.y === b.y;\n}\n\nexport function pointsEqual2D(a, b) {\n return a[0] === b[0] && a[1] === b[1];\n}\n\nexport function pointsAlmostEqual2D(a, b, epsilon = 1e-6) {\n return Math.abs(a[0] - b[0]) <= epsilon && Math.abs(a[1] - b[1]) <= epsilon;\n}\n\nexport function ringPerimeter(ring) {\n let total = 0;\n\n for (let index = 0; index < ring.length; index += 1) {\n total += distance(ring[index], ring[(index + 1) % ring.length]);\n }\n\n return total;\n}\n\nexport function polylineLength(path) {\n let total = 0;\n\n for (let index = 0; index < path.length - 1; index += 1) {\n total += distance(path[index], path[index + 1]);\n }\n\n return total;\n}\n\nexport function pointAtClosedPathDistance(ring, distanceAlong) {\n const perimeter = ringPerimeter(ring);\n\n if (perimeter <= 1e-9) {\n return [ring[0][0], ring[0][1]];\n }\n\n let remaining = mod(distanceAlong, perimeter);\n\n for (let index = 0; index < ring.length; index += 1) {\n const start = ring[index];\n const end = ring[(index + 1) % ring.length];\n const segmentLength = distance(start, end);\n\n if (segmentLength <= 1e-9) {\n continue;\n }\n\n if (remaining <= segmentLength) {\n const t = remaining / segmentLength;\n return [\n start[0] + (end[0] - start[0]) * t,\n start[1] + (end[1] - start[1]) * t,\n ];\n }\n\n remaining -= segmentLength;\n }\n\n return [ring[ring.length - 1][0], ring[ring.length - 1][1]];\n}\n\nexport function pointAtOpenPathDistance(path, distanceAlong) {\n if (distanceAlong <= 0) {\n return [path[0][0], path[0][1]];\n }\n\n let remaining = distanceAlong;\n\n for (let index = 0; index < path.length - 1; index += 1) {\n const start = path[index];\n const end = path[index + 1];\n const segmentLength = distance(start, end);\n\n if (segmentLength <= 1e-9) {\n continue;\n }\n\n if (remaining <= segmentLength) {\n const t = remaining / segmentLength;\n return [\n start[0] + (end[0] - start[0]) * t,\n start[1] + (end[1] - start[1]) * t,\n ];\n }\n\n remaining -= segmentLength;\n }\n\n return [path[path.length - 1][0], path[path.length - 1][1]];\n}\n\nexport function segmentIntersectsRing(a, b, ring, ignoredEdges, epsilon) {\n for (let index = 0; index < ring.length; index += 1) {\n if (ignoredEdges.has(index)) {\n continue;\n }\n\n const c = ring[index];\n const d = ring[(index + 1) % ring.length];\n\n if (segmentsIntersect(a, b, c, d, epsilon)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction segmentsIntersect(a, b, c, d, epsilon) {\n const o1 = orientation(a, b, c);\n const o2 = orientation(a, b, d);\n const o3 = orientation(c, d, a);\n const o4 = orientation(c, d, b);\n\n if (\n ((o1 > epsilon && o2 < -epsilon) || (o1 < -epsilon && o2 > epsilon)) &&\n ((o3 > epsilon && o4 < -epsilon) || (o3 < -epsilon && o4 > epsilon))\n ) {\n return true;\n }\n\n if (Math.abs(o1) <= epsilon && pointOnSegment(c, a, b, epsilon)) {\n return true;\n }\n\n if (Math.abs(o2) <= epsilon && pointOnSegment(d, a, b, epsilon)) {\n return true;\n }\n\n if (Math.abs(o3) <= epsilon && pointOnSegment(a, c, d, epsilon)) {\n return true;\n }\n\n if (Math.abs(o4) <= epsilon && pointOnSegment(b, c, d, epsilon)) {\n return true;\n }\n\n return false;\n}\n\nfunction orientation(a, b, c) {\n return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\n}\n\nfunction pointOnSegment(point, start, end, epsilon) {\n return (\n point[0] >= Math.min(start[0], end[0]) - epsilon &&\n point[0] <= Math.max(start[0], end[0]) + epsilon &&\n point[1] >= Math.min(start[1], end[1]) - epsilon &&\n point[1] <= Math.max(start[1], end[1]) + epsilon\n );\n}\n\nexport function mod(value, divisor) {\n return ((value % divisor) + divisor) % divisor;\n}\n","import {\n cloneRawPoint,\n combineRects,\n copyRing,\n emptyRect,\n flattenCubic,\n flattenQuadratic,\n normalizeNumber,\n normalizePositive,\n pointInRing,\n pointsEqual2D,\n pushUniquePoint,\n rectContainsRect,\n ringBounds,\n samePoint,\n signedArea,\n toScreenPoint,\n translateRect,\n translateRing,\n} from \"./geometry.js\";\n\nexport function layoutGlyphs(font, value, opts) {\n const glyphs = [];\n const renderOptions = toRenderOptions(opts);\n const endX = font.forEachGlyph(\n value,\n opts.x,\n opts.y,\n opts.size,\n renderOptions,\n (glyph, x, y, size) => {\n glyphs.push({\n glyph,\n x,\n y,\n size,\n index: glyphs.length,\n });\n }\n );\n\n return {\n text: value,\n glyphs,\n metrics: {\n width: endX - opts.x,\n x: opts.x,\n y: opts.y,\n size: opts.size,\n },\n };\n}\n\nexport function measureText(font, value, opts) {\n const renderOptions = toRenderOptions(opts);\n const path = font.getPath(value, opts.x, opts.y, opts.size, renderOptions);\n const box = path.getBoundingBox();\n\n return {\n width: font.getAdvanceWidth(value, opts.size, renderOptions),\n bbox: {\n x: box.x1,\n y: box.y1,\n w: box.x2 - box.x1,\n h: box.y2 - box.y1,\n },\n };\n}\n\nexport function buildGlyphTopology(glyph, fallbackUnitsPerEm) {\n const commands = glyph.path?.commands ?? [];\n const contours = [];\n let contourId = 0;\n let current = null;\n\n const finishCurrentContour = () => {\n if (!current || current.segments.length === 0) {\n current = null;\n return;\n }\n\n if (!samePoint(current.cursor, current.start)) {\n current.segments.push({\n type: \"L\",\n from: cloneRawPoint(current.cursor),\n to: cloneRawPoint(current.start),\n });\n current.cursor = cloneRawPoint(current.start);\n }\n\n contours.push({\n id: contourId++,\n start: cloneRawPoint(current.start),\n segments: current.segments,\n });\n current = null;\n };\n\n commands.forEach((cmd) => {\n if (cmd.type === \"M\") {\n finishCurrentContour();\n current = {\n start: { x: cmd.x, y: cmd.y },\n cursor: { x: cmd.x, y: cmd.y },\n segments: [],\n };\n return;\n }\n\n if (!current) {\n return;\n }\n\n if (cmd.type === \"L\") {\n const to = { x: cmd.x, y: cmd.y };\n current.segments.push({\n type: \"L\",\n from: cloneRawPoint(current.cursor),\n to,\n });\n current.cursor = cloneRawPoint(to);\n return;\n }\n\n if (cmd.type === \"Q\") {\n const to = { x: cmd.x, y: cmd.y };\n current.segments.push({\n type: \"Q\",\n from: cloneRawPoint(current.cursor),\n c1: { x: cmd.x1, y: cmd.y1 },\n to,\n });\n current.cursor = cloneRawPoint(to);\n return;\n }\n\n if (cmd.type === \"C\") {\n const to = { x: cmd.x, y: cmd.y };\n current.segments.push({\n type: \"C\",\n from: cloneRawPoint(current.cursor),\n c1: { x: cmd.x1, y: cmd.y1 },\n c2: { x: cmd.x2, y: cmd.y2 },\n to,\n });\n current.cursor = cloneRawPoint(to);\n return;\n }\n\n if (cmd.type === \"Z\") {\n finishCurrentContour();\n }\n });\n\n finishCurrentContour();\n\n return {\n glyphIndex: glyph.index,\n advanceWidth: glyph.advanceWidth ?? 0,\n unitsPerEm: glyph.path?.unitsPerEm ?? fallbackUnitsPerEm ?? 1000,\n contours,\n };\n}\n\nexport function flattenGlyphTopology(topology, options) {\n const scale = options.size / topology.unitsPerEm;\n const contours = topology.contours\n .map((contour) => flattenContour(contour, scale, options.flatten))\n .filter(Boolean);\n const classifiedContours = classifyContours(contours);\n const parts = buildParts(classifiedContours);\n const bbox = combineRects(parts.map((part) => part.bbox)) ?? emptyRect();\n\n return {\n glyphIndex: topology.glyphIndex,\n advanceWidth: topology.advanceWidth * scale,\n contours: classifiedContours,\n parts,\n bbox,\n };\n}\n\nfunction flattenContour(contour, scale, tolerance) {\n const ring = [];\n const start = toScreenPoint(contour.start, scale);\n pushUniquePoint(ring, start);\n\n contour.segments.forEach((segment) => {\n if (segment.type === \"L\") {\n pushUniquePoint(ring, toScreenPoint(segment.to, scale));\n return;\n }\n\n if (segment.type === \"Q\") {\n flattenQuadratic(\n toScreenPoint(segment.from, scale),\n toScreenPoint(segment.c1, scale),\n toScreenPoint(segment.to, scale),\n tolerance,\n ring\n );\n return;\n }\n\n if (segment.type === \"C\") {\n flattenCubic(\n toScreenPoint(segment.from, scale),\n toScreenPoint(segment.c1, scale),\n toScreenPoint(segment.c2, scale),\n toScreenPoint(segment.to, scale),\n tolerance,\n ring\n );\n }\n });\n\n if (ring.length > 1 && pointsEqual2D(ring[0], ring[ring.length - 1])) {\n ring.pop();\n }\n\n if (ring.length < 3) {\n return null;\n }\n\n const bbox = ringBounds(ring);\n const area = signedArea(ring);\n\n return {\n id: contour.id,\n ring,\n bbox,\n area,\n };\n}\n\nfunction classifyContours(contours) {\n const result = contours.map((contour) => ({\n ...contour,\n parentId: null,\n depth: 0,\n role: \"outer\",\n }));\n\n result.forEach((child) => {\n let parent = null;\n let parentArea = Number.POSITIVE_INFINITY;\n\n result.forEach((candidate) => {\n if (candidate.id === child.id) {\n return;\n }\n\n if (Math.abs(candidate.area) <= Math.abs(child.area)) {\n return;\n }\n\n if (!rectContainsRect(candidate.bbox, child.bbox)) {\n return;\n }\n\n if (!pointInRing(child.ring[0], candidate.ring)) {\n return;\n }\n\n const candidateArea = Math.abs(candidate.area);\n if (candidateArea < parentArea) {\n parent = candidate;\n parentArea = candidateArea;\n }\n });\n\n if (parent) {\n child.parentId = parent.id;\n }\n });\n\n const byId = new Map(result.map((contour) => [contour.id, contour]));\n\n const resolveDepth = (contour) => {\n if (contour.parentId == null) {\n return 0;\n }\n\n const parent = byId.get(contour.parentId);\n return resolveDepth(parent) + 1;\n };\n\n result.forEach((contour) => {\n contour.depth = resolveDepth(contour);\n contour.role = contour.depth % 2 === 0 ? \"outer\" : \"hole\";\n });\n\n return result;\n}\n\nfunction buildParts(contours) {\n return contours\n .filter((contour) => contour.role === \"outer\")\n .map((outer) => {\n const holeContours = contours.filter(\n (contour) => contour.parentId === outer.id && contour.role === \"hole\"\n );\n\n return {\n outer: copyRing(outer.ring),\n holes: holeContours.map((hole) => copyRing(hole.ring)),\n bbox: { ...outer.bbox },\n area:\n Math.abs(outer.area) -\n holeContours.reduce((sum, hole) => sum + Math.abs(hole.area), 0),\n };\n });\n}\n\nexport function translateGlyphGeometry(geometry, tx, ty, glyphPosition) {\n const parts = geometry.parts.map((part, partIndex) => ({\n outer: translateRing(part.outer, tx, ty),\n holes: part.holes.map((hole) => translateRing(hole, tx, ty)),\n bbox: translateRect(part.bbox, tx, ty),\n area: part.area,\n glyphPosition,\n partIndex,\n }));\n\n const contours = geometry.contours.map((contour) => ({\n id: `${glyphPosition}:${contour.id}`,\n sourceId: contour.id,\n glyphPosition,\n parentId:\n contour.parentId == null ? null : `${glyphPosition}:${contour.parentId}`,\n depth: contour.depth,\n role: contour.role,\n area: contour.area,\n bbox: translateRect(contour.bbox, tx, ty),\n ring: translateRing(contour.ring, tx, ty),\n }));\n\n return {\n parts,\n contours,\n bbox: translateRect(geometry.bbox, tx, ty),\n };\n}\n\nexport function normalizeTextOptions(options = {}) {\n const size = normalizePositive(options.size, 72);\n\n return {\n x: normalizeNumber(options.x, 0),\n y: normalizeNumber(options.y, 0),\n size,\n flatten: normalizePositive(options.flatten, 1.25),\n edgeEpsilon:\n options.edgeEpsilon == null\n ? defaultEdgeEpsilon(size)\n : normalizePositive(options.edgeEpsilon, defaultEdgeEpsilon(size)),\n kerning: options.kerning !== false,\n letterSpacing:\n options.letterSpacing == null\n ? undefined\n : normalizeNumber(options.letterSpacing, 0),\n tracking:\n options.tracking == null\n ? undefined\n : normalizeNumber(options.tracking, 0),\n script: options.script,\n language: options.language,\n features: options.features,\n };\n}\n\nfunction defaultEdgeEpsilon(size) {\n return Math.min(1, Math.max(0.01, size * 0.0025));\n}\n\nfunction toRenderOptions(opts) {\n const renderOptions = {\n kerning: opts.kerning,\n };\n\n if (opts.letterSpacing != null) {\n renderOptions.letterSpacing = opts.letterSpacing;\n }\n\n if (opts.tracking != null) {\n renderOptions.tracking = opts.tracking;\n }\n\n if (opts.script) {\n renderOptions.script = opts.script;\n }\n\n if (opts.language) {\n renderOptions.language = opts.language;\n }\n\n if (opts.features) {\n renderOptions.features = opts.features;\n }\n\n return renderOptions;\n}\n\nexport function toArrayBuffer(value) {\n if (value instanceof ArrayBuffer) {\n return value;\n }\n\n if (ArrayBuffer.isView(value)) {\n return value.buffer.slice(value.byteOffset, value.byteOffset + value.byteLength);\n }\n\n return value;\n}\n","import {\n combineRects,\n copyRing,\n distance,\n emptyRect,\n hitPart,\n midpoint,\n mod,\n normalizePositive,\n pointAtClosedPathDistance,\n pointAtOpenPathDistance,\n pointInRing,\n pointsAlmostEqual2D,\n polylineLength,\n rectContainsPoint,\n ringBounds,\n ringPerimeter,\n sampleRing,\n segmentIntersectsRing,\n signedArea,\n} from \"./geometry.js\";\nimport { translateGlyphGeometry } from \"./core.js\";\n\nexport class PAShape {\n constructor({ text, parts, contours, glyphs, bbox, metrics, edgeEpsilon }) {\n this.text = text;\n this.parts = parts;\n this.bbox = bbox;\n this.metrics = metrics;\n this.edgeEpsilon = edgeEpsilon;\n this.raw = {\n contours,\n glyphs,\n };\n this._cache = {\n glyphs: null,\n openHoles: new Map(),\n resample: new Map(),\n shapes: new Map(),\n regionViews: null,\n };\n }\n\n get polygons() {\n return this.parts.map((part) => [part.outer, ...part.holes]);\n }\n\n [Symbol.iterator]() {\n return this._getRegionViews()[Symbol.iterator]();\n }\n\n glyphs() {\n if (this._cache.glyphs) {\n return this._cache.glyphs;\n }\n\n if (!Array.isArray(this.raw.glyphs) || this.raw.glyphs.length <= 1) {\n this._cache.glyphs = [this];\n return this._cache.glyphs;\n }\n\n this._cache.glyphs = this.raw.glyphs.map((_, glyphPosition) =>\n createGlyphShape(this, glyphPosition)\n );\n\n return this._cache.glyphs;\n }\n\n toShape(options = {}) {\n return resolveShapeVariant(this, options);\n }\n\n toRegions(options = {}) {\n const shape = this.toShape(options);\n return createRegionCollection(shape);\n }\n\n openHoles(width) {\n const slitWidth = normalizePositive(width, 0);\n\n if (slitWidth <= 0 || !this.parts.some((part) => part.holes.length > 0)) {\n return this;\n }\n\n const cacheKey = toCacheKey(slitWidth);\n const cached = this._cache.openHoles.get(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n const geometryEpsilon = resolveGeometryEpsilon(slitWidth);\n\n const shape = createDerivedShape(\n this,\n this.parts.map((part) => openPartWithSlit(part, slitWidth, geometryEpsilon))\n );\n\n this._cache.openHoles.set(cacheKey, shape);\n return shape;\n }\n\n resample(step) {\n const spacing = normalizePositive(step, 0);\n\n if (spacing <= 0) {\n return this;\n }\n\n const cacheKey = toCacheKey(spacing);\n const cached = this._cache.resample.get(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n const shape = createDerivedShape(\n this,\n this.parts.map((part) => resamplePart(part, spacing))\n );\n\n this._cache.resample.set(cacheKey, shape);\n return shape;\n }\n\n hit(x, y, epsilon = this.edgeEpsilon) {\n const point = [x, y];\n\n if (!rectContainsPoint(this.bbox, point, epsilon)) {\n return \"outside\";\n }\n\n let holeHit = false;\n\n for (const part of this.parts) {\n const result = hitPart(point, part, epsilon);\n\n if (result === \"edge\" || result === \"fill\") {\n return result;\n }\n\n if (result === \"hole\") {\n holeHit = true;\n }\n }\n\n return holeHit ? \"hole\" : \"outside\";\n }\n\n contains(x, y, epsilon = this.edgeEpsilon) {\n return this.hit(x, y, epsilon) === \"fill\";\n }\n\n toPoints(options = {}) {\n const opts = normalizePointOptions(options);\n const shape =\n opts.openWidth > 0 ? this.toShape({ openWidth: opts.openWidth }) : this;\n const step = opts.step;\n const includeHoles = opts.includeHoles;\n const sampled = [];\n\n shape.parts.forEach((part, partIndex) => {\n sampleRing(part.outer, step, (point) => {\n sampled.push({\n x: point[0],\n y: point[1],\n partIndex,\n hole: false,\n });\n });\n\n if (!includeHoles) {\n return;\n }\n\n part.holes.forEach((hole, holeIndex) => {\n sampleRing(hole, step, (point) => {\n sampled.push({\n x: point[0],\n y: point[1],\n partIndex,\n hole: true,\n holeIndex,\n });\n });\n });\n });\n\n return sampled;\n }\n\n _getRegionViews() {\n if (!this._cache.regionViews) {\n this._cache.regionViews = this.parts.map((part) =>\n Object.freeze({\n outer: part.outer,\n holes: part.holes,\n bbox: part.bbox,\n })\n );\n }\n\n return this._cache.regionViews;\n }\n}\n\nexport function createTextShape(layout, opts, fontInstance) {\n const parts = [];\n const contours = [];\n const glyphs = [];\n\n layout.glyphs.forEach((item, glyphPosition) => {\n const localGeometry = fontInstance._getFlattenedGlyph(item.glyph, opts);\n const translated = translateGlyphGeometry(\n localGeometry,\n item.x,\n item.y,\n glyphPosition\n );\n\n parts.push(...translated.parts);\n contours.push(...translated.contours);\n glyphs.push({\n position: glyphPosition,\n glyphIndex: item.glyph.index,\n x: item.x,\n y: item.y,\n size: item.size,\n bbox: translated.bbox,\n partCount: translated.parts.length,\n });\n });\n\n const bbox = combineRects(parts.map((part) => part.bbox)) ?? emptyRect();\n\n return new PAShape({\n text: layout.text,\n parts,\n contours,\n glyphs,\n bbox,\n metrics: {\n ...layout.metrics,\n bbox,\n },\n edgeEpsilon: opts.edgeEpsilon,\n });\n}\n\nfunction createGlyphShape(shape, glyphPosition) {\n const glyphMeta = shape.raw.glyphs?.[glyphPosition] ?? null;\n const parts = copyParts(\n shape.parts.filter((part) => part.glyphPosition === glyphPosition)\n );\n const contours = copyContours(\n (shape.raw.contours ?? []).filter(\n (contour) => contour.glyphPosition === glyphPosition\n )\n );\n const bbox =\n combineRects(parts.map((part) => part.bbox)) ??\n (glyphMeta?.bbox ? { ...glyphMeta.bbox } : emptyRect());\n\n return new PAShape({\n text: extractGlyphText(shape.text, glyphPosition, shape.raw.glyphs?.length ?? 0),\n parts,\n contours,\n glyphs: glyphMeta ? [{ ...glyphMeta, bbox, partCount: parts.length }] : [],\n bbox,\n metrics: {\n x: glyphMeta?.x ?? shape.metrics?.x ?? 0,\n y: glyphMeta?.y ?? shape.metrics?.y ?? 0,\n size: glyphMeta?.size ?? shape.metrics?.size ?? 0,\n width: bbox.w,\n bbox,\n },\n edgeEpsilon: shape.edgeEpsilon,\n });\n}\n\nfunction createDerivedShape(shape, parts) {\n const copiedParts = copyParts(parts);\n const bbox = combineRects(copiedParts.map((part) => part.bbox)) ?? emptyRect();\n const glyphs = (shape.raw.glyphs ?? []).map((glyph, glyphPosition) => {\n const glyphParts = copiedParts.filter(\n (part) => part.glyphPosition === glyphPosition\n );\n\n return {\n ...glyph,\n bbox:\n combineRects(glyphParts.map((part) => part.bbox)) ??\n (glyph.bbox ? { ...glyph.bbox } : emptyRect()),\n partCount: glyphParts.length,\n };\n });\n\n return new PAShape({\n text: shape.text,\n parts: copiedParts,\n contours: [],\n glyphs,\n bbox,\n metrics: {\n ...shape.metrics,\n bbox,\n },\n edgeEpsilon: shape.edgeEpsilon,\n });\n}\n\nfunction createRegionCollection(shape) {\n return shape.parts.map((part) => ({\n outer: copyRing(part.outer),\n holes: part.holes.map((hole) => copyRing(hole)),\n bbox: { ...part.bbox },\n }));\n}\n\nfunction copyParts(parts) {\n return parts.map((part) => copyPart(part));\n}\n\nfunction copyPart(part) {\n return {\n ...part,\n outer: copyRing(part.outer),\n holes: part.holes.map((hole) => copyRing(hole)),\n anchors: part.anchors ? part.anchors.map((point) => [point[0], point[1]]) : undefined,\n bbox: { ...part.bbox },\n };\n}\n\nfunction copyContours(contours) {\n return contours.map((contour) => ({\n ...contour,\n bbox: { ...contour.bbox },\n ring: copyRing(contour.ring),\n }));\n}\n\nfunction extractGlyphText(text, glyphPosition, glyphCount) {\n if (glyphCount <= 1) {\n return text;\n }\n\n const glyphText = Array.from(text ?? \"\")[glyphPosition];\n return glyphText ?? \"\";\n}\n\nfunction normalizePointOptions(options = {}) {\n if (options == null) {\n return {\n step: 8,\n openWidth: 0,\n includeHoles: true,\n };\n }\n\n if (typeof options !== \"object\" || Array.isArray(options)) {\n throw new TypeError(\"toPoints() expects an options object.\");\n }\n\n return {\n step: normalizePositive(options.step, 8),\n openWidth: normalizePositive(options.openWidth, 0),\n includeHoles: options.includeHoles !== false,\n };\n}\n\nfunction normalizeShapeOptions(options = {}) {\n if (options == null) {\n return {\n step: 0,\n openWidth: 0,\n };\n }\n\n if (typeof options !== \"object\" || Array.isArray(options)) {\n throw new TypeError(\n \"toShape() and toRegions() expect an options object.\",\n );\n }\n\n return {\n step: normalizePositive(options.step, 0),\n openWidth: normalizePositive(options.openWidth, 0),\n };\n}\n\nfunction resolveShapeVariant(shape, options = {}) {\n const normalized = normalizeShapeOptions(options);\n\n if (normalized.step <= 0 && normalized.openWidth <= 0) {\n return shape;\n }\n\n const cacheKey = `${toCacheKey(normalized.step)}:${toCacheKey(normalized.openWidth)}`;\n const cached = shape._cache.shapes.get(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n let next = shape;\n\n if (normalized.openWidth > 0) {\n next = next.openHoles(normalized.openWidth);\n }\n\n if (normalized.step > 0) {\n next = next.resample(normalized.step);\n }\n\n shape._cache.shapes.set(cacheKey, next);\n return next;\n}\n\nfunction toCacheKey(value) {\n return normalizePositive(value, 0).toFixed(6);\n}\n\nfunction resolveGeometryEpsilon(width) {\n return Math.max(1e-4, normalizePositive(width, 1) * 1e-3);\n}\n\nfunction openPartWithSlit(part, width, epsilon) {\n if (!part.holes || part.holes.length === 0) {\n return copyPart(part);\n }\n\n let outer = copyRing(part.outer);\n const holes = part.holes.map((hole) => copyRing(hole));\n const anchors = [];\n\n while (holes.length > 0) {\n let selectedHoleIndex = -1;\n let selectedBridge = null;\n\n holes.forEach((hole, holeIndex) => {\n const blockers = holes.filter((_, index) => index !== holeIndex);\n const candidate = findBestHoleBridge(outer, hole, blockers, epsilon);\n\n if (\n candidate &&\n (!selectedBridge || candidate.distance < selectedBridge.distance)\n ) {\n selectedBridge = candidate;\n selectedHoleIndex = holeIndex;\n }\n });\n\n if (!selectedBridge || selectedHoleIndex === -1) {\n break;\n }\n\n const [hole] = holes.splice(selectedHoleIndex, 1);\n const merged = mergeHoleIntoOuter(outer, hole, selectedBridge, width, epsilon);\n outer = merged.ring;\n anchors.push(...merged.anchors);\n }\n\n return {\n ...part,\n outer,\n holes,\n anchors,\n bbox: ringBounds(outer),\n area:\n Math.abs(signedArea(outer)) -\n holes.reduce((sum, hole) => sum + Math.abs(signedArea(hole)), 0),\n };\n}\n\nfunction resamplePart(part, step) {\n const outer = resampleRing(part.outer, step, part.anchors ?? []);\n const holes = part.holes.map((hole) => resampleRing(hole, step));\n\n return {\n ...part,\n outer,\n holes,\n anchors: part.anchors ? part.anchors.map((point) => [point[0], point[1]]) : undefined,\n bbox: ringBounds(outer),\n area:\n Math.abs(signedArea(outer)) -\n holes.reduce((sum, hole) => sum + Math.abs(signedArea(hole)), 0),\n };\n}\n\nfunction findBestHoleBridge(outer, hole, blockers, epsilon) {\n let best = null;\n\n outer.forEach((outerPoint, outerIndex) => {\n hole.forEach((holePoint, holeIndex) => {\n if (\n !isVisibleBridge(\n outer,\n hole,\n blockers,\n outerPoint,\n holePoint,\n outerIndex,\n holeIndex,\n epsilon\n )\n ) {\n return;\n }\n\n const candidate = {\n outerIndex,\n holeIndex,\n distance: distance(outerPoint, holePoint),\n };\n\n if (!best || candidate.distance < best.distance) {\n best = candidate;\n }\n });\n });\n\n if (best) {\n return best;\n }\n\n return findNearestBridge(outer, hole);\n}\n\nfunction findNearestBridge(outer, hole) {\n let best = null;\n\n outer.forEach((outerPoint, outerIndex) => {\n hole.forEach((holePoint, holeIndex) => {\n const candidate = {\n outerIndex,\n holeIndex,\n distance: distance(outerPoint, holePoint),\n };\n\n if (!best || candidate.distance < best.distance) {\n best = candidate;\n }\n });\n });\n\n return best;\n}\n\nfunction isVisibleBridge(\n outer,\n hole,\n blockers,\n outerPoint,\n holePoint,\n outerIndex,\n holeIndex,\n epsilon\n) {\n if (distance(outerPoint, holePoint) <= epsilon) {\n return false;\n }\n\n const bridgeMidpoint = midpoint(outerPoint, holePoint);\n\n if (!pointInRing(bridgeMidpoint, outer) || pointInRing(bridgeMidpoint, hole)) {\n return false;\n }\n\n if (blockers.some((blocker) => pointInRing(bridgeMidpoint, blocker))) {\n return false;\n }\n\n if (\n segmentIntersectsRing(\n outerPoint,\n holePoint,\n outer,\n new Set([outerIndex, mod(outerIndex - 1, outer.length)]),\n epsilon\n )\n ) {\n return false;\n }\n\n if (\n segmentIntersectsRing(\n outerPoint,\n holePoint,\n hole,\n new Set([holeIndex, mod(holeIndex - 1, hole.length)]),\n epsilon\n )\n ) {\n return false;\n }\n\n return !blockers.some((blocker) =>\n segmentIntersectsRing(outerPoint, holePoint, blocker, new Set(), epsilon)\n );\n}\n\nfunction mergeHoleIntoOuter(outer, hole, bridge, width, epsilon) {\n const slitWidth = clampSlitWidth(width, outer, hole, epsilon);\n const outerCut = createRingCut(outer, bridge.outerIndex, slitWidth, epsilon);\n const holeCut = createRingCut(hole, bridge.holeIndex, slitWidth, epsilon);\n const outerPath = ringPath(\n outerCut.ring,\n outerCut.afterIndex,\n outerCut.beforeIndex\n );\n const holePath = ringPath(\n holeCut.ring,\n holeCut.afterIndex,\n holeCut.beforeIndex\n );\n const merged = [];\n\n appendPath(merged, outerPath, epsilon);\n appendPath(merged, holePath, epsilon);\n\n if (\n merged.length > 1 &&\n pointsAlmostEqual2D(merged[0], merged[merged.length - 1], epsilon)\n ) {\n merged.pop();\n }\n\n return {\n ring: merged,\n anchors: [\n outerCut.ring[outerCut.beforeIndex],\n holeCut.ring[holeCut.beforeIndex],\n holeCut.ring[holeCut.afterIndex],\n outerCut.ring[outerCut.afterIndex],\n ].map((point) => [point[0], point[1]]),\n };\n}\n\nfunction clampSlitWidth(width, outer, hole, epsilon) {\n const minPerimeter = Math.min(ringPerimeter(outer), ringPerimeter(hole));\n return Math.max(\n epsilon * 2,\n Math.min(width, Math.max(minPerimeter * 0.24, epsilon * 2))\n );\n}\n\nfunction createRingCut(ring, anchorIndex, width, epsilon) {\n const beforeCut = moveAlongRing(ring, anchorIndex, -width * 0.5, epsilon);\n const afterCut = moveAlongRing(ring, anchorIndex, width * 0.5, epsilon);\n\n return insertRingCutPoints(ring, beforeCut, afterCut, epsilon);\n}\n\nfunction moveAlongRing(ring, anchorIndex, offset, epsilon) {\n if (!Number.isFinite(offset) || Math.abs(offset) <= epsilon) {\n return {\n point: [ring[anchorIndex][0], ring[anchorIndex][1]],\n vertexIndex: anchorIndex,\n t: 0,\n };\n }\n\n let remaining = Math.abs(offset);\n let currentIndex = anchorIndex;\n const direction = offset > 0 ? 1 : -1;\n\n while (remaining > epsilon) {\n const nextIndex =\n direction > 0 ? (currentIndex + 1) % ring.length : mod(currentIndex - 1, ring.length);\n const segmentIndex = direction > 0 ? currentIndex : nextIndex;\n const segmentStart = ring[segmentIndex];\n const segmentEnd = ring[(segmentIndex + 1) % ring.length];\n const segmentLength = distance(segmentStart, segmentEnd);\n\n if (segmentLength <= epsilon) {\n currentIndex = direction > 0 ? nextIndex : segmentIndex;\n continue;\n }\n\n if (remaining < segmentLength - epsilon) {\n const t = remaining / segmentLength;\n const ratio = direction > 0 ? t : 1 - t;\n return {\n point: [\n segmentStart[0] + (segmentEnd[0] - segmentStart[0]) * ratio,\n segmentStart[1] + (segmentEnd[1] - segmentStart[1]) * ratio,\n ],\n segmentIndex,\n t: ratio,\n };\n }\n\n remaining -= segmentLength;\n currentIndex = direction > 0 ? nextIndex : segmentIndex;\n }\n\n return {\n point: [ring[currentIndex][0], ring[currentIndex][1]],\n vertexIndex: currentIndex,\n t: 0,\n };\n}\n\nfunction insertRingCutPoints(ring, beforeCut, afterCut, epsilon) {\n const cuts = [\n normalizeCutLocation(\"before\", ring, beforeCut, epsilon),\n normalizeCutLocation(\"after\", ring, afterCut, epsilon),\n ];\n const insertsBySegment = new Map();\n const cutIndices = {};\n const augmented = [];\n\n cuts.forEach((cut) => {\n if (cut.vertexIndex != null) {\n return;\n }\n\n const existing = insertsBySegment.get(cut.segmentIndex) ?? [];\n existing.push(cut);\n insertsBySegment.set(cut.segmentIndex, existing);\n });\n\n for (let index = 0; index < ring.length; index += 1) {\n augmented.push([ring[index][0], ring[index][1]]);\n\n cuts.forEach((cut) => {\n if (cut.vertexIndex === index) {\n cutIndices[cut.name] = augmented.length - 1;\n }\n });\n\n const segmentCuts = (insertsBySegment.get(index) ?? []).sort(\n (a, b) => a.t - b.t\n );\n\n segmentCuts.forEach((cut) => {\n augmented.push([cut.point[0], cut.point[1]]);\n cutIndices[cut.name] = augmented.length - 1;\n });\n }\n\n return {\n ring: augmented,\n beforeIndex: cutIndices.before,\n afterIndex: cutIndices.after,\n };\n}\n\nfunction normalizeCutLocation(name, ring, cut, epsilon) {\n if (cut.vertexIndex != null) {\n return {\n ...cut,\n name,\n };\n }\n\n const segmentStart = ring[cut.segmentIndex];\n const segmentEnd = ring[(cut.segmentIndex + 1) % ring.length];\n\n if (distance(cut.point, segmentStart) <= epsilon) {\n return {\n point: [segmentStart[0], segmentStart[1]],\n vertexIndex: cut.segmentIndex,\n t: 0,\n name,\n };\n }\n\n if (distance(cut.point, segmentEnd) <= epsilon) {\n return {\n point: [segmentEnd[0], segmentEnd[1]],\n vertexIndex: (cut.segmentIndex + 1) % ring.length,\n t: 1,\n name,\n };\n }\n\n return {\n ...cut,\n name,\n };\n}\n\nfunction ringPath(ring, startIndex, endIndex) {\n if (startIndex == null || endIndex == null) {\n return copyRing(ring);\n }\n\n const path = [ring[startIndex]];\n let cursor = startIndex;\n\n while (cursor !== endIndex) {\n cursor = (cursor + 1) % ring.length;\n path.push(ring[cursor]);\n }\n\n return path;\n}\n\nfunction appendPath(target, path, epsilon) {\n path.forEach((point) => {\n if (\n target.length === 0 ||\n !pointsAlmostEqual2D(target[target.length - 1], point, epsilon)\n ) {\n target.push([point[0], point[1]]);\n }\n });\n}\n\nfunction resampleRing(ring, step, anchors = []) {\n if (ring.length < 3) {\n return copyRing(ring);\n }\n\n const normalizedAnchors = normalizeAnchorPoints(ring, anchors);\n\n if (normalizedAnchors.length >= 2) {\n return resampleRingWithAnchors(ring, step, normalizedAnchors);\n }\n\n return resampleClosedPath(ring, step);\n}\n\nfunction normalizeAnchorPoints(ring, anchors) {\n const indices = anchors\n .map((anchor) => findRingPointIndex(ring, anchor))\n .filter((index) => index >= 0)\n .sort((a, b) => a - b);\n\n return indices.filter((index, position) => index !== indices[position - 1]);\n}\n\nfunction findRingPointIndex(ring, point, epsilon = 1e-6) {\n for (let index = 0; index < ring.length; index += 1) {\n if (pointsAlmostEqual2D(ring[index], point, epsilon)) {\n return index;\n }\n }\n\n return -1;\n}\n\nfunction resampleRingWithAnchors(ring, step, anchorIndices) {\n const result = [];\n\n for (let index = 0; index < anchorIndices.length; index += 1) {\n const startIndex = anchorIndices[index];\n const endIndex = anchorIndices[(index + 1) % anchorIndices.length];\n const path = ringPath(ring, startIndex, endIndex);\n const sampled = resampleOpenPath(path, step);\n\n appendPath(result, sampled, 1e-6);\n }\n\n if (\n result.length > 1 &&\n pointsAlmostEqual2D(result[0], result[result.length - 1], 1e-6)\n ) {\n result.pop();\n }\n\n if (result.length < 3 || result.length >= ring.length) {\n return copyRing(ring);\n }\n\n return result;\n}\n\nfunction resampleClosedPath(ring, step) {\n const perimeter = ringPerimeter(ring);\n\n if (perimeter <= 1e-9) {\n return copyRing(ring);\n }\n\n const pointCount = Math.max(3, Math.round(perimeter / step));\n\n if (pointCount >= ring.length) {\n return copyRing(ring);\n }\n\n const sampled = [];\n\n for (let index = 0; index < pointCount; index += 1) {\n const point = pointAtClosedPathDistance(ring, (perimeter * index) / pointCount);\n\n if (\n sampled.length === 0 ||\n !pointsAlmostEqual2D(sampled[sampled.length - 1], point, 1e-6)\n ) {\n sampled.push(point);\n }\n }\n\n if (sampled.length < 3 || sampled.length >= ring.length) {\n return copyRing(ring);\n }\n\n return sampled;\n}\n\nfunction resampleOpenPath(path, step) {\n if (path.length <= 2) {\n return path.map((point) => [point[0], point[1]]);\n }\n\n const length = polylineLength(path);\n\n if (length <= step) {\n return [\n [path[0][0], path[0][1]],\n [path[path.length - 1][0], path[path.length - 1][1]],\n ];\n }\n\n const divisionCount = Math.max(1, Math.round(length / step));\n const sampled = [];\n\n for (let index = 0; index <= divisionCount; index += 1) {\n const point = pointAtOpenPathDistance(path, (length * index) / divisionCount);\n\n if (\n sampled.length === 0 ||\n !pointsAlmostEqual2D(sampled[sampled.length - 1], point, 1e-6)\n ) {\n sampled.push(point);\n }\n }\n\n return sampled;\n}\n","import { load as loadFont, parse as parseFont } from \"opentype.js\";\nimport {\n buildGlyphTopology,\n flattenGlyphTopology,\n layoutGlyphs,\n measureText,\n normalizeTextOptions,\n toArrayBuffer,\n} from \"./core.js\";\nimport { createTextShape } from \"./shape.js\";\n\nexport class PAFont {\n constructor(font) {\n this.font = font;\n this.unitsPerEm = font.unitsPerEm ?? 1000;\n this._glyphTopologyCache = new Map();\n this._glyphFlatCache = new Map();\n }\n\n static async load(source, options = {}) {\n const opts = normalizeLoadOptions(options);\n\n if (source instanceof ArrayBuffer || ArrayBuffer.isView(source)) {\n return new PAFont(parseFont(toArrayBuffer(source)));\n }\n\n if (typeof window !== \"undefined\") {\n const requestUrl = resolveBrowserFontSource(source, opts.base);\n const bytes = await fetchFontBytes(requestUrl);\n return new PAFont(parseFont(bytes));\n }\n\n const { target, loadOptions } = await resolveNodeFontSource(\n source,\n opts.base,\n );\n const font = await loadFont(target, undefined, loadOptions);\n return new PAFont(font);\n }\n\n text(value, options = {}) {\n const opts = normalizeTextOptions(options);\n const layout = this._layoutText(String(value ?? \"\"), opts);\n return createTextShape(layout, opts, this);\n }\n\n glyph(value, options = {}) {\n const opts = normalizeTextOptions(options);\n const glyph = this.font.charToGlyph(String(value ?? \"\"));\n const layout = {\n text: String(value ?? \"\"),\n glyphs: [\n {\n glyph,\n x: opts.x,\n y: opts.y,\n size: opts.size,\n index: 0,\n },\n ],\n metrics: {\n width: (glyph.advanceWidth ?? 0) * (opts.size / this.unitsPerEm),\n x: opts.x,\n y: opts.y,\n size: opts.size,\n },\n };\n\n return createTextShape(layout, opts, this);\n }\n\n metrics(value, options = {}) {\n const opts = normalizeTextOptions(options);\n return measureText(this.font, String(value ?? \"\"), opts);\n }\n\n _getGlyphTopology(glyph) {\n const key = String(glyph.index);\n\n if (!this._glyphTopologyCache.has(key)) {\n this._glyphTopologyCache.set(\n key,\n buildGlyphTopology(glyph, this.unitsPerEm),\n );\n }\n\n return this._glyphTopologyCache.get(key);\n }\n\n _getFlattenedGlyph(glyph, opts) {\n const key = `${glyph.index}:${opts.size}:${opts.flatten}`;\n\n if (!this._glyphFlatCache.has(key)) {\n const topology = this._getGlyphTopology(glyph);\n this._glyphFlatCache.set(\n key,\n flattenGlyphTopology(topology, {\n size: opts.size,\n flatten: opts.flatten,\n }),\n );\n }\n\n return this._glyphFlatCache.get(key);\n }\n\n _layoutText(value, opts) {\n return layoutGlyphs(this.font, value, opts);\n }\n}\n\nasync function fetchFontBytes(source) {\n const response = await fetch(source);\n\n if (!response.ok) {\n throw new Error(\n `Failed to load font from ${source}: ${response.status} ${response.statusText}`,\n );\n }\n\n const bytes = await response.arrayBuffer();\n const signature = readSignature(bytes);\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n\n if (contentType.includes(\"text/html\") || isHtmlSignature(signature)) {\n throw new Error(\n `Font URL returned HTML instead of font data: ${source}. Use a public font URL like \"/assets/font.otf\", or pass { base: import.meta.url } when loading a module-relative string path. Plain string paths in the browser are resolved from the current page URL.`,\n );\n }\n\n return bytes;\n}\n\nfunction normalizeLoadOptions(options = {}) {\n if (options == null) {\n return {};\n }\n\n if (typeof options !== \"object\" || Array.isArray(options)) {\n throw new TypeError(\"PAFont.load() options must be an object.\");\n }\n\n return options;\n}\n\nfunction resolveBrowserFontSource(source, base) {\n if (source instanceof URL) {\n return source.href;\n }\n\n if (typeof source !== \"string\") {\n throw new TypeError(\n \"PAFont.load() expects a string, URL, ArrayBuffer, or ArrayBufferView.\",\n );\n }\n\n if (base == null) {\n return source;\n }\n\n return new URL(source, normalizeBase(base)).href;\n}\n\nasync function resolveNodeFontSource(source, base) {\n if (source instanceof URL) {\n return toNodeLoadTarget(source);\n }\n\n if (typeof source !== \"string\") {\n throw new TypeError(\n \"PAFont.load() expects a string, URL, ArrayBuffer, or ArrayBufferView.\",\n );\n }\n\n if (base == null) {\n if (isLoadableUrlString(source)) {\n return toNodeLoadTarget(new URL(source));\n }\n\n return {\n target: source,\n loadOptions: undefined,\n };\n }\n\n return toNodeLoadTarget(new URL(source, normalizeBase(base)));\n}\n\nfunction normalizeBase(base) {\n if (base instanceof URL) {\n return base;\n }\n\n if (typeof base === \"string\") {\n return base;\n }\n\n throw new TypeError('PAFont.load() option \"base\" must be a string or URL.');\n}\n\nasync function toNodeLoadTarget(url) {\n if (url.protocol === \"file:\") {\n return {\n target: fileUrlToPath(url),\n loadOptions: undefined,\n };\n }\n\n return {\n target: url.href,\n loadOptions: {\n isUrl: true,\n },\n };\n}\n\nfunction fileUrlToPath(url) {\n const pathname = decodeURIComponent(url.pathname);\n\n if (/^\\/[a-zA-Z]:/.test(pathname)) {\n return pathname.slice(1);\n }\n\n if (url.hostname) {\n return `//${url.hostname}${pathname}`;\n }\n\n return pathname;\n}\n\nfunction isLoadableUrlString(value) {\n return (\n value.startsWith(\"http://\") ||\n value.startsWith(\"https://\") ||\n value.startsWith(\"file://\")\n );\n}\n\nfunction readSignature(bytes) {\n const view = new Uint8Array(bytes, 0, Math.min(4, bytes.byteLength));\n let signature = \"\";\n\n for (const value of view) {\n signature += String.fromCharCode(value);\n }\n\n return signature.toLowerCase();\n}\n\nfunction isHtmlSignature(signature) {\n return signature === \"<!do\" || signature === \"<htm\";\n}\n\nexport { PAFont as pa_Font };\nexport default PAFont;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"paFont.js","names":["parseFont","loadFont"],"sources":["../src/paFont/geometry.js","../src/paFont/core.js","../src/paFont/shape.js","../src/paFont/paFont.js"],"sourcesContent":["export function toScreenPoint(point, scale) {\n return [point.x * scale, -point.y * scale];\n}\n\nexport function cloneRawPoint(point) {\n return { x: point.x, y: point.y };\n}\n\nexport function pushUniquePoint(points, point) {\n if (points.length === 0 || !pointsEqual2D(points[points.length - 1], point)) {\n points.push(point);\n }\n}\n\nexport function flattenQuadratic(p0, p1, p2, tolerance, out, depth = 0) {\n if (depth >= 12 || quadFlatness(p0, p1, p2) <= tolerance) {\n pushUniquePoint(out, p2);\n return;\n }\n\n const p01 = midpoint(p0, p1);\n const p12 = midpoint(p1, p2);\n const p012 = midpoint(p01, p12);\n\n flattenQuadratic(p0, p01, p012, tolerance, out, depth + 1);\n flattenQuadratic(p012, p12, p2, tolerance, out, depth + 1);\n}\n\nexport function flattenCubic(p0, p1, p2, p3, tolerance, out, depth = 0) {\n if (depth >= 12 || cubicFlatness(p0, p1, p2, p3) <= tolerance) {\n pushUniquePoint(out, p3);\n return;\n }\n\n const p01 = midpoint(p0, p1);\n const p12 = midpoint(p1, p2);\n const p23 = midpoint(p2, p3);\n const p012 = midpoint(p01, p12);\n const p123 = midpoint(p12, p23);\n const p0123 = midpoint(p012, p123);\n\n flattenCubic(p0, p01, p012, p0123, tolerance, out, depth + 1);\n flattenCubic(p0123, p123, p23, p3, tolerance, out, depth + 1);\n}\n\nfunction quadFlatness(p0, p1, p2) {\n return pointToLineDistance(p1, p0, p2);\n}\n\nfunction cubicFlatness(p0, p1, p2, p3) {\n return Math.max(\n pointToLineDistance(p1, p0, p3),\n pointToLineDistance(p2, p0, p3)\n );\n}\n\nfunction pointToLineDistance(point, lineStart, lineEnd) {\n const dx = lineEnd[0] - lineStart[0];\n const dy = lineEnd[1] - lineStart[1];\n const lengthSq = dx * dx + dy * dy;\n\n if (lengthSq === 0) {\n return distance(point, lineStart);\n }\n\n const area = Math.abs(\n dx * (lineStart[1] - point[1]) - (lineStart[0] - point[0]) * dy\n );\n\n return area / Math.sqrt(lengthSq);\n}\n\nexport function midpoint(a, b) {\n return [(a[0] + b[0]) * 0.5, (a[1] + b[1]) * 0.5];\n}\n\nexport function signedArea(ring) {\n let area = 0;\n\n for (let index = 0; index < ring.length; index += 1) {\n const current = ring[index];\n const next = ring[(index + 1) % ring.length];\n area += current[0] * next[1] - next[0] * current[1];\n }\n\n return area * 0.5;\n}\n\nexport function pointInRing(point, ring) {\n let inside = false;\n\n for (let i = 0, j = ring.length - 1; i < ring.length; j = i, i += 1) {\n const xi = ring[i][0];\n const yi = ring[i][1];\n const xj = ring[j][0];\n const yj = ring[j][1];\n const intersects =\n yi > point[1] !== yj > point[1] &&\n point[0] < ((xj - xi) * (point[1] - yi)) / (yj - yi || 1e-9) + xi;\n\n if (intersects) {\n inside = !inside;\n }\n }\n\n return inside;\n}\n\nexport function hitPart(point, part, epsilon) {\n if (!rectContainsPoint(part.bbox, point, epsilon)) {\n return \"outside\";\n }\n\n if (isPointOnRingEdge(point, part.outer, epsilon)) {\n return \"edge\";\n }\n\n if (!pointInRing(point, part.outer)) {\n return \"outside\";\n }\n\n for (const hole of part.holes) {\n if (isPointOnRingEdge(point, hole, epsilon)) {\n return \"edge\";\n }\n\n if (pointInRing(point, hole)) {\n return \"hole\";\n }\n }\n\n return \"fill\";\n}\n\nfunction isPointOnRingEdge(point, ring, epsilon) {\n for (let index = 0; index < ring.length; index += 1) {\n const a = ring[index];\n const b = ring[(index + 1) % ring.length];\n\n if (distancePointToSegment(point, a, b) <= epsilon) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction distancePointToSegment(point, a, b) {\n const dx = b[0] - a[0];\n const dy = b[1] - a[1];\n const lengthSq = dx * dx + dy * dy;\n\n if (lengthSq === 0) {\n return distance(point, a);\n }\n\n let t = ((point[0] - a[0]) * dx + (point[1] - a[1]) * dy) / lengthSq;\n t = Math.max(0, Math.min(1, t));\n\n const projection = [a[0] + dx * t, a[1] + dy * t];\n return distance(point, projection);\n}\n\nexport function distance(a, b) {\n const dx = a[0] - b[0];\n const dy = a[1] - b[1];\n return Math.sqrt(dx * dx + dy * dy);\n}\n\nexport function sampleRing(ring, step, callback) {\n for (let index = 0; index < ring.length; index += 1) {\n const a = ring[index];\n const b = ring[(index + 1) % ring.length];\n const segmentLength = distance(a, b);\n const divisions = Math.max(1, Math.ceil(segmentLength / step));\n\n for (let offset = 0; offset < divisions; offset += 1) {\n if (index > 0 || offset > 0) {\n const t = offset / divisions;\n callback([\n a[0] + (b[0] - a[0]) * t,\n a[1] + (b[1] - a[1]) * t,\n ]);\n } else {\n callback([a[0], a[1]]);\n }\n }\n }\n}\n\nexport function ringBounds(ring) {\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n\n ring.forEach((point) => {\n minX = Math.min(minX, point[0]);\n minY = Math.min(minY, point[1]);\n maxX = Math.max(maxX, point[0]);\n maxY = Math.max(maxY, point[1]);\n });\n\n return {\n x: minX,\n y: minY,\n w: maxX - minX,\n h: maxY - minY,\n };\n}\n\nexport function translateRing(ring, tx, ty) {\n return ring.map((point) => [point[0] + tx, point[1] + ty]);\n}\n\nexport function translateRect(rect, tx, ty) {\n return {\n x: rect.x + tx,\n y: rect.y + ty,\n w: rect.w,\n h: rect.h,\n };\n}\n\nexport function copyRing(ring) {\n return ring.map((point) => [point[0], point[1]]);\n}\n\nexport function combineRects(rects) {\n if (rects.length === 0) {\n return null;\n }\n\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n\n rects.forEach((rect) => {\n minX = Math.min(minX, rect.x);\n minY = Math.min(minY, rect.y);\n maxX = Math.max(maxX, rect.x + rect.w);\n maxY = Math.max(maxY, rect.y + rect.h);\n });\n\n return {\n x: minX,\n y: minY,\n w: maxX - minX,\n h: maxY - minY,\n };\n}\n\nexport function rectContainsRect(outer, inner, epsilon = 1e-6) {\n return (\n inner.x >= outer.x - epsilon &&\n inner.y >= outer.y - epsilon &&\n inner.x + inner.w <= outer.x + outer.w + epsilon &&\n inner.y + inner.h <= outer.y + outer.h + epsilon\n );\n}\n\nexport function rectContainsPoint(rect, point, epsilon = 0) {\n return (\n point[0] >= rect.x - epsilon &&\n point[0] <= rect.x + rect.w + epsilon &&\n point[1] >= rect.y - epsilon &&\n point[1] <= rect.y + rect.h + epsilon\n );\n}\n\nexport function emptyRect() {\n return { x: 0, y: 0, w: 0, h: 0 };\n}\n\nexport function normalizeNumber(value, fallback) {\n return Number.isFinite(value) ? value : fallback;\n}\n\nexport function normalizePositive(value, fallback) {\n return Number.isFinite(value) && value > 0 ? value : fallback;\n}\n\nexport function samePoint(a, b) {\n return a.x === b.x && a.y === b.y;\n}\n\nexport function pointsEqual2D(a, b) {\n return a[0] === b[0] && a[1] === b[1];\n}\n\nexport function pointsAlmostEqual2D(a, b, epsilon = 1e-6) {\n return Math.abs(a[0] - b[0]) <= epsilon && Math.abs(a[1] - b[1]) <= epsilon;\n}\n\nexport function ringPerimeter(ring) {\n let total = 0;\n\n for (let index = 0; index < ring.length; index += 1) {\n total += distance(ring[index], ring[(index + 1) % ring.length]);\n }\n\n return total;\n}\n\nexport function polylineLength(path) {\n let total = 0;\n\n for (let index = 0; index < path.length - 1; index += 1) {\n total += distance(path[index], path[index + 1]);\n }\n\n return total;\n}\n\nexport function pointAtClosedPathDistance(ring, distanceAlong) {\n const perimeter = ringPerimeter(ring);\n\n if (perimeter <= 1e-9) {\n return [ring[0][0], ring[0][1]];\n }\n\n let remaining = mod(distanceAlong, perimeter);\n\n for (let index = 0; index < ring.length; index += 1) {\n const start = ring[index];\n const end = ring[(index + 1) % ring.length];\n const segmentLength = distance(start, end);\n\n if (segmentLength <= 1e-9) {\n continue;\n }\n\n if (remaining <= segmentLength) {\n const t = remaining / segmentLength;\n return [\n start[0] + (end[0] - start[0]) * t,\n start[1] + (end[1] - start[1]) * t,\n ];\n }\n\n remaining -= segmentLength;\n }\n\n return [ring[ring.length - 1][0], ring[ring.length - 1][1]];\n}\n\nexport function pointAtOpenPathDistance(path, distanceAlong) {\n if (distanceAlong <= 0) {\n return [path[0][0], path[0][1]];\n }\n\n let remaining = distanceAlong;\n\n for (let index = 0; index < path.length - 1; index += 1) {\n const start = path[index];\n const end = path[index + 1];\n const segmentLength = distance(start, end);\n\n if (segmentLength <= 1e-9) {\n continue;\n }\n\n if (remaining <= segmentLength) {\n const t = remaining / segmentLength;\n return [\n start[0] + (end[0] - start[0]) * t,\n start[1] + (end[1] - start[1]) * t,\n ];\n }\n\n remaining -= segmentLength;\n }\n\n return [path[path.length - 1][0], path[path.length - 1][1]];\n}\n\nexport function segmentIntersectsRing(a, b, ring, ignoredEdges, epsilon) {\n for (let index = 0; index < ring.length; index += 1) {\n if (ignoredEdges.has(index)) {\n continue;\n }\n\n const c = ring[index];\n const d = ring[(index + 1) % ring.length];\n\n if (segmentsIntersect(a, b, c, d, epsilon)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction segmentsIntersect(a, b, c, d, epsilon) {\n const o1 = orientation(a, b, c);\n const o2 = orientation(a, b, d);\n const o3 = orientation(c, d, a);\n const o4 = orientation(c, d, b);\n\n if (\n ((o1 > epsilon && o2 < -epsilon) || (o1 < -epsilon && o2 > epsilon)) &&\n ((o3 > epsilon && o4 < -epsilon) || (o3 < -epsilon && o4 > epsilon))\n ) {\n return true;\n }\n\n if (Math.abs(o1) <= epsilon && pointOnSegment(c, a, b, epsilon)) {\n return true;\n }\n\n if (Math.abs(o2) <= epsilon && pointOnSegment(d, a, b, epsilon)) {\n return true;\n }\n\n if (Math.abs(o3) <= epsilon && pointOnSegment(a, c, d, epsilon)) {\n return true;\n }\n\n if (Math.abs(o4) <= epsilon && pointOnSegment(b, c, d, epsilon)) {\n return true;\n }\n\n return false;\n}\n\nfunction orientation(a, b, c) {\n return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\n}\n\nfunction pointOnSegment(point, start, end, epsilon) {\n return (\n point[0] >= Math.min(start[0], end[0]) - epsilon &&\n point[0] <= Math.max(start[0], end[0]) + epsilon &&\n point[1] >= Math.min(start[1], end[1]) - epsilon &&\n point[1] <= Math.max(start[1], end[1]) + epsilon\n );\n}\n\nexport function mod(value, divisor) {\n return ((value % divisor) + divisor) % divisor;\n}\n","import {\n cloneRawPoint,\n combineRects,\n copyRing,\n emptyRect,\n flattenCubic,\n flattenQuadratic,\n normalizeNumber,\n normalizePositive,\n pointInRing,\n pointsEqual2D,\n pushUniquePoint,\n rectContainsRect,\n ringBounds,\n samePoint,\n signedArea,\n toScreenPoint,\n translateRect,\n translateRing,\n} from \"./geometry.js\";\n\nexport function layoutGlyphs(font, value, opts) {\n const glyphs = [];\n const renderOptions = toRenderOptions(opts);\n const endX = font.forEachGlyph(\n value,\n opts.x,\n opts.y,\n opts.size,\n renderOptions,\n (glyph, x, y, size) => {\n glyphs.push({\n glyph,\n x,\n y,\n size,\n index: glyphs.length,\n });\n }\n );\n\n return {\n text: value,\n glyphs,\n metrics: {\n width: endX - opts.x,\n x: opts.x,\n y: opts.y,\n size: opts.size,\n },\n };\n}\n\nexport function measureText(font, value, opts) {\n const renderOptions = toRenderOptions(opts);\n const path = font.getPath(value, opts.x, opts.y, opts.size, renderOptions);\n const box = path.getBoundingBox();\n\n return {\n width: font.getAdvanceWidth(value, opts.size, renderOptions),\n bbox: {\n x: box.x1,\n y: box.y1,\n w: box.x2 - box.x1,\n h: box.y2 - box.y1,\n },\n };\n}\n\nexport function buildGlyphTopology(glyph, fallbackUnitsPerEm) {\n const commands = glyph.path?.commands ?? [];\n const contours = [];\n let contourId = 0;\n let current = null;\n\n const finishCurrentContour = () => {\n if (!current || current.segments.length === 0) {\n current = null;\n return;\n }\n\n if (!samePoint(current.cursor, current.start)) {\n current.segments.push({\n type: \"L\",\n from: cloneRawPoint(current.cursor),\n to: cloneRawPoint(current.start),\n });\n current.cursor = cloneRawPoint(current.start);\n }\n\n contours.push({\n id: contourId++,\n start: cloneRawPoint(current.start),\n segments: current.segments,\n });\n current = null;\n };\n\n commands.forEach((cmd) => {\n if (cmd.type === \"M\") {\n finishCurrentContour();\n current = {\n start: { x: cmd.x, y: cmd.y },\n cursor: { x: cmd.x, y: cmd.y },\n segments: [],\n };\n return;\n }\n\n if (!current) {\n return;\n }\n\n if (cmd.type === \"L\") {\n const to = { x: cmd.x, y: cmd.y };\n current.segments.push({\n type: \"L\",\n from: cloneRawPoint(current.cursor),\n to,\n });\n current.cursor = cloneRawPoint(to);\n return;\n }\n\n if (cmd.type === \"Q\") {\n const to = { x: cmd.x, y: cmd.y };\n current.segments.push({\n type: \"Q\",\n from: cloneRawPoint(current.cursor),\n c1: { x: cmd.x1, y: cmd.y1 },\n to,\n });\n current.cursor = cloneRawPoint(to);\n return;\n }\n\n if (cmd.type === \"C\") {\n const to = { x: cmd.x, y: cmd.y };\n current.segments.push({\n type: \"C\",\n from: cloneRawPoint(current.cursor),\n c1: { x: cmd.x1, y: cmd.y1 },\n c2: { x: cmd.x2, y: cmd.y2 },\n to,\n });\n current.cursor = cloneRawPoint(to);\n return;\n }\n\n if (cmd.type === \"Z\") {\n finishCurrentContour();\n }\n });\n\n finishCurrentContour();\n\n return {\n glyphIndex: glyph.index,\n advanceWidth: glyph.advanceWidth ?? 0,\n unitsPerEm: glyph.path?.unitsPerEm ?? fallbackUnitsPerEm ?? 1000,\n contours,\n };\n}\n\nexport function flattenGlyphTopology(topology, options) {\n const scale = options.size / topology.unitsPerEm;\n const contours = topology.contours\n .map((contour) => flattenContour(contour, scale, options.flatten))\n .filter(Boolean);\n const classifiedContours = classifyContours(contours);\n const parts = buildParts(classifiedContours);\n const bbox = combineRects(parts.map((part) => part.bbox)) ?? emptyRect();\n\n return {\n glyphIndex: topology.glyphIndex,\n advanceWidth: topology.advanceWidth * scale,\n contours: classifiedContours,\n parts,\n bbox,\n };\n}\n\nfunction flattenContour(contour, scale, tolerance) {\n const ring = [];\n const start = toScreenPoint(contour.start, scale);\n pushUniquePoint(ring, start);\n\n contour.segments.forEach((segment) => {\n if (segment.type === \"L\") {\n pushUniquePoint(ring, toScreenPoint(segment.to, scale));\n return;\n }\n\n if (segment.type === \"Q\") {\n flattenQuadratic(\n toScreenPoint(segment.from, scale),\n toScreenPoint(segment.c1, scale),\n toScreenPoint(segment.to, scale),\n tolerance,\n ring\n );\n return;\n }\n\n if (segment.type === \"C\") {\n flattenCubic(\n toScreenPoint(segment.from, scale),\n toScreenPoint(segment.c1, scale),\n toScreenPoint(segment.c2, scale),\n toScreenPoint(segment.to, scale),\n tolerance,\n ring\n );\n }\n });\n\n if (ring.length > 1 && pointsEqual2D(ring[0], ring[ring.length - 1])) {\n ring.pop();\n }\n\n if (ring.length < 3) {\n return null;\n }\n\n const bbox = ringBounds(ring);\n const area = signedArea(ring);\n\n return {\n id: contour.id,\n ring,\n bbox,\n area,\n };\n}\n\nfunction classifyContours(contours) {\n const result = contours.map((contour) => ({\n ...contour,\n parentId: null,\n depth: 0,\n role: \"outer\",\n }));\n\n result.forEach((child) => {\n let parent = null;\n let parentArea = Number.POSITIVE_INFINITY;\n\n result.forEach((candidate) => {\n if (candidate.id === child.id) {\n return;\n }\n\n if (Math.abs(candidate.area) <= Math.abs(child.area)) {\n return;\n }\n\n if (!rectContainsRect(candidate.bbox, child.bbox)) {\n return;\n }\n\n if (!pointInRing(child.ring[0], candidate.ring)) {\n return;\n }\n\n const candidateArea = Math.abs(candidate.area);\n if (candidateArea < parentArea) {\n parent = candidate;\n parentArea = candidateArea;\n }\n });\n\n if (parent) {\n child.parentId = parent.id;\n }\n });\n\n const byId = new Map(result.map((contour) => [contour.id, contour]));\n\n const resolveDepth = (contour) => {\n if (contour.parentId == null) {\n return 0;\n }\n\n const parent = byId.get(contour.parentId);\n return resolveDepth(parent) + 1;\n };\n\n result.forEach((contour) => {\n contour.depth = resolveDepth(contour);\n contour.role = contour.depth % 2 === 0 ? \"outer\" : \"hole\";\n });\n\n return result;\n}\n\nfunction buildParts(contours) {\n return contours\n .filter((contour) => contour.role === \"outer\")\n .map((outer) => {\n const holeContours = contours.filter(\n (contour) => contour.parentId === outer.id && contour.role === \"hole\"\n );\n\n return {\n outer: copyRing(outer.ring),\n holes: holeContours.map((hole) => copyRing(hole.ring)),\n bbox: { ...outer.bbox },\n area:\n Math.abs(outer.area) -\n holeContours.reduce((sum, hole) => sum + Math.abs(hole.area), 0),\n };\n });\n}\n\nexport function translateGlyphGeometry(geometry, tx, ty, glyphPosition) {\n const parts = geometry.parts.map((part, partIndex) => ({\n outer: translateRing(part.outer, tx, ty),\n holes: part.holes.map((hole) => translateRing(hole, tx, ty)),\n bbox: translateRect(part.bbox, tx, ty),\n area: part.area,\n glyphPosition,\n partIndex,\n }));\n\n const contours = geometry.contours.map((contour) => ({\n id: `${glyphPosition}:${contour.id}`,\n sourceId: contour.id,\n glyphPosition,\n parentId:\n contour.parentId == null ? null : `${glyphPosition}:${contour.parentId}`,\n depth: contour.depth,\n role: contour.role,\n area: contour.area,\n bbox: translateRect(contour.bbox, tx, ty),\n ring: translateRing(contour.ring, tx, ty),\n }));\n\n return {\n parts,\n contours,\n bbox: translateRect(geometry.bbox, tx, ty),\n };\n}\n\nexport function normalizeTextOptions(options = {}) {\n const size = normalizePositive(options.size, 72);\n\n return {\n x: normalizeNumber(options.x, 0),\n y: normalizeNumber(options.y, 0),\n size,\n flatten: normalizePositive(options.flatten, 1.25),\n edgeEpsilon:\n options.edgeEpsilon == null\n ? defaultEdgeEpsilon(size)\n : normalizePositive(options.edgeEpsilon, defaultEdgeEpsilon(size)),\n kerning: options.kerning !== false,\n letterSpacing:\n options.letterSpacing == null\n ? undefined\n : normalizeNumber(options.letterSpacing, 0),\n tracking:\n options.tracking == null\n ? undefined\n : normalizeNumber(options.tracking, 0),\n script: options.script,\n language: options.language,\n features: options.features,\n };\n}\n\nfunction defaultEdgeEpsilon(size) {\n return Math.min(1, Math.max(0.01, size * 0.0025));\n}\n\nfunction toRenderOptions(opts) {\n const renderOptions = {\n kerning: opts.kerning,\n };\n\n if (opts.letterSpacing != null) {\n renderOptions.letterSpacing = opts.letterSpacing;\n }\n\n if (opts.tracking != null) {\n renderOptions.tracking = opts.tracking;\n }\n\n if (opts.script) {\n renderOptions.script = opts.script;\n }\n\n if (opts.language) {\n renderOptions.language = opts.language;\n }\n\n if (opts.features) {\n renderOptions.features = opts.features;\n }\n\n return renderOptions;\n}\n\nexport function toArrayBuffer(value) {\n if (value instanceof ArrayBuffer) {\n return value;\n }\n\n if (ArrayBuffer.isView(value)) {\n return value.buffer.slice(value.byteOffset, value.byteOffset + value.byteLength);\n }\n\n return value;\n}\n","import {\n combineRects,\n copyRing,\n distance,\n emptyRect,\n hitPart,\n midpoint,\n mod,\n normalizePositive,\n pointAtClosedPathDistance,\n pointAtOpenPathDistance,\n pointInRing,\n pointsAlmostEqual2D,\n polylineLength,\n rectContainsPoint,\n ringBounds,\n ringPerimeter,\n sampleRing,\n segmentIntersectsRing,\n signedArea,\n} from \"./geometry.js\";\nimport { translateGlyphGeometry } from \"./core.js\";\n\nexport class PAShape {\n constructor({ text, parts, contours, glyphs, bbox, metrics, edgeEpsilon }) {\n this.text = text;\n this.parts = parts;\n this.bbox = bbox;\n this.metrics = metrics;\n this.edgeEpsilon = edgeEpsilon;\n this.raw = {\n contours,\n glyphs,\n };\n this._cache = {\n glyphs: null,\n openHoles: new Map(),\n resample: new Map(),\n shapes: new Map(),\n regionViews: null,\n };\n }\n\n get polygons() {\n return this.parts.map((part) => [part.outer, ...part.holes]);\n }\n\n [Symbol.iterator]() {\n return this._getRegionViews()[Symbol.iterator]();\n }\n\n glyphs() {\n if (this._cache.glyphs) {\n return this._cache.glyphs;\n }\n\n if (!Array.isArray(this.raw.glyphs) || this.raw.glyphs.length <= 1) {\n this._cache.glyphs = [this];\n return this._cache.glyphs;\n }\n\n this._cache.glyphs = this.raw.glyphs.map((_, glyphPosition) =>\n createGlyphShape(this, glyphPosition)\n );\n\n return this._cache.glyphs;\n }\n\n toShape(options = {}) {\n return resolveShapeVariant(this, options);\n }\n\n toRegions(options = {}) {\n const shape = this.toShape(options);\n return createRegionCollection(shape);\n }\n\n openHoles(width) {\n const slitWidth = normalizePositive(width, 0);\n\n if (slitWidth <= 0 || !this.parts.some((part) => part.holes.length > 0)) {\n return this;\n }\n\n const cacheKey = toCacheKey(slitWidth);\n const cached = this._cache.openHoles.get(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n const geometryEpsilon = resolveGeometryEpsilon(slitWidth);\n\n const shape = createDerivedShape(\n this,\n this.parts.map((part) => openPartWithSlit(part, slitWidth, geometryEpsilon))\n );\n\n this._cache.openHoles.set(cacheKey, shape);\n return shape;\n }\n\n resample(step) {\n const spacing = normalizePositive(step, 0);\n\n if (spacing <= 0) {\n return this;\n }\n\n const cacheKey = toCacheKey(spacing);\n const cached = this._cache.resample.get(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n const shape = createDerivedShape(\n this,\n this.parts.map((part) => resamplePart(part, spacing))\n );\n\n this._cache.resample.set(cacheKey, shape);\n return shape;\n }\n\n hit(x, y, epsilon = this.edgeEpsilon) {\n const point = [x, y];\n\n if (!rectContainsPoint(this.bbox, point, epsilon)) {\n return \"outside\";\n }\n\n let holeHit = false;\n\n for (const part of this.parts) {\n const result = hitPart(point, part, epsilon);\n\n if (result === \"edge\" || result === \"fill\") {\n return result;\n }\n\n if (result === \"hole\") {\n holeHit = true;\n }\n }\n\n return holeHit ? \"hole\" : \"outside\";\n }\n\n contains(x, y, epsilon = this.edgeEpsilon) {\n return this.hit(x, y, epsilon) === \"fill\";\n }\n\n toPoints(options = {}) {\n const opts = normalizePointOptions(options);\n const shape =\n opts.openWidth > 0 ? this.toShape({ openWidth: opts.openWidth }) : this;\n const step = opts.step;\n const includeHoles = opts.includeHoles;\n const sampled = [];\n\n shape.parts.forEach((part, partIndex) => {\n sampleRing(part.outer, step, (point) => {\n sampled.push({\n x: point[0],\n y: point[1],\n partIndex,\n hole: false,\n });\n });\n\n if (!includeHoles) {\n return;\n }\n\n part.holes.forEach((hole, holeIndex) => {\n sampleRing(hole, step, (point) => {\n sampled.push({\n x: point[0],\n y: point[1],\n partIndex,\n hole: true,\n holeIndex,\n });\n });\n });\n });\n\n return sampled;\n }\n\n _getRegionViews() {\n if (!this._cache.regionViews) {\n this._cache.regionViews = this.parts.map((part) =>\n Object.freeze({\n outer: part.outer,\n holes: part.holes,\n bbox: part.bbox,\n })\n );\n }\n\n return this._cache.regionViews;\n }\n}\n\nexport function createTextShape(layout, opts, fontInstance) {\n const parts = [];\n const contours = [];\n const glyphs = [];\n\n layout.glyphs.forEach((item, glyphPosition) => {\n const localGeometry = fontInstance._getFlattenedGlyph(item.glyph, opts);\n const translated = translateGlyphGeometry(\n localGeometry,\n item.x,\n item.y,\n glyphPosition\n );\n\n parts.push(...translated.parts);\n contours.push(...translated.contours);\n glyphs.push({\n position: glyphPosition,\n glyphIndex: item.glyph.index,\n x: item.x,\n y: item.y,\n size: item.size,\n bbox: translated.bbox,\n partCount: translated.parts.length,\n });\n });\n\n const bbox = combineRects(parts.map((part) => part.bbox)) ?? emptyRect();\n\n return new PAShape({\n text: layout.text,\n parts,\n contours,\n glyphs,\n bbox,\n metrics: {\n ...layout.metrics,\n bbox,\n },\n edgeEpsilon: opts.edgeEpsilon,\n });\n}\n\nfunction createGlyphShape(shape, glyphPosition) {\n const glyphMeta = shape.raw.glyphs?.[glyphPosition] ?? null;\n const parts = copyParts(\n shape.parts.filter((part) => part.glyphPosition === glyphPosition)\n );\n const contours = copyContours(\n (shape.raw.contours ?? []).filter(\n (contour) => contour.glyphPosition === glyphPosition\n )\n );\n const bbox =\n combineRects(parts.map((part) => part.bbox)) ??\n (glyphMeta?.bbox ? { ...glyphMeta.bbox } : emptyRect());\n\n return new PAShape({\n text: extractGlyphText(shape.text, glyphPosition, shape.raw.glyphs?.length ?? 0),\n parts,\n contours,\n glyphs: glyphMeta ? [{ ...glyphMeta, bbox, partCount: parts.length }] : [],\n bbox,\n metrics: {\n x: glyphMeta?.x ?? shape.metrics?.x ?? 0,\n y: glyphMeta?.y ?? shape.metrics?.y ?? 0,\n size: glyphMeta?.size ?? shape.metrics?.size ?? 0,\n width: bbox.w,\n bbox,\n },\n edgeEpsilon: shape.edgeEpsilon,\n });\n}\n\nfunction createDerivedShape(shape, parts) {\n const copiedParts = copyParts(parts);\n const bbox = combineRects(copiedParts.map((part) => part.bbox)) ?? emptyRect();\n const glyphs = (shape.raw.glyphs ?? []).map((glyph, glyphPosition) => {\n const glyphParts = copiedParts.filter(\n (part) => part.glyphPosition === glyphPosition\n );\n\n return {\n ...glyph,\n bbox:\n combineRects(glyphParts.map((part) => part.bbox)) ??\n (glyph.bbox ? { ...glyph.bbox } : emptyRect()),\n partCount: glyphParts.length,\n };\n });\n\n return new PAShape({\n text: shape.text,\n parts: copiedParts,\n contours: [],\n glyphs,\n bbox,\n metrics: {\n ...shape.metrics,\n bbox,\n },\n edgeEpsilon: shape.edgeEpsilon,\n });\n}\n\nfunction createRegionCollection(shape) {\n return shape.parts.map((part) => ({\n outer: copyRing(part.outer),\n holes: part.holes.map((hole) => copyRing(hole)),\n bbox: { ...part.bbox },\n }));\n}\n\nfunction copyParts(parts) {\n return parts.map((part) => copyPart(part));\n}\n\nfunction copyPart(part) {\n return {\n ...part,\n outer: copyRing(part.outer),\n holes: part.holes.map((hole) => copyRing(hole)),\n anchors: part.anchors ? part.anchors.map((point) => [point[0], point[1]]) : undefined,\n bbox: { ...part.bbox },\n };\n}\n\nfunction copyContours(contours) {\n return contours.map((contour) => ({\n ...contour,\n bbox: { ...contour.bbox },\n ring: copyRing(contour.ring),\n }));\n}\n\nfunction extractGlyphText(text, glyphPosition, glyphCount) {\n if (glyphCount <= 1) {\n return text;\n }\n\n const glyphText = Array.from(text ?? \"\")[glyphPosition];\n return glyphText ?? \"\";\n}\n\nfunction normalizePointOptions(options = {}) {\n if (options == null) {\n return {\n step: 8,\n openWidth: 0,\n includeHoles: true,\n };\n }\n\n if (typeof options !== \"object\" || Array.isArray(options)) {\n throw new TypeError(\"toPoints() expects an options object.\");\n }\n\n return {\n step: normalizePositive(options.step, 8),\n openWidth: normalizePositive(options.openWidth, 0),\n includeHoles: options.includeHoles !== false,\n };\n}\n\nfunction normalizeShapeOptions(options = {}) {\n if (options == null) {\n return {\n step: 0,\n openWidth: 0,\n };\n }\n\n if (typeof options !== \"object\" || Array.isArray(options)) {\n throw new TypeError(\n \"toShape() and toRegions() expect an options object.\",\n );\n }\n\n return {\n step: normalizePositive(options.step, 0),\n openWidth: normalizePositive(options.openWidth, 0),\n };\n}\n\nfunction resolveShapeVariant(shape, options = {}) {\n const normalized = normalizeShapeOptions(options);\n\n if (normalized.step <= 0 && normalized.openWidth <= 0) {\n return shape;\n }\n\n const cacheKey = `${toCacheKey(normalized.step)}:${toCacheKey(normalized.openWidth)}`;\n const cached = shape._cache.shapes.get(cacheKey);\n\n if (cached) {\n return cached;\n }\n\n let next = shape;\n\n if (normalized.openWidth > 0) {\n next = next.openHoles(normalized.openWidth);\n }\n\n if (normalized.step > 0) {\n next = next.resample(normalized.step);\n }\n\n shape._cache.shapes.set(cacheKey, next);\n return next;\n}\n\nfunction toCacheKey(value) {\n return normalizePositive(value, 0).toFixed(6);\n}\n\nfunction resolveGeometryEpsilon(width) {\n return Math.max(1e-4, normalizePositive(width, 1) * 1e-3);\n}\n\nfunction openPartWithSlit(part, width, epsilon) {\n if (!part.holes || part.holes.length === 0) {\n return copyPart(part);\n }\n\n let outer = copyRing(part.outer);\n const holes = part.holes.map((hole) => copyRing(hole));\n const anchors = [];\n\n while (holes.length > 0) {\n let selectedHoleIndex = -1;\n let selectedBridge = null;\n\n holes.forEach((hole, holeIndex) => {\n const blockers = holes.filter((_, index) => index !== holeIndex);\n const candidate = findBestHoleBridge(outer, hole, blockers, epsilon);\n\n if (\n candidate &&\n (!selectedBridge || candidate.distance < selectedBridge.distance)\n ) {\n selectedBridge = candidate;\n selectedHoleIndex = holeIndex;\n }\n });\n\n if (!selectedBridge || selectedHoleIndex === -1) {\n break;\n }\n\n const [hole] = holes.splice(selectedHoleIndex, 1);\n const merged = mergeHoleIntoOuter(outer, hole, selectedBridge, width, epsilon);\n outer = merged.ring;\n anchors.push(...merged.anchors);\n }\n\n return {\n ...part,\n outer,\n holes,\n anchors,\n bbox: ringBounds(outer),\n area:\n Math.abs(signedArea(outer)) -\n holes.reduce((sum, hole) => sum + Math.abs(signedArea(hole)), 0),\n };\n}\n\nfunction resamplePart(part, step) {\n const outer = resampleRing(part.outer, step, part.anchors ?? []);\n const holes = part.holes.map((hole) => resampleRing(hole, step));\n\n return {\n ...part,\n outer,\n holes,\n anchors: part.anchors ? part.anchors.map((point) => [point[0], point[1]]) : undefined,\n bbox: ringBounds(outer),\n area:\n Math.abs(signedArea(outer)) -\n holes.reduce((sum, hole) => sum + Math.abs(signedArea(hole)), 0),\n };\n}\n\nfunction findBestHoleBridge(outer, hole, blockers, epsilon) {\n let best = null;\n\n outer.forEach((outerPoint, outerIndex) => {\n hole.forEach((holePoint, holeIndex) => {\n if (\n !isVisibleBridge(\n outer,\n hole,\n blockers,\n outerPoint,\n holePoint,\n outerIndex,\n holeIndex,\n epsilon\n )\n ) {\n return;\n }\n\n const candidate = {\n outerIndex,\n holeIndex,\n distance: distance(outerPoint, holePoint),\n };\n\n if (!best || candidate.distance < best.distance) {\n best = candidate;\n }\n });\n });\n\n if (best) {\n return best;\n }\n\n return findNearestBridge(outer, hole);\n}\n\nfunction findNearestBridge(outer, hole) {\n let best = null;\n\n outer.forEach((outerPoint, outerIndex) => {\n hole.forEach((holePoint, holeIndex) => {\n const candidate = {\n outerIndex,\n holeIndex,\n distance: distance(outerPoint, holePoint),\n };\n\n if (!best || candidate.distance < best.distance) {\n best = candidate;\n }\n });\n });\n\n return best;\n}\n\nfunction isVisibleBridge(\n outer,\n hole,\n blockers,\n outerPoint,\n holePoint,\n outerIndex,\n holeIndex,\n epsilon\n) {\n if (distance(outerPoint, holePoint) <= epsilon) {\n return false;\n }\n\n const bridgeMidpoint = midpoint(outerPoint, holePoint);\n\n if (!pointInRing(bridgeMidpoint, outer) || pointInRing(bridgeMidpoint, hole)) {\n return false;\n }\n\n if (blockers.some((blocker) => pointInRing(bridgeMidpoint, blocker))) {\n return false;\n }\n\n if (\n segmentIntersectsRing(\n outerPoint,\n holePoint,\n outer,\n new Set([outerIndex, mod(outerIndex - 1, outer.length)]),\n epsilon\n )\n ) {\n return false;\n }\n\n if (\n segmentIntersectsRing(\n outerPoint,\n holePoint,\n hole,\n new Set([holeIndex, mod(holeIndex - 1, hole.length)]),\n epsilon\n )\n ) {\n return false;\n }\n\n return !blockers.some((blocker) =>\n segmentIntersectsRing(outerPoint, holePoint, blocker, new Set(), epsilon)\n );\n}\n\nfunction mergeHoleIntoOuter(outer, hole, bridge, width, epsilon) {\n const slitWidth = clampSlitWidth(width, outer, hole, epsilon);\n const outerCut = createRingCut(outer, bridge.outerIndex, slitWidth, epsilon);\n const holeCut = createRingCut(hole, bridge.holeIndex, slitWidth, epsilon);\n const outerPath = ringPath(\n outerCut.ring,\n outerCut.afterIndex,\n outerCut.beforeIndex\n );\n const holePath = ringPath(\n holeCut.ring,\n holeCut.afterIndex,\n holeCut.beforeIndex\n );\n const merged = [];\n\n appendPath(merged, outerPath, epsilon);\n appendPath(merged, holePath, epsilon);\n\n if (\n merged.length > 1 &&\n pointsAlmostEqual2D(merged[0], merged[merged.length - 1], epsilon)\n ) {\n merged.pop();\n }\n\n return {\n ring: merged,\n anchors: [\n outerCut.ring[outerCut.beforeIndex],\n holeCut.ring[holeCut.beforeIndex],\n holeCut.ring[holeCut.afterIndex],\n outerCut.ring[outerCut.afterIndex],\n ].map((point) => [point[0], point[1]]),\n };\n}\n\nfunction clampSlitWidth(width, outer, hole, epsilon) {\n const minPerimeter = Math.min(ringPerimeter(outer), ringPerimeter(hole));\n return Math.max(\n epsilon * 2,\n Math.min(width, Math.max(minPerimeter * 0.24, epsilon * 2))\n );\n}\n\nfunction createRingCut(ring, anchorIndex, width, epsilon) {\n const beforeCut = moveAlongRing(ring, anchorIndex, -width * 0.5, epsilon);\n const afterCut = moveAlongRing(ring, anchorIndex, width * 0.5, epsilon);\n\n return insertRingCutPoints(ring, beforeCut, afterCut, epsilon);\n}\n\nfunction moveAlongRing(ring, anchorIndex, offset, epsilon) {\n if (!Number.isFinite(offset) || Math.abs(offset) <= epsilon) {\n return {\n point: [ring[anchorIndex][0], ring[anchorIndex][1]],\n vertexIndex: anchorIndex,\n t: 0,\n };\n }\n\n let remaining = Math.abs(offset);\n let currentIndex = anchorIndex;\n const direction = offset > 0 ? 1 : -1;\n\n while (remaining > epsilon) {\n const nextIndex =\n direction > 0 ? (currentIndex + 1) % ring.length : mod(currentIndex - 1, ring.length);\n const segmentIndex = direction > 0 ? currentIndex : nextIndex;\n const segmentStart = ring[segmentIndex];\n const segmentEnd = ring[(segmentIndex + 1) % ring.length];\n const segmentLength = distance(segmentStart, segmentEnd);\n\n if (segmentLength <= epsilon) {\n currentIndex = direction > 0 ? nextIndex : segmentIndex;\n continue;\n }\n\n if (remaining < segmentLength - epsilon) {\n const t = remaining / segmentLength;\n const ratio = direction > 0 ? t : 1 - t;\n return {\n point: [\n segmentStart[0] + (segmentEnd[0] - segmentStart[0]) * ratio,\n segmentStart[1] + (segmentEnd[1] - segmentStart[1]) * ratio,\n ],\n segmentIndex,\n t: ratio,\n };\n }\n\n remaining -= segmentLength;\n currentIndex = direction > 0 ? nextIndex : segmentIndex;\n }\n\n return {\n point: [ring[currentIndex][0], ring[currentIndex][1]],\n vertexIndex: currentIndex,\n t: 0,\n };\n}\n\nfunction insertRingCutPoints(ring, beforeCut, afterCut, epsilon) {\n const cuts = [\n normalizeCutLocation(\"before\", ring, beforeCut, epsilon),\n normalizeCutLocation(\"after\", ring, afterCut, epsilon),\n ];\n const insertsBySegment = new Map();\n const cutIndices = {};\n const augmented = [];\n\n cuts.forEach((cut) => {\n if (cut.vertexIndex != null) {\n return;\n }\n\n const existing = insertsBySegment.get(cut.segmentIndex) ?? [];\n existing.push(cut);\n insertsBySegment.set(cut.segmentIndex, existing);\n });\n\n for (let index = 0; index < ring.length; index += 1) {\n augmented.push([ring[index][0], ring[index][1]]);\n\n cuts.forEach((cut) => {\n if (cut.vertexIndex === index) {\n cutIndices[cut.name] = augmented.length - 1;\n }\n });\n\n const segmentCuts = (insertsBySegment.get(index) ?? []).sort(\n (a, b) => a.t - b.t\n );\n\n segmentCuts.forEach((cut) => {\n augmented.push([cut.point[0], cut.point[1]]);\n cutIndices[cut.name] = augmented.length - 1;\n });\n }\n\n return {\n ring: augmented,\n beforeIndex: cutIndices.before,\n afterIndex: cutIndices.after,\n };\n}\n\nfunction normalizeCutLocation(name, ring, cut, epsilon) {\n if (cut.vertexIndex != null) {\n return {\n ...cut,\n name,\n };\n }\n\n const segmentStart = ring[cut.segmentIndex];\n const segmentEnd = ring[(cut.segmentIndex + 1) % ring.length];\n\n if (distance(cut.point, segmentStart) <= epsilon) {\n return {\n point: [segmentStart[0], segmentStart[1]],\n vertexIndex: cut.segmentIndex,\n t: 0,\n name,\n };\n }\n\n if (distance(cut.point, segmentEnd) <= epsilon) {\n return {\n point: [segmentEnd[0], segmentEnd[1]],\n vertexIndex: (cut.segmentIndex + 1) % ring.length,\n t: 1,\n name,\n };\n }\n\n return {\n ...cut,\n name,\n };\n}\n\nfunction ringPath(ring, startIndex, endIndex) {\n if (startIndex == null || endIndex == null) {\n return copyRing(ring);\n }\n\n const path = [ring[startIndex]];\n let cursor = startIndex;\n\n while (cursor !== endIndex) {\n cursor = (cursor + 1) % ring.length;\n path.push(ring[cursor]);\n }\n\n return path;\n}\n\nfunction appendPath(target, path, epsilon) {\n path.forEach((point) => {\n if (\n target.length === 0 ||\n !pointsAlmostEqual2D(target[target.length - 1], point, epsilon)\n ) {\n target.push([point[0], point[1]]);\n }\n });\n}\n\nfunction resampleRing(ring, step, anchors = []) {\n if (ring.length < 3) {\n return copyRing(ring);\n }\n\n const normalizedAnchors = normalizeAnchorPoints(ring, anchors);\n\n if (normalizedAnchors.length >= 2) {\n return resampleRingWithAnchors(ring, step, normalizedAnchors);\n }\n\n return resampleClosedPath(ring, step);\n}\n\nfunction normalizeAnchorPoints(ring, anchors) {\n const indices = anchors\n .map((anchor) => findRingPointIndex(ring, anchor))\n .filter((index) => index >= 0)\n .sort((a, b) => a - b);\n\n return indices.filter((index, position) => index !== indices[position - 1]);\n}\n\nfunction findRingPointIndex(ring, point, epsilon = 1e-6) {\n for (let index = 0; index < ring.length; index += 1) {\n if (pointsAlmostEqual2D(ring[index], point, epsilon)) {\n return index;\n }\n }\n\n return -1;\n}\n\nfunction resampleRingWithAnchors(ring, step, anchorIndices) {\n const result = [];\n\n for (let index = 0; index < anchorIndices.length; index += 1) {\n const startIndex = anchorIndices[index];\n const endIndex = anchorIndices[(index + 1) % anchorIndices.length];\n const path = ringPath(ring, startIndex, endIndex);\n const sampled = resampleOpenPath(path, step);\n\n appendPath(result, sampled, 1e-6);\n }\n\n if (\n result.length > 1 &&\n pointsAlmostEqual2D(result[0], result[result.length - 1], 1e-6)\n ) {\n result.pop();\n }\n\n if (result.length < 3 || result.length >= ring.length) {\n return copyRing(ring);\n }\n\n return result;\n}\n\nfunction resampleClosedPath(ring, step) {\n const perimeter = ringPerimeter(ring);\n\n if (perimeter <= 1e-9) {\n return copyRing(ring);\n }\n\n const pointCount = Math.max(3, Math.round(perimeter / step));\n\n if (pointCount >= ring.length) {\n return copyRing(ring);\n }\n\n const sampled = [];\n\n for (let index = 0; index < pointCount; index += 1) {\n const point = pointAtClosedPathDistance(ring, (perimeter * index) / pointCount);\n\n if (\n sampled.length === 0 ||\n !pointsAlmostEqual2D(sampled[sampled.length - 1], point, 1e-6)\n ) {\n sampled.push(point);\n }\n }\n\n if (sampled.length < 3 || sampled.length >= ring.length) {\n return copyRing(ring);\n }\n\n return sampled;\n}\n\nfunction resampleOpenPath(path, step) {\n if (path.length <= 2) {\n return path.map((point) => [point[0], point[1]]);\n }\n\n const length = polylineLength(path);\n\n if (length <= step) {\n return [\n [path[0][0], path[0][1]],\n [path[path.length - 1][0], path[path.length - 1][1]],\n ];\n }\n\n const divisionCount = Math.max(1, Math.round(length / step));\n const sampled = [];\n\n for (let index = 0; index <= divisionCount; index += 1) {\n const point = pointAtOpenPathDistance(path, (length * index) / divisionCount);\n\n if (\n sampled.length === 0 ||\n !pointsAlmostEqual2D(sampled[sampled.length - 1], point, 1e-6)\n ) {\n sampled.push(point);\n }\n }\n\n return sampled;\n}\n","import { load as loadFont, parse as parseFont } from \"opentype.js\";\nimport {\n buildGlyphTopology,\n flattenGlyphTopology,\n layoutGlyphs,\n measureText,\n normalizeTextOptions,\n toArrayBuffer,\n} from \"./core.js\";\nimport { createTextShape } from \"./shape.js\";\n\nexport class paFont {\n constructor(font) {\n this.font = font;\n this.unitsPerEm = font.unitsPerEm ?? 1000;\n this._glyphTopologyCache = new Map();\n this._glyphFlatCache = new Map();\n }\n\n static async load(source, options = {}) {\n const opts = normalizeLoadOptions(options);\n\n if (source instanceof ArrayBuffer || ArrayBuffer.isView(source)) {\n return new paFont(parseFont(toArrayBuffer(source)));\n }\n\n if (typeof window !== \"undefined\") {\n const requestUrl = resolveBrowserFontSource(source, opts.base);\n const bytes = await fetchFontBytes(requestUrl);\n return new paFont(parseFont(bytes));\n }\n\n const { target, loadOptions } = await resolveNodeFontSource(\n source,\n opts.base,\n );\n const font = await loadFont(target, undefined, loadOptions);\n return new paFont(font);\n }\n\n text(value, options = {}) {\n const opts = normalizeTextOptions(options);\n const layout = this._layoutText(String(value ?? \"\"), opts);\n return createTextShape(layout, opts, this);\n }\n\n glyph(value, options = {}) {\n const opts = normalizeTextOptions(options);\n const glyph = this.font.charToGlyph(String(value ?? \"\"));\n const layout = {\n text: String(value ?? \"\"),\n glyphs: [\n {\n glyph,\n x: opts.x,\n y: opts.y,\n size: opts.size,\n index: 0,\n },\n ],\n metrics: {\n width: (glyph.advanceWidth ?? 0) * (opts.size / this.unitsPerEm),\n x: opts.x,\n y: opts.y,\n size: opts.size,\n },\n };\n\n return createTextShape(layout, opts, this);\n }\n\n metrics(value, options = {}) {\n const opts = normalizeTextOptions(options);\n return measureText(this.font, String(value ?? \"\"), opts);\n }\n\n _getGlyphTopology(glyph) {\n const key = String(glyph.index);\n\n if (!this._glyphTopologyCache.has(key)) {\n this._glyphTopologyCache.set(\n key,\n buildGlyphTopology(glyph, this.unitsPerEm),\n );\n }\n\n return this._glyphTopologyCache.get(key);\n }\n\n _getFlattenedGlyph(glyph, opts) {\n const key = `${glyph.index}:${opts.size}:${opts.flatten}`;\n\n if (!this._glyphFlatCache.has(key)) {\n const topology = this._getGlyphTopology(glyph);\n this._glyphFlatCache.set(\n key,\n flattenGlyphTopology(topology, {\n size: opts.size,\n flatten: opts.flatten,\n }),\n );\n }\n\n return this._glyphFlatCache.get(key);\n }\n\n _layoutText(value, opts) {\n return layoutGlyphs(this.font, value, opts);\n }\n}\n\nasync function fetchFontBytes(source) {\n const response = await fetch(source);\n\n if (!response.ok) {\n throw new Error(\n `Failed to load font from ${source}: ${response.status} ${response.statusText}`,\n );\n }\n\n const bytes = await response.arrayBuffer();\n const signature = readSignature(bytes);\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n\n if (contentType.includes(\"text/html\") || isHtmlSignature(signature)) {\n throw new Error(\n `Font URL returned HTML instead of font data: ${source}. Use a public font URL like \"/assets/font.otf\", or pass { base: import.meta.url } when loading a module-relative string path. Plain string paths in the browser are resolved from the current page URL.`,\n );\n }\n\n return bytes;\n}\n\nfunction normalizeLoadOptions(options = {}) {\n if (options == null) {\n return {};\n }\n\n if (typeof options !== \"object\" || Array.isArray(options)) {\n throw new TypeError(\"paFont.load() options must be an object.\");\n }\n\n return options;\n}\n\nfunction resolveBrowserFontSource(source, base) {\n if (source instanceof URL) {\n return source.href;\n }\n\n if (typeof source !== \"string\") {\n throw new TypeError(\n \"paFont.load() expects a string, URL, ArrayBuffer, or ArrayBufferView.\",\n );\n }\n\n if (base == null) {\n return source;\n }\n\n return new URL(source, normalizeBase(base)).href;\n}\n\nasync function resolveNodeFontSource(source, base) {\n if (source instanceof URL) {\n return toNodeLoadTarget(source);\n }\n\n if (typeof source !== \"string\") {\n throw new TypeError(\n \"paFont.load() expects a string, URL, ArrayBuffer, or ArrayBufferView.\",\n );\n }\n\n if (base == null) {\n if (isLoadableUrlString(source)) {\n return toNodeLoadTarget(new URL(source));\n }\n\n return {\n target: source,\n loadOptions: undefined,\n };\n }\n\n return toNodeLoadTarget(new URL(source, normalizeBase(base)));\n}\n\nfunction normalizeBase(base) {\n if (base instanceof URL) {\n return base;\n }\n\n if (typeof base === \"string\") {\n return base;\n }\n\n throw new TypeError('paFont.load() option \"base\" must be a string or URL.');\n}\n\nasync function toNodeLoadTarget(url) {\n if (url.protocol === \"file:\") {\n return {\n target: fileUrlToPath(url),\n loadOptions: undefined,\n };\n }\n\n return {\n target: url.href,\n loadOptions: {\n isUrl: true,\n },\n };\n}\n\nfunction fileUrlToPath(url) {\n const pathname = decodeURIComponent(url.pathname);\n\n if (/^\\/[a-zA-Z]:/.test(pathname)) {\n return pathname.slice(1);\n }\n\n if (url.hostname) {\n return `//${url.hostname}${pathname}`;\n }\n\n return pathname;\n}\n\nfunction isLoadableUrlString(value) {\n return (\n value.startsWith(\"http://\") ||\n value.startsWith(\"https://\") ||\n value.startsWith(\"file://\")\n );\n}\n\nfunction readSignature(bytes) {\n const view = new Uint8Array(bytes, 0, Math.min(4, bytes.byteLength));\n let signature = \"\";\n\n for (const value of view) {\n signature += String.fromCharCode(value);\n }\n\n return signature.toLowerCase();\n}\n\nfunction isHtmlSignature(signature) {\n return signature === \"<!do\" || signature === \"<htm\";\n}\n\nexport default paFont;\n"],"mappings":"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"}
|
package/paFont.d.ts
CHANGED
|
@@ -81,7 +81,7 @@ export class PAShape implements Iterable<Region> {
|
|
|
81
81
|
toPoints(options?: PointOptions): PointSample[];
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
-
export class
|
|
84
|
+
export class paFont {
|
|
85
85
|
constructor(font: unknown);
|
|
86
86
|
|
|
87
87
|
font: unknown;
|
|
@@ -90,11 +90,11 @@ export class PAFont {
|
|
|
90
90
|
static load(
|
|
91
91
|
source: string | URL | ArrayBuffer | ArrayBufferView,
|
|
92
92
|
options?: LoadOptions,
|
|
93
|
-
): Promise<
|
|
93
|
+
): Promise<paFont>;
|
|
94
94
|
|
|
95
95
|
text(value: string, options?: TextOptions): PAShape;
|
|
96
96
|
glyph(value: string, options?: TextOptions): PAShape;
|
|
97
97
|
metrics(value: string, options?: TextOptions): Metrics;
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
export default
|
|
100
|
+
export default paFont;
|