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 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 PAFont = class PAFont {
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 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))));
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 PAFont(await (0, opentype_js.load)(target, void 0, loadOptions));
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("PAFont.load() options must be an object.");
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("PAFont.load() expects a string, URL, ArrayBuffer, or ArrayBufferView.");
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("PAFont.load() expects a string, URL, ArrayBuffer, or ArrayBufferView.");
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("PAFont.load() option \"base\" must be a string or URL.");
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 = PAFont;
1218
+ exports.default = paFont;
1219
+ exports.paFont = paFont;
1220
1220
 
1221
1221
  //# sourceMappingURL=paFont.cjs.map
@@ -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":"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"}
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 PAFont = class PAFont {
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 PAFont(parse(toArrayBuffer(source)));
1096
- if (typeof window !== "undefined") return new PAFont(parse(await fetchFontBytes(resolveBrowserFontSource(source, opts.base))));
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 PAFont(await load(target, void 0, loadOptions));
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("PAFont.load() options must be an object.");
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("PAFont.load() expects a string, URL, ArrayBuffer, or ArrayBufferView.");
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("PAFont.load() expects a string, URL, ArrayBuffer, or ArrayBufferView.");
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("PAFont.load() option \"base\" must be a string or URL.");
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 { PAFont, PAFont as default, PAShape };
1213
+ export { PAShape, paFont as default, paFont };
1214
1214
 
1215
1215
  //# sourceMappingURL=paFont.js.map
@@ -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 PAFont {
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<PAFont>;
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 PAFont;
100
+ export default paFont;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pa_font",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Generate polygon and point geometry from OpenType fonts.",
5
5
  "keywords": [
6
6
  "font",