pa_font 0.1.1

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.
@@ -0,0 +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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"}