@weasel-js/text 1.15.0 → 1.15.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.
- package/dist/{chunk-ZNSU5C43.js → chunk-WUFANHTE.js} +60 -28
- package/dist/chunk-WUFANHTE.js.map +1 -0
- package/dist/index.d.ts +9 -6
- package/dist/index.js +2 -2
- package/dist/{test-seams-Ck0mfD3U.d.ts → test-seams-B2R_EedN.d.ts} +3 -1
- package/dist/test-seams.d.ts +1 -1
- package/dist/test-seams.js +1 -1
- package/package.json +6 -6
- package/dist/chunk-ZNSU5C43.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/layout/tabStops.ts","../src/textStyle.ts","../src/layout/shaperRegistry.ts","../src/layout/decorationMetrics.ts","../src/layout/lineBreak/lineBreakTable.ts","../src/layout/lineBreak/lineBreaks.ts","../src/layout/bidiRegistry.ts","../src/layout/bidiLines.ts","../src/layout/arrayPool.ts","../src/layout/layoutColumns.ts","../src/measure/graphemes.ts","../src/layout/shapedRuns.ts","../src/layout/layoutEntries.ts","../src/layout/lineBreak/wrapLines.ts","../src/layout/layoutLines.ts","../src/layout/layoutOpts.ts","../src/layout/layoutRuns.ts","../src/layout/glyphQuads.ts","../src/syntheticBold.ts","../src/layout/paintGroups.ts","../src/layout/paintRuns.ts","../src/layout/runsEntries.ts","../src/layout/paintCache.ts","../src/layout/layoutCache.ts"],"names":["start","tabs","stopOf","flatWidth","fill","resolved","paintOf","cp","lineBreakPropsOf","CLASS_MASK","EAST_ASIAN","PICTOGRAPHIC_CN","BK","CR","LF","NL","SP","ZW","ZWJ","CM","WJ","GL","BA","BB","B2","HY","CB","CL","CP","EX","IN","NS","OP","QU","IS","NU","PO","PR","SY","AL","HL","ID","EB","EM","H2","H3","JL","JV","JT","RI","AK","AP","AS","VF","VI","QU_PI","QU_PF","scratch","registered","cache","slots","plain","sum","placed","entries","cachedFontVariant","ink","last","broken","strokeHasInk","paintKey","SCRATCH_MAX","spare","SPARE_MAX","shared","strokeKey","held","handOut","vs"],"mappings":"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","file":"chunk-WUFANHTE.js","sourcesContent":["/**\n * Tab stops, CSS `tab-size`'s way: a tab runs from where it starts on its line\n * to the next multiple of the stop interval, so its advance is known only once\n * the line it lands on is.\n */\n\n/** CSS `tab-size`'s initial value, in spaces. */\nexport const DEFAULT_TAB_SIZE = 8;\n\n/** A tab's stop interval and the least it may advance, both in world units. */\nexport interface TabStop {\n stop: number;\n /** Half a space: CSS skips a stop nearer than that to the following one. */\n min: number;\n}\n\n/** How far a tab starting `x` into its line advances. */\nexport function tabAdvance(x: number, stop: number, min: number): number {\n if (!(stop > 0)) return 0;\n const toNext = (Math.floor(x / stop) + 1) * stop - x;\n return toNext < min ? toNext + stop : toNext;\n}\n\n/**\n * Width of entries `[start, end)` set on a line opening at `start`, with each\n * tab among them (`tabs`, ascending entry indices) run out to its stop.\n * `flatWidth` is the same measure with every tab taken as zero-width. `piece`\n * hears each stretch between tabs and the x it starts at.\n */\nexport function widthWithTabs(\n start: number,\n end: number,\n tabs: readonly number[],\n stopOf: (index: number) => TabStop,\n flatWidth: (start: number, end: number) => number,\n piece?: (start: number, end: number, x: number) => void,\n): number {\n let x = 0;\n let from = start;\n const lay = (to: number): void => {\n if (to <= from) return;\n piece?.(from, to, x);\n x += flatWidth(from, to);\n };\n for (const t of tabs) {\n if (t < start) continue;\n if (t >= end) break;\n lay(t);\n const { stop, min } = stopOf(t);\n x += tabAdvance(x, stop, min);\n from = t + 1;\n }\n lay(end);\n return x;\n}\n","/**\n * Typography for `TextPose` and friends. Defaults live in\n * `DEFAULT_TEXT_STYLE` and are applied at render/measure time, never written\n * back to the pose.\n *\n * Paint does not live here. A text node carries its fill and stroke in\n * `data.fill` / `data.stroke`, the slots every other node kind uses.\n */\n\nimport type { Paint, ScreenLength, Stroke, Fill } from '@weasel-js/paint';\nimport { isSolidPaint, resolveFill, resolveScreenLength, type PaintedFill } from '@weasel-js/paint';\nimport { cssFamilyName } from '@weasel-js/font';\nimport type { TextTransform } from './runs/textTransform';\nimport type { FontVariantCaps } from './runs/smallCaps';\nimport { DEFAULT_TAB_SIZE } from './layout/tabStops';\n\n/**\n * Horizontal alignment. `start` / `end` resolve against the reading direction;\n * `left` / `right` are absolute. `justify` spreads every wrapped line across\n * the box by widening its word gaps, and sets a paragraph's last line at the\n * start edge. The same values as CSS `text-align`, with the same meanings.\n */\nexport type TextAlign = 'left' | 'center' | 'right' | 'start' | 'end' | 'justify';\n\n/** Reading direction, which is what gives `start` / `end` their meaning. */\nexport type TextDirection = 'ltr' | 'rtl';\n\n/**\n * Collapse a possibly reading-order-relative alignment to an absolute edge.\n * `justify` collapses to the start edge, which is where it sets every line it\n * does not spread; whether to spread is carried separately, as\n * `LayoutRunsOpts.justify`.\n */\nexport function resolveAlign(\n align: TextAlign,\n direction: TextDirection,\n): 'left' | 'center' | 'right' {\n if (align === 'start' || align === 'justify') return direction === 'rtl' ? 'right' : 'left';\n if (align === 'end') return direction === 'rtl' ? 'left' : 'right';\n return align;\n}\n\n/** User-facing text style. All fields optional; defaults applied at render time via `resolveTextStyle`. */\nexport interface TextStyle {\n /**\n * World units, or `{ px }` for screen pixels — resolved against the view\n * scale passed to {@link resolveTextStyle}, so a label pinned this way\n * stays the same size on screen as the view zooms. Default 16.\n */\n fontSize?: ScreenLength;\n /** Default `'sans-serif'`. */\n fontFamily?: string;\n /** Default 400. */\n fontWeight?: number | string;\n /** Default `'normal'`. */\n fontStyle?: 'normal' | 'italic';\n /** Default `'left'`. Pass `'start'` to align by reading order instead. */\n align?: TextAlign;\n /**\n * Reading direction: the base direction of bidi reordering, and what\n * `align: 'start' | 'end'` resolve against. Default `'auto'`, each\n * paragraph's own first strong character.\n */\n direction?: TextDirection | 'auto';\n /** Multiplier applied to `fontSize`. Default 1.2. */\n lineHeight?: number;\n /** Distance between tab stops, in spaces, as CSS `tab-size`. Default 8. */\n tabSize?: number;\n /**\n * Break lines where they would pass the box width, at the break\n * opportunities of Unicode's line breaking algorithm (UAX #14) — between\n * words, after a hyphen, between CJK characters. Default\n * `false`: a line runs as long as its text, and the box width only resolves\n * `align`. A word longer than the box is never broken.\n */\n wrap?: boolean;\n /**\n * Caret color used by the edit overlay. Defaults to the node's fill when\n * that fill is solid; falls back to `#000` for non-solid paints.\n */\n caretColor?: string;\n /**\n * Selection background color used by the edit overlay's `::selection`\n * pseudo-element. Defaults to a 25%-opacity tint of `caretColor` via CSS\n * `color-mix`. Pass `'none'` to fall back to the browser-native highlight.\n */\n selectionBackground?: string;\n /** Selection text color paired with `selectionBackground`. Default: inherits text color. */\n selectionColor?: string;\n /** Extra advance added after each glyph. World units, or `{ px }` for\n * screen pixels, like {@link TextStyle.fontSize}. Default 0. */\n letterSpacing?: ScreenLength;\n /** Default `false`. */\n underline?: boolean;\n /** Default `false`. */\n strikethrough?: boolean;\n /** Default `false`. */\n overline?: boolean;\n /** CSS `text-transform` for display; the text itself is not rewritten.\n * Default `'none'`. */\n textTransform?: TextTransform;\n /** `'small-caps'` draws lowercase as smaller capitals; the text itself is\n * not rewritten. Default `'normal'`. */\n fontVariantCaps?: FontVariantCaps;\n /**\n * Set the node's text as a superscript or subscript — the default every run\n * inherits. The lines keep the height and baseline the unscripted text would\n * have had. Absent is ordinary text.\n */\n script?: 'super' | 'sub';\n /**\n * The text's language, as a BCP 47 tag (`'sr'`, `'ur-PK'`), which every run\n * inherits: a shaper draws the face's forms for it. Absent draws the face's\n * default forms.\n */\n lang?: string;\n}\n\n/** `TextStyle` with all fields filled in from defaults — what the renderer actually consumes. */\nexport interface ResolvedTextStyle {\n fontSize: number;\n fontFamily: string;\n fontWeight: number | string;\n fontStyle: 'normal' | 'italic';\n /** Still relative if the author wrote it that way — `direction` resolves it. */\n align: TextAlign;\n direction: TextDirection | 'auto';\n lineHeight: number;\n tabSize: number;\n wrap: boolean;\n /** `null` is no fill: outline-only text, painted by its stroke alone. */\n fill: PaintedFill | null;\n caretColor: string;\n selectionBackground: string | null;\n selectionColor: string | null;\n letterSpacing: number;\n underline: boolean;\n strikethrough: boolean;\n overline: boolean;\n textTransform: TextTransform;\n fontVariantCaps: FontVariantCaps;\n /** Absent is ordinary text. */\n script?: 'super' | 'sub';\n /** Absent is no language: the face's default forms. */\n lang?: string;\n /** Absent means no outline — unlike the other fields, this one has no\n * default to fall back to. See {@link TextPaint.stroke}. */\n stroke?: Stroke;\n}\n\nconst DEFAULT_FILL: Paint = { kind: 'solid', color: '#000' };\n\n/** The black a text node is made with. A node read with no fill paints no\n * glyphs, so whatever creates one writes this rather than leaving it out. */\nexport const DEFAULT_TEXT_FILL: PaintedFill = { paint: DEFAULT_FILL };\n\nfunction paintColor(p: Paint | null): string {\n return isSolidPaint(p) ? p.color : '#000';\n}\n\n/** The last color {@link defaultSelectionBackground} mixed and its mix: text\n * restyled every frame mostly asks for the same one. */\nlet mixedColor = '';\nlet mixed = '';\n\nfunction defaultSelectionBackground(textColor: string): string {\n if (textColor !== mixedColor) {\n mixed = `color-mix(in srgb, ${textColor} 25%, transparent)`;\n mixedColor = textColor;\n }\n return mixed;\n}\n\n/** Default resolved style used when a `TextPose` omits `style`. */\nexport const DEFAULT_TEXT_STYLE: ResolvedTextStyle = {\n fontSize: 16,\n fontFamily: 'sans-serif',\n fontWeight: 400,\n fontStyle: 'normal',\n align: 'left',\n direction: 'auto',\n lineHeight: 1.2,\n tabSize: DEFAULT_TAB_SIZE,\n wrap: false,\n fill: null,\n caretColor: paintColor(DEFAULT_FILL),\n selectionBackground: defaultSelectionBackground(paintColor(DEFAULT_FILL)),\n selectionColor: null,\n letterSpacing: 0,\n underline: false,\n strikethrough: false,\n overline: false,\n textTransform: 'none',\n fontVariantCaps: 'normal',\n};\n\n/** The paint a text node hands its glyphs — `data.fill` and `data.stroke`. Runs inherit these when they name none of their own. */\nexport interface TextPaint {\n /** Read by `resolveFill`: absent and `null` are no fill. Unfilled text\n * paints through its stroke and nothing else. */\n fill?: Fill | null;\n /**\n * Outline painted over the glyph fill. Absent means no outline.\n *\n * Only glyphs on the outline tier are stroked: below\n * `textOutlineMinScreenSize` a glyph is a sampled distance field with no\n * geometry to stroke, and it renders unstroked. `width` is in world units —\n * it does not scale with `fontSize`.\n */\n stroke?: Stroke | null;\n}\n\n/**\n * Fill in a partial `TextStyle` with defaults from `DEFAULT_TEXT_STYLE`,\n * taking the glyph paint from the node rather than from the style.\n *\n * `scale` is the view scale any `{ px }` size resolves against — the same\n * mean-of-the-axes factor `resolveStrokeWidth` takes.\n */\nexport function resolveTextStyle(\n style?: TextStyle,\n paint?: TextPaint,\n scale = 1,\n): ResolvedTextStyle {\n if (!style && resolveFill(paint?.fill) === null && (paint?.stroke ?? undefined) === undefined) {\n return DEFAULT_TEXT_STYLE;\n }\n return resolveTextStyleInto({ ...DEFAULT_TEXT_STYLE }, style, paint, scale);\n}\n\n/**\n * {@link resolveTextStyle}, written into `out` and returned. A field `out`\n * holds that this resolution leaves out — `script`, `lang`, `stroke` — is set\n * to `undefined`, so one object can take resolution after resolution.\n */\nexport function resolveTextStyleInto(\n out: ResolvedTextStyle,\n style?: TextStyle,\n paint?: TextPaint,\n scale = 1,\n): ResolvedTextStyle {\n const s = style ?? NO_STYLE;\n const fill = resolveFill(paint?.fill);\n const stroke = paint?.stroke ?? undefined;\n const caretColor = s.caretColor ?? paintColor((fill?.paint ?? null));\n let selectionBackground: string | null;\n if (s.selectionBackground === 'none') {\n selectionBackground = null;\n } else if (s.selectionBackground != null) {\n selectionBackground = s.selectionBackground;\n } else {\n selectionBackground = defaultSelectionBackground(caretColor);\n }\n out.fontSize = resolveScreenLength(s.fontSize ?? DEFAULT_TEXT_STYLE.fontSize, scale);\n out.fontFamily = s.fontFamily ?? DEFAULT_TEXT_STYLE.fontFamily;\n out.fontWeight = s.fontWeight ?? DEFAULT_TEXT_STYLE.fontWeight;\n out.fontStyle = s.fontStyle ?? DEFAULT_TEXT_STYLE.fontStyle;\n out.align = s.align ?? DEFAULT_TEXT_STYLE.align;\n out.direction = s.direction ?? DEFAULT_TEXT_STYLE.direction;\n out.lineHeight = s.lineHeight ?? DEFAULT_TEXT_STYLE.lineHeight;\n out.tabSize = s.tabSize ?? DEFAULT_TEXT_STYLE.tabSize;\n out.wrap = s.wrap ?? DEFAULT_TEXT_STYLE.wrap;\n out.fill = fill;\n out.caretColor = caretColor;\n out.selectionBackground = selectionBackground;\n out.selectionColor = s.selectionColor ?? null;\n out.letterSpacing = resolveScreenLength(s.letterSpacing ?? DEFAULT_TEXT_STYLE.letterSpacing, scale);\n out.underline = s.underline ?? DEFAULT_TEXT_STYLE.underline;\n out.strikethrough = s.strikethrough ?? DEFAULT_TEXT_STYLE.strikethrough;\n out.overline = s.overline ?? DEFAULT_TEXT_STYLE.overline;\n out.textTransform = s.textTransform ?? DEFAULT_TEXT_STYLE.textTransform;\n out.fontVariantCaps = s.fontVariantCaps ?? DEFAULT_TEXT_STYLE.fontVariantCaps;\n // Absent stays absent on a fresh object, and is cleared on a reused one.\n if (s.script !== undefined || out.script !== undefined) out.script = s.script;\n const lang = s.lang || undefined;\n if (lang !== undefined || out.lang !== undefined) out.lang = lang;\n if (stroke !== undefined || out.stroke !== undefined) out.stroke = stroke;\n return out;\n}\n\nconst NO_STYLE: TextStyle = Object.freeze({});\n\n/** Build a CSS `font` shorthand suitable for `ctx.font`. */\nexport function fontString(s: ResolvedTextStyle): string {\n return `${s.fontStyle} ${s.fontWeight} ${s.fontSize}px ${cssFamilyName(s.fontFamily)}`;\n}\n","/**\n * Where the shaping engine arrives, the way the bidi engine does\n * (`bidiRegistry.ts`): registered once, found by every layout.\n */\nimport {\n cachedFontVariant, outlineMetrics, type FaceEmbedding, type FontStyle, type OutlineFace, type ResolveResult,\n} from '@weasel-js/font';\nimport type { TextShaper } from './shaperSeam';\n\nlet registered: TextShaper | null = null;\n\n/**\n * Give every text layout a shaping engine: `registerShaper(await\n * loadShaper())`, with `loadShaper` from `@weasel-js/text-shaping`. `layoutRuns` uses\n * it whenever its options carry none. Pass `null`, or call the function\n * returned, to take it out again.\n *\n * Shaping reaches the text whose face has TrueType or OpenType bytes behind\n * it: a face registered with `registerFontOutlines` alone, or a baked or\n * canvas atlas face whose exact variant is also registered there. The atlas\n * must be cut from that same file, or its advances disagree with the\n * shaper's. On an atlas face, a cluster the shaping left as its code point's\n * own glyph draws from the atlas as before; the rest draw from the shaper's\n * glyphs.\n */\nexport function registerShaper(shaper: TextShaper | null): () => void {\n registered = shaper;\n return () => { if (registered === shaper) registered = null; };\n}\n\n/** The shaper {@link registerShaper} was last given, or null. */\nexport function registeredShaper(): TextShaper | null {\n return registered;\n}\n\nconst embeddingOf = new WeakMap<OutlineFace, FaceEmbedding | null>();\n\n/**\n * The face a shaper reads for text that resolved to `resolved`: its own on the\n * outline tier; on an atlas or canvas face, the outline face registered for\n * the same exact variant, which starts loading the first time it is asked\n * for. Null when there is none, or none with sfnt bytes.\n */\nexport function shapingFace(resolved: ResolveResult): FaceEmbedding | null {\n const { family, weight, style } = resolved.resolved;\n const face = resolved.outlineFace ?? (resolved.source === 'outline'\n ? undefined\n : outlineMetrics(family, weight, style === 'italic' ? 'italic' : 'normal'));\n if (!face) return null;\n let embedding = embeddingOf.get(face);\n if (embedding === undefined) {\n embedding = face.embedding?.() ?? null;\n embeddingOf.set(face, embedding);\n }\n return embedding;\n}\n\n/** The font file a shaper reads for text that resolved to `resolved` ({@link shapingFace}). */\nexport function shapeableBytes(resolved: ResolveResult): ArrayBuffer | null {\n return shapingFace(resolved)?.sfnt ?? null;\n}\n\n/** Whether text set in `(family, weight, style)` will be shaped by `shaper`\n * with OpenType feature `tag` available. */\nexport function shapesWithFeature(\n family: string, weight: number, style: FontStyle, tag: string, shaper: TextShaper | null = registered,\n): boolean {\n if (shaper === null) return false;\n const bytes = shapeableBytes(cachedFontVariant(family, weight, style));\n return bytes !== null && shaper.hasFeature(bytes, tag);\n}\n","import type { FaceMetrics, FaceRuleMetrics } from '@weasel-js/font';\nimport type { ResolvedRun } from '../runs/resolveRuns';\nimport type { PlacedGlyph } from './layoutRuns';\n\n/** The three text decoration rules, in the order every tier paints them. */\nexport type DecorationKind = 'underline' | 'strikethrough' | 'overline';\n\nexport const DECORATION_KINDS: readonly DecorationKind[] = ['underline', 'strikethrough', 'overline'];\n\n/**\n * Decoration placement and weight for a face that states none, as fractions\n * of the run's `fontSize`. Offsets are the *top* edge of the rule, measured\n * down from the baseline — so the two rules that sit above it are negative.\n *\n * Derived, not measured: they apply to an atlas baked before `gen-font`\n * recorded `faceMetrics`, a custom outline parser that reports none, and the\n * canvas tier, which has no font tables to read.\n */\nexport const DEFAULT_DECORATION_METRICS: Readonly<Record<DecorationKind, FaceRuleMetrics>> = Object.freeze({\n underline: Object.freeze({ offset: 0.10, thickness: 0.05 }),\n strikethrough: Object.freeze({ offset: -0.30, thickness: 0.05 }),\n overline: Object.freeze({ offset: -0.90, thickness: 0.05 }),\n});\n\nconst resolved = new WeakMap<FaceMetrics, Readonly<Record<DecorationKind, FaceRuleMetrics>>>();\n\n/**\n * Where each rule sits for a face, in ems: the face's own underline and\n * strikeout where it states them, the defaults where it does not. No font\n * table places an overline, so it keeps the default offset and takes the\n * underline's weight, as browsers draw it.\n *\n * Every text tier places its rules through this, so one face puts a rule in\n * the same place whichever tier paints it.\n */\nexport function decorationMetrics(face?: FaceMetrics): Readonly<Record<DecorationKind, FaceRuleMetrics>> {\n if (!face) return DEFAULT_DECORATION_METRICS;\n let out = resolved.get(face);\n if (!out) {\n const underline = face.underline ?? DEFAULT_DECORATION_METRICS.underline;\n out = Object.freeze({\n underline,\n strikethrough: face.strikethrough ?? DEFAULT_DECORATION_METRICS.strikethrough,\n overline: Object.freeze({ offset: DEFAULT_DECORATION_METRICS.overline.offset, thickness: underline.thickness }),\n });\n resolved.set(face, out);\n }\n return out;\n}\n\n/**\n * The vertical extent of one decoration rule for a run of `fontSize` whose\n * baseline sits at `baselineY` (y grows down), set in `face`.\n */\nexport function decorationRule(\n kind: DecorationKind,\n baselineY: number,\n fontSize: number,\n face?: FaceMetrics,\n): { y0: number; y1: number } {\n const m = decorationMetrics(face)[kind];\n const y0 = baselineY + fontSize * m.offset;\n return { y0, y1: y0 + fontSize * m.thickness };\n}\n\n/** One rule drawn across a stretch of a line. */\nexport interface DecorationRule {\n kind: DecorationKind;\n x0: number; y0: number; x1: number; y1: number;\n /** The run that opened the stretch. Every run in it paints its rules alike. */\n run: number;\n}\n\n/** Builds one line's decoration rules from its glyphs, fed in visual order. */\nexport interface LineDecorations {\n /** Take the next glyph. Its fields are read now and not kept. */\n add(g: PlacedGlyph): void;\n /** The line's rules. */\n end(): DecorationRule[];\n}\n\n/**\n * The decoration rules of one line, in visual order; within a stretch,\n * underline then strikethrough then overline.\n *\n * Fed the whole line in visual order. A rule runs across adjacent\n * glyphs whose runs agree on which rules to draw, on the size, face and\n * baseline that place them, and on `paintOf`: the identity of the paint a\n * run's rules wear, or null for a run that draws none. It is built from pen\n * positions rather than ink, so it covers the spaces, tracking and kerning\n * inside the stretch, and two alike runs join without a seam.\n */\nexport function lineDecorations(\n runs: readonly ResolvedRun[],\n faceOf: (run: number) => FaceMetrics | undefined,\n paintOf: (run: number) => string | null,\n): LineDecorations {\n interface Stretch {\n run: number;\n style: ResolvedRun;\n face: FaceMetrics | undefined;\n paint: string;\n baselineY: number;\n x0: number;\n x1: number;\n }\n const rules: DecorationRule[] = [];\n let open: Stretch | null = null;\n const close = (): void => {\n const s = open;\n open = null;\n if (!s || s.x1 <= s.x0) return;\n for (const kind of DECORATION_KINDS) {\n if (!s.style[kind]) continue;\n // The run's size, not the glyph's: a small-caps word is one rule.\n const { y0, y1 } = decorationRule(kind, s.baselineY, s.style.fontSize, s.face);\n rules.push({ kind, x0: s.x0, y0, x1: s.x1, y1, run: s.run });\n }\n };\n\n return {\n add(g) {\n const style = runs[g.run];\n // Flags first: `paintOf` builds a string, and most text has no rule.\n const paint = style.underline || style.strikethrough || style.overline ? paintOf(g.run) : null;\n if (paint === null) {\n if (open !== null) close();\n return;\n }\n const face = faceOf(g.run);\n const joins = open !== null\n && DECORATION_KINDS.every((kind) => open!.style[kind] === style[kind])\n && open.style.fontSize === style.fontSize\n && open.face === face\n && open.baselineY === g.baselineY\n && open.paint === paint;\n if (joins) {\n open!.x1 = g.x + g.step;\n } else {\n close();\n open = { run: g.run, style, face, paint, baselineY: g.baselineY, x0: g.x, x1: g.x + g.step };\n }\n },\n end() {\n close();\n return rules;\n },\n };\n}\n","/**\n * GENERATED FILE -- DO NOT EDIT BY HAND.\n *\n * Emitted by `packages/text/scripts/gen-line-break-table.mjs` from the\n * Unicode Character Database. Regenerate with `npm run gen:line-break-table`.\n */\n\n/** The Unicode release this table was generated from. */\nexport const UNICODE_VERSION = '16.0.0';\n\n// Line-breaking classes after UAX #14's LB1 resolution. QU_PI and QU_PF are\n// QU split by General_Category Pi and Pf.\nexport const BK = 0;\nexport const CR = 1;\nexport const LF = 2;\nexport const NL = 3;\nexport const SP = 4;\nexport const ZW = 5;\nexport const ZWJ = 6;\nexport const CM = 7;\nexport const WJ = 8;\nexport const GL = 9;\nexport const BA = 10;\nexport const BB = 11;\nexport const B2 = 12;\nexport const HY = 13;\nexport const CB = 14;\nexport const CL = 15;\nexport const CP = 16;\nexport const EX = 17;\nexport const IN = 18;\nexport const NS = 19;\nexport const OP = 20;\nexport const QU = 21;\nexport const IS = 22;\nexport const NU = 23;\nexport const PO = 24;\nexport const PR = 25;\nexport const SY = 26;\nexport const AL = 27;\nexport const HL = 28;\nexport const ID = 29;\nexport const EB = 30;\nexport const EM = 31;\nexport const H2 = 32;\nexport const H3 = 33;\nexport const JL = 34;\nexport const JV = 35;\nexport const JT = 36;\nexport const RI = 37;\nexport const AK = 38;\nexport const AP = 39;\nexport const AS = 40;\nexport const VF = 41;\nexport const VI = 42;\nexport const QU_PI = 43;\nexport const QU_PF = 44;\n\n/** Low bits of a {@link lineBreakPropsOf} value: the class. */\nexport const CLASS_MASK = 63;\n/** East_Asian_Width is F, W or H — UAX #14's `$EastAsian`. */\nexport const EAST_ASIAN = 64;\n/** Unassigned and Extended_Pictographic, for rule LB30b. */\nexport const PICTOGRAPHIC_CN = 128;\n\nconst ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!#$%&()*+,-./:;<=>?@[]^_{|}~';\nconst PALETTE = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 71, 73, 74, 79, 81, 82, 83, 84, 88, 89, 91, 93, 94, 95, 96, 97, 98, 155, 157];\n\n// Run-length encoding over the whole code space: each record is a decimal run\n// length, then one ALPHABET character indexing PALETTE.\nconst RUNS = 2787;\nconst PACKED =\n '9H1K1C2A1B18H1E1R1V1b1Z1Y1b1V1U1Q1b1Z1W1N1W1a10X2W3b1R27b1U1Z1Q29b1U1K1P1b6H1D26H1J1U1Y3Z5b1n1b1' +\n 'K2b1Y1Z2b1L6b1o3b1U520b1L3b1L18b1L32b79H1J12H7J13H14b1W260b7H255b1W1K4b1Z1b45H1K1H1b2H1b2H1R1H8b' +\n '27c4b4c13b6X3b3Y2W2b11H1R1H3R43b21H10X1Y2X3b1H99b1R1b7H1X1b6H2b2H1b4H2b10X23b1H30b27H91b11H15b10' +\n 'X33b9H4b1W1R3b1H2Z22b4H1b9H1b3H1b5H43b3H52b2X5b9H42b24H1X33H54b3H1b18H1b7H10b2H2K10X17b3H56b1H1b' +\n '7H2b2H2b3H9b1H10b2H2b10X2b2Y5b1Y1b1Z2b1H2b3H56b1H1b5H4b2H2b3H3b1H20b10X2H3b1H11b3H56b1H1b8H1b3H1' +\n 'b3H20b2H2b10X1b1Z8b6H1b3H56b1H1b7H2b2H2b3H7b3H10b2H2b10X18b1H59b5H3b3H1b4H9b1H14b10X9b1Z6b5H55b1' +\n 'H1b7H1b3H1b4H7b2H11b2H2b10X7b1L9b3H1L55b1H1b7H1b3H1b4H7b2H11b2H2b10X3b1H12b4H55b2H1b7H1b3H1b4H9b' +\n '1H10b2H2b10X9b1Y7b3H70b1H4b6H1b1H1b8H6b10X2b2H61b1H2b7H4b1Z7b8H1b10X2K85b1H2b9H11b7H1b10X39b4L1b' +\n '2L1J2L1K1J5R1J1b1R3b2H6b10X10b1K1H1b1H1b1H1U1P1U1P2H49b14H1K5H1K2H5b11H1b36H1b2K6b1H9b2L1K1L5b2J' +\n '80b20H1b10X2K10b4H4b3H1b3H2b7H3b4H13b12H1b1H10X4H98b96(72f88g349b3H1b1K158b1K639b1K26b1U1P78b3K3' +\n '6b4H28b3H2K27b2H30b2H64b32H2K1T1b1K1b1K1Z1b1H2b10X24b2R2K1L1b2R1b3H1J1H10X107b2H34b1H118b12H4b12' +\n 'H8b2R10X128b11X60b5H57b10H1b29H2b1H10X6b10X22b31H49b5H47i16H1m8i1b2K10k2K1d4K10d9H9d3K3H30b13H2b' +\n '10X6b38k12H2l48b20H3b5K10X6b10X36b2K80b3H1b21H4b1H6b1H2b3H198b13H1J46H1J3H509b1L2b7K1J3K1F1H1G2H' +\n '1K1J2K1M3b1n1o1U2n1o1U1n4b3S1K2A5H1J8Y1b1n1o1b2T6b1W1U1P3T12b1K1Y4K1b3K1I5b10H13b1U1P14b1U1P17b7' +\n 'Z1Y1Z1y12Z1Y4Z1Y2Z1Y1Z1Y15Z33H18b1Y5b1Y12b1Z251b2Z219b1S24b1U1P1U1P14b2!13b1w1s190b4z3b1!2d1!521' +\n 'b2z1b4d16b2!2b1d1b3d1e2d16b8z1b3d12b12z20b1d22b1!10b6z3b1z13b1z8b2z17b2!5d2!3d4b1d1z3d1b1d1!3b2d' +\n '2b1d2b3d8b1!6b1d2!1d1!1b2d1e1!2b1!7d1z2b2d2#2e26b1z35b1z1b1z4b3z1b1z3b6V1b2R1d3b1U1P1U1P1U1P1U1P' +\n '1U1P1U1P1U1P31b3z24b1z14b1z5b1U1P31b1U1P1U1P1U1P1U1P1U1P403b1U1P1U1P1U1P1U1P1U1P1U1P1U1P1U1P1U1P' +\n '1U1P1U1P63b1U1P1U1P32b1U1P285b2z51b1z4b1z409b3H7b1R3K1b1R1K112b1K14b1H96b32H2V1n1o1n1o3V1n1o1V1n' +\n '1o8K1b1K1U1K2b1n1o2b1n1o1U1P1U1P1U1P1U1P4K1R1b2K1b2K5b2M3K1b2K1U8K1b1K1b2K3b2R1U1Q1U1Q1U1Q1U1Q1K' +\n '34b26!1b89!12b214!26b16!1r2s2!1v2!1w1s1w1s1w1s1w1s1w1s2!1w1s1w1s1w1s1w1s1v1w2s10!6p5!1p5!2v2!1d1' +\n 'b1v1!1v1!1v1!1v1!1v25!1v31!1v1!1v1!1v6!1v6!2v2b2p4v1!2v1!1v1!1v1!1v1!1v25!1v31!1v1!1v1!1v6!1v6!2' +\n 'v4!4v1!5b43!1b94!1b86!9b1!16v31!1b40!8b7024!64z21013!1v1143!3b55!55b2K269b1K1R1K16b10X69b4H1b10H' +\n '32b2H80b2H1b5K266b1H3b1H4b1H23b5H4b1H11b1Y59b2L2R8b2H50b18H8b2K10X6b18H10b1L2b1H10X28b8H2K23b13H' +\n '12b29(3b4H47i13H1m6d3K4d1b1K10k4b2d5b1H10b10X6b41k14H9b3K1H8K2H2b10k2b1d3K27b3H50b1H1b3H2b2H5b2H' +\n '1b1H41b5H2K3b2H236b8H1K2H2b10X6b1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27' +\n '&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&' +\n '1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1' +\n '%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%' +\n '27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%2' +\n '7&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27' +\n '&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&' +\n '1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1' +\n '%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%' +\n '27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%2' +\n '7&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27' +\n '&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&' +\n '1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1' +\n '%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%' +\n '27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%2' +\n '7&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27' +\n '&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&' +\n '1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1' +\n '%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%' +\n '27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%2' +\n '7&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27&1%27' +\n '&1%27&1%27&12b23f4b49g8452b512!29b1c1H10c1b13c1b5c1b1c1b2c1b2c1b10c494b1P1U188b1Y3b16H3s2v2t1w1s' +\n '1u6b1J1H1J1H1J1H2J1H1J1H1J1H2J1H5!1w1s1w1s1w1s1w1s1w1s1w1s1w1s1w1s2!1w1s7!1s1!1s1b2v2t1!1w1s1w1s' +\n '1w1s8!1b1!1y1x1!147b1I1b1t2!1y1x2!1w1s2!1s1!1s11!2v3!1t27!1w1!1s29!1w1!1s1!1w2s1w2s1v1!10v45!2v3' +\n '1!3b6!2b6!2b6!2b3!3b1x1y3!2y1b7z10b3H1O259b3K250b1H226b1H149b5H36b1K48b1K207b10X941b1K199b1K225b' +\n '3H1b2H5b4H40b3H4b1H16b8K141b2H9b6K1S66b7K484b4H8b10X6b10X31b5H1K316b2H1K78b4H70b11H49b4H122b3H2j' +\n '51i14H1m2K5d4b20d10k1H2i2H1i9b1J3H45b11H2b1X4K1H10b1X34b10X6b3H36b14H1b10X4K1b2H44b1H1b1L10b3H48' +\n 'b14H4b2K1b1K4H1b2H10X1b1L1b3K76b12H2K1b2K1b1H2b1H103b1K53b12H5b10X6b4H1b8i2b2i2b22i1b7i1b2i1b5i1' +\n 'b2H1K7H2b2H2b2H1m2b1k6b1H5b1K2k2i2H2b7H3b5H11b10k1b1k2b1k1b2k36i1b1d9H1b1H2b1H1b4H1b4H1m1j1H3d1b' +\n '2d8b2H82b18H4b4K1b10X2K2b1H81b20H12b10X213b7H2b9H1L2K2R3b15K4b2H82b17H2K13b10X6b13L62b13H8b10X6b' +\n '20X57b15H4b10X2b3K237b15H165b10X22b7i2b1i2b8i1b2i1b24i6H1b2H2b3H1m1j1H1j2H3K9b10k119b7H2b7H1b1L1' +\n 'b1H28b10H40b7H1b4H1L1b4K1L1b1H9b11H46b16H3K1b3L2K93b10L230b10X53b8H1b8H1b5K10b10X22b1L1R32b22H1b' +\n '14H122b6H3b1H1b2H1b7H1b1H8b10X48b5H1b2H1b5H8b10X310b18k1K4H2K7b2H1j1H13i1b34i7H3b4H1m2K11d10k1H1' +\n '30b4Y30b1K1136b5K3555b3U3P36b1P3b1U1P1U1P239b1U2P179b1U7J1U1P3J1U1P1U1P1H6b15H4472b1U1P6960b30k1' +\n '8H10k2342b10X4b2K80b10X38b5H1K58b7H3K10b1K11b10X532b2K10X285b2K182b1H1b55H7b4H77b4v1q11b2p14b613' +\n '6!8b768!470z41b1z9!8935b4z1b7z1b2z1b291!15b1v29b3v2b1v14b4v8b396!2465b2H1K4H4172b10X518b46H2b23H' +\n '542b5H3b22H2b7H30b4H148b3H187b87z9b23z1111b50X512b55H4b50H8b1H14b1H2b4K16b5H1b15H1360b7H1b17H2b7' +\n 'H1b2H1b5H100b1H160b7H9b10X356b1H61b4H10X5b1Z492b4H10X244b2H1b10X725b7H109b7H5b10X4b2U844b1Y3b1Y8' +\n '47b4d1!39d4*100d12*15d2*15d1*14d1!1*37d10*142b1z2b10z19b56*26h3!13*44!4*9!7*2!14*6!154*33!12d9!1' +\n 'd70!1d7!1#14!8d2b2d21!2z5!1z5!3#2!1#2!1#2e2d5!12d17!3d1!3d3!5$63!1d1!1d2#2!11#21!19#3!1#4!3#1!3#' +\n '7!1#1!1#14!1z1!1z1!1z5!1#4!1z1!2z74!2d1!7z16!14z13!12z12b1d4!1d24!12d2e4d1#21d1e4d2#13d1!47d8b24' +\n 'd6b1d74!3#3!5#38b3V3T4b35!1#16!3#9!1#5!6d1#3d3!2d3!4*4!11d2!3*4d9!3*116b3d4*5d85b5d6*12!4*1!15*1' +\n '2b4)56b8)10b6)40b8)30b2)12b4)2b62)12b1#2!1#8!8#6!1#9!10#1!1d3#7!1d48!1#61!2#1!2#1!1#17!3#1!13#34' +\n '!84b12*14d2*13!3*10!5*52!3#1!7*15!2*11!6*9#7*240b10X6b1022*2b65534!2b65534!655363b1H30b96H128b24' +\n '0H196112b';\n\nlet bmp: Uint8Array | null = null;\nlet astralStarts: Int32Array | null = null;\nlet astralValues: Uint8Array | null = null;\n\nfunction decode(): void {\n const direct = new Uint8Array(0x10000);\n const starts = new Int32Array(RUNS);\n const values = new Uint8Array(RUNS);\n const slot = new Uint8Array(128);\n for (let i = 0; i < ALPHABET.length; i++) slot[ALPHABET.charCodeAt(i)] = PALETTE[i];\n let cp = 0;\n let run = 0;\n let len = 0;\n for (let i = 0; i < PACKED.length; i++) {\n const code = PACKED.charCodeAt(i);\n if (code <= 57 && code >= 48) len = len * 10 + code - 48;\n else {\n const v = slot[code];\n starts[run] = cp;\n values[run] = v;\n if (cp < 0x10000) direct.fill(v, cp, Math.min(cp + len, 0x10000));\n run++;\n cp += len;\n len = 0;\n }\n }\n bmp = direct;\n astralStarts = starts;\n astralValues = values;\n}\n\n/**\n * The class of `cp` in the low bits (`& CLASS_MASK`), with the\n * {@link EAST_ASIAN} and {@link PICTOGRAPHIC_CN} flags above them.\n */\nexport function lineBreakPropsOf(cp: number): number {\n if (bmp === null) decode();\n if (cp < 0x10000) return bmp![cp];\n if (cp > 0x10ffff) return AL;\n const starts = astralStarts!;\n let lo = 0;\n let hi = starts.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (starts[mid] <= cp) lo = mid;\n else hi = mid - 1;\n }\n return astralValues![lo];\n}\n","/**\n * Line break opportunities per the Unicode Line Breaking Algorithm\n * (UAX #14), default rules, no tailoring: where a line may end, not where it\n * does. Choosing among the opportunities is the wrap's job.\n *\n * Rules LB2–LB31 are applied in order at every position. LB9 is applied up\n * front: a combining mark or ZWJ that follows a base joins it into one unit\n * carrying the base's class, so every later rule reads units, never marks.\n */\n\nimport * as table from './lineBreakTable';\n\n// Copied into module locals: vitest rewrites every read of an imported\n// binding into a property access, which made this loop 25x slower under test.\nconst {\n lineBreakPropsOf, CLASS_MASK, EAST_ASIAN, PICTOGRAPHIC_CN,\n BK, CR, LF, NL, SP, ZW, ZWJ, CM, WJ, GL, BA, BB, B2, HY, CB, CL, CP, EX, IN, NS,\n OP, QU, IS, NU, PO, PR, SY, AL, HL, ID, EB, EM, H2, H3, JL, JV, JT, RI,\n AK, AP, AS, VF, VI, QU_PI, QU_PF,\n} = table;\n\n/** No opportunity before this position. */\nexport const NO_BREAK = 0;\n/** A line may end before this position. */\nexport const BREAK_ALLOWED = 1;\n/** A line must end before this position: after a hard line break, and at the end of text. */\nexport const BREAK_MANDATORY = 2;\n\nconst HYPHEN = 0x2010;\nconst DOTTED_CIRCLE = 0x25cc;\n\nconst isQU = (c: number): boolean => c === QU || c === QU_PI || c === QU_PF;\nconst isHard = (c: number): boolean => c === BK || c === CR || c === LF || c === NL;\n/**\n * Whether a line must end after `cp`: UAX #14's hard breaks, which are LF,\n * VT, FF, CR, NEL, U+2028 LINE SEPARATOR and U+2029 PARAGRAPH SEPARATOR. A CR\n * directly before an LF makes one break with it, not two.\n */\nexport function isHardLineBreak(cp: number): boolean {\n return isHard(lineBreakPropsOf(cp) & CLASS_MASK);\n}\nconst isAlpha =(c: number): boolean => c === AL || c === HL;\nconst isKorean = (c: number): boolean => c === JL || c === JV || c === JT || c === H2 || c === H3;\nconst isIdeoLike = (c: number): boolean => c === ID || c === EB || c === EM;\n\n/** Per-unit columns of one {@link lineBreakOpportunities} call. */\ninterface Scratch { cls: Uint8Array; ea: Uint8Array; pict: Uint8Array; cp: Int32Array; start: Int32Array }\n\nconst newScratch = (n: number): Scratch => ({\n cls: new Uint8Array(n), ea: new Uint8Array(n), pict: new Uint8Array(n), cp: new Int32Array(n), start: new Int32Array(n),\n});\n\n/** Code points past which a call builds its own columns rather than growing the shared ones for good. */\nconst SCRATCH_MAX = 1 << 16;\nlet shared = newScratch(64);\n\nfunction growScratch(n: number): Scratch {\n if (shared.cls.length < n) shared = newScratch(Math.min(SCRATCH_MAX, Math.max(n, shared.cls.length * 2)));\n return shared;\n}\n\n// The call under way's input and columns, read by the rules below. Module\n// state rather than a closure's, which allocated its scope on every call.\nconst NO_INPUT: ArrayLike<number> = [];\nlet input = NO_INPUT;\nlet cls = shared.cls;\nlet ea = shared.ea;\nlet pict = shared.pict;\nlet cp = shared.cp;\n/** Original index of each unit's first code point. */\nlet start = shared.start;\nlet units = 0;\n\n/**\n * For each position `0..cps.length`, whether a line may break before it:\n * {@link NO_BREAK}, {@link BREAK_ALLOWED} or {@link BREAK_MANDATORY}. Position\n * 0 never breaks and position `cps.length` always does.\n *\n * `cps` is code points, not UTF-16 units — one entry per scalar value.\n */\nexport function lineBreakOpportunities(cps: ArrayLike<number>): Uint8Array {\n return lineBreakOpportunitiesInto(cps, new Uint8Array(cps.length + 1));\n}\n\n/** {@link lineBreakOpportunities}, written into the first `cps.length + 1`\n * slots of `out`, which is returned. */\nexport function lineBreakOpportunitiesInto(cps: ArrayLike<number>, out: Uint8Array): Uint8Array {\n const n = cps.length;\n for (let i = 0; i < n; i++) out[i] = NO_BREAK;\n if (n === 0) {\n out[0] = NO_BREAK;\n return out;\n }\n out[n] = BREAK_MANDATORY;\n\n // LB9/LB10: collapse each base and the marks it carries into one unit.\n // Every slot below `units` is written before it is read, so stale scratch past it is never seen.\n const scratch = n <= SCRATCH_MAX ? growScratch(n) : newScratch(n);\n input = cps;\n ({ cls, ea, pict, cp, start } = scratch);\n let u = 0;\n for (let i = 0; i < n; i++) {\n const props = lineBreakPropsOf(cps[i]);\n const c = props & CLASS_MASK;\n if ((c === CM || c === ZWJ) && u > 0) {\n const base = cls[u - 1];\n if (!isHard(base) && base !== SP && base !== ZW) continue;\n }\n if (c === CM || c === ZWJ) {\n cls[u] = AL; ea[u] = 0; pict[u] = 0;\n } else {\n cls[u] = c; ea[u] = props & EAST_ASIAN ? 1 : 0; pict[u] = props & PICTOGRAPHIC_CN ? 1 : 0;\n }\n cp[u] = cps[i];\n start[u] = i;\n u++;\n }\n units = u;\n\n for (let b = 1; b < units; b++) {\n out[start[b]] = decide(b);\n }\n // Nothing held past the call: a long text's own columns go to the collector.\n input = NO_INPUT;\n if (scratch !== shared) ({ cls, ea, pict, cp, start } = shared);\n return out;\n}\n\n// The original class of the code point just before unit `b`, which is the\n// last mark `b - 1` absorbed when it absorbed any.\nconst prevIsZWJ = (b: number): boolean => (lineBreakPropsOf(input[start[b] - 1]) & CLASS_MASK) === ZWJ;\n\n/** The unit before `k`'s run of spaces — `k` itself when it is not a space. */\nfunction beforeSpaces(k: number): number {\n while (k >= 0 && cls[k] === SP) k--;\n return k;\n}\n\nfunction decide(b: number): number {\n const a = b - 1;\n const A = cls[a];\n const B = cls[b];\n\n // LB4, LB5\n if (A === CR && B === LF) return NO_BREAK;\n if (isHard(A)) return BREAK_MANDATORY;\n // LB6, LB7\n if (isHard(B) || B === SP || B === ZW) return NO_BREAK;\n // LB8\n const s = beforeSpaces(a);\n if (s >= 0 && cls[s] === ZW) return BREAK_ALLOWED;\n // LB8a\n if (prevIsZWJ(b)) return NO_BREAK;\n // LB11, LB12, LB12a\n if (A === WJ || B === WJ || A === GL) return NO_BREAK;\n if (B === GL && A !== SP && A !== BA && A !== HY) return NO_BREAK;\n // LB13\n if (B === CL || B === CP || B === EX || B === SY) return NO_BREAK;\n // LB14\n const S = s >= 0 ? cls[s] : -1;\n if (S === OP) return NO_BREAK;\n // LB15a\n if (S === QU_PI) {\n const p = s - 1;\n if (p < 0) return NO_BREAK;\n const P = cls[p];\n if (isHard(P) || P === OP || isQU(P) || P === GL || P === SP || P === ZW) return NO_BREAK;\n }\n // LB15b\n if (B === QU_PF) {\n if (b + 1 >= units) return NO_BREAK;\n const N = cls[b + 1];\n if (N === SP || N === GL || N === WJ || N === CL || isQU(N) || N === CP || N === EX\n || N === IS || N === SY || isHard(N) || N === ZW) return NO_BREAK;\n }\n // LB15c, LB15d\n if (A === SP && B === IS && b + 1 < units && cls[b + 1] === NU) return BREAK_ALLOWED;\n if (B === IS) return NO_BREAK;\n // LB16, LB17\n if ((S === CL || S === CP) && B === NS) return NO_BREAK;\n if (S === B2 && B === B2) return NO_BREAK;\n // LB18\n if (A === SP) return BREAK_ALLOWED;\n // LB19\n if (B === QU || B === QU_PF) return NO_BREAK;\n if (A === QU || A === QU_PI) return NO_BREAK;\n // LB19a\n if (isQU(B)) {\n if (!ea[a]) return NO_BREAK;\n if (b + 1 >= units || !ea[b + 1]) return NO_BREAK;\n }\n if (isQU(A)) {\n if (!ea[b]) return NO_BREAK;\n if (a === 0 || !ea[a - 1]) return NO_BREAK;\n }\n // LB20\n if (A === CB || B === CB) return BREAK_ALLOWED;\n // LB20a\n if ((A === HY || cp[a] === HYPHEN) && B === AL) {\n if (a === 0) return NO_BREAK;\n const P = cls[a - 1];\n if (isHard(P) || P === SP || P === ZW || P === CB || P === GL) return NO_BREAK;\n }\n // LB21\n if (B === BA || B === HY || B === NS || A === BB) return NO_BREAK;\n // LB21a\n if (a > 0 && cls[a - 1] === HL && (A === HY || (A === BA && !ea[a])) && B !== HL) return NO_BREAK;\n // LB21b, LB22\n if (A === SY && B === HL) return NO_BREAK;\n if (B === IN) return NO_BREAK;\n // LB23, LB23a, LB24\n if ((isAlpha(A) && B === NU) || (A === NU && isAlpha(B))) return NO_BREAK;\n if ((A === PR && isIdeoLike(B)) || (isIdeoLike(A) && B === PO)) return NO_BREAK;\n if (((A === PR || A === PO) && isAlpha(B)) || (isAlpha(A) && (B === PR || B === PO))) return NO_BREAK;\n // LB25\n if (B === PO || B === PR) {\n let k = A === CL || A === CP ? a - 1 : a;\n while (k >= 0 && (cls[k] === SY || cls[k] === IS)) k--;\n if (k >= 0 && cls[k] === NU) return NO_BREAK;\n }\n if (A === PO || A === PR) {\n if (B === NU) return NO_BREAK;\n if (B === OP && b + 1 < units) {\n const N = cls[b + 1];\n if (N === NU) return NO_BREAK;\n if (N === IS && b + 2 < units && cls[b + 2] === NU) return NO_BREAK;\n }\n }\n if ((A === HY || A === IS) && B === NU) return NO_BREAK;\n if (B === NU) {\n let k = a;\n while (k >= 0 && (cls[k] === SY || cls[k] === IS)) k--;\n if (k >= 0 && cls[k] === NU) return NO_BREAK;\n }\n // LB26, LB27\n if (A === JL && (B === JL || B === JV || B === H2 || B === H3)) return NO_BREAK;\n if ((A === JV || A === H2) && (B === JV || B === JT)) return NO_BREAK;\n if ((A === JT || A === H3) && B === JT) return NO_BREAK;\n if ((isKorean(A) && B === PO) || (A === PR && isKorean(B))) return NO_BREAK;\n // LB28\n if (isAlpha(A) && isAlpha(B)) return NO_BREAK;\n // LB28a\n const aksaraA = A === AK || A === AS || cp[a] === DOTTED_CIRCLE;\n const aksaraB = B === AK || B === AS || cp[b] === DOTTED_CIRCLE;\n if (A === AP && aksaraB) return NO_BREAK;\n if (aksaraA && (B === VF || B === VI)) return NO_BREAK;\n if (A === VI && a > 0 && (cls[a - 1] === AK || cls[a - 1] === AS || cp[a - 1] === DOTTED_CIRCLE)\n && (B === AK || cp[b] === DOTTED_CIRCLE)) return NO_BREAK;\n if (aksaraA && aksaraB && b + 1 < units && cls[b + 1] === VF) return NO_BREAK;\n // LB29, LB30\n if (A === IS && isAlpha(B)) return NO_BREAK;\n if ((isAlpha(A) || A === NU) && B === OP && !ea[b]) return NO_BREAK;\n if (A === CP && !ea[a] && (isAlpha(B) || B === NU)) return NO_BREAK;\n // LB30a\n if (A === RI && B === RI) {\n let k = a;\n while (k >= 0 && cls[k] === RI) k--;\n if ((a - k) % 2 === 1) return NO_BREAK;\n }\n // LB30b\n if (B === EM && (A === EB || pict[a])) return NO_BREAK;\n // LB31\n return BREAK_ALLOWED;\n}\n","/**\n * Where the bidi engine arrives. This package cannot import one (see\n * `bidiSeam.ts`), and most callers of `layoutRuns` are kit code a consumer\n * never touches, so the consumer registers it once and every layout finds it.\n */\nimport type { BidiResolver } from './bidiSeam';\nimport { isHardLineBreak } from './lineBreak/lineBreaks';\nimport type { TextDirection } from '../textStyle';\n\nlet registered: BidiResolver | null = null;\n\n/**\n * Give every text layout a bidi engine: `registerBidi(bidi)`, with `bidi`\n * from `@weasel-js/bidi`. `layoutRuns` uses it whenever its options carry\n * none. Pass `null`, or call the function returned, to take it out again.\n */\nexport function registerBidi(engine: BidiResolver | null): () => void {\n registered = engine;\n return () => { if (registered === engine) registered = null; };\n}\n\n/** The engine {@link registerBidi} was last given, or null. */\nexport function registeredBidi(): BidiResolver | null {\n return registered;\n}\n\n/** Which way a paragraph reads, from an engine's base level for it. */\nexport function directionOfLevel(level: number): TextDirection {\n return level % 2 === 1 ? 'rtl' : 'ltr';\n}\n\n/**\n * The direction `text`'s first paragraph reads in: `direction` when it states\n * one, otherwise its first strong character's. Finding that takes an engine,\n * so with none registered the answer is `'ltr'`.\n */\nexport function paragraphDirection(\n text: string,\n direction: TextDirection | 'auto' = 'auto',\n engine: BidiResolver | null = registered,\n): TextDirection {\n if (direction !== 'auto') return direction;\n if (engine === null) return 'ltr';\n const cps: number[] = [];\n for (const ch of text) {\n const cp = ch.codePointAt(0)!;\n if (isHardLineBreak(cp)) break;\n cps.push(cp);\n }\n return directionOfLevel(engine.baseLevel(engine.analyze(cps, 'auto')));\n}\n\n/**\n * Code point blocks whose letters read right-to-left.\n *\n * A heuristic on purpose: the real answer is `Bidi_Class`, which lives in\n * `@weasel-js/bidi` and is exactly what the caller has not installed when this\n * matters. It can miss a script, and it still counts a combining mark from\n * these blocks as a letter. What it leaves out is carved out below: code\n * points that sit in these blocks and read the same without an engine.\n */\nconst RTL_BLOCKS: ReadonlyArray<readonly [number, number]> = [\n [0x0590, 0x05ff], [0x0600, 0x07bf], [0x0860, 0x08ff],\n [0xfb1d, 0xfdff], [0xfe70, 0xfeff],\n [0x10800, 0x10fff], [0x1e800, 0x1efff],\n];\n\n/** Digits and number signs inside those blocks. They keep their written order\n * in any paragraph, so a string of them is laid out correctly as it is. */\nconst RTL_BLOCK_NUMBERS: ReadonlyArray<readonly [number, number]> = [\n [0x0600, 0x0605], [0x0660, 0x066c], [0x06dd, 0x06dd], [0x06f0, 0x06f9],\n [0x08e2, 0x08e2], [0x10d30, 0x10d39], [0x10e60, 0x10e7e],\n];\n\n/** The Arabic comma, the ornate parentheses, and the byte order mark: no\n * direction of their own, so they take their neighbors'. */\nconst RTL_BLOCK_NEUTRALS: ReadonlyArray<readonly [number, number]> = [\n [0x060c, 0x060c], [0xfd3e, 0xfd3f], [0xfeff, 0xfeff],\n];\n\nfunction within(ranges: ReadonlyArray<readonly [number, number]>, cp: number): boolean {\n for (let i = 0; i < ranges.length; i++) if (cp >= ranges[i][0] && cp <= ranges[i][1]) return true;\n return false;\n}\n\nlet warnedLogicalRtl = false;\n\n/**\n * Warn, once per process, when `codePoints` hold right-to-left letters and\n * there is no engine to reorder them. `who` names the caller laying them out.\n */\nexport function warnRtlWithoutEngine(codePoints: ArrayLike<number>, who = 'weasel layoutRuns'): void {\n if (warnedLogicalRtl) return;\n for (let i = 0; i < codePoints.length; i++) {\n const cp = codePoints[i];\n if (!within(RTL_BLOCKS, cp) || within(RTL_BLOCK_NUMBERS, cp) || within(RTL_BLOCK_NEUTRALS, cp)) continue;\n warnedLogicalRtl = true;\n console.warn(\n // Naming the import in `from \"<pkg>\"` form would trip labkit's\n // consumer smoke test, which greps dist for that exact shape.\n `${who}: this text contains right-to-left characters but no ` +\n '`bidi` engine is registered, so it is being laid out in logical order — ' +\n 'the glyphs will appear reversed. Import `bidi` out of the ' +\n '`@weasel-js/bidi` package and call `registerBidi(bidi)` once at startup.',\n );\n return;\n }\n}\n\n/** Test helper. Do not call from product code. */\nexport function _resetBidiWarningForTests(): void {\n warnedLogicalRtl = false;\n}\n","/**\n * Bidi analysis for a text with hard line breaks in it.\n *\n * UAX #9 is defined per paragraph, and a hard break ends one: embeddings and\n * overrides close there, and the next paragraph resolves its neutrals — and,\n * under `'auto'`, its direction — from its own characters. The engine's\n * `analyze` takes exactly one paragraph, so this splits the code points at the\n * breaks, analyzes each stretch, and answers a line's reorder against whichever\n * stretch the line sits in.\n */\nimport type { BidiAnalysis, BidiReordering, BidiResolver } from './bidiSeam';\n\ninterface Paragraph {\n start: number;\n end: number;\n analysis: BidiAnalysis;\n}\n\n/** A text's paragraphs, analyzed. */\nexport interface AnalyzedParagraphs {\n /** Visual order for the line `[from, to)`, as positions in the whole text. */\n reorder(from: number, to: number): BidiReordering;\n /** The level the paragraph holding position `at` reads at; 0 for a position\n * in none, which is a hard break or a blank line. */\n baseLevel(at: number): number;\n}\n\n/**\n * Analyze `codePoints` paragraph by paragraph. `isBreak` marks the hard breaks,\n * which belong to no paragraph. `reorder` takes one line, which must lie within\n * a single paragraph — true of any line a wrap produces.\n */\nexport function analyzeParagraphs(\n engine: BidiResolver,\n codePoints: readonly number[],\n isBreak: (index: number) => boolean,\n direction: 'ltr' | 'rtl' | 'auto',\n): AnalyzedParagraphs {\n const paragraphs: Paragraph[] = [];\n let start = 0;\n for (let i = 0; i <= codePoints.length; i++) {\n if (i < codePoints.length && !isBreak(i)) continue;\n if (i > start) {\n paragraphs.push({ start, end: i, analysis: engine.analyze(codePoints.slice(start, i), direction) });\n }\n start = i + 1;\n }\n\n const holding = (at: number): Paragraph | undefined => {\n let lo = 0;\n let hi = paragraphs.length - 1;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (paragraphs[mid].end <= at) lo = mid + 1;\n else hi = mid;\n }\n const p = paragraphs[lo];\n return p !== undefined && at >= p.start && at < p.end ? p : undefined;\n };\n\n return {\n reorder(from, to) {\n const p = holding(from);\n if (p === undefined || to > p.end) return { order: [], levels: [] };\n const r = engine.reorder(p.analysis, from - p.start, to - p.start);\n return { order: r.order.map((i) => i + p.start), levels: r.levels };\n },\n baseLevel(at) {\n const p = holding(at);\n return p === undefined ? 0 : engine.baseLevel(p.analysis);\n },\n };\n}\n\n/**\n * A line's visual order with the positions the engine removed (X9: bidi\n * controls, joiners, soft hyphens) put back beside the character each one\n * follows in the text, on the side that character's direction reads toward.\n * One opening the line sits before the first character that was kept.\n *\n * `order` holds positions `0..count-1` within the line; `rtl` answers for a\n * kept position.\n */\nexport function restoreRemoved(\n order: readonly number[],\n count: number,\n rtl: (pos: number) => boolean,\n): number[] {\n if (order.length === count) return [...order];\n const kept = new Set(order);\n const leading: number[] = [];\n const following = new Map<number, number[]>();\n let anchor = -1;\n let firstKept = -1;\n for (let k = 0; k < count; k++) {\n if (kept.has(k)) {\n anchor = k;\n if (firstKept < 0) firstKept = k;\n } else if (anchor < 0) {\n leading.push(k);\n } else {\n const list = following.get(anchor);\n if (list) list.push(k);\n else following.set(anchor, [k]);\n }\n }\n if (firstKept < 0) return leading;\n const out: number[] = [];\n for (const p of order) {\n const after = following.get(p) ?? [];\n const before = p === firstKept ? leading : [];\n if (rtl(p)) out.push(...[...after].reverse(), p, ...[...before].reverse());\n else out.push(...before, p, ...after);\n }\n return out;\n}\n\n/** One line's visual order. */\nexport interface LineOrder {\n /** Positions within the line, in visual order, left to right. */\n readonly visual: readonly number[];\n /** Resolved embedding level per position; even reads left to right. */\n readonly levels: readonly number[];\n}\n\n/** Lines this long or shorter share one logical order per length. */\nconst SHARED_ORDER_LIMIT = 1024;\nconst logicalOrders: LineOrder[] = [];\n\n/** `count` code points read left to right in the order they are stored: what\n * every line laid out without a bidi engine gets, shared per length because\n * a readout re-laid out every frame would build two arrays a line. */\nfunction logicalOrder(count: number): LineOrder {\n const known = logicalOrders[count];\n if (known !== undefined) return known;\n // Not frozen, though shared: V8 iterates a frozen array through a\n // generic iterator, which allocated a result object per code point.\n const order: LineOrder = {\n visual: Array.from({ length: count }, (_, pos) => pos),\n levels: new Array<number>(count).fill(0),\n };\n if (count <= SHARED_ORDER_LIMIT) logicalOrders[count] = order;\n return order;\n}\n\n/**\n * The visual order of the line of `count` code points opening at `start` in\n * the text `paragraphs` analyzed. With no analysis that is logical order, all\n * at level 0. A position the engine removed still has a place: see\n * {@link restoreRemoved}.\n */\nexport function orderLine(\n paragraphs: AnalyzedParagraphs | null,\n start: number,\n count: number,\n): LineOrder {\n if (paragraphs === null || count === 0) return logicalOrder(count);\n return reorderedLine(paragraphs, start, count);\n}\n\n// Apart from `orderLine` so the closure below, and the scope it captures, is\n// built only for a line that has a bidi engine.\nfunction reorderedLine(paragraphs: AnalyzedParagraphs, start: number, count: number): LineOrder {\n const levels = new Array<number>(count).fill(0);\n const r = paragraphs.reorder(start, start + count);\n for (let pos = 0; pos < count; pos++) {\n const level = r.levels[pos];\n if (typeof level === 'number' && level >= 0) levels[pos] = level;\n }\n // `opts.bidi` is a consumer's to supply, so its order is not trusted to be a\n // permutation: a repeat keeps its first place, and anything that is not a\n // position on the line is dropped.\n const kept = new Set<number>();\n for (const at of r.order) {\n const pos = at - start;\n if (Number.isInteger(pos) && pos >= 0 && pos < count) kept.add(pos);\n }\n return { visual: restoreRemoved([...kept], count, (pos) => levels[pos] % 2 === 1), levels };\n}\n","/**\n * Number and reference arrays handed back by layouts and paintings the caches\n * proved nobody holds, kept for the next layout or painting of the same size.\n * Text whose content changes every frame then lays out into the arrays its\n * previous frame used, rather than allocating them again.\n *\n * Pooled by exact length: the readers take an array's `length` as its count.\n * Bounded by the elements held, so a paragraph handed back cannot pin memory.\n */\n\n/** Longest array {@link doubles} copies from its template rather than builds. */\nconst TEMPLATE_LIMIT = 1 << 16;\n/** All fractions, so V8 holds its elements as unboxed doubles, and `slice`\n * hands a copy that kind. An array that starts out empty or holding integers\n * is copied again the first time a fraction lands in it. */\nlet template: number[] = [0.5];\n\n/** A new array of `n` numbers, held as unboxed doubles from the start. Its\n * contents are placeholders for the caller to overwrite. */\nexport function doubles(n: number): number[] {\n if (n > TEMPLATE_LIMIT) return new Array<number>(n).fill(0.5);\n while (template.length < n) template = template.concat(template);\n return template.slice(0, n);\n}\n\n/** Most elements held across both pools: 2 MB of numbers. */\nexport const ARRAY_POOL_LIMIT = 1 << 18;\n\n/** Arrays of one length. `n` counts the live ones, so emptying the bucket\n * never shrinks `items`: popping did, and refilling it reallocated every\n * frame. */\ninterface Bucket<T> { items: (T[] | undefined)[]; n: number }\n\nconst nums = new Map<number, Bucket<number>>();\nconst refs = new Map<number, Bucket<unknown>>();\nlet held = 0;\n\nfunction take<T>(pool: Map<number, Bucket<T>>, n: number): T[] | undefined {\n const b = pool.get(n);\n if (b === undefined || b.n === 0) return undefined;\n held -= n;\n const a = b.items[--b.n];\n b.items[b.n] = undefined;\n return a;\n}\n\nfunction give<T>(pool: Map<number, Bucket<T>>, a: T[]): void {\n const n = a.length;\n if (n === 0 || held + n > ARRAY_POOL_LIMIT) return;\n let b = pool.get(n);\n if (b === undefined) pool.set(n, (b = { items: [], n: 0 }));\n b.items[b.n++] = a;\n held += n;\n}\n\n/** `n` numbers held as unboxed doubles, their contents placeholders: a pooled\n * array of that length when there is one. */\nexport function takeDoubles(n: number): number[] {\n return take(nums, n) ?? doubles(n);\n}\n\n/** `n` references, their contents placeholders. */\nexport function takeRefs(n: number): unknown[] {\n return take(refs, n) ?? new Array<unknown>(n);\n}\n\n/** Hand back an array from {@link takeDoubles}. The caller keeps no reference. */\nexport function giveDoubles(a: number[]): void {\n give(nums, a);\n}\n\n/** Hand back an array from {@link takeRefs}. The caller keeps no reference. */\nexport function giveRefs(a: unknown[]): void {\n give(refs, a);\n}\n\n/** Elements the pools hold now. */\nexport function pooledElements(): number {\n return held;\n}\n\n/** Cut `a` to `n` elements, keeping its backing store for the next refill:\n * `length = 0` drops V8's store, so refilling a list emptied that way\n * reallocates it every time, and `pop` keeps it. */\nexport function truncate(a: unknown[], n: number): void {\n while (a.length > n) a.pop();\n}\n\n/** Test helper. Do not call from product code. */\nexport function _resetArrayPoolForTests(): void {\n nums.clear();\n refs.clear();\n held = 0;\n}\n","/**\n * A layout's code points held in columns: one array of numbers and one of\n * references for the whole text, rather than a cell object and a placed-glyph\n * object per code point with every number in them boxed.\n *\n * The numbers sit in a plain array rather than a typed one on purpose: V8\n * keeps an all-number array's elements unboxed in one object on its own heap,\n * where a typed array costs a backing store allocated outside it, and a label\n * re-laid out every frame would pay for one every frame.\n *\n * A layout's `cells` and `glyphs` are views onto these, built the first time\n * something reads them. The renderer's paint path never does: `paintRuns`\n * reads the columns through one reused {@link PlacedGlyph}.\n *\n * A code point's cell and its placed glyph share their pen position, width\n * and code point, so each is stored once.\n */\nimport type { BmFont, BmFontChar, GlyphMetrics, ResolveResult } from '@weasel-js/font';\nimport type { Entry } from './layoutEntries';\nimport type { LaidOutCell, LaidOutLineBox, LaidOutRuns, PlacedGlyph } from './layoutRuns';\nimport type { ShapedCluster } from './shaperSeam';\nimport { giveDoubles, giveRefs, takeDoubles, takeRefs, truncate } from './arrayPool';\n\n/** Numbers per code point: pen x, step, the glyph's own advance, its size,\n * its baseline, its source span, code point, bidi level, the two flags, its\n * run, the logical index of the glyph at this visual slot, and its turn. */\nconst NUM = 13;\nconst X = 0, STEP = 1, ADVANCE = 2, FONT_SIZE = 3, BASELINE = 4;\nconst SRC_INDEX = 5, SRC_END = 6, CP = 7, LEVEL = 8, FLAGS = 9, RUN = 10, VISUAL = 11, ROTATE = 12;\nconst DRAWS_INK = 1, CLUSTER_END = 2;\n/** References per code point: the serving tier, its metrics, the atlas, the\n * glyph's record there, and what a shaper gave it. */\nconst REF = 5;\n\nconst EMPTY_NUM: number[] = [];\nconst EMPTY_REF: unknown[] = [];\n\n/** Recycled columns, for {@link LayoutColumns.take}. Sized for a frame of\n * HUD labels, each of which recycles its last frame's layout. */\nconst spare: LayoutColumns[] = [];\nconst SPARE_MAX = 1024;\nlet stamps = 0;\n\n/** Every code point of one layout. Index `i` is a code point's place in the\n * text, in logical order, newlines left out. */\nexport class LayoutColumns {\n num: number[];\n ref: unknown[];\n /** The layout's line boxes, its `lines`. A recycled layout's are refilled\n * by the next layout to take its columns. */\n readonly boxes: LineBox[] = [];\n /** The layout's `bounds`, refilled like its boxes. */\n readonly bounds = { width: 0.5, height: 0.5 };\n /** The layout itself, `{ lines: boxes, bounds }`, handed to every layout\n * that takes these columns. */\n laid: LaidOutRuns | null = null;\n /** Which of those layouts this is, new each time the columns are taken:\n * what tells a layout apart from the one these columns held before. */\n stamp = 0;\n /** The paint cache's paintings of this layout, kept here rather than in a\n * map keyed by the layout, so that recycling one deletes no map entry. */\n readonly paintings: unknown[] = [];\n /** The layout cache's record of who can still reach this layout: runs\n * arrays it is filed under, whether its structural list holds it, and\n * whether any caller was handed it to keep. Only a layout with none of the\n * three gives its arrays back. */\n owners = 0;\n listed = false;\n pinned = false;\n\n private constructor(size: number) {\n this.num = takeDoubles(size * NUM);\n this.ref = takeRefs(size * REF);\n }\n\n /** Columns for `size` code points: a recycled layout's, refilled, when the\n * pool holds one. */\n static take(size: number): LayoutColumns {\n let cols = spare.pop();\n if (cols === undefined) {\n cols = new LayoutColumns(size);\n } else {\n cols.num = takeDoubles(size * NUM);\n cols.ref = takeRefs(size * REF);\n }\n cols.stamp = ++stamps;\n return cols;\n }\n\n /** Give the arrays back to the pool, and these columns with their line\n * boxes and result to the next layout. A line box or result still held\n * afterwards reads that layout's code points, so only a layout nobody holds\n * is recycled. */\n recycle(): void {\n giveDoubles(this.num);\n // A loop, not `fill`, which Chromium's allocation profile charged 400 bytes a call.\n const { ref } = this;\n for (let i = 0; i < ref.length; i++) ref[i] = undefined;\n giveRefs(ref);\n this.num = EMPTY_NUM;\n this.ref = EMPTY_REF;\n truncate(this.paintings, 0);\n this.owners = 0;\n this.listed = false;\n this.pinned = false;\n if (spare.length < SPARE_MAX) spare.push(this);\n }\n\n /** Store code point `i`: entry `e`, set at `x` on a baseline at `baselineY`,\n * moving the pen `step`. */\n set(i: number, e: Entry, level: number, x: number, step: number, baselineY: number): void {\n const n = i * NUM, r = i * REF;\n const { num, ref } = this;\n num[n + X] = x; num[n + STEP] = step; num[n + ADVANCE] = e.advance;\n num[n + FONT_SIZE] = e.fontSize; num[n + BASELINE] = baselineY;\n num[n + SRC_INDEX] = e.srcIndex; num[n + SRC_END] = e.srcEnd; num[n + CP] = e.cp;\n num[n + LEVEL] = level; num[n + RUN] = e.run; num[n + ROTATE] = e.rotate;\n num[n + FLAGS] = (e.drawsInk ? DRAWS_INK : 0) | (e.clusterEnd ? CLUSTER_END : 0);\n ref[r] = e.resolved; ref[r + 1] = e.metrics; ref[r + 2] = e.font; ref[r + 3] = e.glyph;\n ref[r + 4] = e.shaped;\n }\n\n /** Lengthen code point `i`'s step by `by`: the kerning the pen takes after it. */\n widen(i: number, by: number): void {\n this.num[i * NUM + STEP] += by;\n }\n\n /** Record that the `slot`-th code point the pen reaches on the line starting\n * at `start` is the line's `pos`-th in logical order. */\n setVisual(start: number, slot: number, pos: number): void {\n this.num[(start + slot) * NUM + VISUAL] = pos;\n }\n\n /** Logical index, within its line, of the glyph at visual `slot`. */\n visual(start: number, slot: number): number {\n return this.num[(start + slot) * NUM + VISUAL];\n }\n\n /** Fill `out` with code point `start + pos`'s placed glyph and return it.\n * Every field is overwritten, so one object can walk a whole layout. */\n glyph(start: number, pos: number, out: PlacedGlyph): PlacedGlyph {\n const i = start + pos;\n const n = i * NUM, r = i * REF;\n const { num, ref } = this;\n out.run = num[n + RUN];\n out.cell = pos;\n out.cp = num[n + CP];\n out.fontSize = num[n + FONT_SIZE];\n out.resolved = ref[r] as ResolveResult;\n out.metrics = ref[r + 1] as GlyphMetrics;\n out.font = ref[r + 2] as BmFont | null;\n out.glyph = ref[r + 3] as BmFontChar | null;\n out.shaped = ref[r + 4] as ShapedCluster | null;\n out.x = num[n + X];\n out.baselineY = num[n + BASELINE];\n out.advance = num[n + ADVANCE];\n out.step = num[n + STEP];\n out.rotate = num[n + ROTATE];\n return out;\n }\n\n /** Code point `start + pos`'s `LaidOutCell.drawsInk`, without building the cell. */\n drawsInk(start: number, pos: number): boolean {\n return (this.num[(start + pos) * NUM + FLAGS] & DRAWS_INK) !== 0;\n }\n\n /** Code point `start + pos`'s cell, as a new object. */\n cell(start: number, pos: number): LaidOutCell {\n const n = (start + pos) * NUM;\n const { num } = this;\n const flags = num[n + FLAGS];\n return {\n srcIndex: num[n + SRC_INDEX], srcEnd: num[n + SRC_END], cp: num[n + CP],\n x: num[n + X], advance: num[n + STEP], level: num[n + LEVEL],\n drawsInk: (flags & DRAWS_INK) !== 0, clusterEnd: (flags & CLUSTER_END) !== 0,\n };\n }\n}\n\n/** A placed glyph to fill with {@link LayoutColumns.glyph}, its fields set to\n * their final kinds so that refilling it never changes its shape. */\nexport function blankGlyph(): PlacedGlyph {\n return {\n run: 0, cell: 0, cp: 0, fontSize: 0.5,\n resolved: null as unknown as ResolveResult, metrics: null as unknown as GlyphMetrics,\n font: null, glyph: null, shaped: null, x: 0.5, baselineY: 0.5, advance: 0.5, step: 0.5, rotate: 0.5,\n };\n}\n\n/**\n * A line box whose `cells` and `glyphs` are code points `[start, start +\n * count)` of `cols`, built on first read and kept. They are own enumerable\n * properties, so a spread, a clone or a deep equality sees them as it would\n * plain fields.\n */\nexport class LineBox implements LaidOutLineBox {\n declare readonly cells: LaidOutCell[];\n declare readonly glyphs: PlacedGlyph[];\n // Declared rather than defined: a defined field starts out undefined, which\n // left V8 boxing every number `refill` writes to it.\n declare x0: number; declare y0: number; declare x1: number; declare y1: number;\n declare baselineY: number;\n declare srcEnd: number;\n declare justified: boolean;\n readonly #cols: LayoutColumns;\n #start: number;\n #count: number;\n /** Whether a view was built, replacing its accessor with a value. */\n #viewed = false;\n\n constructor(\n x0: number, y0: number, x1: number, y1: number, baselineY: number, srcEnd: number, justified: boolean,\n cols: LayoutColumns, start: number, count: number,\n ) {\n this.x0 = x0; this.y0 = y0; this.x1 = x1; this.y1 = y1;\n this.baselineY = baselineY; this.srcEnd = srcEnd; this.justified = justified;\n this.#cols = cols; this.#start = start; this.#count = count;\n Object.defineProperties(this, LineBox.#views);\n }\n\n /** Set this box to another line of the same columns, as the constructor\n * would, its views unbuilt again. */\n refill(\n x0: number, y0: number, x1: number, y1: number, baselineY: number, srcEnd: number, justified: boolean,\n start: number, count: number,\n ): this {\n this.x0 = x0; this.y0 = y0; this.x1 = x1; this.y1 = y1;\n this.baselineY = baselineY; this.srcEnd = srcEnd; this.justified = justified;\n this.#start = start; this.#count = count;\n if (this.#viewed) {\n this.#viewed = false;\n Object.defineProperties(this, LineBox.#views);\n }\n return this;\n }\n\n /** The columns a line reads; null for a line built by hand. */\n static columns(line: LaidOutLineBox): LayoutColumns | null {\n return line instanceof LineBox ? line.#cols : null;\n }\n\n /** Where a line built by layout starts in its columns; 0 for one built by hand. */\n static start(line: LaidOutLineBox): number {\n return line instanceof LineBox ? line.#start : 0;\n }\n\n /** How many code points the line holds, without building a view. */\n static count(line: LaidOutLineBox): number {\n return line instanceof LineBox ? line.#count : line.glyphs.length;\n }\n\n static #views: PropertyDescriptorMap = {\n cells: lazy('cells', (l: LineBox) => {\n l.#viewed = true;\n const out: LaidOutCell[] = new Array(l.#count);\n for (let pos = 0; pos < l.#count; pos++) out[pos] = l.#cols.cell(l.#start, pos);\n return out;\n }),\n glyphs: lazy('glyphs', (l: LineBox) => {\n l.#viewed = true;\n const out: PlacedGlyph[] = new Array(l.#count);\n for (let slot = 0; slot < l.#count; slot++) {\n out[slot] = l.#cols.glyph(l.#start, l.#cols.visual(l.#start, slot), blankGlyph());\n }\n return out;\n }),\n };\n}\n\n/** An own property `key` that `build` computes on first read, then holds as\n * a plain value. */\nexport function lazy<T extends object>(key: string, build: (self: T) => unknown): PropertyDescriptor {\n return {\n enumerable: true,\n configurable: true,\n get(this: T) {\n const value = build(this);\n Object.defineProperty(this, key, { value, enumerable: true, configurable: true, writable: false });\n return value;\n },\n };\n}\n","/**\n * Grapheme clusters: the unit CSS `letter-spacing` tracks, and therefore the\n * unit every tracked width in this package counts. `measuredWidth` and\n * `layoutRuns` both read clusters from here, so the 2D path, the GL path and\n * a DOM overlay agree on how many gaps a string has.\n */\n\nlet segmenter: Intl.Segmenter | null | undefined;\n\nconst NEEDS_SEGMENTING = /[\\r\\u0300-\\uffff]/;\n\nfunction graphemeSegmenter(): Intl.Segmenter | null {\n if (segmenter === undefined) {\n segmenter = typeof Intl !== 'undefined' && 'Segmenter' in Intl\n ? new Intl.Segmenter(undefined, { granularity: 'grapheme' })\n : null;\n }\n return segmenter;\n}\n\n/**\n * UTF-16 offsets just past each grapheme cluster of `text`, ascending — the\n * last is `text.length`. Without `Intl.Segmenter` every code point is its own\n * cluster. With `into`, that array is emptied, refilled and returned.\n */\nexport function graphemeEnds(text: string, into?: number[]): number[] {\n const out = into ?? [];\n // Written by index and cut to length once: `length = 0` drops the backing\n // store, so pushing after it reallocated `into` every call.\n let n = 0;\n // Nothing below U+0300 extends a cluster except the LF of a CRLF, so text\n // made only of those is one cluster per code unit without asking.\n if (!NEEDS_SEGMENTING.test(text)) {\n for (let i = 1; i <= text.length; i++) out[n++] = i;\n } else {\n const seg = graphemeSegmenter();\n if (seg) {\n n = segmentedEnds(seg, text, out);\n } else {\n let at = 0;\n for (const ch of text) out[n++] = at += ch.length;\n }\n }\n out.length = n;\n return out;\n}\n\n/** A code unit no cluster rule reaches across: below U+0300, and not a CR. */\nconst plain = (u: number): boolean => u < 0x300 && u !== 13;\n\n/**\n * {@link graphemeEnds} through `seg`, written into `out`, returning the count.\n * `seg` allocates for every cluster it hands out, so it is asked only about\n * the clusters of stretches that need it: between two plain units there is\n * always a boundary. A stretch runs from the plain unit before its first other\n * unit to the plain unit after its last, since a prepended mark joins the one\n * after it and an emoji sequence can open on © or ®.\n */\nfunction segmentedEnds(seg: Intl.Segmenter, text: string, out: number[]): number {\n const len = text.length;\n let segments: Intl.Segments | null = null;\n let n = 0;\n let i = 0;\n while (i < len) {\n if (plain(text.charCodeAt(i)) && (i + 1 === len || plain(text.charCodeAt(i + 1)))) {\n out[n++] = ++i;\n continue;\n }\n let end = i + 1;\n for (;;) {\n while (end < len && !plain(text.charCodeAt(end))) end++;\n if (end === len) break;\n end++;\n if (end === len || plain(text.charCodeAt(end))) break;\n }\n segments ??= seg.segment(text);\n while (i < end) {\n const s = segments.containing(i)!;\n out[n++] = i = s.index + s.segment.length;\n }\n }\n return n;\n}\n\n/** Number of grapheme clusters in `text`: how many times it is tracked. */\nexport function graphemeCount(text: string): number {\n return graphemeEnds(text).length;\n}\n","/**\n * A run's shaping, laid over its code points.\n *\n * Layout keeps one entry per code point, which carets, wrapping and bidi all\n * index. A shaper answers in clusters instead, any number of glyphs for any\n * number of code points: so the code point opening a cluster draws all of its\n * glyphs, set from that one pen. A cluster spanning several grapheme clusters\n * (a ligature of two letters) splits its advance evenly across them, so a\n * caret can stop inside it; each grapheme's first code point takes a share and\n * the rest take none. Right to left the opening code point is drawn rightmost,\n * so its glyphs shift left by the other shares to land where the shaper put\n * them.\n */\nimport type { ResolveResult } from '@weasel-js/font';\nimport type { ResolvedRun } from '../runs/resolveRuns';\nimport type { ShapedCluster, ShapedGlyph, TextShaper } from './shaperSeam';\nimport { shapingFace } from './shaperRegistry';\nimport { graphemeEnds } from '../measure/graphemes';\n\n/** What one code point of a shaped run takes. */\nexport interface ShapedSlot {\n cluster: ShapedCluster;\n /** Ems. */\n advance: number;\n}\n\n/** What a code point inside a cluster another one draws holds. */\nconst NOTHING_DRAWN: ShapedCluster = Object.freeze({ d: null, key: '', glyphs: Object.freeze([]), rtl: false, text: '' });\n\n/** A code point inside a cluster another one draws, opening no grapheme. */\nconst COVERED: ShapedSlot = Object.freeze({ cluster: NOTHING_DRAWN, advance: 0 });\n\n/** Slots by UTF-16 offset in the run's text: set at every code point a shaped\n * cluster covers, absent where the code point is left to be found on its own. */\nexport type ShapedRun = readonly (ShapedSlot | undefined)[];\n\n/** One shaping's slots, for as long as the shaper holds the shaping: on an outline face, and on\n * an atlas face, which leaves a cluster that is its code point's own glyph unshaped. */\nconst slotsOf = new WeakMap<readonly ShapedGlyph[], ShapedRun>();\nconst atlasSlotsOf = new WeakMap<readonly ShapedGlyph[], ShapedRun>();\n\nconst fmt = (v: number): string => String(Math.round(v * 1e5) / 1e5);\n\n/**\n * `run`'s shaping by `shaper` in the face `resolved` landed on, or null when\n * it is not shaped: no shaper, or a face with no bytes a shaper reads.\n *\n * A cluster holding `.notdef` is left out, so its code points go to the\n * fallback ladder as unshaped text does rather than drawing the face's box.\n * On an atlas or canvas face, so is a cluster of one code point drawn as that\n * code point's own glyph where the pen is: the atlas draws it as it would\n * unshaped text.\n */\nexport function shapeRun(\n run: ResolvedRun, resolved: ResolveResult, shaper: TextShaper | null,\n): ShapedRun | null {\n if (shaper === null) return null;\n const embedding = shapingFace(resolved);\n if (embedding === null) return null;\n const face = embedding.sfnt;\n const glyphs = shaper.shape(face, run.text, run.fontFeatures, run.lang);\n const cache = resolved.source === 'outline' ? slotsOf : atlasSlotsOf;\n let slots = cache.get(glyphs);\n if (slots) return slots;\n const plain = resolved.source === 'outline' ? null : (cp: number) => embedding.glyphIndexOf(cp);\n slots = slotsFor(shaper, face, run.text, glyphs, plain);\n cache.set(glyphs, slots);\n return slots;\n}\n\nfunction slotsFor(\n shaper: TextShaper, face: ArrayBuffer, text: string, glyphs: readonly ShapedGlyph[],\n plain: ((cp: number) => number | null) | null,\n): ShapedRun {\n const slots: (ShapedSlot | undefined)[] = new Array(text.length);\n const ends = graphemeEnds(text);\n let g = 0;\n let i = 0;\n while (i < glyphs.length) {\n const start = glyphs[i].cluster;\n let j = i;\n while (j < glyphs.length && glyphs[j].cluster === start) j++;\n const end = j < glyphs.length ? glyphs[j].cluster : text.length;\n // The graphemes opening inside the cluster, past its own first code point.\n while (g < ends.length && ends[g] <= start) g++;\n let inner = 0;\n for (let k = g; k < ends.length && ends[k] < end; k++) inner++;\n if (!holdsNotdef(glyphs, i, j) && !(plain && isPlain(glyphs[i], j - i, text, start, end, plain))) {\n const total = advanceOf(glyphs, i, j);\n const share = total / (inner + 1);\n const shift = glyphs[i].rtl ? share - total : 0;\n slots[start] = clusterSlot(shaper, face, glyphs, i, j, text.slice(start, end), shift, share);\n const opens = share === 0 ? COVERED : { cluster: NOTHING_DRAWN, advance: share };\n for (let at = start + 1, k = g; at < end; at++) {\n const opening = k < ends.length && ends[k] === at;\n if (opening) k++;\n slots[at] = opening ? opens : COVERED;\n }\n }\n i = j;\n }\n return slots;\n}\n\n/** Whether a cluster of `count` glyphs from `first`, over `text[start, end)`, is one code point\n * drawn as its own glyph at the pen. */\nfunction isPlain(\n first: ShapedGlyph, count: number, text: string, start: number, end: number, plain: (cp: number) => number | null,\n): boolean {\n if (count !== 1 || first.dx !== 0 || first.dy !== 0) return false;\n const cp = text.codePointAt(start)!;\n return end - start === (cp > 0xffff ? 2 : 1) && plain(cp) === first.gid;\n}\n\nfunction advanceOf(glyphs: readonly ShapedGlyph[], from: number, to: number): number {\n let sum = 0;\n for (let k = from; k < to; k++) sum += glyphs[k].advance;\n return sum;\n}\n\nfunction holdsNotdef(glyphs: readonly ShapedGlyph[], from: number, to: number): boolean {\n for (let k = from; k < to; k++) if (glyphs[k].gid === 0) return true;\n return false;\n}\n\n/** Glyphs `[from, to)`, one cluster, set from one pen moved by `shift` ems,\n * its opening code point taking `advance` of the cluster's width. */\nfunction clusterSlot(\n shaper: TextShaper, face: ArrayBuffer, glyphs: readonly ShapedGlyph[], from: number, to: number, text: string,\n shift: number, advance: number,\n): ShapedSlot {\n const placed: ShapedCluster['glyphs'][number][] = [];\n let pen = shift;\n let d = '';\n let key = '';\n for (let k = from; k < to; k++) {\n const g = glyphs[k];\n const x = pen + g.dx, y = g.dy;\n placed.push({ gid: g.gid, x, y, advance: g.advance });\n d += shaper.glyphD(face, g.gid, x, y) ?? '';\n key += `${k === from ? '' : ';'}${g.gid}${x === 0 && y === 0 ? '' : `@${fmt(x)},${fmt(y)}`}`;\n pen += g.advance;\n }\n return { cluster: { d: d.length > 0 ? d : null, key, glyphs: placed, rtl: glyphs[from].rtl, text }, advance };\n}\n","/**\n * Runs measured code point by code point: which glyph serves each one, how\n * far it advances, and the kerning before it. Nothing here knows about lines.\n *\n * A grapheme cluster with emoji presentation is the exception to one glyph a\n * code point: where the canvas tier draws a color glyph for it, that glyph\n * sits in the slot of the cluster's closing code point, and the code points\n * before it are slots with nothing in them.\n *\n * A run a shaper shapes takes its glyphs from the shaping instead, a cluster\n * at a time (`shapedRuns.ts`), and its kerning is already in their advances.\n */\nimport {\n glyphIn, metricsOf, resolveColorCluster, cachedFontVariant, resolveGlyph, warnNoMetrics,\n type BmFont, type BmFontChar, type GlyphMetrics, type ResolvedGlyph, type ResolveResult,\n} from '@weasel-js/font';\nimport { graphemeEnds } from '../measure/graphemes';\nimport type { ResolvedRun } from '../runs/resolveRuns';\nimport { isHardLineBreak } from './lineBreak/lineBreaks';\nimport type { ShapedCluster, TextShaper } from './shaperSeam';\nimport { shapeRun, type ShapedSlot } from './shapedRuns';\nimport type { TabStop } from './tabStops';\n\n/** A mark that takes no width of its own, which kerning reads through. */\nconst NONSPACING_MARK = /^[\\p{Mn}\\p{Me}]$/u;\n\n/** One code point of the runs, measured. Widths are world units. */\nexport interface Entry {\n /** Index of its run in the runs measured. */\n run: number;\n cp: number;\n /** The glyph's own size, which small caps sets below its run's. */\n fontSize: number;\n /** The size it holds its line at: its run's, or the larger size a shrunken\n * run inherited. */\n lineSize: number;\n /** How far its run is raised off the line's baseline. */\n baselineShift: number;\n /** Its run's `rotate`, in degrees: how far the glyph turns about its pen. */\n rotate: number;\n /** UTF-16 span of the source character it was drawn from. */\n srcIndex: number;\n srcEnd: number;\n clusterEnd: boolean;\n /** The tier serving the glyph, which is not its run's when the code point\n * escalated, and that tier's metrics. */\n resolved: ResolveResult;\n metrics: GlyphMetrics;\n /** The atlas to sample and the glyph's record in it; null on the outline\n * tier and for a slot with nothing to draw. */\n font: BmFont | null;\n glyph: BmFontChar | null;\n advance: number;\n /** Its run's `letterSpacing` when it closes a grapheme cluster, else 0. */\n tracking: number;\n /** The kerning gap between the entry before it and this one. A\n * nonspacing mark has none, and the entry after it kerns against the\n * mark's base. */\n kerningBefore: number;\n /** Set on a tab, whose `advance` is known only once its line is. */\n tab?: TabStop;\n /** What it draws when its run was shaped; null when it was not, and its\n * glyph is the one its code point maps to. */\n shaped: ShapedCluster | null;\n /** See `LaidOutCell.drawsInk`. */\n drawsInk: boolean;\n}\n\n/**\n * Measure every code point of `runs`, in order. Kerning pairs across run\n * boundaries, in the left glyph's face and at its size, and through a\n * nonspacing mark. A run whose face has\n * no metrics contributes no entries but still takes up its source offsets.\n *\n * With `pool`, the entries are its objects, rewritten in place and grown as\n * needed, so a caller that is done with them before it measures again\n * allocates none: the entries of a label re-laid out every frame were a tenth\n * of a HUD readout's garbage. They are then valid only until the next call\n * given the same pool. A pool keeps at most `POOL_MAX` of them. With `into`,\n * the list returned is that array, emptied and refilled.\n *\n * With `shaper`, a run whose face it can read is shaped, and its code points\n * draw what the shaping gave them.\n */\nexport function measureRuns(\n runs: readonly ResolvedRun[], tabSize: number, pool?: Entry[], into?: Entry[], shaper: TextShaper | null = null,\n): Entry[] {\n const entries: Entry[] = into ?? [];\n // Written by index and cut to length once: `length = 0` drops the backing\n // store, so pushing after it reallocated the list every call.\n let n = 0;\n /** The entry the next one kerns against; none across a break, a tab, or a\n * run with no metrics. */\n let prev: Entry | undefined;\n let srcIndex = 0;\n\n for (let runIndex = 0; runIndex < runs.length; runIndex++) {\n const run = runs[runIndex];\n const resolved = cachedFontVariant(run.fontFamily, run.fontWeight, run.fontStyle);\n const metrics = metricsOf(resolved);\n if (!metrics) {\n // Laying out as nothing is indistinguishable from empty text downstream,\n // so this is the only signal a consumer ever gets.\n warnNoMetrics(run.fontFamily, run.fontWeight, run.fontStyle);\n srcIndex += run.srcMap?.length ?? run.text.length;\n prev = undefined;\n continue;\n }\n const runBase = srcIndex;\n const map = run.srcMap;\n const clusterEnds = graphemeEnds(run.text, CLUSTER_ENDS);\n const shaped = shapeRun(run, resolved, shaper);\n let cluster = 0;\n let clusterStart = 0;\n /** The color glyph of the cluster being walked, when it has one. */\n let color: ResolvedGlyph | null = null;\n let at = 0;\n const text = run.text;\n\n while (at < text.length) {\n const cp = text.codePointAt(at)!;\n const len = cp > 0xffff ? 2 : 1;\n const slot = shaped?.[at];\n const fontSize = run.sizeMap ? run.sizeMap[at] : run.fontSize;\n if (at === clusterStart) {\n color = resolveColorCluster(\n resolved, run.fontFamily, run.fontWeight, run.fontStyle, run.text.slice(at, clusterEnds[cluster]),\n );\n }\n const clusterEnd = at + len === clusterEnds[cluster];\n if (clusterEnd) clusterStart = clusterEnds[cluster++];\n // World units, deliberately not scaled by fontSize: the same tracking\n // opens the same gap whatever size the run is set at.\n const tracking = clusterEnd ? run.letterSpacing : 0;\n // A transformed run draws characters its source does not have; each\n // takes the source span of the character it was mapped from.\n const srcStart = map ? runBase + map.starts[at] : runBase + at;\n const srcEnd = map ? runBase + map.ends[at] : runBase + at + len;\n at += len;\n srcIndex = map ? runBase + map.length : srcEnd;\n\n const mark = isNonspacingMark(cp);\n const kerningBefore = prev && !mark\n ? prev.metrics.kernOf(prev.cp, cp) * (prev.fontSize / prev.metrics.size)\n : 0;\n // A slot with nothing in it: no glyph, no width, and none of the\n // tracking or kerning a width would carry. Filled in place when it inks.\n const blank = blankEntry(pool, n, runIndex, run, cp, fontSize, srcStart, srcEnd, clusterEnd, resolved, metrics);\n\n if (color) {\n if (clusterEnd) {\n blank.tracking = tracking;\n ink(blank, color);\n }\n entries[n++] = blank;\n prev = undefined;\n } else if (isHardLineBreak(cp)) {\n entries[n++] = blank;\n prev = undefined;\n } else if (cp === 9 || cp === 32) {\n // A face with no space still gets one wide enough to part words.\n const space = metrics.advanceOf(32);\n const advance = space !== null ? space * (fontSize / metrics.size) : fontSize * 0.25;\n if (cp === 9) {\n entries[n++] = { ...blank, tab: { stop: tabSize * (advance + run.letterSpacing), min: advance / 2 } };\n prev = undefined;\n } else {\n // Its record in the run's own tier, for an atlas that draws one. It\n // never escalates: a face without a space still parts words.\n const own = glyphIn(resolved, 32, HIT);\n blank.font = own?.font ?? null;\n blank.glyph = own?.glyph ?? null;\n blank.advance = advance;\n blank.tracking = tracking;\n blank.kerningBefore = kerningBefore;\n prev = blank;\n entries[n++] = prev;\n }\n } else if (slot !== undefined) {\n blank.tracking = tracking;\n entries[n++] = shape(blank, slot);\n prev = undefined;\n } else {\n const hit = resolveGlyph(resolved, run.fontFamily, run.fontWeight, run.fontStyle, cp, true, HIT);\n if (hit) {\n blank.kerningBefore = kerningBefore;\n blank.tracking = tracking;\n ink(blank, hit);\n }\n entries[n++] = blank;\n if (!mark) prev = blank;\n }\n }\n }\n entries.length = n;\n return entries;\n}\n\n/** No nonspacing mark sits below U+0300, so Latin text builds no string to ask. */\nfunction isNonspacingMark(cp: number): boolean {\n return cp >= 0x300 && NONSPACING_MARK.test(String.fromCodePoint(cp));\n}\n\n/** The cluster ends of the run being measured, refilled for each. */\nconst CLUSTER_ENDS: number[] = [];\n\n/** What `resolveGlyph` answers into, which `ink` copies out of at once. */\nconst HIT: ResolvedGlyph = { resolved: null as unknown as ResolveResult, metrics: null as unknown as GlyphMetrics, advance: 0, font: null, glyph: null };\n\n/** The most entries a pool keeps, so one long text does not hold its entries for good. */\nconst POOL_MAX = 4096;\n\n/** An entry with nothing in it — no glyph, no width — as `pool[i]` rewritten, or a new one.\n * It reads `r`'s numbers itself: a fraction passed to a call V8 does not inline is boxed. */\nfunction blankEntry(\n pool: Entry[] | undefined, i: number, run: number, r: ResolvedRun, cp: number, fontSize: number,\n srcIndex: number, srcEnd: number, clusterEnd: boolean, resolved: ResolveResult, metrics: GlyphMetrics,\n): Entry {\n const lineSize = Math.max(r.fontSize, r.strutSize ?? 0);\n // Optional on the authored run type; absent, every y would go NaN.\n const baselineShift = r.baselineShift ?? 0;\n const rotate = r.rotate ?? 0;\n const e = pool?.[i];\n if (!e) {\n const made: Entry = {\n run, cp, fontSize, lineSize, baselineShift, rotate, srcIndex, srcEnd, clusterEnd, resolved, metrics,\n font: null, glyph: null, advance: 0, tracking: 0, kerningBefore: 0, tab: undefined, shaped: null,\n drawsInk: false,\n };\n if (pool && i < POOL_MAX) pool[i] = made;\n return made;\n }\n e.run = run; e.cp = cp; e.fontSize = fontSize; e.lineSize = lineSize; e.baselineShift = baselineShift;\n e.rotate = rotate; e.srcIndex = srcIndex; e.srcEnd = srcEnd; e.clusterEnd = clusterEnd; e.resolved = resolved; e.metrics = metrics;\n e.font = null; e.glyph = null; e.advance = 0; e.tracking = 0; e.kerningBefore = 0; e.tab = undefined;\n e.shaped = null; e.drawsInk = false;\n return e;\n}\n\n/** Fill the empty slot `e` with `hit`, in place: one object a code point. An\n * escalated code point is served in another tier's units, so its scale is its\n * own. Its tracking and kerning are the caller's to set. */\nfunction ink(e: Entry, hit: ResolvedGlyph): void {\n e.resolved = hit.resolved;\n e.metrics = hit.metrics;\n e.font = hit.font;\n e.glyph = hit.glyph;\n e.advance = hit.advance * (e.fontSize / hit.metrics.size);\n e.drawsInk = true;\n}\n\n/** Fill the empty slot `e` with what shaping gave its code point, in place. */\nfunction shape(e: Entry, slot: ShapedSlot): Entry {\n e.shaped = slot.cluster;\n e.advance = slot.advance * e.fontSize;\n e.drawsInk = slot.cluster.d !== null;\n return e;\n}\n\n/**\n * One line's entries with each bracket in a right-to-left stretch painting as\n * its mirror (UAX #9 L4). `levels` holds the line's resolved level per entry.\n *\n * The outline tier reads the code point directly; the atlas tiers need the\n * other glyph looked up, which may come from another tier, and a face without\n * it keeps the unmirrored one. The advance stays the one the wrap measured.\n *\n * A shaped entry already shows the mirror when it was shaped right to left.\n * Where that disagrees with its level — a bracket shaped with the text on one\n * side of it and resolved to the direction of the other — it gives up its\n * shaped glyph for its code point's own.\n */\nexport function mirrorEntries(\n entries: readonly Entry[],\n levels: readonly number[],\n mirror: (cp: number) => number | null,\n runs: readonly ResolvedRun[],\n): Entry[] {\n return entries.map((entry, pos) => {\n const odd = levels[pos] % 2 === 1;\n if (entry.shaped !== null && entry.shaped.rtl !== odd) {\n const flipped = mirror(entry.cp);\n if (flipped !== null && flipped !== entry.cp) entry = unshaped(entry, runs[entry.run]);\n }\n if (!odd) return entry;\n if (entry.shaped !== null) return entry;\n const cp = mirror(entry.cp);\n if (cp === null || cp === entry.cp) return entry;\n if (entry.font === null) return { ...entry, cp };\n const run = runs[entry.run];\n const hit = resolveGlyph(entry.resolved, run.fontFamily, run.fontWeight, run.fontStyle, cp, false);\n if (!hit) return entry;\n return { ...entry, cp, resolved: hit.resolved, metrics: hit.metrics, font: hit.font, glyph: hit.glyph };\n });\n}\n\n/** `entry` drawing its own code point's glyph rather than its shaped cluster: on an atlas, the\n * glyph's record, which shaping left out. */\nfunction unshaped(entry: Entry, run: ResolvedRun): Entry {\n if (entry.resolved.source === 'outline') return { ...entry, shaped: null };\n const hit = resolveGlyph(entry.resolved, run.fontFamily, run.fontWeight, run.fontStyle, entry.cp, false);\n return hit\n ? { ...entry, shaped: null, resolved: hit.resolved, metrics: hit.metrics, font: hit.font, glyph: hit.glyph }\n : { ...entry, shaped: null };\n}\n","/**\n * The greedy wrap every text layout in this package shares: each measures its\n * own way and hands the measuring in here, so where a line ends is decided in\n * one place.\n */\n\nimport { isHardLineBreak, lineBreakOpportunities, lineBreakOpportunitiesInto, NO_BREAK } from './lineBreaks';\n\n/** One line of a wrap, as code point indices into the wrapped sequence. */\nexport interface WrappedLine {\n /** First code point on the line. */\n start: number;\n /** One past the last, excluding the hard break that closed it. Trailing spaces are included. */\n end: number;\n /** Closed by the wrap rather than by a hard break or the end of the text. */\n wrapped: boolean;\n}\n\n/** White space that hangs at a line's end and never opens a wrapped line: a\n * space or a tab. */\nexport const hangs = (cp: number): boolean => cp === 32 || cp === 9;\n\n/**\n * Greedy wrap of `cps` at its UAX #14 break opportunities. A line ends at\n * every hard break (CRLF counts once, and neither code point lands on a\n * line), and before any word — the text up to the next opportunity, spaces\n * after it included — whose ink would take the line past `maxWidth`. Only\n * ink has to fit: trailing spaces and tabs hang. A word wider than the line is never\n * split. `Infinity` breaks at hard breaks alone.\n *\n * `widthOf(start, end)` is the width of code points `[start, end)` set on a\n * line of their own starting at `start`; `end` is always one past a\n * non-space, non-tab.\n */\nexport function wrapLines(\n cps: ArrayLike<number>,\n maxWidth: number,\n widthOf: (start: number, end: number) => number,\n): WrappedLine[] {\n const lines: WrappedLine[] = [];\n wrapSpans(cps, { maxWidth }, widthOf, (start, end, wrapped) => { lines.push({ start, end, wrapped }); });\n return lines;\n}\n\n/** The opportunities of the wrap under way, kept for the next. A wrap that\n * starts inside another's `widthOf` or `emit` finds them taken and builds its own. */\nlet breakScratch = new Uint8Array(64);\nlet breakScratchTaken = false;\n/** Code points past which a wrap builds its own opportunities rather than\n * growing the shared ones for good. */\nconst BREAK_SCRATCH_MAX = 1 << 16;\n\n/** {@link wrapLines}, handing each line to `emit` in order rather than\n * building an object for it. The width comes in an object because a number\n * passed to a call V8 does not inline is boxed on every call. */\nexport function wrapSpans(\n cps: ArrayLike<number>,\n box: { readonly maxWidth: number },\n widthOf: (start: number, end: number) => number,\n emit: (start: number, end: number, wrapped: boolean) => void,\n): void {\n const n = cps.length;\n if (!Number.isFinite(box.maxWidth)) {\n wrapAt(cps, box, widthOf, emit, null);\n } else if (breakScratchTaken || n >= BREAK_SCRATCH_MAX) {\n wrapAt(cps, box, widthOf, emit, lineBreakOpportunities(cps));\n } else {\n if (breakScratch.length < n + 1) breakScratch = new Uint8Array(Math.max(n + 1, breakScratch.length * 2));\n breakScratchTaken = true;\n try {\n wrapAt(cps, box, widthOf, emit, lineBreakOpportunitiesInto(cps, breakScratch));\n } finally {\n breakScratchTaken = false;\n }\n }\n}\n\nfunction wrapAt(\n cps: ArrayLike<number>,\n box: { readonly maxWidth: number },\n widthOf: (start: number, end: number) => number,\n emit: (start: number, end: number, wrapped: boolean) => void,\n breaks: Uint8Array | null,\n): void {\n const n = cps.length;\n let start = 0;\n let i = 0;\n while (i < n) {\n const cp = cps[i];\n if (isHardLineBreak(cp)) {\n emit(start, i, false);\n i += cp === 13 && cps[i + 1] === 10 ? 2 : 1;\n start = i;\n continue;\n }\n // A space here opens the text or follows a hard break: it never wraps.\n if (hangs(cp)) { i++; continue; }\n let j = i + 1;\n let ink = i + 1;\n while (j < n && !isHardLineBreak(cps[j]) && (!breaks || breaks[j] === NO_BREAK)) {\n if (!hangs(cps[j])) ink = j + 1;\n j++;\n }\n if (breaks && i > start && widthOf(start, ink) > box.maxWidth) {\n emit(start, i, true);\n start = i;\n }\n i = j;\n }\n if (start < n) emit(start, n, false);\n}\n","/**\n * Measured entries broken into lines, and one line set on its baseline: where\n * each cell and glyph lands once alignment, justification and visual order\n * have had their say.\n */\nimport type { LineOrder } from './bidiLines';\nimport { doubles, truncate } from './arrayPool';\nimport { LineBox, type LayoutColumns } from './layoutColumns';\nimport type { Entry } from './layoutEntries';\nimport { hangs, wrapSpans } from './lineBreak/wrapLines';\nimport { tabAdvance, widthWithTabs } from './tabStops';\n\n/** What breaking and placing lines read of the layout's options. Handed over\n * in an object, not as arguments: a number passed to a call V8 does not\n * inline is boxed on every call. */\nexport interface LineOpts {\n maxWidth: number;\n alignWidth: number;\n lineHeight: number;\n justify: boolean;\n}\n\n/** One line's entries, measured and not yet placed. */\nexport interface Line {\n /** Index of its first entry among the entries that were broken. */\n start: number;\n /** One past its last, excluding the hard break that closed it. */\n end: number;\n /** In logical order. The first has dropped the kerning before it, and a tab\n * has run out to its stop. */\n entries: Entry[];\n width: number;\n height: number;\n /** Line top to baseline. */\n ascent: number;\n /** Closed by the wrap rather than by a hard break or the end of the text:\n * the lines `justify` spreads. */\n wrapped: boolean;\n /** Source offset just past the line's last character. */\n srcEnd: number;\n}\n\n/**\n * How far above the baseline an entry's inline box reaches, CSS's way: the\n * face's ascent plus half the leading its line height leaves around ascent\n * and descent. A face taller than its line box gets negative leading and\n * overflows the box rather than growing it.\n */\nfunction aboveBaseline(e: Entry, lineHeight: number): number {\n const k = e.lineSize / e.metrics.size;\n const ascent = e.metrics.ascent * k;\n if (e.metrics.descent === undefined) return ascent;\n return (e.lineSize * lineHeight - ascent - e.metrics.descent * k) / 2 + ascent;\n}\n\nconst NONE: readonly Entry[] = [];\n/** The entries the width callbacks below read, set for one {@link breakLines}\n * call and cleared after it, so the wrap builds no closure a call. */\nlet cur = NONE;\n/** `sum[k]`: width of entries `[0, k)` set end to end. Grown, never shrunk. */\nlet sum: number[] = doubles(64);\n/** Indices of the tabs among `cur`, ascending. */\nconst tabs: number[] = [];\n/** The lines a call broke, and every line object any call has made, reused by\n * index. Lists here are written by index and cut to length once: `length = 0`\n * drops an array's backing store, so pushing after it reallocated every call. */\nconst broken: Line[] = [];\nlet brokenCount = 0;\nconst linePool: Line[] = [];\n/** The most line objects the pool keeps. */\nconst LINE_POOL_MAX = 64;\n\n/** An entry opening a line drops the kerning before it. */\nfunction flatWidth(start: number, end: number): number {\n return cur[start].advance + cur[start].tracking + sum[end] - sum[start + 1];\n}\nconst stopOf = (k: number) => cur[k].tab!;\nfunction tabbedWidth(start: number, end: number): number {\n return widthWithTabs(start, end, tabs, stopOf, flatWidth);\n}\n\nfunction pushSpan(start: number, end: number, wrapped: boolean): void {\n const i = brokenCount++;\n let line = linePool[i];\n if (line === undefined) {\n line = { start: 0, entries: [], width: 0.5, height: 0.5, ascent: 0.5, wrapped: false, srcEnd: 0, end: 0 };\n if (i < LINE_POOL_MAX) linePool[i] = line;\n }\n line.start = start; line.end = end; line.wrapped = wrapped;\n line.width = 0; line.height = 0; line.ascent = 0; line.srcEnd = 0;\n broken[i] = line;\n}\n\n/**\n * Break `entries` into lines: at hard breaks, and at UAX #14 opportunities\n * when `maxWidth` is finite. A line is as tall as its tallest entry's line\n * box, with one baseline sunk to clear whichever entry reaches highest above\n * it — from unshifted ascents, so a `baselineShift` cannot drag the rest of\n * the line with it. A blank line takes both from the hard break that closed\n * it, the only carrier of a size it has.\n *\n * The entry opening each line has its kerning zeroed, and each tab its\n * advance set, in place. The lines and their `entries` arrays are reused by\n * the next call, so they are valid only until then.\n */\nexport function breakLines(\n entries: readonly Entry[],\n cps: readonly number[],\n opts: LineOpts,\n): Line[] {\n const { lineHeight } = opts;\n if (sum.length < entries.length + 1) sum = doubles(entries.length + 1);\n sum[0] = 0;\n let tabCount = 0;\n brokenCount = 0;\n for (let k = 0; k < entries.length; k++) {\n const e = entries[k];\n sum[k + 1] = sum[k] + e.kerningBefore + e.advance + e.tracking;\n if (e.tab) tabs[tabCount++] = k;\n }\n tabs.length = tabCount;\n cur = entries;\n wrapSpans(cps, opts, tabCount === 0 ? flatWidth : tabbedWidth, pushSpan);\n cur = NONE;\n broken.length = brokenCount;\n\n for (let i = 0; i < broken.length; i++) {\n const line = broken[i];\n if (line.start === line.end) {\n const brk = entries[line.end];\n line.height = brk.lineSize * lineHeight;\n line.ascent = aboveBaseline(brk, lineHeight);\n line.srcEnd = brk.srcIndex;\n truncate(line.entries, 0);\n continue;\n }\n const out = line.entries;\n for (let k = line.start; k < line.end; k++) {\n const e = entries[k];\n if (k === line.start) e.kerningBefore = 0;\n if (e.tab) e.advance = tabAdvance(line.width, e.tab.stop, e.tab.min);\n out[k - line.start] = e;\n line.width += e.kerningBefore + e.advance + e.tracking;\n line.height = Math.max(line.height, e.lineSize * lineHeight);\n line.ascent = Math.max(line.ascent, aboveBaseline(e, lineHeight));\n }\n out.length = line.end - line.start;\n line.srcEnd = entries[line.end - 1].srcEnd;\n }\n return broken;\n}\n\n/** Width of the white space a line ends in. CSS aligns a line on its ink, so\n * this hangs past the aligned edge; each space keeps its cell and advance. */\nfunction hungWidth(entries: readonly Entry[]): number {\n let hung = 0;\n for (let k = entries.length - 1; k >= 0 && hangs(entries[k].cp); k--) {\n const e = entries[k];\n hung += e.kerningBefore + e.advance + e.tracking;\n }\n return hung;\n}\n\n/** Positions of the spaces between a line's words. Leading spaces are\n * zero-width slots and trailing ones hang, so neither is a gap. */\nfunction wordGaps(entries: readonly Entry[]): Set<number> {\n const gaps = new Set<number>();\n let first = 0;\n while (first < entries.length && entries[first].cp === 32) first++;\n let last = entries.length - 1;\n while (last > first && entries[last].cp === 32) last--;\n for (let k = first + 1; k < last; k++) if (entries[k].cp === 32) gaps.add(k);\n return gaps;\n}\n\n/** Where a line's ink starts for `align`. With no box to align in, a line\n * anchors on its own width, as the canvas-2D `renderLabel` does. */\nfunction alignOffset(align: 'left' | 'center' | 'right', alignWidth: number, inkWidth: number): number {\n if (align === 'left') return 0;\n if (!Number.isFinite(alignWidth)) return align === 'center' ? -inkWidth / 2 : -inkWidth;\n const slack = alignWidth - inkWidth;\n return align === 'center' ? slack / 2 : slack;\n}\n\nconst NO_GAPS: ReadonlySet<number> = new Set();\n\n/** A line set at its place in the text: one object every {@link placeLine}\n * call rewrites, so it is valid only until the next. */\nexport interface PlacedLine {\n box: LineBox;\n /** Width of the line's ink, hung white space left out and any justified\n * spread counted. */\n inkWidth: number;\n}\n\nconst placed: PlacedLine = { box: null as unknown as LineBox, inkWidth: 0.5 };\n\n/**\n * Set `line` with its top at `y`: align it in `alignWidth`, spread it when it\n * is `justify`'s to spread, then walk the pen through `order`, storing every\n * entry's cell and placed glyph in `cols` from index `start`. Its box is\n * `cols.boxes[at]`, refilled where the columns already hold one.\n */\nexport function placeLine(\n line: Line,\n y: number,\n order: LineOrder,\n align: 'left' | 'center' | 'right',\n opts: LineOpts,\n cols: LayoutColumns,\n start: number,\n at: number,\n): PlacedLine {\n const { alignWidth, justify } = opts;\n const { entries } = line;\n const hung = hungWidth(entries);\n const inkWidth = line.width - hung;\n const slack = alignWidth - inkWidth;\n const gaps = justify && line.wrapped && Number.isFinite(alignWidth) && slack > 0\n ? wordGaps(entries)\n : NO_GAPS;\n const gapExtra = gaps.size > 0 ? slack / gaps.size : 0;\n const spread = gapExtra * gaps.size;\n const inkLeft = spread > 0 ? 0 : alignOffset(align, alignWidth, inkWidth);\n // L1 gives a line's trailing spaces the paragraph's level, so in a\n // right-to-left paragraph they reorder to the left and hang off that side.\n const hangsLeft = hung > 0 && order.levels[entries.length - 1] % 2 === 1;\n const left = hangsLeft ? inkLeft - hung : inkLeft;\n const lineBaselineY = y + line.ascent;\n\n let penX = left;\n let prevPos = -1;\n /** The last code point the pen moved past, which the kerning after it widens. */\n let wide = -1;\n let slot = 0;\n const { visual } = order;\n for (let v = 0; v < visual.length; v++) {\n const pos = visual[v];\n const e = entries[pos];\n // Kerning is a gap between two adjacent characters, and the wrap measured\n // it logically. Reordering can put a different pair side by side: take\n // the gap that belongs to whichever of the two is logically second, and\n // none across a direction boundary, where the pair never touched.\n const kern = prevPos < 0 ? 0\n : pos === prevPos + 1 ? e.kerningBefore\n : prevPos === pos + 1 ? entries[prevPos].kerningBefore\n : 0;\n // The gap belongs to the cell on its left, so the cells tile the line;\n // a mark that takes no room leaves it to the glyph it sits on.\n if (kern !== 0) cols.widen(start + (wide >= 0 ? wide : prevPos), kern);\n penX += kern;\n prevPos = pos;\n const step = e.advance + e.tracking + (gaps.has(pos) ? gapExtra : 0);\n if (step !== 0) wide = pos;\n // Positive raises, and y grows down, so the shift subtracts.\n cols.set(start + pos, e, order.levels[pos], penX, step, lineBaselineY - e.baselineShift);\n cols.setVisual(start, slot++, pos);\n penX += step;\n }\n\n const x1 = left + line.width + spread;\n const y1 = y + line.height;\n const prior = cols.boxes[at];\n placed.box = prior !== undefined\n ? prior.refill(left, y, x1, y1, lineBaselineY, line.srcEnd, spread > 0, start, entries.length)\n : (cols.boxes[at] = new LineBox(left, y, x1, y1, lineBaselineY, line.srcEnd, spread > 0, cols, start, entries.length));\n placed.inkWidth = inkWidth + spread;\n return placed;\n}\n","import type { TextAlign, TextDirection } from '../textStyle';\nimport type { BidiResolver } from './bidiSeam';\nimport { registeredBidi } from './bidiRegistry';\nimport type { TextShaper } from './shaperSeam';\nimport { registeredShaper } from './shaperRegistry';\nimport { DEFAULT_TAB_SIZE } from './tabStops';\n\n/** Options for `layoutRuns`. */\nexport interface LayoutRunsOpts {\n /** Wrap width. `Infinity` never wraps. */\n maxWidth: number;\n /**\n * Width of the box `center` / `right` resolve within, with `x = 0` its left\n * edge. Default `maxWidth`. Separate from it so a box can align text it does\n * not wrap. When both are infinite a line anchors on its own width instead:\n * `x = 0` is its midpoint (`center`) or right edge (`right`).\n */\n alignWidth?: number;\n lineHeight: number;\n /**\n * `start` / `end` resolve against `direction`; `left` / `right` are absolute\n * and ignore it, the way CSS `text-align` treats the same values. `justify`\n * is `justify: true` with the start edge.\n */\n align: TextAlign;\n /**\n * Spread each line that wrapped across `alignWidth`, widening its word gaps\n * (spaces between words; not leading or hanging trailing ones) by equal\n * shares of the slack. A line that closes its paragraph, or has no gap, or\n * no slack, keeps `align` — so `align` is CSS `text-align-last` here.\n * Implied by `align: 'justify'`. Default `false`.\n */\n justify?: boolean;\n /**\n * Bidi engine. Default: the one given to `registerBidi`. With neither, the\n * text lays out in logical order, which is correct for left-to-right text\n * and wrong for right-to-left text — see the warning this emits when it\n * detects the latter without one.\n */\n bidi?: BidiResolver;\n /**\n * Shaping engine. Default: the one given to `registerShaper`. With neither,\n * each code point is laid out as its own glyph and pairs are kerned, which\n * is wrong for scripts whose letters join or reorder, Arabic and Devanagari\n * among them.\n */\n shaper?: TextShaper;\n /**\n * Reading direction: the base direction of the bidi analysis, and what\n * `start` / `end` resolve against. Default `'auto'`, each paragraph's own\n * first strong character, which only an engine can find: with none, `'auto'`\n * reads left to right.\n */\n direction?: TextDirection | 'auto';\n /**\n * Distance between tab stops, in spaces of the tab's own run (its advance\n * plus the run's tracking), as CSS `tab-size` counts it. A tab advances to\n * the next stop from the start of its line. Default 8.\n */\n tabSize?: number;\n}\n\n/** {@link LayoutRunsOpts} with every default filled in. */\nexport interface ResolvedLayoutOpts {\n maxWidth: number;\n alignWidth: number;\n lineHeight: number;\n align: TextAlign;\n justify: boolean;\n bidi: BidiResolver | null;\n shaper: TextShaper | null;\n direction: TextDirection | 'auto';\n tabSize: number;\n}\n\n/** Fill in the defaults `layoutRuns` lays out with: into `out`, when given. */\nexport function resolveLayoutOpts(\n opts: LayoutRunsOpts,\n out: ResolvedLayoutOpts = {\n maxWidth: 0, alignWidth: 0, lineHeight: 0, align: 'left', justify: false,\n bidi: null, shaper: null, direction: 'auto', tabSize: 0,\n },\n): ResolvedLayoutOpts {\n out.maxWidth = opts.maxWidth;\n storeAlignWidth(out, opts);\n out.lineHeight = opts.lineHeight;\n out.align = opts.align;\n out.justify = opts.justify === true || opts.align === 'justify';\n out.bidi = layoutBidi(opts);\n out.shaper = layoutShaper(opts);\n out.direction = opts.direction ?? 'auto';\n out.tabSize = opts.tabSize ?? DEFAULT_TAB_SIZE;\n return out;\n}\n\n/** `opts`' align width, defaulted to its wrap width, into `out`. Stored on\n * each branch: `alignWidth ?? maxWidth` joins a tagged field with a double\n * one, and V8 boxed the join as a heap number every layout. */\nexport function storeAlignWidth(out: { alignWidth: number }, opts: LayoutRunsOpts): void {\n if (opts.alignWidth === undefined) out.alignWidth = opts.maxWidth;\n else out.alignWidth = opts.alignWidth;\n}\n\n/** The bidi engine `opts` lays out with: its own, else the registered one. */\nexport function layoutBidi(opts: LayoutRunsOpts): BidiResolver | null {\n return opts.bidi ?? registeredBidi();\n}\n\n/** The shaper `opts` lays out with: its own, else the registered one. */\nexport function layoutShaper(opts: LayoutRunsOpts): TextShaper | null {\n return opts.shaper ?? registeredShaper();\n}\n","/**\n * Runs-aware text layout: wraps `ResolvedRun[]` into lines and places every\n * glyph on them. What to draw for the result — which glyphs share a draw,\n * which tier paints each, where the decoration rules go — is `paintRuns`'.\n * Nothing here reads a run's paint, so recoloring text never lays it out again.\n *\n * A run's `letterSpacing` (world units, so it does not scale with `fontSize`)\n * is added to the advance *after* every grapheme cluster of that run,\n * including the last one on a line — the CSS `letter-spacing` rule. Trailing\n * tracking therefore widens the measured line width and counts toward\n * wrapping. Spaces are tracked like any other character; a newline is not.\n *\n * Word wrap is applied when `maxWidth` is finite, at UAX #14 break\n * opportunities. Forced line breaks are emitted at UAX #14's hard breaks, none\n * of which lays out a cell. Every run on a line shares one baseline, sunk to\n * clear whichever run reaches highest above it; line height is\n * `max(fontSize * lineHeight)` across the line. A face that states its ascent\n * and descent sits in its line the way CSS sets it — half the leading above the\n * ascent, negative when the face is taller than the line, so its glyphs overflow\n * the box rather than growing it. A run a relative size shrank\n * measures at its `strutSize` for both.\n *\n * `ResolvedRun.baselineShift` displaces a run off that shared baseline. The\n * shift moves the run's glyphs and its own decoration rules together, and does\n * not feed back into the line's baseline or its height.\n *\n * Every coordinate out of here is measured from the text's own top-left: the\n * caller translates. That is what lets a text node be dragged without\n * re-laying out.\n */\n\nimport type { BmFont, BmFontChar, GlyphMetrics, ResolveResult } from '@weasel-js/font';\nimport type { ResolvedRun } from '../runs/resolveRuns';\nimport { resolveAlign } from '../textStyle';\nimport { analyzeParagraphs, orderLine } from './bidiLines';\nimport { directionOfLevel, warnRtlWithoutEngine } from './bidiRegistry';\nimport { LayoutColumns } from './layoutColumns';\nimport { measureRuns, mirrorEntries, type Entry } from './layoutEntries';\nimport { breakLines, placeLine, type LineOpts } from './layoutLines';\nimport { resolveLayoutOpts, type LayoutRunsOpts } from './layoutOpts';\nimport type { BidiResolver } from './bidiSeam';\nimport type { ShapedCluster } from './shaperSeam';\nimport { isHardLineBreak } from './lineBreak/lineBreaks';\n\n/**\n * One advance cell: a single code point's slot on a line.\n *\n * A cell spans its code point *plus* the kerning that precedes the glyph to\n * its right, so a caret snapped to the midpoint between two `x`s lands where the glyphs\n * were actually painted rather than where an unkerned re-measure would put it.\n */\nexport interface LaidOutCell {\n /** UTF-16 offset of this code point in the runs' concatenated source text.\n * Under a length-changing `textTransform` it is the offset of the source\n * character this one was mapped from, so neighbors can share it — both\n * `S` cells of an uppercased `ß` do. */\n srcIndex: number;\n /** One past that source character — `srcIndex + 2` for an astral one. */\n srcEnd: number;\n cp: number;\n /** Left edge of the cell, post-alignment, origin-relative.\n *\n * **Not monotonic across `cells`** once a bidi engine reorders a line: cells\n * stay in logical order and their x values do not. Sort on `x` for visual\n * order; never assume `cells[i + 1].x` is this cell's right edge. */\n x: number;\n /** Width of the cell: its glyph's advance, plus its run's tracking when it\n * closes a grapheme cluster, plus a justified gap's share of the slack,\n * plus the kerning before the glyph to its right. A cell ends at its right\n * neighbor's `x`, except across a combining mark that takes no room: the\n * mark keeps 0 and the glyph it sits on takes the kerning. */\n advance: number;\n /** Resolved bidi embedding level — even reads left-to-right. 0 with no\n * engine, which is the same as saying the text was laid out logically. */\n level: number;\n /**\n * Whether this code point can put ink on the page. False for a space and\n * for a code point no tier could serve — each of which still holds its\n * slot. A zero-advance combining mark is `true`: it inks without advancing.\n * An emoji drawn as one color glyph inks from its cluster's closing code\n * point, which holds the whole advance; the ones before it are `false`.\n *\n * A property of the character and the face, not of this call: it does not\n * change when a dynamic bake lands or the outline threshold is crossed. A\n * blank-but-servable glyph (NBSP in a face that has one) reports `true`;\n * read the quad or outline geometry for exact ink extents.\n */\n drawsInk: boolean;\n /**\n * Whether this code point closes a grapheme cluster. A caret stops only\n * after a cell that does: never between a letter and its combining mark,\n * inside a joined emoji, or before a variation selector.\n */\n clusterEnd: boolean;\n}\n\n/**\n * One code point where the pen put it, with what a painter needs to draw it:\n * the tier that serves it and its record there. Carries no paint.\n */\nexport interface PlacedGlyph {\n /** Index of its run in the runs laid out. */\n run: number;\n /** Index in its line's `cells` of the code point it draws. */\n cell: number;\n cp: number;\n /** The glyph's own size, which small caps sets below its run's. */\n fontSize: number;\n /** The tier serving the glyph, which is not its run's own when the code\n * point escalated to the dynamic tier, and that tier's metrics. */\n resolved: ResolveResult;\n metrics: GlyphMetrics;\n /** The atlas to sample and the glyph's record in it. Both null on the\n * outline tier and for a slot with nothing to draw. A dynamic glyph's\n * record gains its atlas rect in place when its bake lands. */\n font: BmFont | null;\n glyph: BmFontChar | null;\n /** What it draws when a shaper shaped its run: its cluster's glyphs, set\n * from this pen, in place of the glyph its code point maps to. Null or\n * absent when its run was not shaped. */\n shaped?: ShapedCluster | null;\n /** Pen position: the left edge of the glyph's slot. */\n x: number;\n /** Its line's baseline, raised by its run's `baselineShift`. */\n baselineY: number;\n /** The glyph's own advance. */\n advance: number;\n /** How far the pen moved past it: `advance`, its run's tracking, a\n * justified gap's share of the slack, and the kerning before the next glyph\n * along the line. */\n step: number;\n /** Degrees its run turns each glyph, clockwise about `(x, baselineY)`, its\n * pen on the baseline. 0, or absent on a glyph built by hand, is upright.\n * The turn moves no pen: the glyphs after it sit where they would. */\n rotate?: number;\n}\n\n/**\n * One laid-out line's box.\n *\n * `[x0, x1]` is the line's own advance width *after* alignment — not the\n * wrap box — so a short centered line reports the span it actually occupies.\n * `[y0, y1]` is the full line box: `y0` is the pen's line top, and the box is\n * as tall as its tallest run's `lineHeight` times that run's size, or the\n * larger size a shrunken run inherited. Ink can escape it vertically; this is\n * the typographic box, not an ink bounding box.\n *\n * Emitted for every line including empty ones, so indices line up with the\n * wrap. An empty line has `x0 === x1`.\n */\nexport interface LaidOutLineBox {\n x0: number; y0: number; x1: number; y1: number;\n /** The line's baseline, for callers placing carets or rules against it. */\n baselineY: number;\n /**\n * One cell per code point on this line, in logical order. Every code point\n * the line covers has exactly one, drawn or not; only a newline has none,\n * since it separates cells rather than being one. The code points are the\n * drawn ones, after `textTransform`, so an uppercased `ß` has two cells.\n *\n * A caret stop is a cell's `x`, and the stop closing the line is `x1` /\n * `srcEnd` — there is one more stop than cell, except that cells sharing a\n * source span have no stop between them.\n */\n cells: LaidOutCell[];\n /** The same code points as placed glyphs, in visual order, left to right. */\n glyphs: PlacedGlyph[];\n /**\n * Source offset just past this line's last cell — the closing caret stop's\n * index, and the only source offset a blank line carries.\n */\n srcEnd: number;\n /** Whether `justify` spread this line's slack across its word gaps — never\n * for a line closing its paragraph, or one with no gap or no slack. */\n justified: boolean;\n}\n\n/** What {@link layoutRuns} returns. Every coordinate is relative to the text's own top-left. */\nexport interface LaidOutRuns {\n /** Per-line boxes in layout order: where the text actually sits inside its\n * wrap box. */\n lines: LaidOutLineBox[];\n /** The text's box. `width` is the widest line measured to its last\n * non-space cell — a trailing space hangs past the aligned edge, so a\n * block wrapped at `maxWidth` never reports wider than it. `height` is the\n * line boxes stacked. Not an ink box: a decoration rule, or a run shifted\n * off the baseline, can fall outside it. */\n bounds: { width: number; height: number };\n}\n\n/** The entries every layout measures into, the list holding them, and their\n * code points: none outlives the layout that measured it. */\nconst ENTRY_POOL: Entry[] = [];\nconst ENTRIES: Entry[] = [];\nconst CPS: number[] = [];\n/** The options of the layout running now, read into locals before anything\n * else can lay out. */\nconst OPTS = resolveLayoutOpts({ maxWidth: 0, lineHeight: 0, align: 'left' });\n/** The ones its lines read, set once measuring is done. */\nconst LINE_OPTS: LineOpts = { maxWidth: 0.5, alignWidth: 0.5, lineHeight: 0.5, justify: false };\n\n// Neither closure is built inside `layoutRuns`: one that captured its locals\n// made every call allocate the scope they live in, bidi engine or not.\nconst hardBreakAt = (i: number): boolean => isHardLineBreak(CPS[i]);\n\nfunction mirrorLine(\n bidi: BidiResolver, entries: readonly Entry[], levels: readonly number[], runs: readonly ResolvedRun[],\n): Entry[] {\n return mirrorEntries(entries, levels, (cp) => bidi.mirror(cp), runs);\n}\n\n/**\n * Lay out `runs` into lines of placed glyphs. Wrapping, baselines and tracking\n * follow the rules in this file's module doc.\n */\nexport function layoutRuns(\n runs: readonly ResolvedRun[],\n opts: LayoutRunsOpts,\n): LaidOutRuns {\n const {\n maxWidth, alignWidth, lineHeight, align, justify, bidi, shaper, direction, tabSize,\n } = resolveLayoutOpts(opts, OPTS);\n const entries = measureRuns(runs, tabSize, ENTRY_POOL, ENTRIES, shaper);\n const cps = CPS;\n cps.length = entries.length;\n for (let k = 0; k < entries.length; k++) cps[k] = entries[k].cp;\n // Each paragraph is analyzed once; each line then asks for its own range,\n // because L1 resets trailing whitespace against a line's end.\n const paragraphs = bidi\n ? analyzeParagraphs(bidi, cps, hardBreakAt, direction)\n : null;\n if (!bidi) warnRtlWithoutEngine(cps);\n\n const lineOpts = LINE_OPTS;\n lineOpts.maxWidth = maxWidth; lineOpts.alignWidth = alignWidth;\n lineOpts.lineHeight = lineHeight; lineOpts.justify = justify;\n const broken = breakLines(entries, cps, lineOpts);\n let size = 0;\n for (let i = 0; i < broken.length; i++) size += broken[i].entries.length;\n const cols = broken.length > 0 ? LayoutColumns.take(size) : null;\n const lines: LaidOutLineBox[] = cols !== null ? cols.boxes : [];\n let y = 0;\n let width = 0;\n let start = 0;\n for (let i = 0; i < broken.length; i++) {\n const line = broken[i];\n const order = orderLine(paragraphs, line.start, line.entries.length);\n // L4, done per line rather than during analysis: the same code point\n // mirrors in one run and not in another, and the level is known only now.\n if (bidi) line.entries = mirrorLine(bidi, line.entries, order.levels, runs);\n const reads = direction !== 'auto' ? direction\n : directionOfLevel(line.entries.length > 0 ? paragraphs?.baseLevel(line.start) ?? 0 : 0);\n const placed = placeLine(\n line, y, order, resolveAlign(align, reads), lineOpts, cols!, start, i,\n );\n start += line.entries.length;\n width = Math.max(width, placed.inkWidth);\n y += line.height;\n }\n lines.length = broken.length;\n if (cols === null) return { lines, bounds: { width, height: y } };\n cols.bounds.width = width;\n cols.bounds.height = y;\n return (cols.laid ??= { lines, bounds: cols.bounds });\n}\n","/**\n * A glyph quad as painting packs it: the numbers `LaidOutGroup.quadData`\n * holds for each atlas glyph, and the object view a reader can ask for instead.\n */\nimport type { BmFontChar } from '@weasel-js/font';\nimport { lazy } from './layoutColumns';\nimport type { PlacedGlyph } from './layoutRuns';\nimport type { LaidOutGroup } from './paintRuns';\n\n/** One textured glyph quad, relative to the text's own top-left: what\n * `LaidOutGroup.quads` holds, read out of `quadData`. */\nexport interface LaidOutQuad {\n x0: number; y0: number; x1: number; y1: number;\n u0: number; v0: number; u1: number; v1: number;\n /** The glyph's baseline. The synthetic-italic skew leans vertices about it. */\n baselineY: number;\n /** The glyph's pen on that baseline, which it turns about. */\n penX: number;\n /** Degrees the quad turns, clockwise about `(penX, baselineY)`, after the\n * skew. 0 is upright. */\n rotate: number;\n /** On a `'color'` group's quads, the glyph's record, which a renderer drawing\n * it larger than its bake asks for a sharper one (`sharperColorGlyph`). */\n colorGlyph?: BmFontChar;\n}\n\n/** Numbers per quad in `LaidOutGroup.quadData`. */\nexport const QUAD_STRIDE = 11;\n\n/**\n * Whether `g` has an atlas quad: false with no atlas record, for a zero-area\n * glyph, or for a dynamic glyph not baked yet.\n */\nexport function hasGlyphQuad(g: PlacedGlyph): boolean {\n const { font, glyph } = g;\n return font !== null && glyph !== null && glyph.width !== 0 && glyph.page >= 0;\n}\n\n/** Write `g`'s atlas quad, which it must have, into `out` at `at`. */\nexport function writeGlyphQuad(g: PlacedGlyph, out: number[], at: number): void {\n const font = g.font!, glyph = g.glyph!;\n const scale = g.fontSize / g.metrics.size;\n const x0 = g.x + glyph.xoffset * scale;\n // `yoffset` is measured from the line top in the atlas's own frame, so\n // subtracting that frame's baseline hangs the glyph off its own.\n const y0 = g.baselineY + (glyph.yoffset - g.metrics.base) * scale;\n out[at] = x0;\n out[at + 1] = y0;\n out[at + 2] = x0 + glyph.width * scale;\n out[at + 3] = y0 + glyph.height * scale;\n out[at + 4] = glyph.x / font.common.scaleW;\n out[at + 5] = glyph.y / font.common.scaleH;\n out[at + 6] = (glyph.x + glyph.width) / font.common.scaleW;\n out[at + 7] = (glyph.y + glyph.height) / font.common.scaleH;\n out[at + 8] = g.baselineY;\n out[at + 9] = g.x;\n out[at + 10] = g.rotate ?? 0;\n}\n\n/** Groups whose `quads` view was built, which holds their quads as a value\n * from then on and so cannot be refilled. */\nexport const quadsViewed = new WeakSet<LaidOutGroup>();\n\n/** The `quads` view over a group's `quadData`. */\nexport const quadViews: PropertyDescriptorMap = {\n quads: lazy('quads', (group: LaidOutGroup) => {\n quadsViewed.add(group);\n const d = group.quadData;\n const out: LaidOutQuad[] = [];\n for (let at = 0, k = 0; at < d.length; at += QUAD_STRIDE, k++) {\n const q: LaidOutQuad = {\n x0: d[at], y0: d[at + 1], x1: d[at + 2], y1: d[at + 3],\n u0: d[at + 4], v0: d[at + 5], u1: d[at + 6], v1: d[at + 7], baselineY: d[at + 8],\n penX: d[at + 9], rotate: d[at + 10],\n };\n if (group.colorGlyphs) q.colorGlyph = group.colorGlyphs[k];\n out.push(q);\n }\n return out;\n }),\n};\n","/**\n * Synthetic bold as geometry. The renderer fakes a missing bold face by\n * dropping the distance-field threshold, which moves every edge of the glyph\n * outward by `syntheticBoldGrowth`; outlining it is the glyph's own outline\n * grown by that distance.\n */\n\nimport { syntheticBoldGrowth, type ResolveResult } from '@weasel-js/font';\nimport { growRegion, mergeRegion, pathFromD, pathToD, type PolygonPath } from '@weasel-js/geom';\n\n/** How closely the grown outline follows the font's curves, in em. */\nexport const SYNTHETIC_BOLD_TOLERANCE = 0.0005;\n\nconst CACHE_LIMIT = 4096;\nconst cache = new Map<string, PolygonPath>();\nconst dCache = new Map<string, string>();\n\n/**\n * How far synthetic bold grows a glyph served as `resolved`, in em per side,\n * and how its corners turn; `null` when the renderer draws it unshifted.\n * An MSDF atlas keeps sharp corners, so its shifted edge meets in a miter; a\n * canvas bake is a true distance field, whose shifted edge rounds them.\n */\nexport function syntheticBoldOffset(resolved: ResolveResult): { growth: number; join: 'miter' | 'round' } | null {\n if (!resolved.synthetic.bold) return null;\n const { source } = resolved;\n if (source !== 'atlas' && source !== 'canvas') return null;\n const { family, weight, style } = resolved.resolved;\n const growth = syntheticBoldGrowth(source, family, weight, style);\n if (growth === undefined || !(growth > 0)) return null;\n return { growth, join: source === 'atlas' ? 'miter' : 'round' };\n}\n\n/**\n * `em`, a glyph's em-space outline keyed by its outline data `d`, as the\n * renderer draws it faked bold for `resolved`: unchanged when it is not.\n * The grown contours keep their curves, and are merged where they overlap so\n * a stroke traces only the glyph's edge.\n */\nexport function emboldenGlyph(em: PolygonPath, d: string, resolved: ResolveResult): PolygonPath {\n const offset = syntheticBoldOffset(resolved);\n if (offset === null) return em;\n const key = `${offset.growth}|${offset.join}|${d}`;\n let grown = cache.get(key);\n if (grown) return grown;\n grown = mergeRegion(\n growRegion(em, offset.growth, { join: offset.join, tolerance: SYNTHETIC_BOLD_TOLERANCE }),\n { tolerance: SYNTHETIC_BOLD_TOLERANCE },\n );\n if (cache.size >= CACHE_LIMIT) cache.clear();\n cache.set(key, grown);\n return grown;\n}\n\n/**\n * {@link emboldenGlyph} for the renderer's outline tier, which takes outline\n * data: `d` grown as the field draws it, and a tag naming the growth for the\n * glyph's tessellation key. `null` when the renderer draws `resolved` unshifted.\n */\nexport function emboldenGlyphD(d: string, resolved: ResolveResult): { d: string; tag: string } | null {\n const offset = syntheticBoldOffset(resolved);\n if (offset === null) return null;\n const tag = `bold:${offset.growth}:${offset.join}`;\n const key = `${tag}|${d}`;\n let grown = dCache.get(key);\n if (grown === undefined) {\n grown = pathToD(emboldenGlyph(pathFromD(d), d, resolved));\n if (dCache.size >= CACHE_LIMIT) dCache.clear();\n dCache.set(key, grown);\n }\n return { d: grown, tag };\n}\n","/**\n * The groups a painting sorts its glyphs into, and the groups of paintings\n * nobody can reach any more, refilled by the next.\n */\nimport type { FontStyle } from '@weasel-js/font';\nimport { paintKey, strokeHasInk, strokeKey, type Stroke } from '@weasel-js/paint';\nimport type { ResolvedRun } from '../runs/resolveRuns';\nimport { truncate } from './arrayPool';\nimport { quadsViewed, quadViews } from './glyphQuads';\nimport type { PlacedGlyph } from './layoutRuns';\nimport type { LaidOutGroup } from './paintRuns';\n\n/** The group the previous glyph joined, and every input it was matched on. */\ninterface LastGroup {\n group: LaidOutGroup | null;\n run: number; family: string; weight: number; style: FontStyle;\n bold: boolean; italic: boolean; source: LaidOutGroup['source']; page: number;\n}\n\n/** A group, the run whose glyph opened it, and what that run paints, as a\n * string built only when a glyph of another run has to be compared with it. */\ninterface GroupSlot {\n group: LaidOutGroup;\n run: number;\n paint: string | null;\n}\n\n/** What a glyph of `run` on `source` paints with: its fill, and its stroke\n * where the tier can draw one. */\nfunction strokeOn(run: ResolvedRun, source: LaidOutGroup['source']): Stroke | undefined {\n // Only the outline tier can paint a stroke; an SDF group carrying one would\n // be a promise the renderer cannot keep.\n return source === 'outline' && strokeHasInk(run.stroke) ? run.stroke : undefined;\n}\n\nfunction paintOf(run: ResolvedRun, source: LaidOutGroup['source']): string {\n return `${paintKey(run.fill?.paint)}|${strokeKey(strokeOn(run, source))}`;\n}\n\n/** The group `g` joins, of those the painting under way has opened: one\n * sharing its face, tier, page and paint, or a new one. */\nexport function groupFor(\n runs: readonly ResolvedRun[],\n g: PlacedGlyph,\n source: LaidOutGroup['source'],\n): LaidOutGroup {\n const { family, weight, style } = g.resolved.resolved;\n const { synthetic } = g.resolved;\n const page = source === 'outline' ? 0 : g.glyph!.page;\n // A glyph matching the one before it joins that group without a search.\n if (last.group !== null && last.run === g.run && last.source === source && last.page === page\n && last.family === family && last.weight === weight && last.style === style\n && last.bold === synthetic.bold && last.italic === synthetic.italic) {\n return last.group;\n }\n const run = runs[g.run];\n let group: LaidOutGroup | null = null;\n let paint: string | null = null;\n for (let k = 0; k < slots.length; k++) {\n const slot = slots[k];\n const c = slot.group;\n if (c.source !== source || c.page !== page || c.family !== family || c.weight !== weight\n || c.style !== style || c.synthetic.bold !== synthetic.bold || c.synthetic.italic !== synthetic.italic) continue;\n // One run paints one way, so only a glyph of another run builds the strings.\n if (slot.run !== g.run) {\n paint ??= paintOf(run, source);\n slot.paint ??= paintOf(runs[slot.run], source);\n if (slot.paint !== paint) continue;\n }\n group = c;\n break;\n }\n if (group === null) {\n const stroke = strokeOn(run, source);\n group = stroke === undefined && source !== 'color' ? spareGroups.pop() ?? null : null;\n if (group !== null) {\n group.family = family; group.weight = weight; group.style = style;\n group.synthetic.bold = synthetic.bold; group.synthetic.italic = synthetic.italic;\n group.source = source; group.page = page; group.fill = run.fill;\n } else {\n group = Object.defineProperties({\n family, weight, style, synthetic: { bold: synthetic.bold, italic: synthetic.italic }, source, page,\n fill: run.fill, quadData: NO_QUADS, glyphs: [],\n }, quadViews) as unknown as LaidOutGroup;\n if (stroke) group.stroke = stroke;\n if (source === 'color') group.colorGlyphs = [];\n }\n const i = slots.length;\n let slot = slotPool[i];\n if (slot === undefined) {\n slot = { group, run: g.run, paint };\n if (i < SLOT_POOL_MAX) slotPool[i] = slot;\n } else {\n slot.group = group; slot.run = g.run; slot.paint = paint;\n }\n slots.push(slot);\n }\n last.group = group;\n last.run = g.run; last.family = family; last.weight = weight; last.style = style;\n last.bold = synthetic.bold; last.italic = synthetic.italic; last.source = source; last.page = page;\n return group;\n}\n\n/** What a group holds before its first quad: never written to, since the\n * quad that would be is given an array of its own. */\nexport const NO_QUADS: readonly number[] = [];\n\n/** Groups of paintings nobody can reach any more, for the next painting's\n * groups to refill. */\nconst spareGroups: LaidOutGroup[] = [];\nconst SPARE_GROUPS_MAX = 1024;\n\n/** Hand `group`, of a painting nobody can reach, to the next painting. Its\n * quad array is the caller's to have given back already. One with a stroke,\n * color glyphs, or a built `quads` view is left to the collector. */\nexport function giveGroup(group: LaidOutGroup): void {\n if (spareGroups.length >= SPARE_GROUPS_MAX || group.stroke !== undefined || group.colorGlyphs !== undefined\n || quadsViewed.has(group)) return;\n group.quadData = NO_QUADS;\n truncate(group.glyphs, 0);\n spareGroups.push(group);\n}\n\n/** The painting under way's groups so far and the one its last glyph joined,\n * emptied by {@link takeGroups} so they hold no group between paintings. */\nconst slots: GroupSlot[] = [];\nconst slotPool: GroupSlot[] = [];\nconst SLOT_POOL_MAX = 64;\nconst last: LastGroup = {\n group: null, run: -1, family: '', weight: 0, style: 'normal', bold: false, italic: false, source: 'atlas', page: 0,\n};\n\n/** Move the painting under way's groups into `out`, in the order they opened,\n * and start the next painting with none. */\nexport function takeGroups(out: LaidOutGroup[]): void {\n for (let i = 0; i < slots.length; i++) {\n out.push(slots[i].group);\n slots[i].group = null as unknown as LaidOutGroup;\n }\n truncate(slots, 0);\n last.group = null;\n}\n","/**\n * What to draw for laid-out text: which tier paints each glyph, which glyphs\n * can be staged together, and the decoration rules. Layout places the glyphs\n * and knows nothing of this; no decision here moves one.\n *\n * Underline, strikethrough and overline come out as solid rectangles built\n * from pen positions, not from quad extents: quads exist only for glyphs with\n * ink, so a decorated stretch's spaces would punch holes in a rule derived\n * from them.\n */\nimport {\n faceMetricsOf, glyphOutline, cachedFontVariant, type BmFontChar, type FaceMetrics, type FontStyle,\n} from '@weasel-js/font';\nimport {\n fillHasInk, paintKey, strokeHasInk, type Fill, type Stroke,\n} from '@weasel-js/paint';\nimport type { ResolvedRun } from '../runs/resolveRuns';\nimport { emboldenGlyphD } from '../syntheticBold';\nimport { lineDecorations, type DecorationKind } from './decorationMetrics';\nimport { doubles, takeDoubles, truncate } from './arrayPool';\nimport { blankGlyph, LineBox } from './layoutColumns';\nimport type { LaidOutRuns, PlacedGlyph } from './layoutRuns';\nimport { hasGlyphQuad, QUAD_STRIDE, writeGlyphQuad, type LaidOutQuad } from './glyphQuads';\nimport { groupFor, NO_QUADS, takeGroups } from './paintGroups';\n\n\n/**\n * One glyph the renderer should tessellate rather than sample.\n *\n * `d` is em-space SVG path data — 1 unit is 1 em, y grows down, origin on the\n * baseline at the pen — with any synthetic bold already grown into it. Placing it is therefore a uniform scale by `scale`\n * followed by a translate to `(x, baselineY)`. `key` identifies the cached\n * tessellation — face identity plus codepoint, plus the growth of a synthetic\n * bold.\n */\nexport interface LaidOutOutlineGlyph {\n d: string;\n key: string;\n /** Pen position: where em-space x = 0 lands, in world units. */\n x: number;\n /** The glyph's baseline: where em-space y = 0 lands, in world units. */\n baselineY: number;\n /** World units per em — the glyph's `fontSize`, since em space is unit-scale. */\n scale: number;\n /** Degrees the glyph turns, clockwise about the pen, after any synthetic\n * italic shear. Absent is upright. */\n rotate?: number;\n}\n\n/**\n * Glyphs that share a resolved face, glyph source and paint, so a renderer\n * can bind once for all of them. Groups come in the order their first glyph\n * appears, line by line in visual order, and paint in that order.\n */\nexport interface LaidOutGroup {\n /** Resolved atlas family — may differ from the requested family when the\n * cross-family fallback policy substituted a default. A renderer looks the\n * atlas up by this, exactly. */\n family: string;\n /** Resolved variant — matches the registered atlas and the texture-cache key. */\n weight: number;\n style: FontStyle;\n /** Gap between the request and the resolved match, for the renderer to fake.\n * An `'outline'` group's bold is already grown into its glyphs. */\n synthetic: { bold: boolean; italic: boolean };\n /** Which glyph source this group binds: a baked MSDF atlas, the runtime\n * canvas-SDF dynamic atlas, tessellated font outlines, or the dynamic\n * atlas's color pages, whose quads are emoji painted in their own colors. */\n source: 'atlas' | 'canvas' | 'outline' | 'color';\n /** Dynamic-atlas page index for 'canvas' and 'color' groups, each in its\n * own set of pages; 0 for the others. */\n page: number;\n /** The run's fill. It holds no paint — `null`, or a fill without one — only\n * on an `'outline'` group carrying a stroke, since nothing else can put ink\n * down without a fill. A `'color'` group takes its opacity and nothing else\n * from it. */\n fill: Fill | null;\n /** Outline painted over the glyphs. Only ever set on an `'outline'` group —\n * the SDF tiers have no geometry to stroke, which is why a stroke pulls its\n * run onto the outline tier at any size. A run the tier cannot serve at all\n * (no registered outlines) stays on the atlas, unstroked. */\n stroke?: Stroke;\n /** Textured glyph quads, {@link QUAD_STRIDE} numbers each, in\n * `LaidOutQuad`'s field order: `x0 y0 x1 y1 u0 v0 u1 v1 baselineY penX rotate`. What\n * a painter reads; `quads` is a view of it. Empty for an `'outline'` group. */\n quadData: readonly number[];\n /** On a `'color'` group, each quad's glyph record, which a renderer drawing\n * it larger than its bake asks for a sharper one (`sharperColorGlyph`). */\n colorGlyphs?: readonly BmFontChar[];\n /** The same quads as objects, built on first read. */\n readonly quads: LaidOutQuad[];\n /** Outline geometry. Always empty for an `'atlas'` / `'canvas'` group. */\n glyphs: LaidOutOutlineGlyph[];\n}\n\n/**\n * One decoration rule: an axis-aligned solid rectangle in the same space as\n * `LaidOutQuad`. Never spans a line break, and carries the fill of the run(s)\n * it decorates so the rule follows the text color.\n */\nexport interface LaidOutDecoration {\n kind: DecorationKind;\n x0: number; y0: number; x1: number; y1: number;\n fill: Fill;\n}\n\n/** Options for {@link paintRuns}. */\nexport interface PaintRunsOpts {\n /**\n * World-space `fontSize` at or above which glyphs are emitted as outline\n * geometry, when the resolved face has outlines registered. Omit (the\n * default) to keep every glyph on its SDF tier.\n *\n * Ignored for a family that resolved to the outline tier because it has no\n * atlas: there the geometry is the only rendering.\n */\n outlineMinSize?: number;\n}\n\n/** What {@link paintRuns} returns. Relative to the text's own top-left, as the layout is. */\nexport interface PaintedRuns {\n groups: LaidOutGroup[];\n /** Decoration rules, in line order; within a stretch, underline then\n * strikethrough then overline. Empty when nothing is decorated. */\n decorations: LaidOutDecoration[];\n}\n\n/**\n * Em-space outline for `g` and the key its tessellation is cached by, or\n * `null` to leave it on its SDF tier. Decided per glyph, so a face the\n * resolver reports as atlas or canvas can still serve it. `ungated` skips the\n * size gate, for a glyph its SDF tier cannot draw.\n */\nexport function glyphOutlineD(\n g: PlacedGlyph, run: ResolvedRun, minSize: number | undefined, ungated = false,\n): { d: string; key: string } | null {\n // An outline-only run has no atlas behind it. Every gate below trades one\n // rendering for another; here there is no other, so gating would paint\n // nothing at all.\n const outlineOnly = g.resolved.source === 'outline';\n if (!outlineOnly && !ungated) {\n if (minSize === undefined) return null;\n // A stroked run ignores the size gate: the SDF tiers have no geometry to\n // stroke, so leaving it below the threshold drops the outline asked for.\n // Gated on the run's size, so a small-caps word is not split across tiers.\n if (run.fontSize < minSize && !strokeHasInk(run.stroke)) return null;\n }\n const d = faceOutlineD(g);\n if (d === null) return null;\n const { family, weight, style } = g.resolved.resolved;\n const key = g.shaped ? `${family}|${weight}|${style}|#${g.shaped.key}` : `${family}|${weight}|${style}|${g.cp}`;\n // Synthetic italic is a shear, exact on geometry, and the renderer applies\n // it. Synthetic bold is an SDF threshold shift, so the face's own outline\n // would be lighter: it is grown by the distance the shift moves the edge.\n if (outlineOnly || !g.resolved.synthetic.bold) return { d, key };\n const bold = emboldenGlyphD(d, g.resolved);\n return bold && { d: bold.d, key: `${key}|${bold.tag}` };\n}\n\n/**\n * Em-space outline of `g` in the face it resolved to, whichever tier draws it\n * — its shaped cluster's, when its run was shaped — or `null` when it has none: a color glyph, or a slot the layout left empty,\n * which has no width to draw in and would land on top of its neighbor.\n */\nexport function faceOutlineD(g: PlacedGlyph): string | null {\n if (g.shaped) return g.shaped.d;\n if (g.glyph?.color) return null;\n const { family, weight, style } = g.resolved.resolved;\n if (g.resolved.source !== 'outline' && g.glyph === null) return null;\n return glyphOutline(family, weight, style, g.cp);\n}\n\n/** `g`, a shaped cluster on the canvas tier, as a glyph drawing its whole cluster from one baked\n * tile; null until the tile has baked, and on any other tier. */\nfunction shapedQuadGlyph(g: PlacedGlyph): PlacedGlyph | null {\n const face = g.resolved.dynamicFace;\n const shaped = g.shaped!;\n if (!face || shaped.d === null) return null;\n const glyph = face.requestShaped(shaped.key, shaped.d);\n if (!glyph || glyph.page < 0 || glyph.width === 0) return null;\n return { ...g, font: face.font, glyph };\n}\n\n/** Each run's own face, which places its rules: a glyph's `resolved` may be a\n * per-glyph fallback. */\nexport function runFaces(runs: readonly ResolvedRun[]): (run: number) => FaceMetrics | undefined {\n const faces = runs.map((r) => faceMetricsOf(cachedFontVariant(r.fontFamily, r.fontWeight, r.fontStyle)));\n return (run) => faces[run];\n}\n\nconst isDecorated = (r: ResolvedRun): boolean => r.underline || r.strikethrough || r.overline;\n\n/** What paints a rule under run `run`: a solid rect with only its fill. Built\n * apart from `paintRunsInto`, whose every call allocated the scope a closure\n * over its `runs` lives in, decorated or not. */\nfunction rulePaintOf(runs: readonly ResolvedRun[]): (run: number) => string | null {\n return (run) => (fillHasInk(runs[run].fill) ? paintKey(runs[run].fill!.paint) : null);\n}\n\n/** One glyph walks a layout's columns, so painting builds no object a glyph,\n * nor one a painting: each glyph is read before the next is filled in. */\nconst cursor = blankGlyph();\n\n/** The first group's quads while a painting fills them, before they are\n * copied out at their final length. */\nlet scratch: number[] = [];\n/** Longest {@link scratch} grows to; a longer text's group gets its own. */\nconst SCRATCH_MAX = 1 << 14;\n\n/**\n * Derive what to draw for `laid`, the layout of `runs` — or of runs that\n * differ from them only in paint and decoration, which a layout does not read.\n */\nexport function paintRuns(\n laid: LaidOutRuns,\n runs: readonly ResolvedRun[],\n opts: PaintRunsOpts = {},\n): PaintedRuns {\n return paintRunsInto(laid, runs, opts, { groups: [], decorations: [] });\n}\n\n/** {@link paintRuns}, emptying `out`'s arrays and filling them. */\nexport function paintRunsInto(\n laid: LaidOutRuns,\n runs: readonly ResolvedRun[],\n opts: PaintRunsOpts,\n out: PaintedRuns,\n): PaintedRuns {\n const { groups, decorations } = out;\n truncate(groups, 0);\n truncate(decorations, 0);\n const faceOf = runs.some(isDecorated) ? runFaces(runs) : null;\n const rulePaint = faceOf && rulePaintOf(runs);\n // Most text is one group. The first to take a quad fills a scratch array\n // sized for every glyph, copied out at its final length; any other grows\n // as it fills.\n let glyphCount = 0;\n const { lines } = laid;\n for (let i = 0; i < lines.length; i++) glyphCount += LineBox.count(lines[i]);\n const need = glyphCount * QUAD_STRIDE;\n if (need <= SCRATCH_MAX && scratch.length < need) scratch = doubles(need);\n const buf = need <= SCRATCH_MAX ? scratch : doubles(need);\n let sized: LaidOutGroup | null = null;\n let sizedAt = 0;\n\n for (let li = 0; li < lines.length; li++) {\n const line = lines[li];\n const cols = LineBox.columns(line);\n const start = cols !== null ? LineBox.start(line) : 0;\n const count = LineBox.count(line);\n const rules = faceOf && lineDecorations(runs, faceOf, rulePaint!);\n for (let slot = 0; slot < count; slot++) {\n const pos = cols !== null ? cols.visual(start, slot) : -1;\n const g = cols !== null ? cols.glyph(start, pos, cursor) : line.glyphs[slot];\n rules?.add(g);\n const run = runs[g.run];\n // A color cluster's leading code points draw no ink of their own, though\n // an outline face has a glyph for each: a keycap would paint its digit.\n const inks = cols !== null ? cols.drawsInk(start, pos) : line.cells[g.cell].drawsInk;\n // Asked before the quad: a dynamic glyph still waiting for its bake has\n // no atlas rect, but its outline is available right now.\n let outline = inks ? glyphOutlineD(g, run, opts.outlineMinSize) : null;\n let q = g;\n if (inks && outline === null && g.shaped) {\n // An atlas cannot look a shaped cluster up by code point: the canvas tier bakes it whole,\n // and it draws from its outline until that lands, and always on a baked atlas.\n const baked = shapedQuadGlyph(g);\n if (baked) q = baked;\n else outline = glyphOutlineD(g, run, opts.outlineMinSize, true);\n }\n // An unfilled run paints through its stroke, and only tessellated\n // geometry can carry one. An atlas quad would paint the fill that was\n // refused, so it gets none.\n if (!fillHasInk(run.fill) && !(outline !== null && strokeHasInk(run.stroke))) continue;\n if (outline !== null) {\n const placed: LaidOutOutlineGlyph = { ...outline, x: g.x, baselineY: g.baselineY, scale: g.fontSize };\n if (g.rotate) placed.rotate = g.rotate;\n groupFor(runs, g, 'outline').glyphs.push(placed);\n continue;\n }\n if (!hasGlyphQuad(q)) continue;\n const group = groupFor(runs, q, q.glyph!.color ? 'color' : q.resolved.source);\n if (sized === null) {\n sized = group;\n group.quadData = buf;\n }\n let quads = group.quadData as number[];\n if (quads === NO_QUADS) group.quadData = quads = [];\n if (group === sized) {\n writeGlyphQuad(q, quads, sizedAt);\n sizedAt += QUAD_STRIDE;\n } else {\n writeGlyphQuad(q, quads, quads.length);\n }\n (group.colorGlyphs as BmFontChar[] | undefined)?.push(q.glyph!);\n }\n if (!rules) continue;\n for (const rule of rules.end()) {\n const { run, ...rect } = rule;\n decorations.push({ ...rect, fill: runs[run].fill! });\n }\n }\n if (sized !== null && buf !== scratch) {\n buf.length = sizedAt;\n } else if (sized !== null) {\n const quads = takeDoubles(sizedAt);\n for (let k = 0; k < sizedAt; k++) quads[k] = scratch[k];\n sized.quadData = quads;\n }\n takeGroups(groups);\n return out;\n}\n","/**\n * What the layout and paint caches hold for one runs array, in one `WeakMap`\n * entry, so a runs array new every frame costs one set and one delete rather\n * than one in each cache.\n */\nimport type { ResolvedRun } from '../runs/resolveRuns';\nimport type { Structural, Variant } from './layoutCache';\nimport type { LaidOutRuns } from './layoutRuns';\nimport type { Painting } from './paintCache';\n\nexport interface RunsEntry {\n /** `faceGeneration()` when the layout cache filled `variants`; -1 until it has. */\n generation: number;\n /** The layout cache's layouts of these runs, most recently matched first. */\n variants: Variant[];\n /** The paint cache's own painting of these runs, the layout it was painted\n * on, and the threshold it was last asked for at. The runs fix every paint,\n * so the same layout at an unchanged threshold and glyph generation is a\n * hit with no key built. */\n painting: Painting | null;\n paintedOn: LaidOutRuns | null;\n /** `paintedOn`'s columns' stamp when it was painted: a recycled layout's\n * result is handed on, so the object alone does not say it is the same layout. */\n paintedStamp: number;\n paintMin: number | undefined;\n /** The structural entry these runs filled, which compares later runs with\n * them: it is dead once they are refilled in place. */\n listed: Structural | null;\n}\n\nlet entries = new WeakMap<readonly ResolvedRun[], RunsEntry>();\n\n/** Entries `dropEntry` let go, for the next runs arrays. */\nconst spare: RunsEntry[] = [];\nconst SPARE_MAX = 1024;\n\nexport function entryOf(runs: readonly ResolvedRun[]): RunsEntry | undefined {\n return entries.get(runs);\n}\n\n/** `runs`' entry, filed now if it has none. */\nexport function entryFor(runs: readonly ResolvedRun[]): RunsEntry {\n let e = entries.get(runs);\n if (e === undefined) {\n e = spare.pop() ?? {\n generation: -1, variants: [], painting: null, paintedOn: null, paintedStamp: 0, paintMin: undefined,\n listed: null,\n };\n entries.set(runs, e);\n }\n return e;\n}\n\n/** Unfile `runs`' entry and return it, for the caller to empty and pass to\n * {@link giveEntry}. */\nexport function dropEntry(runs: readonly ResolvedRun[]): RunsEntry | undefined {\n const e = entries.get(runs);\n if (e !== undefined) entries.delete(runs);\n return e;\n}\n\n/** Reset an entry whose `variants` the caller has emptied, leaving it filed. */\nexport function emptyEntry(e: RunsEntry): void {\n e.generation = -1;\n e.painting = null;\n e.paintedOn = null;\n e.paintMin = undefined;\n e.listed = null;\n}\n\n/** Take back an entry whose `variants` the caller has emptied. */\nexport function giveEntry(e: RunsEntry): void {\n emptyEntry(e);\n if (spare.length < SPARE_MAX) spare.push(e);\n}\n\n/** Test helper. Do not call from product code. */\nexport function _resetRunsEntriesForTests(): void {\n entries = new WeakMap();\n}\n","/**\n * `paintRuns`, memoized against the layout it was derived from.\n *\n * Kept apart from the layout cache because the two go stale for different\n * reasons: a recolor, a zoom across the outline threshold, or a dynamic bake\n * landing changes what is drawn and leaves every glyph where it was.\n */\nimport { glyphGeneration } from '@weasel-js/font';\nimport { paintKey, strokeKey } from '@weasel-js/paint';\nimport type { ResolvedRun } from '../runs/resolveRuns';\nimport { giveDoubles, truncate } from './arrayPool';\nimport type { CacheUse } from './layoutCache';\nimport { LineBox } from './layoutColumns';\nimport type { LaidOutRuns } from './layoutRuns';\nimport { giveGroup, NO_QUADS } from './paintGroups';\nimport { paintRunsInto, type PaintedRuns, type PaintRunsOpts } from './paintRuns';\nimport { entryFor, entryOf } from './runsEntries';\n\n/** Paintings held for one layout on behalf of runs arrays that have since\n * gone, before the least recently used is dropped. Sized for a palette. */\nexport const PAINT_CACHE_VARIANT_LIMIT = 32;\n\nexport interface Painting {\n /** `glyphGeneration()` when it was painted. */\n generation: number;\n /** What it paints, built only once a second runs array asks this layout\n * for a painting: until then nothing has to be told apart from it. */\n key: string | null;\n /** The bucket of the threshold it was painted at, and the runs it was\n * painted for, held until `key` is built from them. */\n bucket: number;\n runs: readonly ResolvedRun[] | null;\n painted: PaintedRuns;\n /** Whether a caller was handed it to keep, which bars its quad arrays from\n * going back to the pool with its layout. */\n pinned: boolean;\n}\n\n/*\n * Two tiers, as the layout cache has and for the same reason. A runs array\n * that stays put, which is what the renderer is handed, keeps its own painting\n * for as long as it lives, on the entry the layout cache files it under\n * (`runsEntries.ts`): any number of labels can share one layout and none\n * evicts another. Runs built fresh on every call can only be found by what\n * they paint, in a bounded list per layout, which hangs off the layout weakly.\n *\n * Text whose runs and layout are both new, a readout rewritten every frame,\n * builds no key at all: the list for a fresh layout is empty, and a key is\n * built only when there is something to compare it with.\n */\n\n/** Each layout's paintings, most recently used last: on its columns, or here\n * for a layout built by hand. */\nconst shared = new WeakMap<LaidOutRuns, Painting[]>();\n\nfunction stampOf(laid: LaidOutRuns): number {\n return laid.lines.length > 0 ? LineBox.columns(laid.lines[0])?.stamp ?? 0 : 0;\n}\n\nfunction listOf(laid: LaidOutRuns): Painting[] {\n const cols = laid.lines.length > 0 ? LineBox.columns(laid.lines[0]) : null;\n if (cols !== null) return cols.paintings as Painting[];\n let list = shared.get(laid);\n if (list === undefined) shared.set(laid, (list = []));\n return list;\n}\n\n/** Paintings of recycled layouts, their groups and decorations arrays\n * emptied, for the next painting. */\nconst spare: Painting[] = [];\nconst SPARE_MAX = 1024;\n\nfunction painting(\n laid: LaidOutRuns, runs: readonly ResolvedRun[], opts: PaintRunsOpts,\n generation: number, key: string | null, bucket: number,\n): Painting {\n const p = spare.pop();\n if (p === undefined) {\n return {\n generation, key, bucket, runs: key === null ? runs : null,\n painted: paintRunsInto(laid, runs, opts, { groups: [], decorations: [] }), pinned: false,\n };\n }\n p.generation = generation; p.key = key; p.bucket = bucket; p.runs = key === null ? runs : null;\n p.pinned = false;\n paintRunsInto(laid, runs, opts, p.painted);\n return p;\n}\n\n/**\n * How many of the distinct font sizes present in `runs` reach `min`. The\n * threshold reaches `paintRuns` through one comparison against a run's size,\n * and the count is monotonic in `min` over fixed runs, so equal counts mean\n * the same runs cleared it. That keeps an entry across every zoom that crosses\n * no run size, where keying on `min` itself would miss on every frame.\n * Stroked runs need no term of their own: a stroke pulls its run onto the\n * outline tier at every `min`.\n *\n * `-1` is an absent threshold, which must stay distinct from one no run\n * reaches: an outline-only face aside, neither draws outlines, but only the\n * first leaves a stroked run on its atlas.\n */\nfunction outlineBucket(runs: readonly ResolvedRun[], min: number | undefined): number {\n if (min === undefined) return -1;\n let n = 0;\n for (let i = 0; i < runs.length; i++) {\n const size = runs[i].fontSize;\n if (!(size >= min)) continue;\n let seen = false;\n for (let j = 0; j < i && !seen; j++) seen = runs[j].fontSize === size;\n if (!seen) n++;\n }\n return n;\n}\n\n/** Everything `paintRuns` reads from the runs that their layout does not. */\nfunction variantKey(runs: readonly ResolvedRun[], bucket: number): string {\n let out = `${bucket}`;\n for (const r of runs) {\n out += `|${r.underline ? 1 : 0}${r.strikethrough ? 1 : 0}${r.overline ? 1 : 0}`\n + `${paintKey(r.fill?.paint)}|${strokeKey(r.stroke)}`;\n }\n return out;\n}\n\nfunction keyOf(p: Painting): string {\n if (p.key === null) {\n p.key = variantKey(p.runs!, p.bucket);\n p.runs = null;\n }\n return p.key;\n}\n\n/**\n * {@link paintRuns}, reusing the previous result while the paints, the outline\n * threshold's effect, and the glyphs available are what they were. `laid` must\n * be the layout of `runs`, as for `paintRuns`.\n *\n * **The result is shared and must be treated as immutable.** `use` is as for\n * `cachedLayoutRuns`: a `'read'` painting's quads go back to the pool with its\n * layout.\n */\nexport function cachedPaintRuns(\n laid: LaidOutRuns,\n runs: readonly ResolvedRun[],\n opts: PaintRunsOpts = {},\n use: CacheUse = 'keep',\n): PaintedRuns {\n const generation = glyphGeneration();\n const min = opts.outlineMinSize;\n const mine = entryOf(runs);\n const stamp = stampOf(laid);\n const own = mine !== undefined && mine.paintedOn === laid && mine.paintedStamp === stamp ? mine.painting : null;\n const mineHere = own !== null && own.generation === generation;\n if (mineHere && mine!.paintMin === min) return handOut(own, use);\n\n const bucket = outlineBucket(runs, min);\n if (mineHere && own.bucket === bucket) {\n mine!.paintMin = min;\n return handOut(own, use);\n }\n\n const list = listOf(laid);\n let p: Painting | null = null;\n if (list.length > 0) {\n const key = variantKey(runs, bucket);\n for (let i = 0; i < list.length; i++) {\n const held = list[i];\n if (held.bucket !== bucket || keyOf(held) !== key) continue;\n list.splice(i, 1);\n if (held.generation === generation) p = held;\n break;\n }\n p ??= painting(laid, runs, opts, generation, key, bucket);\n } else {\n p = painting(laid, runs, opts, generation, null, bucket);\n }\n if (list.length >= PAINT_CACHE_VARIANT_LIMIT) list.shift();\n list.push(p);\n const e = mine ?? entryFor(runs);\n if (e.painting !== null && e.painting !== p) settlePainting(e.painting, runs);\n e.paintedOn = laid; e.paintedStamp = stamp; e.painting = p; e.paintMin = min;\n return handOut(p, use);\n}\n\n/** Build `p`'s key now if it would be built from `runs`, which are about to\n * be refilled in place or painted elsewhere. */\nexport function settlePainting(p: Painting, runs: readonly ResolvedRun[]): void {\n if (p.runs === runs) keyOf(p);\n}\n\nfunction handOut(p: Painting, use: CacheUse): PaintedRuns {\n if (use === 'keep') p.pinned = true;\n return p.painted;\n}\n\n/** Drop every painting of `laid`, which no caller can reach any more, giving\n * those no caller kept, with their groups and quad arrays, to the next\n * paintings. */\nexport function recyclePaintings(laid: LaidOutRuns): void {\n const cols = laid.lines.length > 0 ? LineBox.columns(laid.lines[0]) : null;\n let list: Painting[] | undefined;\n if (cols !== null) {\n list = cols.paintings as Painting[];\n } else {\n list = shared.get(laid);\n if (list === undefined) return;\n shared.delete(laid);\n }\n for (let i = 0; i < list.length; i++) {\n const p = list[i];\n if (p.pinned) continue;\n const { groups } = p.painted;\n for (let k = 0; k < groups.length; k++) {\n const group = groups[k];\n if (group.quadData.length > 0) giveDoubles(group.quadData as number[]);\n group.quadData = NO_QUADS;\n giveGroup(group);\n }\n truncate(groups, 0);\n truncate(p.painted.decorations, 0);\n p.runs = null;\n p.key = null;\n if (spare.length < SPARE_MAX) spare.push(p);\n }\n truncate(list, 0);\n}\n","/**\n * Laid-out text, memoized. The one entry point every caller of `layoutRuns`\n * should reach for — the renderer's paint path, the silhouette measurement\n * behind picking, and caret hit-testing all answer from this.\n *\n * `layoutRuns` is the most expensive derivation in the kit — it walks every\n * codepoint, resolves a face per run, measures, wraps, aligns, and places\n * every glyph — and `drawText` ran it per text command per frame. Measured,\n * when it also built the draw groups: 2.0 ms/frame for 200 short labels, 9.3\n * for 1000, and 25.9 for 200 wrapped paragraphs.\n *\n * ### Two keys, tried in order\n *\n * **Array identity**, in a `WeakMap`, the same contract as the renderer's\n * `WeakMap<Path, Mesh>` — and for the same reason: it makes the entry\n * collectable with whatever owns the runs, and the lookup is a pointer\n * compare. `kit:text`'s memoized `paint` hands back a stable array per node,\n * so the renderer stays on this path.\n *\n * **Structure**, in a bounded list, for every caller that cannot. Measuring\n * a pose resolves its style and allocates a fresh `ResolvedRun[]` each call,\n * so an identity-keyed cache could never hold anything for it — and those\n * callers run on the drag path, once per pose change. The runs are hashed,\n * and a matching hash compared field by field with the runs that filled the\n * entry, which it holds. No key is built: a HUD readout whose text changes\n * every frame misses here every frame, and a string key was a string of\n * every label's text a frame for the collector. Those held runs are why a\n * run must not be mutated once laid out, the promise the identity key\n * already asks of its array.\n *\n * Under either, one entry per distinct `(maxWidth, alignWidth, lineHeight,\n * align, direction, bidi engine, shaper, tab size)`. Position is deliberately absent:\n * `layoutRuns` emits origin-relative geometry and `drawText` translates at\n * upload, so a text node dragged across the page keeps hitting the same entry.\n * So is everything that only changes what is drawn — a run's fill, stroke and\n * decorations, the outline threshold — which `cachedPaintRuns` keys on\n * instead. Two runs arrays that differ only there share one layout.\n *\n * ### What the keys cannot see\n *\n * The font set. A face landing changes metrics with no change to the runs, so\n * every lookup compares `faceGeneration()` — advanced by a registration, a\n * load, a fallback policy, and the dynamic atlas measuring a face again or\n * emptying its pages — and drops everything when it moves. A deferred bake\n * landing does not advance it: that fills in a glyph record the layout\n * already holds, and moves no pen. Polled rather than subscribed: a\n * module-load subscription is a cross-package side effect that makes importing\n * this package require the font package's whole surface.\n *\n * ### Bounds\n *\n * Variants per runs array are capped and evicted wholesale, matching\n * `outlineMeshCache`: the refill cost is one layout, and the bookkeeping would\n * cost more than the misses it avoids. The structural list cannot ride an\n * array's lifetime the way the `WeakMap` does, so it is a real LRU with a\n * hard entry count.\n *\n * ### Giving arrays back\n *\n * A layout's columns and its paintings' quads go back to a pool for the next\n * text of the same size once nothing can reach them: `dropRuns` has removed\n * every runs array filing it, the structural list has evicted it, and every\n * call handed it passed `'read'`. One `'keep'` handout pins it for good. That\n * is what lets a readout rewritten every frame, whose widget drops the runs it\n * replaces and whose renderer only reads, lay out into last frame's arrays.\n */\n\nimport { faceGeneration } from '@weasel-js/font';\nimport type { ResolvedRun } from '../runs/resolveRuns';\nimport { layoutBidi, layoutShaper, storeAlignWidth, type LayoutRunsOpts } from './layoutOpts';\nimport { truncate } from './arrayPool';\nimport { LineBox, type LayoutColumns } from './layoutColumns';\nimport { layoutRuns, type LaidOutRuns } from './layoutRuns';\nimport { recyclePaintings, settlePainting } from './paintCache';\nimport { _resetRunsEntriesForTests, dropEntry, emptyEntry, entryFor, entryOf, giveEntry, type RunsEntry } from './runsEntries';\nimport { DEFAULT_TAB_SIZE } from './tabStops';\n\n/** Distinct option combinations held for one runs array before the whole set\n * is dropped. Sized for \"a few views onto the same text\". */\nexport const LAYOUT_CACHE_VARIANT_LIMIT = 8;\n\n/** Layouts held against the structural key before the least recently used one\n * is dropped. Sized for \"every text node visible on a page, plus slack\". */\nexport const LAYOUT_CACHE_STRUCTURAL_LIMIT = 64;\n\n/** One option combination, defaults filled in, and the layout made with it. */\nexport interface Variant {\n maxWidth: number; alignWidth: number; lineHeight: number; align: LayoutRunsOpts['align'];\n justify: boolean; direction: NonNullable<LayoutRunsOpts['direction']>; tabSize: number;\n bidi: ReturnType<typeof layoutBidi>; shaper: ReturnType<typeof layoutShaper>; laid: LaidOutRuns;\n}\n\n/** A layout held against the content of the runs that made it. */\nexport interface Structural extends Variant {\n hash: number;\n runs: readonly ResolvedRun[];\n /** When it was last read, for the eviction. */\n used: number;\n}\n\nlet structural: Structural[] = [];\nlet structuralGeneration = -1;\nlet clock = 0;\n\n/** `a === b`, with NaN equal to itself, as the string key this replaced had it. */\nconst same = (a: number | undefined, b: number | undefined): boolean => a === b || (a !== a && b !== b);\n\nfunction matches(v: Variant, opts: LayoutRunsOpts, bidi: Variant['bidi']): boolean {\n return same(v.maxWidth, opts.maxWidth) && same(v.alignWidth, opts.alignWidth ?? opts.maxWidth)\n && same(v.lineHeight, opts.lineHeight) && v.align === opts.align\n && v.justify === (opts.justify === true || opts.align === 'justify')\n && v.direction === (opts.direction ?? 'auto') && same(v.tabSize, opts.tabSize ?? DEFAULT_TAB_SIZE)\n && v.bidi === bidi && v.shaper === layoutShaper(opts);\n}\n\n/** What a call means to do with the layout it is handed: `'keep'` may hold\n * it, or anything in it, for as long as it likes; `'read'` is done with it\n * before its next call into the text caches, and keeps nothing of it. */\nexport type CacheUse = 'keep' | 'read';\n\nconst columnsOf = (laid: LaidOutRuns): LayoutColumns | null =>\n (laid.lines.length > 0 ? LineBox.columns(laid.lines[0]) : null);\n\nfunction handOut(laid: LaidOutRuns, use: CacheUse): LaidOutRuns {\n if (use === 'keep') {\n const cols = columnsOf(laid);\n if (cols !== null) cols.pinned = true;\n }\n return laid;\n}\n\n/** Give `laid`'s arrays, and those of its paintings, back to the pool once\n * nothing can reach it: no runs array files it, the structural list has let\n * it go, and every caller handed it was only reading. */\nfunction release(laid: LaidOutRuns): void {\n const cols = columnsOf(laid);\n if (cols === null || cols.owners > 0 || cols.listed || cols.pinned) return;\n recyclePaintings(laid);\n cols.recycle();\n}\n\n/** Variants of runs arrays `dropRuns` forgot, for the next runs arrays to fill. */\nconst spareVariants: Variant[] = [];\nconst SPARE_MAX = 1024;\n\nfunction disown(vs: Variant[]): void {\n for (let i = 0; i < vs.length; i++) {\n const v = vs[i];\n const cols = columnsOf(v.laid);\n if (cols !== null) {\n cols.owners--;\n release(v.laid);\n }\n v.laid = NO_LAYOUT;\n if (spareVariants.length < SPARE_MAX) spareVariants.push(v);\n }\n truncate(vs, 0);\n}\n\nconst NO_LAYOUT: LaidOutRuns = { lines: [], bounds: { width: 0, height: 0 } };\n\n/** Set `v` to `opts` and `laid`, defaults filled in. */\nfunction fill<V extends Variant>(v: V, opts: LayoutRunsOpts, bidi: Variant['bidi'], laid: LaidOutRuns): V {\n v.maxWidth = opts.maxWidth; storeAlignWidth(v, opts); v.lineHeight = opts.lineHeight;\n v.align = opts.align; v.justify = opts.justify === true || opts.align === 'justify';\n v.direction = opts.direction ?? 'auto'; v.tabSize = opts.tabSize ?? DEFAULT_TAB_SIZE; v.bidi = bidi;\n v.shaper = layoutShaper(opts); v.laid = laid;\n return v;\n}\n\nfunction variant(opts: LayoutRunsOpts, bidi: Variant['bidi'], laid: LaidOutRuns): Variant {\n const spare = spareVariants.pop();\n if (spare !== undefined) return fill(spare, opts, bidi, laid);\n const v: Variant = {\n maxWidth: opts.maxWidth, alignWidth: opts.maxWidth, lineHeight: opts.lineHeight,\n align: opts.align, justify: opts.justify === true || opts.align === 'justify',\n direction: opts.direction ?? 'auto', tabSize: opts.tabSize ?? DEFAULT_TAB_SIZE, bidi,\n shaper: layoutShaper(opts), laid,\n };\n storeAlignWidth(v, opts);\n return v;\n}\n\nfunction mix(h: number, n: number): number {\n return Math.imul(h ^ n, 0x01000193);\n}\n\nfunction mixNum(h: number, x: number): number {\n return mix(h, x === (x | 0) ? x : Math.round(x * 4096));\n}\n\nfunction mixStr(h: number, s: string): number {\n h = mix(h, s.length);\n for (let i = 0; i < s.length; i++) h = mix(h, s.charCodeAt(i));\n return h;\n}\n\n/** A hash of everything about `runs` that changes the layout: what\n * {@link sameRuns} compares. Built without allocating, so a miss costs a walk\n * of the text and nothing for the collector. */\nfunction runsHash(runs: readonly ResolvedRun[]): number {\n let h = mix(0x811c9dc5, runs.length);\n for (let i = 0; i < runs.length; i++) {\n const r = runs[i];\n h = mixStr(h, r.text);\n h = mixStr(h, r.fontFamily);\n h = mixNum(h, r.fontSize);\n h = mixNum(h, r.fontWeight);\n h = mix(h, r.fontStyle === 'italic' ? 1 : 0);\n h = mixNum(h, r.letterSpacing);\n h = mixNum(h, r.baselineShift);\n h = mixNum(h, r.rotate ?? 0);\n h = mixNum(h, r.strutSize ?? -1);\n h = mix(h, r.fontFeatures?.length ?? 0);\n h = mixStr(h, r.lang ?? '');\n }\n // Cut to 30 bits, which V8 holds unboxed; a wider int32 was a heap number a layout.\n return h & 0x3fffffff;\n}\n\nfunction sameNums(a: readonly number[] | undefined, b: readonly number[] | undefined): boolean {\n if (a === b) return true;\n if (a === undefined || b === undefined || a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (!same(a[i], b[i])) return false;\n return true;\n}\n\nfunction sameStrs(a: readonly string[] | undefined, b: readonly string[] | undefined): boolean {\n if (a === b) return true;\n if ((a?.length ?? 0) !== (b?.length ?? 0)) return false;\n for (let i = 0; i < (a?.length ?? 0); i++) if (a![i] !== b![i]) return false;\n return true;\n}\n\n/** Whether `a` and `b` lay out alike. A run's paint and decorations are left\n * out; `cachedPaintRuns` keys on those. */\nfunction sameRuns(a: readonly ResolvedRun[], b: readonly ResolvedRun[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n const x = a[i], y = b[i];\n if (x === y) continue;\n if (x.text !== y.text || x.fontFamily !== y.fontFamily || !same(x.fontSize, y.fontSize)\n || !same(x.fontWeight, y.fontWeight) || x.fontStyle !== y.fontStyle\n || !same(x.letterSpacing, y.letterSpacing) || !same(x.baselineShift, y.baselineShift)\n || !same(x.strutSize, y.strutSize) || !same(x.rotate ?? 0, y.rotate ?? 0) || !sameNums(x.sizeMap, y.sizeMap)\n || !sameStrs(x.fontFeatures, y.fontFeatures) || x.lang !== y.lang) return false;\n // Ends follow from starts and the length, so the two pin the cells.\n const sx = x.srcMap, sy = y.srcMap;\n if (sx !== sy && (sx === undefined || sy === undefined || sx.length !== sy.length\n || !sameNums(sx.starts, sy.starts))) return false;\n }\n return true;\n}\n\n/**\n * Lay `runs` out, reusing the previous result when nothing it depends on has\n * changed. Drop-in for `layoutRuns` — same arguments, same return value.\n *\n * **The result is shared and must be treated as immutable.** `drawText`\n * applies position and `verticalAlign` while packing vertices rather than by\n * shifting the layout, precisely so it can be handed the same object every\n * frame.\n *\n * `use` is `'read'` for a caller done with the result before its next call\n * into these caches, keeping nothing of it, which lets the cache recycle the\n * layout's arrays later; see \"Giving arrays back\".\n */\nexport function cachedLayoutRuns(\n runs: readonly ResolvedRun[],\n opts: LayoutRunsOpts,\n use: CacheUse = 'keep',\n): LaidOutRuns {\n const fonts = faceGeneration();\n const bidi = layoutBidi(opts);\n const entry = entryFor(runs);\n if (entry.generation !== fonts) {\n entry.generation = fonts;\n disown(entry.variants);\n } else {\n const vs = entry.variants;\n for (let i = 0; i < vs.length; i++) {\n const v = vs[i];\n if (!matches(v, opts, bidi)) continue;\n for (let k = i; k > 0; k--) vs[k] = vs[k - 1];\n vs[0] = v;\n return handOut(v.laid, use);\n }\n }\n\n const laid = structuralLayout(runs, opts, bidi, fonts, entry);\n const vs = entry.variants;\n if (vs.length >= LAYOUT_CACHE_VARIANT_LIMIT) disown(vs);\n vs.unshift(variant(opts, bidi, laid));\n const cols = columnsOf(laid);\n if (cols !== null) cols.owners++;\n return handOut(laid, use);\n}\n\n/**\n * Forget what the caches hold for `runs`, which its caller will not lay out\n * again: a readout replacing its text drops the runs it drew last. A layout no\n * other runs array or caller can reach gives its arrays to the next layout of\n * the same size, so text rewritten every frame stops allocating them.\n *\n * Passing `runs` again afterwards is only a cache miss.\n */\nexport function dropRuns(runs: readonly ResolvedRun[]): void {\n const entry = dropEntry(runs);\n if (entry === undefined) return;\n disown(entry.variants);\n giveEntry(entry);\n}\n\nfunction structuralLayout(\n runs: readonly ResolvedRun[], opts: LayoutRunsOpts, bidi: Variant['bidi'], fonts: number, entry: RunsEntry,\n): LaidOutRuns {\n if (structuralGeneration !== fonts) {\n for (const s of structural) { unlist(s); s.runs = NO_RUNS; }\n structural = [];\n structuralGeneration = fonts;\n }\n const hash = runsHash(runs);\n let oldest = 0;\n for (let i = 0; i < structural.length; i++) {\n const s = structural[i];\n if (s.hash === hash && matches(s, opts, bidi) && sameRuns(s.runs, runs)) {\n s.used = ++clock;\n return s.laid;\n }\n if (s.used < structural[oldest].used) oldest = i;\n }\n // Evicted before laying out, so the new layout can take its arrays.\n const full = structural.length >= LAYOUT_CACHE_STRUCTURAL_LIMIT;\n if (full) unlist(structural[oldest]);\n const laid = layoutRuns(runs, opts);\n // The evicted entry is refilled in place.\n const filled = full ? fill(structural[oldest], opts, bidi, laid) : structuralEntry(opts, bidi, laid);\n filled.hash = hash; filled.runs = runs; filled.used = ++clock;\n entry.listed = filled;\n const cols = columnsOf(laid);\n if (cols !== null) cols.listed = true;\n if (!full) structural.push(filled);\n return laid;\n}\n\n/**\n * Forget what the caches hold for `runs`, which its caller is about to refill\n * in place, leaving the array filed: unlike {@link dropRuns}, the next call\n * with it costs no `WeakMap` set. A readout rewriting its text every frame\n * refills one runs array this way, so the command it hands the renderer\n * stays the same object.\n *\n * Call it before the first write to `runs` or any run in it: the structural\n * list compares later runs with these, and a painting may still have to build\n * its key from them.\n */\nexport function clearRuns(runs: readonly ResolvedRun[]): void {\n const entry = entryOf(runs);\n if (entry === undefined) return;\n const s = entry.listed;\n if (s !== null && s.runs === runs) {\n // Left in the list unmatchable and oldest, for the next layout to refill.\n unlist(s);\n s.laid = NO_LAYOUT; s.runs = NO_RUNS; s.hash = -1; s.used = 0;\n }\n const p = entry.painting;\n disown(entry.variants);\n // After the layouts went back: a painting that went with them needs no key.\n if (p !== null) settlePainting(p, runs);\n emptyEntry(entry);\n}\n\nconst NO_RUNS: readonly ResolvedRun[] = [];\n\nfunction structuralEntry(opts: LayoutRunsOpts, bidi: Variant['bidi'], laid: LaidOutRuns): Structural {\n return fill({\n maxWidth: 0, alignWidth: 0, lineHeight: 0, align: 'left', justify: false, direction: 'auto', tabSize: 0,\n bidi: null, shaper: null, laid, hash: 0, runs: [], used: 0,\n }, opts, bidi, laid);\n}\n\nfunction unlist(s: Structural): void {\n const cols = columnsOf(s.laid);\n if (cols === null) return;\n cols.listed = false;\n release(s.laid);\n}\n\n/** Test helper. Do not call from product code. */\nexport function _resetLayoutCacheForTests(): void {\n _resetRunsEntriesForTests();\n structural = [];\n structuralGeneration = -1;\n clock = 0;\n}\n"]}
|