@vibecook/ghosttea-react 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +10 -0
  2. package/THIRD_PARTY_NOTICES.md +62 -0
  3. package/dist/appearance/AdvancedConfigSettings.d.ts +12 -0
  4. package/dist/appearance/AdvancedConfigSettings.d.ts.map +1 -0
  5. package/dist/appearance/AdvancedConfigSettings.js +362 -0
  6. package/dist/appearance/AdvancedConfigSettings.js.map +1 -0
  7. package/dist/appearance/AppearanceSettings.d.ts +21 -0
  8. package/dist/appearance/AppearanceSettings.d.ts.map +1 -0
  9. package/dist/appearance/AppearanceSettings.js +175 -0
  10. package/dist/appearance/AppearanceSettings.js.map +1 -0
  11. package/dist/appearance/catalog.d.ts +39 -0
  12. package/dist/appearance/catalog.d.ts.map +1 -0
  13. package/dist/appearance/catalog.js +56 -0
  14. package/dist/appearance/catalog.js.map +1 -0
  15. package/dist/appearance/config-draft.d.ts +35 -0
  16. package/dist/appearance/config-draft.d.ts.map +1 -0
  17. package/dist/appearance/config-draft.js +289 -0
  18. package/dist/appearance/config-draft.js.map +1 -0
  19. package/dist/appearance/shaders.d.ts +14 -0
  20. package/dist/appearance/shaders.d.ts.map +1 -0
  21. package/dist/appearance/shaders.js +71 -0
  22. package/dist/appearance/shaders.js.map +1 -0
  23. package/dist/appearance/theme-catalog.generated.json +16260 -0
  24. package/dist/appearance/types.d.ts +61 -0
  25. package/dist/appearance/types.d.ts.map +1 -0
  26. package/dist/appearance/types.js +2 -0
  27. package/dist/appearance/types.js.map +1 -0
  28. package/dist/config.d.ts.map +1 -1
  29. package/dist/config.js +23 -4
  30. package/dist/config.js.map +1 -1
  31. package/dist/index.d.ts +1 -1
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +1 -1
  34. package/dist/index.js.map +1 -1
  35. package/dist/renderers/canvas-renderer.d.ts.map +1 -1
  36. package/dist/renderers/canvas-renderer.js +9 -1
  37. package/dist/renderers/canvas-renderer.js.map +1 -1
  38. package/dist/renderers/shader-effects.d.ts +2 -0
  39. package/dist/renderers/shader-effects.d.ts.map +1 -0
  40. package/dist/renderers/shader-effects.js +206 -0
  41. package/dist/renderers/shader-effects.js.map +1 -0
  42. package/dist/renderers/types.d.ts +7 -0
  43. package/dist/renderers/types.d.ts.map +1 -1
  44. package/dist/renderers/types.js +11 -0
  45. package/dist/renderers/types.js.map +1 -1
  46. package/dist/renderers/webgpu-renderer.d.ts +2 -1
  47. package/dist/renderers/webgpu-renderer.d.ts.map +1 -1
  48. package/dist/renderers/webgpu-renderer.js +250 -159
  49. package/dist/renderers/webgpu-renderer.js.map +1 -1
  50. package/dist/terminal-render.worker.js +479 -165
  51. package/dist/terminal-render.worker.js.map +3 -3
  52. package/dist/workspace/Workspace.d.ts +7 -2
  53. package/dist/workspace/Workspace.d.ts.map +1 -1
  54. package/dist/workspace/Workspace.js +15 -7
  55. package/dist/workspace/Workspace.js.map +1 -1
  56. package/dist/workspace/index.d.ts +3 -0
  57. package/dist/workspace/index.d.ts.map +1 -1
  58. package/dist/workspace/index.js +2 -0
  59. package/dist/workspace/index.js.map +1 -1
  60. package/dist/workspace/themes.d.ts +4 -0
  61. package/dist/workspace/themes.d.ts.map +1 -1
  62. package/dist/workspace/themes.js +4 -0
  63. package/dist/workspace/themes.js.map +1 -1
  64. package/dist/workspace.css +1122 -5
  65. package/package.json +6 -5
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../ghosttea-frame/src/index.ts", "../src/performance.ts", "../src/renderers/types.ts", "../src/renderers/canvas-renderer.ts", "../src/cell-width.ts", "../src/renderers/render-damage.ts", "../src/renderers/webgpu-renderer.ts", "../src/frame-sequence.ts", "../src/cursor-invalidation.ts", "../src/catalog-budget.ts", "../src/terminal-render.worker.ts"],
4
- "sourcesContent": ["export const FRAME_MAGIC = 0x31465254;\nexport const FRAME_PROTOCOL_VERSION = 1;\nexport const FRAME_HEADER_BYTES = 64;\nexport const SECTION_HEADER_BYTES = 16;\nexport const MAX_FRAME_BYTES = 16 * 1024 * 1024;\nexport const FrameFlag = {\n FullSnapshot: 1 << 0,\n MouseTracking: 1 << 1,\n CatalogReset: 1 << 2,\n} as const;\n\nexport enum SectionKind {\n GlyphDefinitions = 1,\n StyleDefinitions = 2,\n RowReplacements = 3,\n CursorState = 4,\n SelectionSpans = 5,\n ImageDefinitions = 6,\n ImagePlacements = 7,\n ScrollbarState = 8,\n ViewportMetadata = 9,\n AccessibilityText = 10,\n ClipboardWrite = 11,\n}\n\nexport interface FrameSection {\n kind: SectionKind;\n flags: number;\n itemCount: number;\n bytes: Uint8Array;\n}\n\nexport interface TerminalFrame {\n protocolVersion: number;\n flags: number;\n sessionHandle: bigint;\n viewHandle: bigint;\n sessionEpoch: bigint;\n layoutEpoch: bigint;\n frameSequence: bigint;\n terminalRevision: bigint;\n cols: number;\n rows: number;\n sections: FrameSection[];\n}\n\nexport interface TextRow {\n row: number;\n text: string;\n}\n\nexport interface RowReplacement extends TextRow {\n revision: bigint;\n glyphs: GlyphInstance[];\n styles: StyleRun[];\n}\n\nexport enum GlyphFormat {\n Alpha8 = 0,\n Rgba8Premultiplied = 1,\n}\n\nexport interface GlyphDefinition {\n id: number;\n width: number;\n height: number;\n bearingX: number;\n bearingY: number;\n format: GlyphFormat;\n pixels: Uint8Array;\n}\n\nexport interface GlyphInstance {\n glyphId: number;\n styleId: number;\n x: number;\n y: number;\n width: number;\n height: number;\n cellStart: number;\n cellSpan: number;\n}\n\nexport interface StyleDefinition {\n id: number;\n bold: boolean;\n italic: boolean;\n faint: boolean;\n inverse: boolean;\n invisible: boolean;\n strikethrough: boolean;\n underline: boolean;\n foreground?: readonly [number, number, number];\n background?: readonly [number, number, number];\n}\n\nexport interface StyleRun {\n styleId: number;\n cellStart: number;\n cellSpan: number;\n}\n\nexport interface CursorState {\n x: number;\n y: number;\n visible: boolean;\n style: CursorStyle;\n blinking: boolean;\n}\n\nexport interface ScrollbarState {\n total: bigint;\n offset: bigint;\n length: bigint;\n}\n\nexport enum CursorStyle {\n Bar = 0,\n Block = 1,\n Underline = 2,\n HollowBlock = 3,\n}\n\nfunction assertRange(condition: boolean, message: string): asserts condition {\n if (!condition) throw new RangeError(`Invalid terminal frame: ${message}`);\n}\n\nexport function decodeFrame(buffer: ArrayBuffer): TerminalFrame {\n assertRange(buffer.byteLength >= FRAME_HEADER_BYTES, \"truncated header\");\n assertRange(buffer.byteLength <= MAX_FRAME_BYTES, \"packet exceeds limit\");\n const view = new DataView(buffer);\n assertRange(view.getUint32(0, true) === FRAME_MAGIC, \"bad magic\");\n assertRange(view.getUint16(4, true) === FRAME_PROTOCOL_VERSION, \"unsupported protocol version\");\n\n const sectionCount = view.getUint16(60, true);\n const tableEnd = FRAME_HEADER_BYTES + sectionCount * SECTION_HEADER_BYTES;\n assertRange(tableEnd <= buffer.byteLength, \"truncated section table\");\n\n const sections: FrameSection[] = [];\n for (let index = 0; index < sectionCount; index += 1) {\n const base = FRAME_HEADER_BYTES + index * SECTION_HEADER_BYTES;\n const kind = view.getUint16(base, true) as SectionKind;\n const flags = view.getUint16(base + 2, true);\n const offset = view.getUint32(base + 4, true);\n const length = view.getUint32(base + 8, true);\n const itemCount = view.getUint32(base + 12, true);\n const end = offset + length;\n assertRange(end >= offset && offset >= tableEnd && end <= buffer.byteLength, \"section out of bounds\");\n sections.push({ kind, flags, itemCount, bytes: new Uint8Array(buffer, offset, length) });\n }\n\n return {\n protocolVersion: view.getUint16(4, true),\n flags: view.getUint16(6, true),\n sessionHandle: view.getBigUint64(8, true),\n viewHandle: view.getBigUint64(16, true),\n sessionEpoch: view.getBigUint64(24, true),\n layoutEpoch: view.getBigUint64(32, true),\n frameSequence: view.getBigUint64(40, true),\n terminalRevision: view.getBigUint64(48, true),\n cols: view.getUint16(56, true),\n rows: view.getUint16(58, true),\n sections,\n };\n}\n\nexport function decodeAccessibilityRows(section: FrameSection): TextRow[] {\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n assertRange(section.bytes.byteLength >= 2, \"truncated text row header\");\n const count = view.getUint16(0, true);\n assertRange(count === section.itemCount, \"text row count mismatch\");\n const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n const rows: TextRow[] = [];\n let offset = 2;\n for (let index = 0; index < count; index += 1) {\n assertRange(offset + 6 <= section.bytes.byteLength, \"truncated text row\");\n const row = view.getUint16(offset, true);\n const length = view.getUint32(offset + 2, true);\n offset += 6;\n assertRange(offset + length <= section.bytes.byteLength, \"text row payload out of bounds\");\n rows.push({ row, text: decoder.decode(section.bytes.subarray(offset, offset + length)) });\n offset += length;\n }\n assertRange(offset === section.bytes.byteLength, \"trailing text row bytes\");\n return rows;\n}\n\nexport function decodeRowReplacements(section: FrameSection): RowReplacement[] {\n assertRange(section.kind === SectionKind.RowReplacements, \"wrong row replacement section kind\");\n assertRange(section.bytes.byteLength >= 2, \"truncated row replacement header\");\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n const count = view.getUint16(0, true);\n assertRange(count === section.itemCount, \"row replacement count mismatch\");\n const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n const rows: RowReplacement[] = [];\n let offset = 2;\n for (let index = 0; index < count; index += 1) {\n assertRange(offset + 18 <= section.bytes.byteLength, \"truncated row replacement\");\n const row = view.getUint16(offset, true);\n const revision = view.getBigUint64(offset + 2, true);\n const length = view.getUint32(offset + 10, true);\n const glyphCount = view.getUint16(offset + 14, true);\n const styleCount = view.getUint16(offset + 16, true);\n offset += 18;\n assertRange(offset + length <= section.bytes.byteLength, \"row replacement payload out of bounds\");\n const text = decoder.decode(section.bytes.subarray(offset, offset + length));\n offset += length;\n const glyphs: GlyphInstance[] = [];\n for (let glyphIndex = 0; glyphIndex < glyphCount; glyphIndex += 1) {\n assertRange(offset + 28 <= section.bytes.byteLength, \"truncated glyph instance\");\n glyphs.push({\n glyphId: view.getUint32(offset, true),\n styleId: view.getUint32(offset + 4, true),\n x: view.getFloat32(offset + 8, true),\n y: view.getFloat32(offset + 12, true),\n width: view.getFloat32(offset + 16, true),\n height: view.getFloat32(offset + 20, true),\n cellStart: view.getUint16(offset + 24, true),\n cellSpan: view.getUint16(offset + 26, true),\n });\n offset += 28;\n }\n const styles: StyleRun[] = [];\n for (let styleIndex = 0; styleIndex < styleCount; styleIndex += 1) {\n assertRange(offset + 8 <= section.bytes.byteLength, \"truncated row style run\");\n styles.push({\n styleId: view.getUint32(offset, true),\n cellStart: view.getUint16(offset + 4, true),\n cellSpan: view.getUint16(offset + 6, true),\n });\n offset += 8;\n }\n rows.push({ row, revision, text, glyphs, styles });\n }\n assertRange(offset === section.bytes.byteLength, \"trailing row replacement bytes\");\n return rows;\n}\n\nexport function decodeGlyphDefinitions(section: FrameSection): GlyphDefinition[] {\n assertRange(section.kind === SectionKind.GlyphDefinitions, \"wrong glyph definition section kind\");\n assertRange(section.bytes.byteLength >= 4, \"truncated glyph definition header\");\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n const count = view.getUint32(0, true);\n assertRange(count === section.itemCount, \"glyph definition count mismatch\");\n const definitions: GlyphDefinition[] = [];\n let offset = 4;\n for (let index = 0; index < count; index += 1) {\n assertRange(offset + 20 <= section.bytes.byteLength, \"truncated glyph definition\");\n const format = view.getUint8(offset + 12) as GlyphFormat;\n assertRange(format === GlyphFormat.Alpha8 || format === GlyphFormat.Rgba8Premultiplied, \"invalid glyph format\");\n assertRange(\n view.getUint8(offset + 13) === 0 && view.getUint16(offset + 14, true) === 0,\n \"nonzero glyph reserved bytes\",\n );\n const pixelLength = view.getUint32(offset + 16, true);\n const width = view.getUint16(offset + 4, true);\n const height = view.getUint16(offset + 6, true);\n const expectedLength = width * height * (format === GlyphFormat.Alpha8 ? 1 : 4);\n assertRange(pixelLength === expectedLength, \"glyph pixel length mismatch\");\n offset += 20;\n assertRange(offset + pixelLength <= section.bytes.byteLength, \"glyph pixels out of bounds\");\n definitions.push({\n id: view.getUint32(offset - 20, true),\n width,\n height,\n bearingX: view.getInt16(offset - 12, true),\n bearingY: view.getInt16(offset - 10, true),\n format,\n pixels: section.bytes.slice(offset, offset + pixelLength),\n });\n offset += pixelLength;\n }\n assertRange(offset === section.bytes.byteLength, \"trailing glyph definition bytes\");\n return definitions;\n}\n\nexport function decodeStyleDefinitions(section: FrameSection): StyleDefinition[] {\n assertRange(section.kind === SectionKind.StyleDefinitions, \"wrong style definition section kind\");\n assertRange(section.bytes.byteLength >= 4, \"truncated style definition header\");\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n const count = view.getUint32(0, true);\n assertRange(count === section.itemCount, \"style definition count mismatch\");\n assertRange(section.bytes.byteLength === 4 + count * 16, \"invalid style definition length\");\n const styles: StyleDefinition[] = [];\n for (let index = 0; index < count; index += 1) {\n const offset = 4 + index * 16;\n const flags = view.getUint16(offset + 4, true);\n const foregroundKind = view.getUint8(offset + 6);\n const backgroundKind = view.getUint8(offset + 7);\n assertRange((flags & ~0x7f) === 0, \"invalid style flags\");\n assertRange(foregroundKind <= 1 && backgroundKind <= 1, \"invalid style color kind\");\n assertRange(view.getUint16(offset + 14, true) === 0, \"nonzero style reserved bytes\");\n styles.push({\n id: view.getUint32(offset, true),\n bold: (flags & 1) !== 0,\n italic: (flags & 2) !== 0,\n faint: (flags & 4) !== 0,\n inverse: (flags & 8) !== 0,\n invisible: (flags & 16) !== 0,\n strikethrough: (flags & 32) !== 0,\n underline: (flags & 64) !== 0,\n ...(foregroundKind === 1\n ? { foreground: [view.getUint8(offset + 8), view.getUint8(offset + 9), view.getUint8(offset + 10)] as const }\n : {}),\n ...(backgroundKind === 1\n ? { background: [view.getUint8(offset + 11), view.getUint8(offset + 12), view.getUint8(offset + 13)] as const }\n : {}),\n });\n }\n return styles;\n}\n\nexport function decodeCursorState(section: FrameSection): CursorState {\n assertRange(section.kind === SectionKind.CursorState, \"wrong cursor section kind\");\n assertRange(section.itemCount === 1, \"cursor item count mismatch\");\n assertRange(section.bytes.byteLength === 8, \"invalid cursor payload length\");\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n const visible = view.getUint8(4);\n const style = view.getUint8(5) as CursorStyle;\n const blinking = view.getUint8(6);\n assertRange(visible <= 1, \"invalid cursor visibility\");\n assertRange(style <= CursorStyle.HollowBlock, \"invalid cursor style\");\n assertRange(blinking <= 1, \"invalid cursor blinking state\");\n assertRange(view.getUint8(7) === 0, \"nonzero cursor reserved byte\");\n return {\n x: view.getUint16(0, true),\n y: view.getUint16(2, true),\n visible: visible === 1,\n style,\n blinking: blinking === 1,\n };\n}\n\nexport function decodeScrollbarState(section: FrameSection): ScrollbarState {\n assertRange(section.kind === SectionKind.ScrollbarState, \"wrong scrollbar section kind\");\n assertRange(section.itemCount === 1, \"scrollbar item count mismatch\");\n assertRange(section.bytes.byteLength === 24, \"invalid scrollbar payload size\");\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n const total = view.getBigUint64(0, true);\n const offset = view.getBigUint64(8, true);\n const length = view.getBigUint64(16, true);\n assertRange(length <= total, \"scrollbar viewport exceeds total rows\");\n assertRange(offset <= total - length, \"scrollbar offset exceeds scrollable range\");\n return { total, offset, length };\n}\n\nexport function decodeClipboardWrite(section: FrameSection): string {\n assertRange(section.kind === SectionKind.ClipboardWrite, \"wrong clipboard section kind\");\n assertRange(section.itemCount === 1, \"clipboard item count mismatch\");\n assertRange(section.bytes.byteLength >= 4, \"truncated clipboard payload\");\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n const length = view.getUint32(0, true);\n assertRange(length === section.bytes.byteLength - 4, \"clipboard length mismatch\");\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(section.bytes.subarray(4));\n}\n", "export interface TerminalRenderMetrics {\n queueSubmits: number;\n fullRenders: number;\n partialRenders: number;\n damagedRows: number;\n geometryCacheHits: number;\n geometryCacheMisses: number;\n canvasPixels: number;\n renderPasses: number;\n drawCalls: number;\n rectangleVertices: number;\n monoGlyphVertices: number;\n colorGlyphVertices: number;\n fallbackGlyphVertices: number;\n vertexUploadBytes: number;\n atlasUploadBytes: number;\n atlasUploadCalls: number;\n}\n\nexport interface TerminalRenderPerformanceSnapshot {\n backend: string;\n durationMs: number;\n timedOutWaitingForIdle: boolean;\n gpuQueueDrainMs: number | null;\n frames: {\n received: number;\n bytes: number;\n full: number;\n incremental: number;\n stale: number;\n resyncRequested: number;\n rowsDecoded: number;\n glyphDefinitions: number;\n };\n scheduling: {\n flushes: number;\n renderCalls: number;\n maximumDirtyPanes: number;\n panesPerFlush: number[];\n };\n renderer: {\n queueSubmits: number;\n fullRenders: number;\n partialRenders: number;\n damagedRows: number;\n geometryCacheHits: number;\n geometryCacheMisses: number;\n canvasPixelFrames: number;\n renderPasses: number;\n drawCalls: number;\n rectangleVertices: number;\n monoGlyphVertices: number;\n colorGlyphVertices: number;\n fallbackGlyphVertices: number;\n vertexUploadBytes: number;\n atlasUploadBytes: number;\n atlasUploadCalls: number;\n };\n samples: {\n frameApplyMs: number[];\n renderCpuMs: number[];\n dirtyToRenderMs: number[];\n frameArrivalToRenderMs: number[];\n };\n}\n\nexport function emptyRenderMetrics(): TerminalRenderMetrics {\n return {\n queueSubmits: 0,\n fullRenders: 0,\n partialRenders: 0,\n damagedRows: 0,\n geometryCacheHits: 0,\n geometryCacheMisses: 0,\n canvasPixels: 0,\n renderPasses: 0,\n drawCalls: 0,\n rectangleVertices: 0,\n monoGlyphVertices: 0,\n colorGlyphVertices: 0,\n fallbackGlyphVertices: 0,\n vertexUploadBytes: 0,\n atlasUploadBytes: 0,\n atlasUploadCalls: 0,\n };\n}\n", "import {\n CursorStyle,\n type CursorState,\n type GlyphDefinition,\n type GlyphInstance,\n type StyleDefinition,\n type StyleRun,\n} from \"@vibecook/ghosttea-frame\";\nimport type { TerminalRenderMetrics } from \"../performance.js\";\n\nexport type Rgba = readonly [number, number, number, number];\n\nexport interface TerminalTheme {\n background: Rgba;\n foreground: Rgba;\n cursor: Rgba;\n selection: Rgba;\n selectionForeground: Rgba;\n}\n\nexport type TerminalPostProcess = \"none\" | \"better-crt\";\n\nexport interface TerminalEffects {\n postProcess: TerminalPostProcess;\n}\n\nexport interface CellPoint {\n column: number;\n row: number;\n}\n\nexport interface CellSelection {\n anchor: CellPoint;\n focus: CellPoint;\n}\n\nexport interface RenderView {\n rows: string[];\n nativeRows: GlyphInstance[][];\n nativeStyleRows: StyleRun[][];\n rowRevisions: readonly bigint[];\n glyphDefinitions: Map<number, GlyphDefinition>;\n styleDefinitions: Map<number, StyleDefinition>;\n sessionEpoch: bigint;\n layoutEpoch: bigint;\n cursor: CursorState;\n focused: boolean;\n cursorBlinkVisible: boolean;\n selection: CellSelection | null;\n theme: TerminalTheme;\n effects?: TerminalEffects;\n damage?: RenderDamage;\n}\n\nexport interface RenderDamage {\n full: boolean;\n rows: ReadonlySet<number>;\n geometryChanged: boolean;\n}\n\nexport function effectiveCursorStyle(view: RenderView): CursorStyle | null {\n if (!view.cursor.visible) return null;\n if (!view.focused) return CursorStyle.HollowBlock;\n if (view.cursor.blinking && !view.cursorBlinkVisible) return null;\n return view.cursor.style;\n}\n\nexport interface PixelSize {\n width: number;\n height: number;\n dpr: number;\n}\n\nfunction physicalPixels(value: number, dpr: number): number {\n return Math.max(1, Math.round(value * dpr));\n}\n\nexport function renderedSizeChanged(current: PixelSize, next: PixelSize): boolean {\n return (\n current.dpr !== next.dpr ||\n physicalPixels(current.width, current.dpr) !== physicalPixels(next.width, next.dpr) ||\n physicalPixels(current.height, current.dpr) !== physicalPixels(next.height, next.dpr)\n );\n}\n\nexport interface TerminalRenderer {\n readonly kind: \"webgpu\" | \"canvas2d\";\n mount(id: string, canvas: OffscreenCanvas): void;\n unmount(id: string): void;\n resize(id: string, size: PixelSize): void;\n render(id: string, view: RenderView): TerminalRenderMetrics | undefined;\n renderBatch?(entries: ReadonlyArray<{ id: string; view: RenderView }>): Array<TerminalRenderMetrics | undefined>;\n setPerformanceMeasurementEnabled?(enabled: boolean): void;\n settle?(): Promise<void>;\n}\n\nexport const DEFAULT_THEME: TerminalTheme = {\n background: [40 / 255, 44 / 255, 52 / 255, 1],\n foreground: [1, 1, 1, 1],\n cursor: [1, 1, 1, 1],\n selection: [1, 1, 1, 1],\n selectionForeground: [40 / 255, 44 / 255, 52 / 255, 1],\n};\n\nexport const DEFAULT_EFFECTS: TerminalEffects = {\n postProcess: \"none\",\n};\n\nexport const CELL_WIDTH = 7.83;\nexport const LINE_HEIGHT = 19;\n// Ghostty defaults window-padding-x/y to two device-independent points.\nexport const ORIGIN_X = 2;\nexport const ORIGIN_Y = 2;\n", "import { CursorStyle } from \"@vibecook/ghosttea-frame\";\nimport { emptyRenderMetrics, type TerminalRenderMetrics } from \"../performance.js\";\nimport {\n CELL_WIDTH,\n LINE_HEIGHT,\n ORIGIN_X,\n ORIGIN_Y,\n effectiveCursorStyle,\n renderedSizeChanged,\n type CellPoint,\n type PixelSize,\n type RenderView,\n type Rgba,\n type TerminalRenderer,\n} from \"./types.js\";\n\ninterface CanvasSurface extends PixelSize {\n canvas: OffscreenCanvas;\n context: OffscreenCanvasRenderingContext2D;\n}\n\nfunction css(color: Rgba): string {\n const [red, green, blue, alpha] = color;\n return `rgba(${Math.round(red * 255)}, ${Math.round(green * 255)}, ${Math.round(blue * 255)}, ${alpha})`;\n}\n\nfunction ordered(selection: RenderView[\"selection\"]): [CellPoint, CellPoint] | null {\n if (!selection) return null;\n const { anchor, focus } = selection;\n return anchor.row < focus.row || (anchor.row === focus.row && anchor.column <= focus.column)\n ? [anchor, focus]\n : [focus, anchor];\n}\n\nexport class CanvasTerminalRenderer implements TerminalRenderer {\n readonly kind = \"canvas2d\" as const;\n readonly #surfaces = new Map<string, CanvasSurface>();\n #performanceMeasurementEnabled = false;\n\n setPerformanceMeasurementEnabled(enabled: boolean): void {\n this.#performanceMeasurementEnabled = enabled;\n }\n\n mount(id: string, canvas: OffscreenCanvas): void {\n const context = canvas.getContext(\"2d\", { alpha: false });\n if (!context) throw new Error(\"Canvas2D worker backend unavailable\");\n this.#surfaces.set(id, { canvas, context, width: 1, height: 1, dpr: 1 });\n }\n\n unmount(id: string): void {\n this.#surfaces.delete(id);\n }\n\n resize(id: string, size: PixelSize): void {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n const changed = renderedSizeChanged(surface, size);\n Object.assign(surface, size);\n if (!changed) return;\n surface.canvas.width = Math.max(1, Math.round(size.width * size.dpr));\n surface.canvas.height = Math.max(1, Math.round(size.height * size.dpr));\n }\n\n render(id: string, view: RenderView): TerminalRenderMetrics | undefined {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n const { context, width, height, dpr } = surface;\n context.save();\n context.setTransform(dpr, 0, 0, dpr, 0, 0);\n context.fillStyle = css(view.theme.background);\n context.fillRect(0, 0, width, height);\n const selection = ordered(view.selection);\n if (selection) {\n context.fillStyle = css(view.theme.selection);\n const [start, end] = selection;\n for (let row = start.row; row <= end.row; row += 1) {\n const first = row === start.row ? start.column : 0;\n const last = row === end.row ? end.column : Math.max(0, view.rows[row]?.length ?? 0);\n context.fillRect(\n ORIGIN_X + first * CELL_WIDTH,\n ORIGIN_Y + row * LINE_HEIGHT,\n Math.max(1, last - first + 1) * CELL_WIDTH,\n LINE_HEIGHT,\n );\n }\n }\n context.font = \"13px ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\";\n context.textBaseline = \"top\";\n context.fillStyle = css(view.theme.foreground);\n for (let row = 0; row < view.rows.length; row += 1) {\n context.fillText(view.rows[row] ?? \"\", ORIGIN_X, ORIGIN_Y + row * LINE_HEIGHT);\n }\n if (selection) {\n const [start, end] = selection;\n context.fillStyle = css(view.theme.selectionForeground);\n for (let row = start.row; row <= end.row; row += 1) {\n const first = row === start.row ? start.column : 0;\n const last = row === end.row ? end.column : Math.max(0, view.rows[row]?.length ?? 0);\n context.save();\n context.beginPath();\n context.rect(\n ORIGIN_X + first * CELL_WIDTH,\n ORIGIN_Y + row * LINE_HEIGHT,\n Math.max(1, last - first + 1) * CELL_WIDTH,\n LINE_HEIGHT,\n );\n context.clip();\n context.fillText(view.rows[row] ?? \"\", ORIGIN_X, ORIGIN_Y + row * LINE_HEIGHT);\n context.restore();\n }\n }\n const cursorStyle = effectiveCursorStyle(view);\n if (cursorStyle !== null) {\n const x = ORIGIN_X + view.cursor.x * CELL_WIDTH;\n const y = ORIGIN_Y + view.cursor.y * LINE_HEIGHT;\n const color =\n cursorStyle === CursorStyle.HollowBlock\n ? ([view.theme.cursor[0], view.theme.cursor[1], view.theme.cursor[2], 1] as const)\n : view.theme.cursor;\n context.fillStyle = css(color);\n if (cursorStyle === CursorStyle.Bar) {\n context.fillRect(x, y, 2, LINE_HEIGHT);\n } else if (cursorStyle === CursorStyle.Underline) {\n context.fillRect(x, y + LINE_HEIGHT - 2, CELL_WIDTH, 2);\n } else if (cursorStyle === CursorStyle.HollowBlock) {\n context.strokeStyle = css(color);\n context.lineWidth = 1;\n context.strokeRect(x + 0.5, y + 0.5, CELL_WIDTH - 1, LINE_HEIGHT - 1);\n } else {\n context.fillRect(x, y, CELL_WIDTH, LINE_HEIGHT);\n }\n }\n context.restore();\n if (!this.#performanceMeasurementEnabled) return undefined;\n const metrics = emptyRenderMetrics();\n metrics.fullRenders = 1;\n metrics.damagedRows = Math.max(view.rows.length, view.nativeRows.length, view.nativeStyleRows.length);\n metrics.canvasPixels = surface.canvas.width * surface.canvas.height;\n metrics.renderPasses = 1;\n metrics.drawCalls = 1;\n return metrics;\n }\n}\n", "const graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\nexport function splitGraphemes(text: string): string[] {\n return Array.from(graphemeSegmenter.segment(text), ({ segment }) => segment);\n}\n\nexport function graphemeCellWidth(grapheme: string): 1 | 2 {\n const codepoint = grapheme.codePointAt(0) ?? 0;\n return /\\p{Extended_Pictographic}/u.test(grapheme) ||\n (codepoint >= 0x1100 && codepoint <= 0x115f) ||\n (codepoint >= 0x2e80 && codepoint <= 0xa4cf) ||\n (codepoint >= 0xac00 && codepoint <= 0xd7a3) ||\n (codepoint >= 0xf900 && codepoint <= 0xfaff) ||\n (codepoint >= 0xfe10 && codepoint <= 0xfe6f) ||\n (codepoint >= 0xff00 && codepoint <= 0xff60) ||\n (codepoint >= 0x1f300 && codepoint <= 0x1faff) ||\n (codepoint >= 0x20000 && codepoint <= 0x3fffd)\n ? 2\n : 1;\n}\n", "import type { RenderDamage } from \"./types.js\";\n\nexport interface RenderRows {\n full: boolean;\n rows: number[];\n}\n\nexport function rowsForDamage(rowCount: number, damage: RenderDamage | undefined, sceneValid: boolean): RenderRows {\n const full = !sceneValid || !damage || damage.full;\n if (full) return { full: true, rows: Array.from({ length: rowCount }, (_, row) => row) };\n\n const rows = new Set<number>();\n for (const damagedRow of damage.rows) {\n // Native glyph bearings can cross a row boundary. Repaint one neighbor\n // on each side so clearing stale overhang never clips combining marks.\n for (let row = damagedRow - 1; row <= damagedRow + 1; row += 1) {\n if (row >= 0 && row < rowCount) rows.add(row);\n }\n }\n return { full: false, rows: [...rows].sort((left, right) => left - right) };\n}\n", "/// <reference types=\"@webgpu/types\" />\n\nimport { CursorStyle, GlyphFormat, type GlyphDefinition, type StyleDefinition } from \"@vibecook/ghosttea-frame\";\nimport type { TerminalRenderMetrics } from \"../performance.js\";\n\nimport {\n CELL_WIDTH,\n LINE_HEIGHT,\n ORIGIN_X,\n ORIGIN_Y,\n effectiveCursorStyle,\n renderedSizeChanged,\n type CellPoint,\n type PixelSize,\n type RenderView,\n type Rgba,\n type TerminalRenderer,\n} from \"./types.js\";\nimport { graphemeCellWidth, splitGraphemes } from \"../cell-width.js\";\nimport { rowsForDamage } from \"./render-damage.js\";\n\nconst ATLAS_SIZE = 2048;\nconst GEOMETRY_CACHE_LIMIT = 8;\nconst FONT_STACK = \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\";\n\nconst RECT_SHADER = /* wgsl */ `\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n @location(0) color: vec4f,\n}\n\n@vertex fn vertex_main(\n @builtin(vertex_index) vertex_index: u32,\n @location(0) p0: vec2f,\n @location(1) p1: vec2f,\n @location(2) p2: vec2f,\n @location(3) color: vec4f,\n) -> VertexOutput {\n let p3 = p1 + p2 - p0;\n let positions = array<vec2f, 6>(\n p0,\n p1,\n p2,\n p2,\n p1,\n p3,\n );\n var output: VertexOutput;\n output.position = vec4f(positions[vertex_index], 0.0, 1.0);\n output.color = color;\n return output;\n}\n\n@fragment fn fragment_main(input: VertexOutput) -> @location(0) vec4f {\n return vec4f(input.color.rgb * input.color.a, input.color.a);\n}\n`;\n\nfunction glyphShader(coverageChannel: \"r\" | \"a\"): string {\n return /* wgsl */ `\n@group(0) @binding(0) var atlas: texture_2d<f32>;\n@group(0) @binding(1) var atlas_sampler: sampler;\n\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n @location(0) uv: vec2f,\n @location(1) color: vec4f,\n}\n\n@vertex fn vertex_main(\n @builtin(vertex_index) vertex_index: u32,\n @location(0) bounds: vec4f,\n @location(1) uv_bounds: vec4f,\n @location(2) color: vec4f,\n) -> VertexOutput {\n let positions = array<vec2f, 6>(\n vec2f(bounds.x, bounds.z),\n vec2f(bounds.y, bounds.z),\n vec2f(bounds.x, bounds.w),\n vec2f(bounds.x, bounds.w),\n vec2f(bounds.y, bounds.z),\n vec2f(bounds.y, bounds.w),\n );\n let uvs = array<vec2f, 6>(\n vec2f(uv_bounds.x, uv_bounds.z),\n vec2f(uv_bounds.y, uv_bounds.z),\n vec2f(uv_bounds.x, uv_bounds.w),\n vec2f(uv_bounds.x, uv_bounds.w),\n vec2f(uv_bounds.y, uv_bounds.z),\n vec2f(uv_bounds.y, uv_bounds.w),\n );\n var output: VertexOutput;\n output.position = vec4f(positions[vertex_index], 0.0, 1.0);\n output.uv = uvs[vertex_index];\n output.color = color;\n return output;\n}\n\n@fragment fn fragment_main(input: VertexOutput) -> @location(0) vec4f {\n let coverage = textureSample(atlas, atlas_sampler, input.uv).${coverageChannel};\n let alpha = input.color.a * coverage;\n return vec4f(input.color.rgb * alpha, alpha);\n}\n`;\n}\n\nconst MONO_GLYPH_SHADER = glyphShader(\"r\");\nconst FALLBACK_GLYPH_SHADER = glyphShader(\"a\");\n\nconst COLOR_GLYPH_SHADER = /* wgsl */ `\n@group(0) @binding(0) var atlas: texture_2d<f32>;\n@group(0) @binding(1) var atlas_sampler: sampler;\n\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n @location(0) uv: vec2f,\n @location(1) color: vec4f,\n}\n\n@vertex fn vertex_main(\n @builtin(vertex_index) vertex_index: u32,\n @location(0) bounds: vec4f,\n @location(1) uv_bounds: vec4f,\n @location(2) color: vec4f,\n) -> VertexOutput {\n let positions = array<vec2f, 6>(\n vec2f(bounds.x, bounds.z),\n vec2f(bounds.y, bounds.z),\n vec2f(bounds.x, bounds.w),\n vec2f(bounds.x, bounds.w),\n vec2f(bounds.y, bounds.z),\n vec2f(bounds.y, bounds.w),\n );\n let uvs = array<vec2f, 6>(\n vec2f(uv_bounds.x, uv_bounds.z),\n vec2f(uv_bounds.y, uv_bounds.z),\n vec2f(uv_bounds.x, uv_bounds.w),\n vec2f(uv_bounds.x, uv_bounds.w),\n vec2f(uv_bounds.y, uv_bounds.z),\n vec2f(uv_bounds.y, uv_bounds.w),\n );\n var output: VertexOutput;\n output.position = vec4f(positions[vertex_index], 0.0, 1.0);\n output.uv = uvs[vertex_index];\n output.color = color;\n return output;\n}\n\n@fragment fn fragment_main(input: VertexOutput) -> @location(0) vec4f {\n return textureSample(atlas, atlas_sampler, input.uv);\n}\n`;\n\n// WebGPU port of ~/.config/ghostty/shaders/bettercrt.glsl. Ghostty applies\n// custom shaders to the completed terminal image, so this must remain a\n// separate pass rather than being approximated per glyph.\nconst BETTER_CRT_SHADER = /* wgsl */ `\n@group(0) @binding(0) var terminal_image: texture_2d<f32>;\n@group(0) @binding(1) var terminal_sampler: sampler;\nstruct PostProcessConfig {\n // A vec4 keeps the WGSL uniform layout equal to the host's 16-byte buffer.\n enabled: vec4u,\n}\n@group(0) @binding(2) var<uniform> post_process: PostProcessConfig;\n\n@vertex fn vertex_main(@builtin(vertex_index) vertex_index: u32) -> @builtin(position) vec4f {\n let positions = array<vec2f, 3>(\n vec2f(-1.0, -1.0),\n vec2f(3.0, -1.0),\n vec2f(-1.0, 3.0),\n );\n return vec4f(positions[vertex_index], 0.0, 1.0);\n}\n\n@fragment fn fragment_main(@builtin(position) position: vec4f) -> @location(0) vec4f {\n let dimensions = vec2f(textureDimensions(terminal_image));\n var uv = position.xy / dimensions;\n if (post_process.enabled.x == 0u) {\n return textureSample(terminal_image, terminal_sampler, uv);\n }\n var dc = abs(vec2f(0.5) - uv);\n dc *= dc;\n\n // These constants are the active Ghostty shader's warp = 0.25 and\n // scan = 0.50 values.\n uv.x -= 0.5;\n uv.x *= 1.0 + dc.y * 0.075;\n uv.x += 0.5;\n uv.y -= 0.5;\n uv.y *= 1.0 + dc.x * 0.10;\n uv.y += 0.5;\n\n let scanline = abs(sin(position.y) * 0.125);\n let color = textureSample(terminal_image, terminal_sampler, uv).rgb;\n return vec4f(mix(color, vec3f(0.0), scanline), 1.0);\n}\n`;\n\nconst premultipliedBlend: GPUBlendState = {\n color: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n};\n\nclass DynamicVertexBuffer {\n #buffer: GPUBuffer | undefined;\n #capacity = 0;\n\n constructor(\n readonly device: GPUDevice,\n readonly label: string,\n ) {}\n\n write(vertices: Float32Array): GPUBuffer | undefined {\n if (vertices.byteLength === 0) return undefined;\n if (!this.#buffer || this.#capacity < vertices.byteLength) {\n this.#buffer?.destroy();\n this.#capacity = Math.max(4096, 2 ** Math.ceil(Math.log2(vertices.byteLength)));\n this.#buffer = this.device.createBuffer({\n label: this.label,\n size: this.#capacity,\n usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n });\n }\n this.device.queue.writeBuffer(this.#buffer, 0, vertices);\n return this.#buffer;\n }\n\n destroy(): void {\n this.#buffer?.destroy();\n this.#buffer = undefined;\n }\n}\n\ninterface GlyphLocation {\n u0: number;\n v0: number;\n u1: number;\n v1: number;\n cells: number;\n}\n\nclass FallbackGlyphAtlas {\n readonly #texture: GPUTexture;\n readonly #sampler: GPUSampler;\n readonly #bindGroup: GPUBindGroup;\n readonly #cache = new Map<string, GlyphLocation>();\n readonly #scratch = new OffscreenCanvas(1, 1);\n #x = 1;\n #y = 1;\n #rowHeight = 0;\n #uploadBytes = 0;\n #uploadCalls = 0;\n #generation = 0;\n\n constructor(\n readonly device: GPUDevice,\n bindGroupLayout: GPUBindGroupLayout,\n ) {\n this.#texture = device.createTexture({\n label: \"terminal glyph atlas\",\n size: [ATLAS_SIZE, ATLAS_SIZE],\n format: \"rgba8unorm\",\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,\n });\n this.#sampler = device.createSampler({ minFilter: \"linear\", magFilter: \"linear\" });\n this.#bindGroup = device.createBindGroup({\n label: \"terminal glyph atlas bindings\",\n layout: bindGroupLayout,\n entries: [\n { binding: 0, resource: this.#texture.createView() },\n { binding: 1, resource: this.#sampler },\n ],\n });\n }\n\n get bindGroup(): GPUBindGroup {\n return this.#bindGroup;\n }\n\n get generation(): number {\n return this.#generation;\n }\n\n prepare(values: Iterable<string>, dpr: number): void {\n const scale = Math.max(1, Math.min(3, dpr));\n const all = [...new Set(values)].filter((value) => value.trim().length > 0);\n const missing = all.filter((value) => !this.#cache.has(`${scale.toFixed(2)}:${value}`));\n if (this.#fits(missing, scale, this.#x, this.#y, this.#rowHeight)) return;\n this.#cache.clear();\n this.#generation += 1;\n this.#x = 1;\n this.#y = 1;\n this.#rowHeight = 0;\n if (!this.#fits(all, scale, this.#x, this.#y, this.#rowHeight)) {\n throw new Error(\"The diagnostic glyph atlas cannot fit the text visible in one frame\");\n }\n }\n\n #fits(values: Iterable<string>, scale: number, startX: number, startY: number, startRowHeight: number): boolean {\n let x = startX;\n let y = startY;\n let rowHeight = startRowHeight;\n for (const value of values) {\n const width = Math.max(1, Math.ceil(CELL_WIDTH * graphemeCellWidth(value) * scale));\n const height = Math.max(1, Math.ceil(LINE_HEIGHT * scale));\n if (x + width + 1 > ATLAS_SIZE) {\n x = 1;\n y += rowHeight + 1;\n rowHeight = 0;\n }\n if (y + height + 1 > ATLAS_SIZE) return false;\n x += width + 1;\n rowHeight = Math.max(rowHeight, height);\n }\n return true;\n }\n\n glyph(grapheme: string, dpr: number): GlyphLocation | undefined {\n if (grapheme.trim().length === 0) return undefined;\n const scale = Math.max(1, Math.min(3, dpr));\n const cells = graphemeCellWidth(grapheme);\n const key = `${scale.toFixed(2)}:${grapheme}`;\n const cached = this.#cache.get(key);\n if (cached) return cached;\n\n const width = Math.max(1, Math.ceil(CELL_WIDTH * cells * scale));\n const height = Math.max(1, Math.ceil(LINE_HEIGHT * scale));\n if (this.#x + width + 1 > ATLAS_SIZE) {\n this.#x = 1;\n this.#y += this.#rowHeight + 1;\n this.#rowHeight = 0;\n }\n if (this.#y + height + 1 > ATLAS_SIZE) {\n throw new Error(\"Temporary glyph atlas exhausted\");\n }\n\n this.#scratch.width = width;\n this.#scratch.height = height;\n const context = this.#scratch.getContext(\"2d\", { willReadFrequently: true });\n if (!context) throw new Error(\"Glyph raster canvas unavailable\");\n context.clearRect(0, 0, width, height);\n context.fillStyle = \"white\";\n context.font = `${13 * scale}px ${FONT_STACK}`;\n context.textBaseline = \"top\";\n context.fillText(grapheme, 0, Math.max(0, Math.floor((height - 15 * scale) / 2)));\n const image = context.getImageData(0, 0, width, height);\n this.device.queue.writeTexture(\n { texture: this.#texture, origin: [this.#x, this.#y] },\n image.data,\n { bytesPerRow: width * 4, rowsPerImage: height },\n [width, height],\n );\n this.#uploadBytes += image.data.byteLength;\n this.#uploadCalls += 1;\n const location: GlyphLocation = {\n u0: this.#x / ATLAS_SIZE,\n v0: this.#y / ATLAS_SIZE,\n u1: (this.#x + width) / ATLAS_SIZE,\n v1: (this.#y + height) / ATLAS_SIZE,\n cells,\n };\n this.#cache.set(key, location);\n this.#x += width + 1;\n this.#rowHeight = Math.max(this.#rowHeight, height);\n return location;\n }\n\n destroy(): void {\n this.#texture.destroy();\n }\n\n uploadMetrics(): { bytes: number; calls: number } {\n return { bytes: this.#uploadBytes, calls: this.#uploadCalls };\n }\n}\n\nclass NativeGlyphAtlas {\n readonly #texture: GPUTexture;\n readonly #sampler: GPUSampler;\n readonly #bindGroup: GPUBindGroup;\n readonly #cache = new Map<number, GlyphLocation>();\n #x = 1;\n #y = 1;\n #rowHeight = 0;\n #uploadBytes = 0;\n #uploadCalls = 0;\n #generation = 0;\n\n constructor(\n readonly device: GPUDevice,\n bindGroupLayout: GPUBindGroupLayout,\n readonly label: string,\n readonly format: \"r8unorm\" | \"rgba8unorm\",\n ) {\n this.#texture = device.createTexture({\n label,\n size: [ATLAS_SIZE, ATLAS_SIZE],\n format,\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,\n });\n this.#sampler = device.createSampler({ minFilter: \"linear\", magFilter: \"linear\" });\n this.#bindGroup = device.createBindGroup({\n label: `${label} bindings`,\n layout: bindGroupLayout,\n entries: [\n { binding: 0, resource: this.#texture.createView() },\n { binding: 1, resource: this.#sampler },\n ],\n });\n }\n\n get bindGroup(): GPUBindGroup {\n return this.#bindGroup;\n }\n\n get generation(): number {\n return this.#generation;\n }\n\n prepare(definitions: Iterable<GlyphDefinition>): void {\n const all = new Map<number, GlyphDefinition>();\n const missing = new Map<number, GlyphDefinition>();\n for (const definition of definitions) {\n all.set(definition.id, definition);\n if (!this.#cache.has(definition.id)) missing.set(definition.id, definition);\n }\n if (this.#fits(missing.values(), this.#x, this.#y, this.#rowHeight)) return;\n this.#cache.clear();\n this.#generation += 1;\n this.#x = 1;\n this.#y = 1;\n this.#rowHeight = 0;\n if (!this.#fits(all.values(), this.#x, this.#y, this.#rowHeight)) {\n throw new Error(`${this.label} cannot fit the glyphs visible in one frame`);\n }\n }\n\n #fits(definitions: Iterable<GlyphDefinition>, startX: number, startY: number, startRowHeight: number): boolean {\n let x = startX;\n let y = startY;\n let rowHeight = startRowHeight;\n for (const { width, height } of definitions) {\n if (width + 2 > ATLAS_SIZE || height + 2 > ATLAS_SIZE) return false;\n if (x + width + 1 > ATLAS_SIZE) {\n x = 1;\n y += rowHeight + 1;\n rowHeight = 0;\n }\n if (y + height + 1 > ATLAS_SIZE) return false;\n x += width + 1;\n rowHeight = Math.max(rowHeight, height);\n }\n return true;\n }\n\n glyph(definition: GlyphDefinition): GlyphLocation {\n const cached = this.#cache.get(definition.id);\n if (cached) return cached;\n const { width, height } = definition;\n if (this.#x + width + 1 > ATLAS_SIZE) {\n this.#x = 1;\n this.#y += this.#rowHeight + 1;\n this.#rowHeight = 0;\n }\n if (this.#y + height + 1 > ATLAS_SIZE) throw new Error(`${this.label} exhausted`);\n const pixels = definition.pixels;\n const bytesPerPixel = this.format === \"r8unorm\" ? 1 : 4;\n this.device.queue.writeTexture(\n { texture: this.#texture, origin: [this.#x, this.#y] },\n pixels,\n { bytesPerRow: width * bytesPerPixel, rowsPerImage: height },\n [width, height],\n );\n this.#uploadBytes += pixels.byteLength;\n this.#uploadCalls += 1;\n const location: GlyphLocation = {\n u0: this.#x / ATLAS_SIZE,\n v0: this.#y / ATLAS_SIZE,\n u1: (this.#x + width) / ATLAS_SIZE,\n v1: (this.#y + height) / ATLAS_SIZE,\n cells: 0,\n };\n this.#cache.set(definition.id, location);\n this.#x += width + 1;\n this.#rowHeight = Math.max(this.#rowHeight, height);\n return location;\n }\n\n destroy(): void {\n this.#texture.destroy();\n }\n\n uploadMetrics(): { bytes: number; calls: number } {\n return { bytes: this.#uploadBytes, calls: this.#uploadCalls };\n }\n}\n\ninterface WebGpuSurface extends PixelSize {\n canvas: OffscreenCanvas;\n context: GPUCanvasContext;\n sceneTexture: GPUTexture;\n postProcessConfigBuffer: GPUBuffer;\n postProcessBindGroup: GPUBindGroup;\n postProcessEnabled: boolean | undefined;\n rectangleBuffer: DynamicVertexBuffer;\n glyphBuffer: DynamicVertexBuffer;\n colorGlyphBuffer: DynamicVertexBuffer;\n fallbackGlyphBuffer: DynamicVertexBuffer;\n cursorBuffer: DynamicVertexBuffer;\n geometryCache: Map<string, CachedGeometry>;\n geometryCandidates: Map<string, true>;\n sceneValid: boolean;\n}\n\ninterface GeometryLayout {\n backgroundInstanceCount: number;\n selectionInstanceCount: number;\n decorationInstanceStart: number;\n decorationInstanceCount: number;\n rectangleInstanceCount: number;\n glyphInstanceCount: number;\n colorGlyphInstanceCount: number;\n fallbackGlyphInstanceCount: number;\n}\n\ninterface CpuGeometry extends GeometryLayout {\n rectangleData: Float32Array;\n glyphData: Float32Array;\n colorGlyphData: Float32Array;\n fallbackGlyphData: Float32Array;\n}\n\ninterface CachedGeometry extends GeometryLayout {\n rectangleBuffer: GPUBuffer | undefined;\n glyphBuffer: GPUBuffer | undefined;\n colorGlyphBuffer: GPUBuffer | undefined;\n fallbackGlyphBuffer: GPUBuffer | undefined;\n}\n\nfunction destroyCachedGeometry(geometry: CachedGeometry): void {\n geometry.rectangleBuffer?.destroy();\n geometry.glyphBuffer?.destroy();\n geometry.colorGlyphBuffer?.destroy();\n geometry.fallbackGlyphBuffer?.destroy();\n}\n\nfunction clearGeometryCache(surface: WebGpuSurface): void {\n for (const geometry of surface.geometryCache.values()) destroyCachedGeometry(geometry);\n surface.geometryCache.clear();\n surface.geometryCandidates.clear();\n}\n\nfunction createCachedVertexBuffer(device: GPUDevice, label: string, data: Float32Array): GPUBuffer | undefined {\n if (data.byteLength === 0) return undefined;\n const buffer = device.createBuffer({\n label,\n size: data.byteLength,\n usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n });\n device.queue.writeBuffer(buffer, 0, data);\n return buffer;\n}\n\nfunction geometryCacheKey(\n view: RenderView,\n rows: readonly number[],\n hasNativeRows: boolean,\n atlasGenerations: readonly [number, number, number],\n): string {\n const selection = view.selection\n ? `${view.selection.anchor.row},${view.selection.anchor.column},${view.selection.focus.row},${view.selection.focus.column}`\n : \"-\";\n return [\n view.sessionEpoch.toString(),\n view.layoutEpoch.toString(),\n hasNativeRows ? \"native\" : \"fallback\",\n rows.map((row) => `${row}:${view.rowRevisions[row]?.toString() ?? \"-\"}`).join(\",\"),\n [\n ...view.theme.background,\n ...view.theme.foreground,\n ...view.theme.selection,\n ...view.theme.selectionForeground,\n ].join(\",\"),\n selection,\n atlasGenerations.join(\",\"),\n ].join(\"|\");\n}\n\nfunction pushCursorVertices(\n vertices: number[],\n view: RenderView,\n renderRowSet: ReadonlySet<number>,\n scale: number,\n viewportWidth: number,\n viewportHeight: number,\n): void {\n const cursorStyle = effectiveCursorStyle(view);\n if (cursorStyle === null || !renderRowSet.has(view.cursor.y)) return;\n const x = (ORIGIN_X + view.cursor.x * CELL_WIDTH) * scale;\n const y = (ORIGIN_Y + view.cursor.y * LINE_HEIGHT) * scale;\n const width = CELL_WIDTH * scale;\n const height = LINE_HEIGHT * scale;\n const stroke = Math.max(1, Math.round(scale));\n const cursorColor: Rgba =\n cursorStyle === CursorStyle.HollowBlock\n ? [view.theme.cursor[0], view.theme.cursor[1], view.theme.cursor[2], 1]\n : view.theme.cursor;\n if (cursorStyle === CursorStyle.Bar) {\n pushRectangle(\n vertices,\n x,\n y,\n Math.max(2, Math.round(2 * scale)),\n height,\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n } else if (cursorStyle === CursorStyle.Underline) {\n const thickness = Math.max(2, Math.round(2 * scale));\n pushRectangle(vertices, x, y + height - thickness, width, thickness, cursorColor, viewportWidth, viewportHeight);\n } else if (cursorStyle === CursorStyle.HollowBlock) {\n pushRectangle(vertices, x, y, width, stroke, cursorColor, viewportWidth, viewportHeight);\n pushRectangle(vertices, x, y + height - stroke, width, stroke, cursorColor, viewportWidth, viewportHeight);\n pushRectangle(\n vertices,\n x,\n y + stroke,\n stroke,\n Math.max(0, height - stroke * 2),\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n pushRectangle(\n vertices,\n x + width - stroke,\n y + stroke,\n stroke,\n Math.max(0, height - stroke * 2),\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n } else {\n pushRectangle(vertices, x, y, width, height, cursorColor, viewportWidth, viewportHeight);\n }\n}\n\nfunction clipX(pixel: number, width: number): number {\n return (pixel / Math.max(1, width)) * 2 - 1;\n}\n\nfunction clipY(pixel: number, height: number): number {\n return 1 - (pixel / Math.max(1, height)) * 2;\n}\n\nfunction pushRectangle(\n output: number[],\n x: number,\n y: number,\n width: number,\n height: number,\n color: Rgba,\n viewportWidth: number,\n viewportHeight: number,\n): void {\n const left = clipX(x, viewportWidth);\n const right = clipX(x + width, viewportWidth);\n const top = clipY(y, viewportHeight);\n const bottom = clipY(y + height, viewportHeight);\n output.push(left, top, right, top, left, bottom, ...color);\n}\n\nfunction pushGlyph(\n output: number[],\n x: number,\n y: number,\n width: number,\n height: number,\n glyph: GlyphLocation,\n color: Rgba,\n viewportWidth: number,\n viewportHeight: number,\n): void {\n const left = clipX(x, viewportWidth);\n const right = clipX(x + width, viewportWidth);\n const top = clipY(y, viewportHeight);\n const bottom = clipY(y + height, viewportHeight);\n output.push(left, right, top, bottom, glyph.u0, glyph.u1, glyph.v0, glyph.v1, ...color);\n}\n\nfunction ordered(selection: RenderView[\"selection\"]): [CellPoint, CellPoint] | null {\n if (!selection) return null;\n const { anchor, focus } = selection;\n return anchor.row < focus.row || (anchor.row === focus.row && anchor.column <= focus.column)\n ? [anchor, focus]\n : [focus, anchor];\n}\n\nfunction cellLength(text: string): number {\n return splitGraphemes(text).reduce((total, grapheme) => total + graphemeCellWidth(grapheme), 0);\n}\n\nconst BOX_DIRECTIONS = new Map<string, string>([\n [\"\u2500\", \"lr\"],\n [\"\u2501\", \"lr\"],\n [\"\u2502\", \"ud\"],\n [\"\u2503\", \"ud\"],\n [\"\u250C\", \"rd\"],\n [\"\u250D\", \"rd\"],\n [\"\u250E\", \"rd\"],\n [\"\u250F\", \"rd\"],\n [\"\u2510\", \"ld\"],\n [\"\u2511\", \"ld\"],\n [\"\u2512\", \"ld\"],\n [\"\u2513\", \"ld\"],\n [\"\u2514\", \"ru\"],\n [\"\u2515\", \"ru\"],\n [\"\u2516\", \"ru\"],\n [\"\u2517\", \"ru\"],\n [\"\u2518\", \"lu\"],\n [\"\u2519\", \"lu\"],\n [\"\u251A\", \"lu\"],\n [\"\u251B\", \"lu\"],\n [\"\u251C\", \"udr\"],\n [\"\u251D\", \"udr\"],\n [\"\u251E\", \"udr\"],\n [\"\u2523\", \"udr\"],\n [\"\u2524\", \"udl\"],\n [\"\u2525\", \"udl\"],\n [\"\u2526\", \"udl\"],\n [\"\u252B\", \"udl\"],\n [\"\u252C\", \"lrd\"],\n [\"\u252F\", \"lrd\"],\n [\"\u2530\", \"lrd\"],\n [\"\u2533\", \"lrd\"],\n [\"\u2534\", \"lru\"],\n [\"\u2537\", \"lru\"],\n [\"\u2538\", \"lru\"],\n [\"\u253B\", \"lru\"],\n [\"\u253C\", \"lrud\"],\n [\"\u254B\", \"lrud\"],\n [\"\u2574\", \"l\"],\n [\"\u2576\", \"r\"],\n [\"\u2575\", \"u\"],\n [\"\u2577\", \"d\"],\n [\"\u2550\", \"lr\"],\n [\"\u2551\", \"ud\"],\n [\"\u2554\", \"rd\"],\n [\"\u2557\", \"ld\"],\n [\"\u255A\", \"ru\"],\n [\"\u255D\", \"lu\"],\n [\"\u2560\", \"udr\"],\n [\"\u2563\", \"udl\"],\n [\"\u2566\", \"lrd\"],\n [\"\u2569\", \"lru\"],\n [\"\u256C\", \"lrud\"],\n [\"\u256D\", \"rd\"],\n [\"\u256E\", \"ld\"],\n [\"\u256F\", \"lu\"],\n [\"\u2570\", \"ru\"],\n]);\n\nconst ROUNDED_BOX_CORNERS = new Set([\"\u256D\", \"\u256E\", \"\u256F\", \"\u2570\"]);\n\nexport interface SpecialDrawingCells {\n box: Map<number, string>;\n block: Map<number, string>;\n}\n\nexport function specialDrawingCells(text: string): SpecialDrawingCells {\n const box = new Map<number, string>();\n const block = new Map<number, string>();\n let column = 0;\n let simple = true;\n for (let index = 0; index < text.length; index += 1) {\n const codepoint = text.charCodeAt(index);\n if (codepoint <= 0x7f) {\n column += 1;\n } else if (codepoint >= 0x2580 && codepoint <= 0x259f) {\n block.set(column, text[index]!);\n column += 1;\n } else if (BOX_DIRECTIONS.has(text[index]!)) {\n box.set(column, text[index]!);\n column += 1;\n } else {\n simple = false;\n break;\n }\n }\n if (simple) return { box, block };\n\n box.clear();\n block.clear();\n column = 0;\n for (const grapheme of splitGraphemes(text)) {\n const codepoint = grapheme.codePointAt(0) ?? 0;\n if (codepoint >= 0x2580 && codepoint <= 0x259f) block.set(column, grapheme);\n else if (BOX_DIRECTIONS.has(grapheme)) box.set(column, grapheme);\n column += graphemeCellWidth(grapheme);\n }\n return { box, block };\n}\n\nfunction rgb(color: readonly [number, number, number]): Rgba {\n return [color[0] / 255, color[1] / 255, color[2] / 255, 1];\n}\n\nfunction over(source: Rgba, backdrop: Rgba): Rgba {\n if (source[3] >= 1) return source;\n if (source[3] <= 0) return backdrop;\n const alpha = source[3] + backdrop[3] * (1 - source[3]);\n if (alpha <= Number.EPSILON) return [0, 0, 0, 0];\n return [\n (source[0] * source[3] + backdrop[0] * backdrop[3] * (1 - source[3])) / alpha,\n (source[1] * source[3] + backdrop[1] * backdrop[3] * (1 - source[3])) / alpha,\n (source[2] * source[3] + backdrop[2] * backdrop[3] * (1 - source[3])) / alpha,\n alpha,\n ];\n}\n\nfunction selectionContains(selection: [CellPoint, CellPoint] | null, row: number, column: number): boolean {\n if (!selection) return false;\n const [start, end] = selection;\n if (row < start.row || row > end.row) return false;\n const first = row === start.row ? start.column : 0;\n const last = row === end.row ? end.column : Number.MAX_SAFE_INTEGER;\n return column >= first && column <= last;\n}\n\ninterface ResolvedStyle {\n foreground: Rgba;\n background: Rgba | null;\n underline: boolean;\n strikethrough: boolean;\n invisible: boolean;\n}\n\nfunction resolveStyle(style: StyleDefinition | undefined, theme: RenderView[\"theme\"]): ResolvedStyle {\n let foreground: Rgba = style?.foreground ? rgb(style.foreground) : theme.foreground;\n let background: Rgba | null = style?.background ? rgb(style.background) : null;\n if (style?.inverse) {\n const originalForeground = foreground;\n foreground = background ?? theme.background;\n background = originalForeground;\n }\n if (style?.faint) foreground = [foreground[0], foreground[1], foreground[2], foreground[3] * 0.55];\n return {\n foreground,\n background,\n underline: style?.underline ?? false,\n strikethrough: style?.strikethrough ?? false,\n invisible: style?.invisible ?? false,\n };\n}\n\nfunction pushBoxDrawing(\n output: number[],\n grapheme: string,\n column: number,\n row: number,\n scale: number,\n color: Rgba,\n viewportWidth: number,\n viewportHeight: number,\n): void {\n const directions = BOX_DIRECTIONS.get(grapheme);\n if (!directions) return;\n const left = (ORIGIN_X + column * CELL_WIDTH) * scale;\n const right = (ORIGIN_X + (column + 1) * CELL_WIDTH) * scale;\n const top = (ORIGIN_Y + row * LINE_HEIGHT) * scale;\n const bottom = (ORIGIN_Y + (row + 1) * LINE_HEIGHT) * scale;\n const stroke = Math.max(1, Math.round(scale));\n const centerX = Math.round((left + right - stroke) / 2);\n const centerY = Math.round((top + bottom - stroke) / 2);\n if (ROUNDED_BOX_CORNERS.has(grapheme)) {\n const x = centerX + stroke / 2;\n const y = centerY + stroke / 2;\n const points: Array<readonly [number, number]> = [];\n const [originX, originY, startAngle, endAngle] =\n grapheme === \"\u256D\"\n ? [right, bottom, -Math.PI / 2, -Math.PI]\n : grapheme === \"\u256E\"\n ? [left, bottom, -Math.PI / 2, 0]\n : grapheme === \"\u256F\"\n ? [left, top, Math.PI / 2, 0]\n : [right, top, Math.PI, Math.PI / 2];\n const radiusX = Math.abs(right - x);\n const radiusY = Math.abs(bottom - y);\n const steps = Math.max(5, Math.ceil(Math.max(radiusX, radiusY) / 2));\n for (let step = 0; step <= steps; step += 1) {\n const angle = startAngle + (endAngle - startAngle) * (step / steps);\n points.push([originX + Math.cos(angle) * radiusX, originY + Math.sin(angle) * radiusY]);\n }\n for (let index = 1; index < points.length; index += 1) {\n const from = points[index - 1]!;\n const to = points[index]!;\n const dx = to[0] - from[0];\n const dy = to[1] - from[1];\n const length = Math.hypot(dx, dy);\n if (length <= Number.EPSILON) continue;\n const nx = ((-dy / length) * stroke) / 2;\n const ny = ((dx / length) * stroke) / 2;\n output.push(\n clipX(from[0] + nx, viewportWidth),\n clipY(from[1] + ny, viewportHeight),\n clipX(to[0] + nx, viewportWidth),\n clipY(to[1] + ny, viewportHeight),\n clipX(from[0] - nx, viewportWidth),\n clipY(from[1] - ny, viewportHeight),\n ...color,\n );\n }\n return;\n }\n if (directions.includes(\"u\"))\n pushRectangle(output, centerX, top, stroke, centerY + stroke - top, color, viewportWidth, viewportHeight);\n if (directions.includes(\"d\"))\n pushRectangle(output, centerX, centerY, stroke, bottom - centerY, color, viewportWidth, viewportHeight);\n if (directions.includes(\"l\"))\n pushRectangle(output, left, centerY, centerX + stroke - left, stroke, color, viewportWidth, viewportHeight);\n if (directions.includes(\"r\"))\n pushRectangle(output, centerX, centerY, right - centerX, stroke, color, viewportWidth, viewportHeight);\n}\n\ntype FractionRect = readonly [left: number, top: number, right: number, bottom: number];\n\nconst LOWER_BLOCK_RECTANGLES = Array.from({ length: 7 }, (_, index): readonly FractionRect[] => [\n [0, 1 - (index + 1) / 8, 1, 1],\n]);\nconst LEFT_BLOCK_RECTANGLES = Array.from({ length: 7 }, (_, index): readonly FractionRect[] => [\n [0, 0, (7 - index) / 8, 1],\n]);\nconst FULL_BLOCK_RECTANGLES: readonly FractionRect[] = [[0, 0, 1, 1]];\nconst RIGHT_HALF_RECTANGLES: readonly FractionRect[] = [[0.5, 0, 1, 1]];\nconst UPPER_EIGHTH_RECTANGLES: readonly FractionRect[] = [[0, 0, 1, 1 / 8]];\nconst RIGHT_EIGHTH_RECTANGLES: readonly FractionRect[] = [[7 / 8, 0, 1, 1]];\nconst QUADRANT_RECTANGLES: readonly FractionRect[] = [\n [0, 0, 0.5, 0.5],\n [0.5, 0, 1, 0.5],\n [0, 0.5, 0.5, 1],\n [0.5, 0.5, 1, 1],\n];\nconst QUADRANT_BLOCK_RECTANGLES = new Map<number, readonly FractionRect[]>(\n [\n [0x2596, [2]],\n [0x2597, [3]],\n [0x2598, [0]],\n [0x2599, [0, 2, 3]],\n [0x259a, [0, 3]],\n [0x259b, [0, 1, 2]],\n [0x259c, [0, 1, 3]],\n [0x259d, [1]],\n [0x259e, [1, 2]],\n [0x259f, [1, 2, 3]],\n ].map(([codepoint, quadrants]) => [\n codepoint as number,\n (quadrants as number[]).map((quadrant) => QUADRANT_RECTANGLES[quadrant]!),\n ]),\n);\n\nfunction blockElementRectangles(codepoint: number): readonly FractionRect[] | undefined {\n if (codepoint >= 0x2581 && codepoint <= 0x2587) return LOWER_BLOCK_RECTANGLES[codepoint - 0x2581];\n if (codepoint === 0x2588) return FULL_BLOCK_RECTANGLES;\n if (codepoint >= 0x2589 && codepoint <= 0x258f) return LEFT_BLOCK_RECTANGLES[codepoint - 0x2589];\n if (codepoint === 0x2590) return RIGHT_HALF_RECTANGLES;\n if (codepoint === 0x2594) return UPPER_EIGHTH_RECTANGLES;\n if (codepoint === 0x2595) return RIGHT_EIGHTH_RECTANGLES;\n return QUADRANT_BLOCK_RECTANGLES.get(codepoint);\n}\n\nfunction pushBlockElement(\n output: number[],\n grapheme: string,\n column: number,\n row: number,\n scale: number,\n color: Rgba,\n viewportWidth: number,\n viewportHeight: number,\n): boolean {\n const codepoint = grapheme.charCodeAt(0);\n if (codepoint < 0x2580 || codepoint > 0x259f) return false;\n const cellLeft = (ORIGIN_X + column * CELL_WIDTH) * scale;\n const cellRight = (ORIGIN_X + (column + 1) * CELL_WIDTH) * scale;\n const cellTop = (ORIGIN_Y + row * LINE_HEIGHT) * scale;\n const cellBottom = (ORIGIN_Y + (row + 1) * LINE_HEIGHT) * scale;\n if (codepoint === 0x2580) {\n const x0 = Math.round(cellLeft);\n const x1 = Math.round(cellRight);\n const y0 = Math.round(cellTop);\n const y1 = Math.round(cellTop + (cellBottom - cellTop) * 0.5);\n pushRectangle(output, x0, y0, x1 - x0, y1 - y0, color, viewportWidth, viewportHeight);\n return true;\n }\n const rectangles = blockElementRectangles(codepoint);\n if (!rectangles) return false;\n for (const [left, top, right, bottom] of rectangles) {\n const x0 = Math.round(cellLeft + (cellRight - cellLeft) * left);\n const x1 = Math.round(cellLeft + (cellRight - cellLeft) * right);\n const y0 = Math.round(cellTop + (cellBottom - cellTop) * top);\n const y1 = Math.round(cellTop + (cellBottom - cellTop) * bottom);\n pushRectangle(output, x0, y0, x1 - x0, y1 - y0, color, viewportWidth, viewportHeight);\n }\n return true;\n}\n\nexport class WebGpuTerminalRenderer implements TerminalRenderer {\n readonly kind = \"webgpu\" as const;\n readonly #surfaces = new Map<string, WebGpuSurface>();\n readonly #rectanglePipeline: GPURenderPipeline;\n readonly #glyphPipeline: GPURenderPipeline;\n readonly #fallbackGlyphPipeline: GPURenderPipeline;\n readonly #colorGlyphPipeline: GPURenderPipeline;\n readonly #postProcessPipeline: GPURenderPipeline;\n readonly #postProcessSampler: GPUSampler;\n readonly #monoAtlas: NativeGlyphAtlas;\n readonly #colorAtlas: NativeGlyphAtlas;\n readonly #fallbackAtlas: FallbackGlyphAtlas;\n #performanceMeasurementEnabled = false;\n\n private constructor(\n readonly device: GPUDevice,\n readonly format: GPUTextureFormat,\n ) {\n const rectangleModule = device.createShaderModule({ label: \"terminal rectangle shader\", code: RECT_SHADER });\n const glyphModule = device.createShaderModule({ label: \"terminal glyph shader\", code: MONO_GLYPH_SHADER });\n const fallbackGlyphModule = device.createShaderModule({\n label: \"terminal fallback glyph shader\",\n code: FALLBACK_GLYPH_SHADER,\n });\n const colorGlyphModule = device.createShaderModule({\n label: \"terminal color glyph shader\",\n code: COLOR_GLYPH_SHADER,\n });\n const postProcessModule = device.createShaderModule({ label: \"Ghostty bettercrt shader\", code: BETTER_CRT_SHADER });\n this.#rectanglePipeline = device.createRenderPipeline({\n label: \"terminal rectangle pipeline\",\n layout: \"auto\",\n vertex: {\n module: rectangleModule,\n entryPoint: \"vertex_main\",\n buffers: [\n {\n arrayStride: 40,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n { shaderLocation: 1, offset: 8, format: \"float32x2\" },\n { shaderLocation: 2, offset: 16, format: \"float32x2\" },\n { shaderLocation: 3, offset: 24, format: \"float32x4\" },\n ],\n },\n ],\n },\n fragment: {\n module: rectangleModule,\n entryPoint: \"fragment_main\",\n targets: [{ format, blend: premultipliedBlend }],\n },\n primitive: { topology: \"triangle-list\" },\n });\n this.#glyphPipeline = device.createRenderPipeline({\n label: \"terminal glyph pipeline\",\n layout: \"auto\",\n vertex: {\n module: glyphModule,\n entryPoint: \"vertex_main\",\n buffers: [\n {\n arrayStride: 48,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x4\" },\n { shaderLocation: 1, offset: 16, format: \"float32x4\" },\n { shaderLocation: 2, offset: 32, format: \"float32x4\" },\n ],\n },\n ],\n },\n fragment: { module: glyphModule, entryPoint: \"fragment_main\", targets: [{ format, blend: premultipliedBlend }] },\n primitive: { topology: \"triangle-list\" },\n });\n this.#fallbackGlyphPipeline = device.createRenderPipeline({\n label: \"terminal fallback glyph pipeline\",\n layout: \"auto\",\n vertex: {\n module: fallbackGlyphModule,\n entryPoint: \"vertex_main\",\n buffers: [\n {\n arrayStride: 48,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x4\" },\n { shaderLocation: 1, offset: 16, format: \"float32x4\" },\n { shaderLocation: 2, offset: 32, format: \"float32x4\" },\n ],\n },\n ],\n },\n fragment: {\n module: fallbackGlyphModule,\n entryPoint: \"fragment_main\",\n targets: [{ format, blend: premultipliedBlend }],\n },\n primitive: { topology: \"triangle-list\" },\n });\n this.#colorGlyphPipeline = device.createRenderPipeline({\n label: \"terminal color glyph pipeline\",\n layout: \"auto\",\n vertex: {\n module: colorGlyphModule,\n entryPoint: \"vertex_main\",\n buffers: [\n {\n arrayStride: 48,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x4\" },\n { shaderLocation: 1, offset: 16, format: \"float32x4\" },\n { shaderLocation: 2, offset: 32, format: \"float32x4\" },\n ],\n },\n ],\n },\n fragment: {\n module: colorGlyphModule,\n entryPoint: \"fragment_main\",\n targets: [{ format, blend: premultipliedBlend }],\n },\n primitive: { topology: \"triangle-list\" },\n });\n this.#postProcessPipeline = device.createRenderPipeline({\n label: \"Ghostty custom shader pipeline\",\n layout: \"auto\",\n vertex: { module: postProcessModule, entryPoint: \"vertex_main\" },\n fragment: { module: postProcessModule, entryPoint: \"fragment_main\", targets: [{ format }] },\n primitive: { topology: \"triangle-list\" },\n });\n this.#postProcessSampler = device.createSampler({\n label: \"Ghostty custom shader sampler\",\n addressModeU: \"clamp-to-edge\",\n addressModeV: \"clamp-to-edge\",\n minFilter: \"linear\",\n magFilter: \"linear\",\n });\n this.#monoAtlas = new NativeGlyphAtlas(\n device,\n this.#glyphPipeline.getBindGroupLayout(0),\n \"native monochrome glyph atlas\",\n \"r8unorm\",\n );\n this.#colorAtlas = new NativeGlyphAtlas(\n device,\n this.#colorGlyphPipeline.getBindGroupLayout(0),\n \"native color glyph atlas\",\n \"rgba8unorm\",\n );\n this.#fallbackAtlas = new FallbackGlyphAtlas(device, this.#fallbackGlyphPipeline.getBindGroupLayout(0));\n }\n\n static async create(onLost: (info: GPUDeviceLostInfo) => void): Promise<WebGpuTerminalRenderer> {\n if (!navigator.gpu) throw new Error(\"WebGPU is unavailable\");\n const adapter = await navigator.gpu.requestAdapter();\n if (!adapter) throw new Error(\"No WebGPU adapter is available\");\n const device = await adapter.requestDevice({ label: \"Electron Ghostty terminal renderer\" });\n device.addEventListener(\"uncapturederror\", (event) => {\n console.error(\"[terminal-renderer] WebGPU validation error\", event.error);\n });\n void device.lost.then((info) => {\n if (info.reason !== \"destroyed\") onLost(info);\n });\n return new WebGpuTerminalRenderer(device, navigator.gpu.getPreferredCanvasFormat());\n }\n\n setPerformanceMeasurementEnabled(enabled: boolean): void {\n this.#performanceMeasurementEnabled = enabled;\n }\n\n mount(id: string, canvas: OffscreenCanvas): void {\n const context = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!context) throw new Error(\"WebGPU canvas context unavailable\");\n const sceneTexture = this.#createSceneTexture(canvas.width, canvas.height);\n const postProcessConfigBuffer = this.device.createBuffer({\n label: `Ghostty custom shader configuration ${id}`,\n size: 16,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n const surface: WebGpuSurface = {\n canvas,\n context,\n sceneTexture,\n postProcessConfigBuffer,\n postProcessBindGroup: this.#createPostProcessBindGroup(sceneTexture, postProcessConfigBuffer),\n postProcessEnabled: undefined,\n width: 1,\n height: 1,\n dpr: 1,\n rectangleBuffer: new DynamicVertexBuffer(this.device, `rectangles ${id}`),\n glyphBuffer: new DynamicVertexBuffer(this.device, `glyphs ${id}`),\n colorGlyphBuffer: new DynamicVertexBuffer(this.device, `color glyphs ${id}`),\n fallbackGlyphBuffer: new DynamicVertexBuffer(this.device, `fallback glyphs ${id}`),\n cursorBuffer: new DynamicVertexBuffer(this.device, `cursor ${id}`),\n geometryCache: new Map(),\n geometryCandidates: new Map(),\n sceneValid: false,\n };\n this.#surfaces.set(id, surface);\n this.#configure(surface);\n }\n\n unmount(id: string): void {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n surface.context.unconfigure();\n surface.sceneTexture.destroy();\n surface.postProcessConfigBuffer.destroy();\n surface.rectangleBuffer.destroy();\n surface.glyphBuffer.destroy();\n surface.colorGlyphBuffer.destroy();\n surface.fallbackGlyphBuffer.destroy();\n surface.cursorBuffer.destroy();\n clearGeometryCache(surface);\n this.#surfaces.delete(id);\n }\n\n resize(id: string, size: PixelSize): void {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n const changed = renderedSizeChanged(surface, size);\n Object.assign(surface, size);\n if (!changed) return;\n surface.canvas.width = Math.max(1, Math.round(size.width * size.dpr));\n surface.canvas.height = Math.max(1, Math.round(size.height * size.dpr));\n this.#configure(surface);\n }\n\n #configure(surface: WebGpuSurface): void {\n surface.context.configure({ device: this.device, format: this.format, alphaMode: \"premultiplied\" });\n surface.sceneTexture.destroy();\n surface.sceneTexture = this.#createSceneTexture(surface.canvas.width, surface.canvas.height);\n surface.postProcessBindGroup = this.#createPostProcessBindGroup(\n surface.sceneTexture,\n surface.postProcessConfigBuffer,\n );\n clearGeometryCache(surface);\n surface.sceneValid = false;\n }\n\n #createSceneTexture(width: number, height: number): GPUTexture {\n return this.device.createTexture({\n label: \"terminal scene before Ghostty custom shaders\",\n size: [Math.max(1, width), Math.max(1, height)],\n format: this.format,\n usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,\n });\n }\n\n #createPostProcessBindGroup(texture: GPUTexture, configBuffer: GPUBuffer): GPUBindGroup {\n return this.device.createBindGroup({\n label: \"Ghostty custom shader bindings\",\n layout: this.#postProcessPipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: texture.createView() },\n { binding: 1, resource: this.#postProcessSampler },\n { binding: 2, resource: { buffer: configBuffer } },\n ],\n });\n }\n\n render(id: string, view: RenderView): TerminalRenderMetrics | undefined {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n const postProcessEnabled = view.effects?.postProcess === \"better-crt\";\n if (surface.postProcessEnabled !== postProcessEnabled) {\n surface.postProcessEnabled = postProcessEnabled;\n this.device.queue.writeBuffer(\n surface.postProcessConfigBuffer,\n 0,\n new Uint32Array([Number(postProcessEnabled), 0, 0, 0]),\n );\n }\n const encoder = this.device.createCommandEncoder({ label: `terminal frame ${id}` });\n const metrics =\n view.damage?.geometryChanged === false\n ? this.#encodeCachedRender(id, view, encoder)\n : this.#encodeRender(id, view, encoder);\n this.device.queue.submit([encoder.finish()]);\n if (metrics) metrics.queueSubmits = 1;\n return metrics;\n }\n\n renderBatch(entries: ReadonlyArray<{ id: string; view: RenderView }>): Array<TerminalRenderMetrics | undefined> {\n const active = entries.filter(({ id }) => this.#surfaces.has(id));\n if (active.length === 0) return entries.map(() => undefined);\n const encoder = this.device.createCommandEncoder({ label: `terminal frame batch (${active.length} panes)` });\n const byId = new Map<string, TerminalRenderMetrics | undefined>();\n for (const { id, view } of active) {\n const surface = this.#surfaces.get(id)!;\n const postProcessEnabled = view.effects?.postProcess === \"better-crt\";\n if (surface.postProcessEnabled !== postProcessEnabled) {\n surface.postProcessEnabled = postProcessEnabled;\n this.device.queue.writeBuffer(\n surface.postProcessConfigBuffer,\n 0,\n new Uint32Array([Number(postProcessEnabled), 0, 0, 0]),\n );\n }\n byId.set(\n id,\n view.damage?.geometryChanged === false\n ? this.#encodeCachedRender(id, view, encoder)\n : this.#encodeRender(id, view, encoder),\n );\n }\n this.device.queue.submit([encoder.finish()]);\n const firstMetrics = [...byId.values()].find((metrics) => metrics !== undefined);\n if (firstMetrics) firstMetrics.queueSubmits = 1;\n return entries.map(({ id }) => byId.get(id));\n }\n\n #buildGeometry(\n view: RenderView,\n renderRows: readonly number[],\n rowCount: number,\n fullRedraw: boolean,\n hasNativeRows: boolean,\n scale: number,\n viewportWidth: number,\n viewportHeight: number,\n ): CpuGeometry {\n const rectangleVertices: number[] = [];\n const glyphVertices: number[] = [];\n const colorGlyphVertices: number[] = [];\n const fallbackGlyphVertices: number[] = [];\n const resolvedStyles = new Map<number, ResolvedStyle>();\n const styleFor = (styleId: number): ResolvedStyle => {\n const cached = resolvedStyles.get(styleId);\n if (cached) return cached;\n const resolved = resolveStyle(view.styleDefinitions.get(styleId), view.theme);\n resolvedStyles.set(styleId, resolved);\n return resolved;\n };\n const monoDefinitions = new Map<number, GlyphDefinition>();\n const colorDefinitions = new Map<number, GlyphDefinition>();\n for (const row of renderRows) {\n for (const glyph of view.nativeRows[row] ?? []) {\n const definition = view.glyphDefinitions.get(glyph.glyphId);\n if (!definition) continue;\n (definition.format === GlyphFormat.Rgba8Premultiplied ? colorDefinitions : monoDefinitions).set(\n definition.id,\n definition,\n );\n }\n }\n this.#monoAtlas.prepare(monoDefinitions.values());\n this.#colorAtlas.prepare(colorDefinitions.values());\n\n if (!fullRedraw) {\n for (const row of renderRows) {\n const top = row === 0 ? 0 : (ORIGIN_Y + row * LINE_HEIGHT) * scale;\n const bottom =\n row === rowCount - 1\n ? viewportHeight\n : Math.min(viewportHeight, (ORIGIN_Y + (row + 1) * LINE_HEIGHT) * scale);\n pushRectangle(\n rectangleVertices,\n 0,\n top,\n viewportWidth,\n Math.max(0, bottom - top),\n // The rectangle pipeline blends. Force the row reset opaque so it\n // replaces stale scene pixels even when a theme carries alpha.\n [view.theme.background[0], view.theme.background[1], view.theme.background[2], 1],\n viewportWidth,\n viewportHeight,\n );\n }\n }\n\n for (const row of renderRows) {\n for (const run of view.nativeStyleRows[row] ?? []) {\n const style = styleFor(run.styleId);\n if (!style.background) continue;\n pushRectangle(\n rectangleVertices,\n (ORIGIN_X + run.cellStart * CELL_WIDTH) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT) * scale,\n run.cellSpan * CELL_WIDTH * scale,\n LINE_HEIGHT * scale,\n style.background,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n const backgroundInstanceCount = rectangleVertices.length / 10;\n\n const selection = ordered(view.selection);\n if (selection) {\n const [start, end] = selection;\n for (const row of renderRows) {\n if (row < start.row || row > end.row) continue;\n const first = row === start.row ? start.column : 0;\n const last = row === end.row ? end.column : Math.max(0, cellLength(view.rows[row] ?? \"\") - 1);\n pushRectangle(\n rectangleVertices,\n (ORIGIN_X + first * CELL_WIDTH) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT) * scale,\n Math.max(1, last - first + 1) * CELL_WIDTH * scale,\n LINE_HEIGHT * scale,\n view.theme.selection,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n const selectionInstanceCount = rectangleVertices.length / 10 - backgroundInstanceCount;\n\n if (!hasNativeRows) {\n this.#fallbackAtlas.prepare(\n renderRows.flatMap((row) => splitGraphemes(view.rows[row] ?? \"\")),\n scale,\n );\n }\n if (hasNativeRows) {\n for (const row of renderRows) {\n const { box: boxCells, block: blockCells } = specialDrawingCells(view.rows[row] ?? \"\");\n for (const instance of view.nativeRows[row] ?? []) {\n const definition = view.glyphDefinitions.get(instance.glyphId);\n if (!definition) continue;\n const style = styleFor(instance.styleId);\n if (style.invisible) continue;\n const isSelected = selectionContains(selection, row, instance.cellStart);\n const foreground = isSelected ? view.theme.selectionForeground : style.foreground;\n const boxDrawing = boxCells.get(instance.cellStart);\n if (boxDrawing) {\n let backdrop = style.background ?? view.theme.background;\n if (isSelected) backdrop = view.theme.selection;\n // Box glyphs are overlapping primitives. Flatten faint opacity\n // against the cell backdrop so joins are blended only once.\n pushBoxDrawing(\n rectangleVertices,\n boxDrawing,\n instance.cellStart,\n row,\n scale,\n over(foreground, backdrop),\n viewportWidth,\n viewportHeight,\n );\n continue;\n }\n const blockElement = blockCells.get(instance.cellStart);\n if (blockElement) {\n let backdrop = style.background ?? view.theme.background;\n if (isSelected) backdrop = view.theme.selection;\n if (\n pushBlockElement(\n rectangleVertices,\n blockElement,\n instance.cellStart,\n row,\n scale,\n over(foreground, backdrop),\n viewportWidth,\n viewportHeight,\n )\n )\n continue;\n }\n const atlas = definition.format === GlyphFormat.Alpha8 ? this.#monoAtlas : this.#colorAtlas;\n const vertices = definition.format === GlyphFormat.Alpha8 ? glyphVertices : colorGlyphVertices;\n pushGlyph(\n vertices,\n (ORIGIN_X + instance.x) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT + instance.y) * scale,\n instance.width * scale,\n instance.height * scale,\n atlas.glyph(definition),\n foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n } else {\n for (const row of renderRows) {\n let column = 0;\n for (const grapheme of splitGraphemes(view.rows[row] ?? \"\")) {\n const glyph = this.#fallbackAtlas.glyph(grapheme, scale);\n const cells = glyph?.cells ?? graphemeCellWidth(grapheme);\n if (glyph) {\n const foreground = selectionContains(selection, row, column)\n ? view.theme.selectionForeground\n : view.theme.foreground;\n pushGlyph(\n fallbackGlyphVertices,\n (ORIGIN_X + column * CELL_WIDTH) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT) * scale,\n CELL_WIDTH * cells * scale,\n LINE_HEIGHT * scale,\n glyph,\n foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n column += cells;\n }\n }\n }\n\n for (const row of renderRows) {\n for (const run of view.nativeStyleRows[row] ?? []) {\n const style = styleFor(run.styleId);\n if (style.invisible) continue;\n const x = (ORIGIN_X + run.cellStart * CELL_WIDTH) * scale;\n const width = run.cellSpan * CELL_WIDTH * scale;\n const rowTop = (ORIGIN_Y + row * LINE_HEIGHT) * scale;\n const stroke = Math.max(1, Math.round(scale));\n if (style.underline) {\n pushRectangle(\n rectangleVertices,\n x,\n Math.round(rowTop + 16 * scale),\n width,\n stroke,\n style.foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n if (style.strikethrough) {\n pushRectangle(\n rectangleVertices,\n x,\n Math.round(rowTop + 9 * scale),\n width,\n stroke,\n style.foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n }\n const decorationInstanceStart = backgroundInstanceCount + selectionInstanceCount;\n const decorationInstanceCount = rectangleVertices.length / 10 - decorationInstanceStart;\n return {\n rectangleData: new Float32Array(rectangleVertices),\n glyphData: new Float32Array(glyphVertices),\n colorGlyphData: new Float32Array(colorGlyphVertices),\n fallbackGlyphData: new Float32Array(fallbackGlyphVertices),\n backgroundInstanceCount,\n selectionInstanceCount,\n decorationInstanceStart,\n decorationInstanceCount,\n rectangleInstanceCount: rectangleVertices.length / 10,\n glyphInstanceCount: glyphVertices.length / 12,\n colorGlyphInstanceCount: colorGlyphVertices.length / 12,\n fallbackGlyphInstanceCount: fallbackGlyphVertices.length / 12,\n };\n }\n\n #encodeRender(id: string, view: RenderView, encoder: GPUCommandEncoder): TerminalRenderMetrics | undefined {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n const monoUploadsBefore = this.#performanceMeasurementEnabled ? this.#monoAtlas.uploadMetrics() : undefined;\n const colorUploadsBefore = this.#performanceMeasurementEnabled ? this.#colorAtlas.uploadMetrics() : undefined;\n const fallbackUploadsBefore = this.#performanceMeasurementEnabled ? this.#fallbackAtlas.uploadMetrics() : undefined;\n const scale = surface.dpr;\n const viewportWidth = surface.canvas.width;\n const viewportHeight = surface.canvas.height;\n const rowCount = Math.max(view.rows.length, view.nativeRows.length, view.nativeStyleRows.length);\n const { full: fullRedraw, rows: renderRows } = rowsForDamage(rowCount, view.damage, surface.sceneValid);\n const renderRowSet = new Set(renderRows);\n const rectangleVertices: number[] = [];\n const glyphVertices: number[] = [];\n const colorGlyphVertices: number[] = [];\n const fallbackGlyphVertices: number[] = [];\n const resolvedStyles = new Map<number, ResolvedStyle>();\n const styleFor = (styleId: number): ResolvedStyle => {\n const cached = resolvedStyles.get(styleId);\n if (cached) return cached;\n const resolved = resolveStyle(view.styleDefinitions.get(styleId), view.theme);\n resolvedStyles.set(styleId, resolved);\n return resolved;\n };\n const monoDefinitions = new Map<number, GlyphDefinition>();\n const colorDefinitions = new Map<number, GlyphDefinition>();\n for (const row of renderRows) {\n for (const glyph of view.nativeRows[row] ?? []) {\n const definition = view.glyphDefinitions.get(glyph.glyphId);\n if (!definition) continue;\n (definition.format === GlyphFormat.Rgba8Premultiplied ? colorDefinitions : monoDefinitions).set(\n definition.id,\n definition,\n );\n }\n }\n this.#monoAtlas.prepare(monoDefinitions.values());\n this.#colorAtlas.prepare(colorDefinitions.values());\n\n if (!fullRedraw) {\n for (const row of renderRows) {\n const top = row === 0 ? 0 : (ORIGIN_Y + row * LINE_HEIGHT) * scale;\n const bottom =\n row === rowCount - 1\n ? viewportHeight\n : Math.min(viewportHeight, (ORIGIN_Y + (row + 1) * LINE_HEIGHT) * scale);\n pushRectangle(\n rectangleVertices,\n 0,\n top,\n viewportWidth,\n Math.max(0, bottom - top),\n // The rectangle pipeline blends. Force the row reset opaque so it\n // replaces stale scene pixels even when a theme carries alpha.\n [view.theme.background[0], view.theme.background[1], view.theme.background[2], 1],\n viewportWidth,\n viewportHeight,\n );\n }\n }\n\n for (const row of renderRows) {\n for (const run of view.nativeStyleRows[row] ?? []) {\n const style = styleFor(run.styleId);\n if (!style.background) continue;\n pushRectangle(\n rectangleVertices,\n (ORIGIN_X + run.cellStart * CELL_WIDTH) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT) * scale,\n run.cellSpan * CELL_WIDTH * scale,\n LINE_HEIGHT * scale,\n style.background,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n const backgroundInstanceCount = rectangleVertices.length / 10;\n\n const selection = ordered(view.selection);\n if (selection) {\n const [start, end] = selection;\n for (const row of renderRows) {\n if (row < start.row || row > end.row) continue;\n const first = row === start.row ? start.column : 0;\n const last = row === end.row ? end.column : Math.max(0, cellLength(view.rows[row] ?? \"\") - 1);\n pushRectangle(\n rectangleVertices,\n (ORIGIN_X + first * CELL_WIDTH) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT) * scale,\n Math.max(1, last - first + 1) * CELL_WIDTH * scale,\n LINE_HEIGHT * scale,\n view.theme.selection,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n const selectionInstanceCount = rectangleVertices.length / 10 - backgroundInstanceCount;\n\n const hasNativeRows = view.nativeRows.some((row) => row.length > 0);\n if (!hasNativeRows) {\n this.#fallbackAtlas.prepare(\n renderRows.flatMap((row) => splitGraphemes(view.rows[row] ?? \"\")),\n scale,\n );\n }\n if (hasNativeRows) {\n for (const row of renderRows) {\n const { box: boxCells, block: blockCells } = specialDrawingCells(view.rows[row] ?? \"\");\n for (const instance of view.nativeRows[row] ?? []) {\n const definition = view.glyphDefinitions.get(instance.glyphId);\n if (!definition) continue;\n const style = styleFor(instance.styleId);\n if (style.invisible) continue;\n const isSelected = selectionContains(selection, row, instance.cellStart);\n const foreground = isSelected ? view.theme.selectionForeground : style.foreground;\n const boxDrawing = boxCells.get(instance.cellStart);\n if (boxDrawing) {\n let backdrop = style.background ?? view.theme.background;\n if (isSelected) backdrop = view.theme.selection;\n // Box glyphs are assembled from several overlapping primitives. Flatten\n // faint opacity against the cell backdrop first so joins are blended once,\n // instead of producing a brighter seam at every cell boundary.\n const boxColor = over(foreground, backdrop);\n pushBoxDrawing(\n rectangleVertices,\n boxDrawing,\n instance.cellStart,\n row,\n scale,\n boxColor,\n viewportWidth,\n viewportHeight,\n );\n continue;\n }\n const blockElement = blockCells.get(instance.cellStart);\n if (blockElement) {\n let backdrop = style.background ?? view.theme.background;\n if (isSelected) backdrop = view.theme.selection;\n const blockColor = over(foreground, backdrop);\n if (\n pushBlockElement(\n rectangleVertices,\n blockElement,\n instance.cellStart,\n row,\n scale,\n blockColor,\n viewportWidth,\n viewportHeight,\n )\n )\n continue;\n }\n const atlas = definition.format === GlyphFormat.Alpha8 ? this.#monoAtlas : this.#colorAtlas;\n const vertices = definition.format === GlyphFormat.Alpha8 ? glyphVertices : colorGlyphVertices;\n pushGlyph(\n vertices,\n (ORIGIN_X + instance.x) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT + instance.y) * scale,\n instance.width * scale,\n instance.height * scale,\n atlas.glyph(definition),\n foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n } else {\n for (const row of renderRows) {\n let column = 0;\n for (const grapheme of splitGraphemes(view.rows[row] ?? \"\")) {\n const glyph = this.#fallbackAtlas.glyph(grapheme, scale);\n const cells = glyph?.cells ?? graphemeCellWidth(grapheme);\n if (glyph) {\n const foreground = selectionContains(selection, row, column)\n ? view.theme.selectionForeground\n : view.theme.foreground;\n pushGlyph(\n fallbackGlyphVertices,\n (ORIGIN_X + column * CELL_WIDTH) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT) * scale,\n CELL_WIDTH * cells * scale,\n LINE_HEIGHT * scale,\n glyph,\n foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n column += cells;\n }\n }\n }\n\n for (const row of renderRows) {\n for (const run of view.nativeStyleRows[row] ?? []) {\n const style = styleFor(run.styleId);\n if (style.invisible) continue;\n const x = (ORIGIN_X + run.cellStart * CELL_WIDTH) * scale;\n const width = run.cellSpan * CELL_WIDTH * scale;\n const rowTop = (ORIGIN_Y + row * LINE_HEIGHT) * scale;\n const stroke = Math.max(1, Math.round(scale));\n if (style.underline) {\n pushRectangle(\n rectangleVertices,\n x,\n Math.round(rowTop + 16 * scale),\n width,\n stroke,\n style.foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n if (style.strikethrough) {\n pushRectangle(\n rectangleVertices,\n x,\n Math.round(rowTop + 9 * scale),\n width,\n stroke,\n style.foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n }\n const decorationInstanceStart = backgroundInstanceCount + selectionInstanceCount;\n const decorationInstanceCount = rectangleVertices.length / 10 - decorationInstanceStart;\n\n const cursorStyle = effectiveCursorStyle(view);\n if (cursorStyle !== null && renderRowSet.has(view.cursor.y)) {\n const x = (ORIGIN_X + view.cursor.x * CELL_WIDTH) * scale;\n const y = (ORIGIN_Y + view.cursor.y * LINE_HEIGHT) * scale;\n const width = CELL_WIDTH * scale;\n const height = LINE_HEIGHT * scale;\n const stroke = Math.max(1, Math.round(scale));\n const cursorColor: Rgba =\n cursorStyle === CursorStyle.HollowBlock\n ? [view.theme.cursor[0], view.theme.cursor[1], view.theme.cursor[2], 1]\n : view.theme.cursor;\n if (cursorStyle === CursorStyle.Bar) {\n pushRectangle(\n rectangleVertices,\n x,\n y,\n Math.max(2, Math.round(2 * scale)),\n height,\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n } else if (cursorStyle === CursorStyle.Underline) {\n const thickness = Math.max(2, Math.round(2 * scale));\n pushRectangle(\n rectangleVertices,\n x,\n y + height - thickness,\n width,\n thickness,\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n } else if (cursorStyle === CursorStyle.HollowBlock) {\n pushRectangle(rectangleVertices, x, y, width, stroke, cursorColor, viewportWidth, viewportHeight);\n pushRectangle(\n rectangleVertices,\n x,\n y + height - stroke,\n width,\n stroke,\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n pushRectangle(\n rectangleVertices,\n x,\n y + stroke,\n stroke,\n Math.max(0, height - stroke * 2),\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n pushRectangle(\n rectangleVertices,\n x + width - stroke,\n y + stroke,\n stroke,\n Math.max(0, height - stroke * 2),\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n } else {\n pushRectangle(rectangleVertices, x, y, width, height, cursorColor, viewportWidth, viewportHeight);\n }\n }\n const rectangleData = new Float32Array(rectangleVertices);\n const glyphData = new Float32Array(glyphVertices);\n const colorGlyphData = new Float32Array(colorGlyphVertices);\n const fallbackGlyphData = new Float32Array(fallbackGlyphVertices);\n const rectangleBuffer = surface.rectangleBuffer.write(rectangleData);\n const glyphBuffer = surface.glyphBuffer.write(glyphData);\n const colorGlyphBuffer = surface.colorGlyphBuffer.write(colorGlyphData);\n const fallbackGlyphBuffer = surface.fallbackGlyphBuffer.write(fallbackGlyphData);\n const cursorInstanceStart = decorationInstanceStart + decorationInstanceCount;\n const cursorInstanceCount = rectangleVertices.length / 10 - cursorInstanceStart;\n\n const pass = encoder.beginRenderPass({\n label: `terminal pass ${id}`,\n colorAttachments: [\n {\n view: surface.sceneTexture.createView(),\n clearValue: {\n r: view.theme.background[0],\n g: view.theme.background[1],\n b: view.theme.background[2],\n a: view.theme.background[3],\n },\n loadOp: fullRedraw ? \"clear\" : \"load\",\n storeOp: \"store\",\n },\n ],\n });\n if (rectangleBuffer && backgroundInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, rectangleBuffer);\n pass.draw(6, backgroundInstanceCount);\n }\n if (rectangleBuffer && selectionInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, rectangleBuffer);\n pass.draw(6, selectionInstanceCount, 0, backgroundInstanceCount);\n }\n if (glyphBuffer && glyphData.length > 0) {\n pass.setPipeline(this.#glyphPipeline);\n pass.setBindGroup(0, this.#monoAtlas.bindGroup);\n pass.setVertexBuffer(0, glyphBuffer);\n pass.draw(6, glyphVertices.length / 12);\n }\n if (colorGlyphBuffer && colorGlyphData.length > 0) {\n pass.setPipeline(this.#colorGlyphPipeline);\n pass.setBindGroup(0, this.#colorAtlas.bindGroup);\n pass.setVertexBuffer(0, colorGlyphBuffer);\n pass.draw(6, colorGlyphVertices.length / 12);\n }\n if (fallbackGlyphBuffer && fallbackGlyphData.length > 0) {\n pass.setPipeline(this.#fallbackGlyphPipeline);\n pass.setBindGroup(0, this.#fallbackAtlas.bindGroup);\n pass.setVertexBuffer(0, fallbackGlyphBuffer);\n pass.draw(6, fallbackGlyphVertices.length / 12);\n }\n if (rectangleBuffer && decorationInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, rectangleBuffer);\n pass.draw(6, decorationInstanceCount, 0, decorationInstanceStart);\n }\n if (rectangleBuffer && cursorInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, rectangleBuffer);\n pass.draw(6, cursorInstanceCount, 0, cursorInstanceStart);\n }\n pass.end();\n\n const postProcessPass = encoder.beginRenderPass({\n label: `Ghostty custom shader pass ${id}`,\n colorAttachments: [\n {\n view: surface.context.getCurrentTexture().createView(),\n clearValue: {\n r: view.theme.background[0],\n g: view.theme.background[1],\n b: view.theme.background[2],\n a: 1,\n },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n postProcessPass.setPipeline(this.#postProcessPipeline);\n postProcessPass.setBindGroup(0, surface.postProcessBindGroup);\n postProcessPass.draw(3);\n postProcessPass.end();\n surface.sceneValid = true;\n if (!this.#performanceMeasurementEnabled) return undefined;\n const monoUploadsAfter = this.#monoAtlas.uploadMetrics();\n const colorUploadsAfter = this.#colorAtlas.uploadMetrics();\n const fallbackUploadsAfter = this.#fallbackAtlas.uploadMetrics();\n return {\n queueSubmits: 0,\n fullRenders: Number(fullRedraw),\n partialRenders: Number(!fullRedraw),\n damagedRows: renderRows.length,\n geometryCacheHits: 0,\n geometryCacheMisses: 0,\n canvasPixels: viewportWidth * viewportHeight,\n renderPasses: 2,\n drawCalls:\n Number(backgroundInstanceCount > 0) +\n Number(selectionInstanceCount > 0) +\n Number(glyphData.length > 0) +\n Number(colorGlyphData.length > 0) +\n Number(fallbackGlyphData.length > 0) +\n Number(decorationInstanceCount > 0) +\n Number(cursorInstanceCount > 0) +\n 1,\n rectangleVertices: (rectangleVertices.length / 10) * 6,\n monoGlyphVertices: (glyphVertices.length / 12) * 6,\n colorGlyphVertices: (colorGlyphVertices.length / 12) * 6,\n fallbackGlyphVertices: (fallbackGlyphVertices.length / 12) * 6,\n vertexUploadBytes:\n rectangleData.byteLength + glyphData.byteLength + colorGlyphData.byteLength + fallbackGlyphData.byteLength,\n atlasUploadBytes:\n monoUploadsAfter.bytes -\n monoUploadsBefore!.bytes +\n (colorUploadsAfter.bytes - colorUploadsBefore!.bytes) +\n (fallbackUploadsAfter.bytes - fallbackUploadsBefore!.bytes),\n atlasUploadCalls:\n monoUploadsAfter.calls -\n monoUploadsBefore!.calls +\n (colorUploadsAfter.calls - colorUploadsBefore!.calls) +\n (fallbackUploadsAfter.calls - fallbackUploadsBefore!.calls),\n };\n }\n\n #encodeCachedRender(id: string, view: RenderView, encoder: GPUCommandEncoder): TerminalRenderMetrics | undefined {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n if (!surface.sceneValid || !view.damage || view.damage.full) return this.#encodeRender(id, view, encoder);\n const rowCount = Math.max(view.rows.length, view.nativeRows.length, view.nativeStyleRows.length);\n const damage = rowsForDamage(rowCount, view.damage, surface.sceneValid);\n const monoUploadsBefore = this.#performanceMeasurementEnabled ? this.#monoAtlas.uploadMetrics() : undefined;\n const colorUploadsBefore = this.#performanceMeasurementEnabled ? this.#colorAtlas.uploadMetrics() : undefined;\n const fallbackUploadsBefore = this.#performanceMeasurementEnabled ? this.#fallbackAtlas.uploadMetrics() : undefined;\n const scale = surface.dpr;\n const viewportWidth = surface.canvas.width;\n const viewportHeight = surface.canvas.height;\n const renderRowSet = new Set(damage.rows);\n const hasNativeRows = view.nativeRows.some((row) => row.length > 0);\n let geometry: CachedGeometry;\n let geometryUploadBytes = 0;\n const generations = (): [number, number, number] => [\n this.#monoAtlas.generation,\n this.#colorAtlas.generation,\n this.#fallbackAtlas.generation,\n ];\n let key = geometryCacheKey(view, damage.rows, hasNativeRows, generations());\n const cached = surface.geometryCache.get(key);\n const cacheHit = cached !== undefined;\n if (cached) {\n geometry = cached;\n surface.geometryCache.delete(key);\n surface.geometryCache.set(key, cached);\n } else {\n const admitted = surface.geometryCandidates.has(key);\n const candidateKey = key;\n const cpu = this.#buildGeometry(\n view,\n damage.rows,\n rowCount,\n false,\n hasNativeRows,\n scale,\n viewportWidth,\n viewportHeight,\n );\n key = geometryCacheKey(view, damage.rows, hasNativeRows, generations());\n const promote = admitted && key === candidateKey;\n geometry = {\n rectangleBuffer: promote\n ? createCachedVertexBuffer(this.device, `cached rectangles ${id}`, cpu.rectangleData)\n : surface.rectangleBuffer.write(cpu.rectangleData),\n glyphBuffer: promote\n ? createCachedVertexBuffer(this.device, `cached glyphs ${id}`, cpu.glyphData)\n : surface.glyphBuffer.write(cpu.glyphData),\n colorGlyphBuffer: promote\n ? createCachedVertexBuffer(this.device, `cached color glyphs ${id}`, cpu.colorGlyphData)\n : surface.colorGlyphBuffer.write(cpu.colorGlyphData),\n fallbackGlyphBuffer: promote\n ? createCachedVertexBuffer(this.device, `cached fallback glyphs ${id}`, cpu.fallbackGlyphData)\n : surface.fallbackGlyphBuffer.write(cpu.fallbackGlyphData),\n backgroundInstanceCount: cpu.backgroundInstanceCount,\n selectionInstanceCount: cpu.selectionInstanceCount,\n decorationInstanceStart: cpu.decorationInstanceStart,\n decorationInstanceCount: cpu.decorationInstanceCount,\n rectangleInstanceCount: cpu.rectangleInstanceCount,\n glyphInstanceCount: cpu.glyphInstanceCount,\n colorGlyphInstanceCount: cpu.colorGlyphInstanceCount,\n fallbackGlyphInstanceCount: cpu.fallbackGlyphInstanceCount,\n };\n geometryUploadBytes =\n cpu.rectangleData.byteLength +\n cpu.glyphData.byteLength +\n cpu.colorGlyphData.byteLength +\n cpu.fallbackGlyphData.byteLength;\n if (promote) {\n surface.geometryCandidates.delete(key);\n surface.geometryCache.set(key, geometry);\n while (surface.geometryCache.size > GEOMETRY_CACHE_LIMIT) {\n const oldestKey = surface.geometryCache.keys().next().value as string | undefined;\n if (oldestKey === undefined) break;\n const oldest = surface.geometryCache.get(oldestKey);\n if (oldest) destroyCachedGeometry(oldest);\n surface.geometryCache.delete(oldestKey);\n }\n } else {\n surface.geometryCandidates.delete(key);\n surface.geometryCandidates.set(key, true);\n while (surface.geometryCandidates.size > GEOMETRY_CACHE_LIMIT) {\n const oldestKey = surface.geometryCandidates.keys().next().value as string | undefined;\n if (oldestKey === undefined) break;\n surface.geometryCandidates.delete(oldestKey);\n }\n }\n }\n\n const cursorVertices: number[] = [];\n pushCursorVertices(cursorVertices, view, renderRowSet, scale, viewportWidth, viewportHeight);\n const cursorData = new Float32Array(cursorVertices);\n const cursorBuffer = surface.cursorBuffer.write(cursorData);\n const cursorInstanceStart = 0;\n const cursorInstanceCount = cursorData.length / 10;\n const pass = encoder.beginRenderPass({\n label: `terminal pass ${id}`,\n colorAttachments: [\n {\n view: surface.sceneTexture.createView(),\n clearValue: {\n r: view.theme.background[0],\n g: view.theme.background[1],\n b: view.theme.background[2],\n a: view.theme.background[3],\n },\n loadOp: \"load\",\n storeOp: \"store\",\n },\n ],\n });\n if (geometry.rectangleBuffer && geometry.backgroundInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, geometry.rectangleBuffer);\n pass.draw(6, geometry.backgroundInstanceCount);\n }\n if (geometry.rectangleBuffer && geometry.selectionInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, geometry.rectangleBuffer);\n pass.draw(6, geometry.selectionInstanceCount, 0, geometry.backgroundInstanceCount);\n }\n if (geometry.glyphBuffer && geometry.glyphInstanceCount > 0) {\n pass.setPipeline(this.#glyphPipeline);\n pass.setBindGroup(0, this.#monoAtlas.bindGroup);\n pass.setVertexBuffer(0, geometry.glyphBuffer);\n pass.draw(6, geometry.glyphInstanceCount);\n }\n if (geometry.colorGlyphBuffer && geometry.colorGlyphInstanceCount > 0) {\n pass.setPipeline(this.#colorGlyphPipeline);\n pass.setBindGroup(0, this.#colorAtlas.bindGroup);\n pass.setVertexBuffer(0, geometry.colorGlyphBuffer);\n pass.draw(6, geometry.colorGlyphInstanceCount);\n }\n if (geometry.fallbackGlyphBuffer && geometry.fallbackGlyphInstanceCount > 0) {\n pass.setPipeline(this.#fallbackGlyphPipeline);\n pass.setBindGroup(0, this.#fallbackAtlas.bindGroup);\n pass.setVertexBuffer(0, geometry.fallbackGlyphBuffer);\n pass.draw(6, geometry.fallbackGlyphInstanceCount);\n }\n if (geometry.rectangleBuffer && geometry.decorationInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, geometry.rectangleBuffer);\n pass.draw(6, geometry.decorationInstanceCount, 0, geometry.decorationInstanceStart);\n }\n if (cursorBuffer && cursorInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, cursorBuffer);\n pass.draw(6, cursorInstanceCount, 0, cursorInstanceStart);\n }\n pass.end();\n\n const postProcessPass = encoder.beginRenderPass({\n label: `Ghostty custom shader pass ${id}`,\n colorAttachments: [\n {\n view: surface.context.getCurrentTexture().createView(),\n clearValue: {\n r: view.theme.background[0],\n g: view.theme.background[1],\n b: view.theme.background[2],\n a: 1,\n },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n postProcessPass.setPipeline(this.#postProcessPipeline);\n postProcessPass.setBindGroup(0, surface.postProcessBindGroup);\n postProcessPass.draw(3);\n postProcessPass.end();\n surface.sceneValid = true;\n if (!this.#performanceMeasurementEnabled) return undefined;\n const monoUploadsAfter = this.#monoAtlas.uploadMetrics();\n const colorUploadsAfter = this.#colorAtlas.uploadMetrics();\n const fallbackUploadsAfter = this.#fallbackAtlas.uploadMetrics();\n return {\n queueSubmits: 0,\n fullRenders: 0,\n partialRenders: 1,\n damagedRows: damage.rows.length,\n geometryCacheHits: Number(cacheHit),\n geometryCacheMisses: Number(!cacheHit),\n canvasPixels: viewportWidth * viewportHeight,\n renderPasses: 2,\n drawCalls:\n Number(geometry.backgroundInstanceCount > 0) +\n Number(geometry.selectionInstanceCount > 0) +\n Number(geometry.glyphInstanceCount > 0) +\n Number(geometry.colorGlyphInstanceCount > 0) +\n Number(geometry.fallbackGlyphInstanceCount > 0) +\n Number(geometry.decorationInstanceCount > 0) +\n Number(cursorInstanceCount > 0) +\n 1,\n rectangleVertices: (geometry.rectangleInstanceCount + cursorInstanceCount) * 6,\n monoGlyphVertices: geometry.glyphInstanceCount * 6,\n colorGlyphVertices: geometry.colorGlyphInstanceCount * 6,\n fallbackGlyphVertices: geometry.fallbackGlyphInstanceCount * 6,\n vertexUploadBytes: geometryUploadBytes + cursorData.byteLength,\n atlasUploadBytes:\n monoUploadsAfter.bytes -\n monoUploadsBefore!.bytes +\n (colorUploadsAfter.bytes - colorUploadsBefore!.bytes) +\n (fallbackUploadsAfter.bytes - fallbackUploadsBefore!.bytes),\n atlasUploadCalls:\n monoUploadsAfter.calls -\n monoUploadsBefore!.calls +\n (colorUploadsAfter.calls - colorUploadsBefore!.calls) +\n (fallbackUploadsAfter.calls - fallbackUploadsBefore!.calls),\n };\n }\n\n settle(): Promise<void> {\n return this.device.queue.onSubmittedWorkDone();\n }\n\n destroy(): void {\n for (const id of [...this.#surfaces.keys()]) this.unmount(id);\n this.#monoAtlas.destroy();\n this.#colorAtlas.destroy();\n this.#fallbackAtlas.destroy();\n this.device.destroy();\n }\n}\n", "export interface AppliedFrameState {\n sessionEpoch: bigint;\n layoutEpoch: bigint;\n sequence: bigint;\n awaitingResync: boolean;\n}\n\nexport interface IncomingFrameState {\n sessionEpoch: bigint;\n layoutEpoch: bigint;\n sequence: bigint;\n full: boolean;\n}\n\nexport function classifyFrame(\n previous: AppliedFrameState,\n incoming: IncomingFrameState,\n): \"accept\" | \"stale\" | \"resync\" {\n const sameSession = previous.sessionEpoch === 0n || incoming.sessionEpoch === previous.sessionEpoch;\n if (\n sameSession &&\n (incoming.layoutEpoch < previous.layoutEpoch ||\n (incoming.layoutEpoch === previous.layoutEpoch && incoming.sequence <= previous.sequence))\n )\n return \"stale\";\n if (previous.awaitingResync && !incoming.full) return \"resync\";\n const changedSession = !sameSession;\n const missingInitialSnapshot = previous.sessionEpoch === 0n && !incoming.full;\n const sequenceGap =\n previous.sessionEpoch === incoming.sessionEpoch &&\n previous.sequence !== 0n &&\n incoming.sequence !== previous.sequence + 1n;\n return !incoming.full && (changedSession || missingInitialSnapshot || sequenceGap) ? \"resync\" : \"accept\";\n}\n", "import type { CursorState } from \"@vibecook/ghosttea-frame\";\n\nexport function cursorActivityChangesPixels(\n cursor: CursorState,\n focused: boolean,\n cursorBlinkVisible: boolean,\n): boolean {\n return focused && cursor.visible && cursor.blinking && !cursorBlinkVisible;\n}\n", "export interface GlyphCatalogBudget {\n maxDefinitions: number;\n maxSharedDefinitions: number;\n maxSessionPixelBytes: number;\n maxSharedPixelBytes: number;\n}\n\nexport type CatalogAdmission = \"install\" | \"request-full\" | \"text-fallback\";\n\nexport function catalogAdmission(\n resetsCatalog: boolean,\n alreadyUsingFallback: boolean,\n fits: boolean,\n): CatalogAdmission {\n if (alreadyUsingFallback && !resetsCatalog) return \"text-fallback\";\n if (fits) return \"install\";\n return resetsCatalog ? \"text-fallback\" : \"request-full\";\n}\n\ninterface GlyphLike {\n id: number;\n pixels: { byteLength: number };\n}\n\nexport function glyphCatalogFits<T extends GlyphLike>(\n sessionDefinitions: ReadonlyMap<number, T>,\n sessionPixelBytes: number,\n sharedDefinitions: ReadonlyMap<number, { definition: T }>,\n sharedPixelBytes: number,\n definitions: readonly T[],\n budget: GlyphCatalogBudget,\n): boolean {\n if (definitions.length === 0) return true;\n let nextDefinitionCount = sessionDefinitions.size;\n let nextSharedDefinitionCount = sharedDefinitions.size;\n let nextSessionPixelBytes = sessionPixelBytes;\n let nextSharedPixelBytes = sharedPixelBytes;\n const pending = new Set<number>();\n for (const definition of definitions) {\n if (sessionDefinitions.has(definition.id) || pending.has(definition.id)) continue;\n pending.add(definition.id);\n const shared = sharedDefinitions.get(definition.id);\n const pixelBytes = shared?.definition.pixels.byteLength ?? definition.pixels.byteLength;\n nextDefinitionCount += 1;\n nextSessionPixelBytes += pixelBytes;\n if (!shared) {\n nextSharedDefinitionCount += 1;\n nextSharedPixelBytes += pixelBytes;\n }\n if (\n nextDefinitionCount > budget.maxDefinitions ||\n nextSharedDefinitionCount > budget.maxSharedDefinitions ||\n nextSessionPixelBytes > budget.maxSessionPixelBytes ||\n nextSharedPixelBytes > budget.maxSharedPixelBytes\n )\n return false;\n }\n return true;\n}\n\nexport function definitionCatalogFits<T extends { id: number }>(\n installed: ReadonlyMap<number, T>,\n definitions: readonly T[],\n maxDefinitions: number,\n retainedDefinitions = installed.size,\n maxRetainedDefinitions = Number.MAX_SAFE_INTEGER,\n): boolean {\n if (definitions.length === 0) return true;\n let nextDefinitionCount = installed.size;\n let nextRetainedDefinitions = retainedDefinitions;\n const pending = new Set<number>();\n for (const definition of definitions) {\n if (installed.has(definition.id) || pending.has(definition.id)) continue;\n pending.add(definition.id);\n nextDefinitionCount += 1;\n nextRetainedDefinitions += 1;\n if (nextDefinitionCount > maxDefinitions || nextRetainedDefinitions > maxRetainedDefinitions) return false;\n }\n return true;\n}\n", "/// <reference lib=\"webworker\" />\n/// <reference types=\"@webgpu/types\" />\n\nimport {\n decodeClipboardWrite,\n decodeCursorState,\n decodeFrame,\n decodeGlyphDefinitions,\n decodeRowReplacements,\n decodeScrollbarState,\n decodeStyleDefinitions,\n FrameFlag,\n type CursorState,\n type GlyphDefinition,\n type GlyphInstance,\n type StyleDefinition,\n type StyleRun,\n SectionKind,\n} from \"@vibecook/ghosttea-frame\";\nimport type { TerminalScrollbarState } from \"@vibecook/ghosttea-protocol\";\nimport { CanvasTerminalRenderer } from \"./renderers/canvas-renderer.js\";\nimport {\n DEFAULT_EFFECTS,\n DEFAULT_THEME,\n type CellSelection,\n type PixelSize,\n type RenderView,\n type TerminalRenderer,\n type TerminalEffects,\n type TerminalTheme,\n renderedSizeChanged,\n} from \"./renderers/types.js\";\nimport { WebGpuTerminalRenderer } from \"./renderers/webgpu-renderer.js\";\nimport { classifyFrame } from \"./frame-sequence.js\";\nimport { cursorActivityChangesPixels } from \"./cursor-invalidation.js\";\nimport { emptyRenderMetrics, type TerminalRenderPerformanceSnapshot } from \"./performance.js\";\nimport type { RendererToWorkerMessage, WorkerToRendererMessage } from \"./worker-messages.js\";\nimport { catalogAdmission, definitionCatalogFits, glyphCatalogFits } from \"./catalog-budget.js\";\n\ninterface SessionSnapshot {\n rows: string[];\n nativeRows: GlyphInstance[][];\n nativeStyleRows: StyleRun[][];\n glyphDefinitions: Map<number, GlyphDefinition>;\n glyphPixelBytes: number;\n styleDefinitions: Map<number, StyleDefinition>;\n rowRevisions: bigint[];\n cursor: CursorState;\n layoutEpoch: bigint;\n sessionEpoch: bigint;\n sequence: bigint;\n awaitingResync: boolean;\n catalogFallback: boolean;\n scrollbar: TerminalScrollbarState | null;\n}\n\ninterface SurfaceSnapshot {\n sessionHandle: string;\n focused: boolean;\n cursorBlinkVisible: boolean;\n selection: CellSelection | null;\n theme: TerminalTheme;\n effects: TerminalEffects;\n damage: { full: boolean; rows: Set<number>; geometryChanged: boolean };\n}\n\ninterface MountedCanvas {\n canvas: OffscreenCanvas;\n size: PixelSize;\n sessionHandle: string;\n}\n\ninterface SessionPresentationDefaults {\n theme: TerminalTheme;\n effects: TerminalEffects;\n selection: CellSelection | null;\n visible: boolean;\n}\n\nconst hiddenCursor: CursorState = { x: 0, y: 0, visible: false, style: 1, blinking: false };\nconst CURSOR_BLINK_INTERVAL_MS = 600;\nconst MAX_SESSION_GLYPH_DEFINITIONS = 65_536;\nconst MAX_SESSION_GLYPH_PIXEL_BYTES = 64 * 1024 * 1024;\nconst MAX_SESSION_STYLE_DEFINITIONS = 65_536;\nconst MAX_SHARED_GLYPH_DEFINITIONS = 131_072;\nconst MAX_SHARED_GLYPH_PIXEL_BYTES = 128 * 1024 * 1024;\nconst MAX_RETAINED_STYLE_DEFINITIONS = 262_144;\nconst GLYPH_CATALOG_BUDGET = {\n maxDefinitions: MAX_SESSION_GLYPH_DEFINITIONS,\n maxSharedDefinitions: MAX_SHARED_GLYPH_DEFINITIONS,\n maxSessionPixelBytes: MAX_SESSION_GLYPH_PIXEL_BYTES,\n maxSharedPixelBytes: MAX_SHARED_GLYPH_PIXEL_BYTES,\n} as const;\nconst NO_GLYPH_DEFINITIONS: readonly GlyphDefinition[] = [];\nconst NO_STYLE_DEFINITIONS: readonly StyleDefinition[] = [];\nconst MAX_PERFORMANCE_SAMPLES = 100_000;\nconst FRAME_CREDIT_BATCH_BYTES = 4 * 1024 * 1024;\nconst FRAME_CREDIT_MAX_DELAY_MS = 8;\nconst snapshots = new Map<string, SessionSnapshot>();\nconst sharedGlyphDefinitions = new Map<number, { definition: GlyphDefinition; references: number }>();\nlet sharedGlyphPixelBytes = 0;\nlet retainedStyleDefinitions = 0;\nconst surfaces = new Map<string, SurfaceSnapshot>();\nconst surfaceIdsBySession = new Map<string, Set<string>>();\nconst noSurfaceIds: ReadonlySet<string> = new Set();\nconst presentationDefaults = new Map<string, SessionPresentationDefaults>();\nconst mounts = new Map<string, MountedCanvas>();\nconst cursorBlinkTimers = new Map<string, ReturnType<typeof setTimeout>>();\nconst dirty = new Set<string>();\n// Occluded surfaces continue ingesting frames so they resume from current state,\n// but do not schedule GPU flushes or cursor timers while their native tab is hidden.\nconst occluded = new Set<string>();\n// A frozen replica must not animate: a blinking cursor on a screen the host\n// stopped updating reads as a live session. Focus is left untouched, since the\n// runtime owns focus truth for control reclaim.\nconst frozenCursors = new Set<string>();\nlet renderer: TerminalRenderer | undefined;\nlet rendererPromise: Promise<TerminalRenderer> | undefined;\nlet flushScheduled = false;\nlet recoveryAttempts = 0;\nlet recovering = false;\nlet nativeTextAnnounced = false;\nlet forceCanvasFallback = false;\nlet partialRenderingEnabled = true;\nlet pendingFrameCreditBytes = 0;\nlet frameCreditTimer: ReturnType<typeof setTimeout> | undefined;\n\ninterface ActivePerformanceMeasurement {\n startedAt: number;\n lastActivityAt: number;\n lastFrameAt: Map<string, number>;\n dirtySince: Map<string, number>;\n frames: TerminalRenderPerformanceSnapshot[\"frames\"];\n scheduling: TerminalRenderPerformanceSnapshot[\"scheduling\"];\n renderer: TerminalRenderPerformanceSnapshot[\"renderer\"];\n samples: TerminalRenderPerformanceSnapshot[\"samples\"];\n}\n\nlet performanceMeasurement: ActivePerformanceMeasurement | undefined;\n\nfunction appendPerformanceSample(samples: number[], value: number): void {\n if (samples.length < MAX_PERFORMANCE_SAMPLES) samples.push(value);\n}\n\nfunction flushFrameCredit(): void {\n if (frameCreditTimer !== undefined) clearTimeout(frameCreditTimer);\n frameCreditTimer = undefined;\n if (pendingFrameCreditBytes === 0) return;\n const bytes = pendingFrameCreditBytes;\n pendingFrameCreditBytes = 0;\n postToRenderer({ type: \"frame-credit\", bytes });\n}\n\nfunction returnFrameCredit(bytes: number): void {\n pendingFrameCreditBytes += bytes;\n if (pendingFrameCreditBytes >= FRAME_CREDIT_BATCH_BYTES) {\n flushFrameCredit();\n } else if (frameCreditTimer === undefined) {\n frameCreditTimer = setTimeout(flushFrameCredit, FRAME_CREDIT_MAX_DELAY_MS);\n }\n}\n\nfunction beginPerformanceMeasurement(): void {\n const now = performance.now();\n performanceMeasurement = {\n startedAt: now,\n lastActivityAt: now,\n lastFrameAt: new Map(),\n dirtySince: new Map(),\n frames: {\n received: 0,\n bytes: 0,\n full: 0,\n incremental: 0,\n stale: 0,\n resyncRequested: 0,\n rowsDecoded: 0,\n glyphDefinitions: 0,\n },\n scheduling: { flushes: 0, renderCalls: 0, maximumDirtyPanes: 0, panesPerFlush: [] },\n renderer: {\n queueSubmits: 0,\n fullRenders: 0,\n partialRenders: 0,\n damagedRows: 0,\n geometryCacheHits: 0,\n geometryCacheMisses: 0,\n canvasPixelFrames: 0,\n renderPasses: 0,\n drawCalls: 0,\n rectangleVertices: 0,\n monoGlyphVertices: 0,\n colorGlyphVertices: 0,\n fallbackGlyphVertices: 0,\n vertexUploadBytes: 0,\n atlasUploadBytes: 0,\n atlasUploadCalls: 0,\n },\n samples: { frameApplyMs: [], renderCpuMs: [], dirtyToRenderMs: [], frameArrivalToRenderMs: [] },\n };\n renderer?.setPerformanceMeasurementEnabled?.(true);\n}\n\nfunction notePerformanceActivity(now = performance.now()): void {\n if (performanceMeasurement) performanceMeasurement.lastActivityAt = now;\n}\n\nfunction recordRenderMetrics(metrics: ReturnType<typeof emptyRenderMetrics>): void {\n const target = performanceMeasurement?.renderer;\n if (!target) return;\n target.queueSubmits += metrics.queueSubmits;\n target.fullRenders += metrics.fullRenders;\n target.partialRenders += metrics.partialRenders;\n target.damagedRows += metrics.damagedRows;\n target.geometryCacheHits += metrics.geometryCacheHits;\n target.geometryCacheMisses += metrics.geometryCacheMisses;\n target.canvasPixelFrames += metrics.canvasPixels;\n target.renderPasses += metrics.renderPasses;\n target.drawCalls += metrics.drawCalls;\n target.rectangleVertices += metrics.rectangleVertices;\n target.monoGlyphVertices += metrics.monoGlyphVertices;\n target.colorGlyphVertices += metrics.colorGlyphVertices;\n target.fallbackGlyphVertices += metrics.fallbackGlyphVertices;\n target.vertexUploadBytes += metrics.vertexUploadBytes;\n target.atlasUploadBytes += metrics.atlasUploadBytes;\n target.atlasUploadCalls += metrics.atlasUploadCalls;\n}\n\nasync function finishPerformanceMeasurement(requestId: number, quietMs: number, timeoutMs: number): Promise<void> {\n const active = performanceMeasurement;\n if (!active) throw new Error(\"No terminal render performance measurement is active\");\n const deadline = performance.now() + timeoutMs;\n let timedOutWaitingForIdle = false;\n let gpuQueueDrainMs: number | null = null;\n\n while (true) {\n const now = performance.now();\n const hasVisibleDirty = [...dirty].some((id) => !occluded.has(id));\n if (!flushScheduled && !hasVisibleDirty && now - active.lastActivityAt >= quietMs) {\n const beforeDrainActivity = active.lastActivityAt;\n if (renderer?.settle) {\n const drainStarted = performance.now();\n await renderer.settle();\n gpuQueueDrainMs = performance.now() - drainStarted;\n }\n if (active.lastActivityAt === beforeDrainActivity && !flushScheduled) break;\n }\n if (now >= deadline) {\n timedOutWaitingForIdle = true;\n break;\n }\n await new Promise((resolve) => setTimeout(resolve, Math.min(25, Math.max(1, quietMs / 4))));\n }\n\n if (timedOutWaitingForIdle && renderer?.settle) {\n const drainStarted = performance.now();\n await renderer.settle();\n gpuQueueDrainMs = performance.now() - drainStarted;\n }\n const snapshot: TerminalRenderPerformanceSnapshot = {\n backend: renderer?.kind ?? \"starting\",\n durationMs: performance.now() - active.startedAt,\n timedOutWaitingForIdle,\n gpuQueueDrainMs,\n frames: active.frames,\n scheduling: active.scheduling,\n renderer: active.renderer,\n samples: active.samples,\n };\n renderer?.setPerformanceMeasurementEnabled?.(false);\n if (performanceMeasurement === active) performanceMeasurement = undefined;\n postToRenderer({ type: \"performance-result\", requestId, snapshot });\n}\n\nfunction postToRenderer(message: WorkerToRendererMessage): void {\n self.postMessage(message);\n}\n\nfunction snapshot(sessionHandle: string): SessionSnapshot {\n let value = snapshots.get(sessionHandle);\n if (!value) {\n value = {\n rows: [],\n nativeRows: [],\n nativeStyleRows: [],\n glyphDefinitions: new Map(),\n glyphPixelBytes: 0,\n styleDefinitions: new Map(),\n rowRevisions: [],\n cursor: hiddenCursor,\n layoutEpoch: 0n,\n sessionEpoch: 0n,\n sequence: 0n,\n awaitingResync: false,\n catalogFallback: false,\n scrollbar: null,\n };\n snapshots.set(sessionHandle, value);\n }\n return value;\n}\n\nfunction clearSessionCatalog(session: SessionSnapshot): void {\n for (const glyphId of session.glyphDefinitions.keys()) {\n const shared = sharedGlyphDefinitions.get(glyphId);\n if (!shared) continue;\n shared.references -= 1;\n if (shared.references <= 0) {\n sharedGlyphDefinitions.delete(glyphId);\n sharedGlyphPixelBytes -= shared.definition.pixels.byteLength;\n }\n }\n session.glyphDefinitions.clear();\n session.glyphPixelBytes = 0;\n retainedStyleDefinitions -= session.styleDefinitions.size;\n session.styleDefinitions.clear();\n}\n\nfunction installGlyphDefinitions(session: SessionSnapshot, definitions: readonly GlyphDefinition[]): void {\n for (const decoded of definitions) {\n if (session.glyphDefinitions.has(decoded.id)) continue;\n let shared = sharedGlyphDefinitions.get(decoded.id);\n const pixelBytes = shared?.definition.pixels.byteLength ?? decoded.pixels.byteLength;\n if (shared) {\n shared.references += 1;\n } else {\n shared = { definition: decoded, references: 1 };\n sharedGlyphDefinitions.set(decoded.id, shared);\n sharedGlyphPixelBytes += decoded.pixels.byteLength;\n }\n session.glyphDefinitions.set(decoded.id, shared.definition);\n session.glyphPixelBytes += pixelBytes;\n }\n}\n\nfunction installStyleDefinitions(session: SessionSnapshot, definitions: readonly StyleDefinition[]): void {\n for (const definition of definitions) {\n if (session.styleDefinitions.has(definition.id)) continue;\n session.styleDefinitions.set(definition.id, definition);\n retainedStyleDefinitions += 1;\n }\n}\n\nfunction dropSessionSnapshot(sessionHandle: string): void {\n const session = snapshots.get(sessionHandle);\n if (session) clearSessionCatalog(session);\n snapshots.delete(sessionHandle);\n}\n\nfunction defaults(sessionHandle: string): SessionPresentationDefaults {\n let value = presentationDefaults.get(sessionHandle);\n if (!value) {\n value = { theme: DEFAULT_THEME, effects: DEFAULT_EFFECTS, selection: null, visible: true };\n presentationDefaults.set(sessionHandle, value);\n }\n return value;\n}\n\nfunction surface(surfaceId: string, sessionHandle: string): SurfaceSnapshot {\n const existing = surfaces.get(surfaceId);\n if (existing) {\n if (existing.sessionHandle !== sessionHandle) throw new Error(`Surface ${surfaceId} changed sessions`);\n return existing;\n }\n const initial = defaults(sessionHandle);\n const value: SurfaceSnapshot = {\n sessionHandle,\n focused: false,\n cursorBlinkVisible: true,\n selection: initial.selection,\n theme: initial.theme,\n effects: initial.effects,\n damage: { full: true, rows: new Set(), geometryChanged: true },\n };\n surfaces.set(surfaceId, value);\n let sessionSurfaceIds = surfaceIdsBySession.get(sessionHandle);\n if (!sessionSurfaceIds) {\n sessionSurfaceIds = new Set();\n surfaceIdsBySession.set(sessionHandle, sessionSurfaceIds);\n }\n sessionSurfaceIds.add(surfaceId);\n if (!initial.visible) occluded.add(surfaceId);\n return value;\n}\n\nfunction surfaceIdsForSession(sessionHandle: string): ReadonlySet<string> {\n return surfaceIdsBySession.get(sessionHandle) ?? noSurfaceIds;\n}\n\nfunction deleteSurface(surfaceId: string): SurfaceSnapshot | undefined {\n const value = surfaces.get(surfaceId);\n if (!value) return undefined;\n surfaces.delete(surfaceId);\n const sessionSurfaceIds = surfaceIdsBySession.get(value.sessionHandle);\n sessionSurfaceIds?.delete(surfaceId);\n if (sessionSurfaceIds?.size === 0) surfaceIdsBySession.delete(value.sessionHandle);\n return value;\n}\n\nfunction renderView(session: SessionSnapshot, presentation: SurfaceSnapshot): RenderView {\n return {\n rows: session.rows,\n nativeRows: session.nativeRows,\n nativeStyleRows: session.nativeStyleRows,\n rowRevisions: session.rowRevisions,\n glyphDefinitions: session.glyphDefinitions,\n styleDefinitions: session.styleDefinitions,\n sessionEpoch: session.sessionEpoch,\n layoutEpoch: session.layoutEpoch,\n cursor: session.cursor,\n focused: presentation.focused,\n cursorBlinkVisible: presentation.cursorBlinkVisible,\n selection: presentation.selection,\n theme: presentation.theme,\n effects: presentation.effects,\n damage: presentation.damage,\n };\n}\n\nfunction scheduleCursorBlink(surfaceId: string, reset: boolean): void {\n const existing = cursorBlinkTimers.get(surfaceId);\n if (existing !== undefined) clearTimeout(existing);\n cursorBlinkTimers.delete(surfaceId);\n const value = surfaces.get(surfaceId);\n if (!value) return;\n const session = snapshot(value.sessionHandle);\n if (reset) value.cursorBlinkVisible = true;\n if (\n occluded.has(surfaceId) ||\n frozenCursors.has(surfaceId) ||\n !value.focused ||\n !session.cursor.visible ||\n !session.cursor.blinking\n )\n return;\n cursorBlinkTimers.set(\n surfaceId,\n setTimeout(() => {\n cursorBlinkTimers.delete(surfaceId);\n const current = surfaces.get(surfaceId);\n const currentSession = current ? snapshots.get(current.sessionHandle) : undefined;\n if (\n occluded.has(surfaceId) ||\n !current ||\n !currentSession ||\n !current.focused ||\n !currentSession.cursor.visible ||\n !currentSession.cursor.blinking\n )\n return;\n current.cursorBlinkVisible = !current.cursorBlinkVisible;\n invalidateRows(surfaceId, [currentSession.cursor.y]);\n scheduleCursorBlink(surfaceId, false);\n }, CURSOR_BLINK_INTERVAL_MS),\n );\n}\n\nasync function createRenderer(): Promise<TerminalRenderer> {\n if (forceCanvasFallback) {\n const canvas = new CanvasTerminalRenderer();\n postToRenderer({ type: \"renderer-status\", backend: canvas.kind, recovered: true });\n return canvas;\n }\n try {\n const gpu = await WebGpuTerminalRenderer.create((info) => void recoverDevice(info));\n recoveryAttempts = 0;\n postToRenderer({ type: \"renderer-status\", backend: gpu.kind });\n return gpu;\n } catch (error) {\n console.warn(\"[terminal-renderer] WebGPU unavailable; using diagnostic Canvas2D\", error);\n const canvas = new CanvasTerminalRenderer();\n postToRenderer({ type: \"renderer-status\", backend: canvas.kind });\n return canvas;\n }\n}\n\nasync function ensureRenderer(): Promise<TerminalRenderer> {\n rendererPromise ??= createRenderer();\n renderer = await rendererPromise;\n return renderer;\n}\n\nasync function recoverDevice(info: GPUDeviceLostInfo): Promise<void> {\n if (recovering || renderer?.kind === \"canvas2d\") return;\n recovering = true;\n recoveryAttempts += 1;\n console.warn(`[terminal-renderer] WebGPU device lost (${info.reason}): ${info.message}`);\n renderer = undefined;\n rendererPromise = WebGpuTerminalRenderer.create((nextInfo) => void recoverDevice(nextInfo));\n try {\n const next = await rendererPromise;\n renderer = next;\n recoveryAttempts = 0;\n recovering = false;\n for (const [id, mount] of mounts) {\n next.mount(id, mount.canvas);\n next.resize(id, mount.size);\n invalidateFull(id);\n }\n postToRenderer({ type: \"renderer-status\", backend: next.kind, recovered: true });\n } catch (error) {\n console.error(\"[terminal-renderer] WebGPU recovery failed\", error);\n rendererPromise = undefined;\n recovering = false;\n if (recoveryAttempts >= 3) {\n postToRenderer({ type: \"renderer-reload-required\", reason: \"webgpu-device-loss\" });\n return;\n }\n const delay = Math.min(5_000, 250 * 2 ** Math.min(recoveryAttempts, 4));\n setTimeout(() => void recoverDevice(info), delay);\n }\n}\n\nfunction scheduleFlush(): void {\n if (flushScheduled) return;\n flushScheduled = true;\n const run = (): void => {\n flushScheduled = false;\n void flush();\n };\n if (typeof self.requestAnimationFrame === \"function\") self.requestAnimationFrame(run);\n else setTimeout(run, 8);\n}\n\nasync function flush(): Promise<void> {\n const backend = await ensureRenderer();\n const ids = [...dirty].filter((id) => !occluded.has(id));\n if (performanceMeasurement && ids.length > 0) {\n performanceMeasurement.scheduling.flushes += 1;\n appendPerformanceSample(performanceMeasurement.scheduling.panesPerFlush, ids.length);\n performanceMeasurement.scheduling.maximumDirtyPanes = Math.max(\n performanceMeasurement.scheduling.maximumDirtyPanes,\n ids.length,\n );\n }\n for (const id of ids) dirty.delete(id);\n const entries = ids.flatMap((id) => {\n const presentation = surfaces.get(id);\n const session = presentation ? snapshots.get(presentation.sessionHandle) : undefined;\n return mounts.has(id) && presentation && session ? [{ id, view: renderView(session, presentation) }] : [];\n });\n if (entries.length > 0) {\n try {\n const active = performanceMeasurement;\n const beforeRender = active ? performance.now() : 0;\n const metrics = backend.renderBatch\n ? backend.renderBatch(entries)\n : entries.map(({ id, view }) => backend.render(id, view));\n const renderedAt = active ? performance.now() : 0;\n for (const { id } of entries) {\n const damage = surfaces.get(id)?.damage;\n if (!damage) continue;\n damage.full = false;\n damage.rows.clear();\n damage.geometryChanged = false;\n }\n if (active && performanceMeasurement === active) {\n active.scheduling.renderCalls += entries.length;\n appendPerformanceSample(active.samples.renderCpuMs, renderedAt - beforeRender);\n for (let index = 0; index < entries.length; index += 1) {\n const { id } = entries[index]!;\n const dirtySince = active.dirtySince.get(id);\n const sessionHandle = surfaces.get(id)?.sessionHandle;\n const lastFrameAt = sessionHandle ? active.lastFrameAt.get(sessionHandle) : undefined;\n if (dirtySince !== undefined)\n appendPerformanceSample(active.samples.dirtyToRenderMs, renderedAt - dirtySince);\n if (lastFrameAt !== undefined)\n appendPerformanceSample(active.samples.frameArrivalToRenderMs, renderedAt - lastFrameAt);\n active.dirtySince.delete(id);\n recordRenderMetrics(metrics[index] ?? emptyRenderMetrics());\n }\n notePerformanceActivity(renderedAt);\n }\n } catch (error) {\n console.error(`[terminal-renderer] failed to render ${entries.length} view(s)`, error);\n }\n }\n if ([...dirty].some((id) => !occluded.has(id))) scheduleFlush();\n}\n\nfunction markDirty(id: string): void {\n if (performanceMeasurement && !performanceMeasurement.dirtySince.has(id)) {\n performanceMeasurement.dirtySince.set(id, performance.now());\n }\n dirty.add(id);\n if (!occluded.has(id)) scheduleFlush();\n}\n\nfunction invalidateFull(id: string): void {\n const value = surfaces.get(id);\n if (!value) return;\n const damage = value.damage;\n damage.full = true;\n damage.rows.clear();\n damage.geometryChanged = true;\n markDirty(id);\n}\n\nfunction invalidateRows(id: string, rows: Iterable<number>, geometryChanged = false): void {\n if (!partialRenderingEnabled) {\n invalidateFull(id);\n return;\n }\n const value = surfaces.get(id);\n if (!value) return;\n const damage = value.damage;\n if (!damage.full) {\n damage.geometryChanged ||= geometryChanged;\n for (const row of rows) {\n if (Number.isSafeInteger(row) && row >= 0) damage.rows.add(row);\n }\n }\n markDirty(id);\n}\n\nfunction invalidateSessionFull(sessionHandle: string): void {\n for (const surfaceId of surfaceIdsForSession(sessionHandle)) invalidateFull(surfaceId);\n}\n\nfunction invalidateSessionRows(sessionHandle: string, rows: Iterable<number>, geometryChanged = false): void {\n const damagedRows = [...rows];\n for (const surfaceId of surfaceIdsForSession(sessionHandle)) invalidateRows(surfaceId, damagedRows, geometryChanged);\n}\n\nasync function mount(surfaceId: string, sessionHandle: string, canvas: OffscreenCanvas): Promise<void> {\n if (mounts.has(surfaceId)) renderer?.unmount(surfaceId);\n snapshot(sessionHandle);\n surface(surfaceId, sessionHandle);\n const entry: MountedCanvas = { canvas, size: { width: 1, height: 1, dpr: 1 }, sessionHandle };\n mounts.set(surfaceId, entry);\n const backend = await ensureRenderer();\n if (mounts.get(surfaceId) !== entry) return;\n backend.mount(surfaceId, canvas);\n backend.resize(surfaceId, entry.size);\n invalidateFull(surfaceId);\n}\n\nfunction applyFrame(packet: ArrayBuffer): void {\n const active = performanceMeasurement;\n const applyStarted = active ? performance.now() : 0;\n if (active) {\n active.frames.received += 1;\n active.frames.bytes += packet.byteLength;\n active.lastActivityAt = applyStarted;\n }\n const frame = decodeFrame(packet);\n const id = frame.sessionHandle.toString();\n if (active) {\n active.lastFrameAt.set(id, applyStarted);\n if ((frame.flags & FrameFlag.FullSnapshot) !== 0) active.frames.full += 1;\n else active.frames.incremental += 1;\n }\n const previous = snapshot(id);\n const fullFrame = (frame.flags & FrameFlag.FullSnapshot) !== 0;\n const catalogReset = (frame.flags & FrameFlag.CatalogReset) !== 0;\n if (catalogReset && !fullFrame) {\n if (active) {\n active.frames.resyncRequested += 1;\n appendPerformanceSample(active.samples.frameApplyMs, performance.now() - applyStarted);\n }\n previous.awaitingResync = true;\n postToRenderer({ type: \"frame-resync-needed\", sessionHandle: id });\n return;\n }\n const classification = classifyFrame(previous, {\n sessionEpoch: frame.sessionEpoch,\n layoutEpoch: frame.layoutEpoch,\n sequence: frame.frameSequence,\n full: fullFrame,\n });\n if (classification === \"stale\") {\n if (active) {\n active.frames.stale += 1;\n appendPerformanceSample(active.samples.frameApplyMs, performance.now() - applyStarted);\n }\n return;\n }\n const changedSession = previous.sessionEpoch !== 0n && frame.sessionEpoch !== previous.sessionEpoch;\n if (classification === \"resync\") {\n if (active) {\n active.frames.resyncRequested += 1;\n appendPerformanceSample(active.samples.frameApplyMs, performance.now() - applyStarted);\n }\n previous.awaitingResync = true;\n postToRenderer({ type: \"frame-resync-needed\", sessionHandle: id });\n return;\n }\n const completingResync = previous.awaitingResync;\n const rowSection = frame.sections.find((candidate) => candidate.kind === SectionKind.RowReplacements);\n const cursorSection = frame.sections.find((candidate) => candidate.kind === SectionKind.CursorState);\n const glyphSection = frame.sections.find((candidate) => candidate.kind === SectionKind.GlyphDefinitions);\n const styleSection = frame.sections.find((candidate) => candidate.kind === SectionKind.StyleDefinitions);\n const clipboardSection = frame.sections.find((candidate) => candidate.kind === SectionKind.ClipboardWrite);\n const scrollbarSection = frame.sections.find((candidate) => candidate.kind === SectionKind.ScrollbarState);\n if (!rowSection || !cursorSection) {\n if (active) appendPerformanceSample(active.samples.frameApplyMs, performance.now() - applyStarted);\n return;\n }\n\n const glyphDefinitions = glyphSection ? decodeGlyphDefinitions(glyphSection) : NO_GLYPH_DEFINITIONS;\n const styleDefinitions = styleSection ? decodeStyleDefinitions(styleSection) : NO_STYLE_DEFINITIONS;\n if (active) active.frames.glyphDefinitions += glyphDefinitions.length;\n const resetsCatalog = changedSession || completingResync || catalogReset;\n const wasCatalogFallback = previous.catalogFallback;\n if (resetsCatalog) {\n previous.rows = [];\n previous.nativeRows = [];\n previous.nativeStyleRows = [];\n clearSessionCatalog(previous);\n previous.rowRevisions = [];\n const catalogFits =\n glyphCatalogFits(\n previous.glyphDefinitions,\n previous.glyphPixelBytes,\n sharedGlyphDefinitions,\n sharedGlyphPixelBytes,\n glyphDefinitions,\n GLYPH_CATALOG_BUDGET,\n ) &&\n definitionCatalogFits(\n previous.styleDefinitions,\n styleDefinitions,\n MAX_SESSION_STYLE_DEFINITIONS,\n retainedStyleDefinitions,\n MAX_RETAINED_STYLE_DEFINITIONS,\n );\n const admission = catalogAdmission(true, wasCatalogFallback, catalogFits);\n previous.catalogFallback = admission === \"text-fallback\";\n if (admission === \"install\") {\n installGlyphDefinitions(previous, glyphDefinitions);\n installStyleDefinitions(previous, styleDefinitions);\n } else if (!wasCatalogFallback) {\n postToRenderer({\n type: \"catalog-pressure\",\n sessionHandle: id,\n reason: \"working-set-exceeds-budget\",\n });\n }\n } else if (!previous.catalogFallback) {\n const catalogFits =\n glyphCatalogFits(\n previous.glyphDefinitions,\n previous.glyphPixelBytes,\n sharedGlyphDefinitions,\n sharedGlyphPixelBytes,\n glyphDefinitions,\n GLYPH_CATALOG_BUDGET,\n ) &&\n definitionCatalogFits(\n previous.styleDefinitions,\n styleDefinitions,\n MAX_SESSION_STYLE_DEFINITIONS,\n retainedStyleDefinitions,\n MAX_RETAINED_STYLE_DEFINITIONS,\n );\n const admission = catalogAdmission(false, false, catalogFits);\n if (admission === \"request-full\") {\n if (active) {\n active.frames.resyncRequested += 1;\n appendPerformanceSample(active.samples.frameApplyMs, performance.now() - applyStarted);\n }\n previous.awaitingResync = true;\n postToRenderer({ type: \"frame-resync-needed\", sessionHandle: id });\n return;\n }\n if (admission === \"install\") {\n installGlyphDefinitions(previous, glyphDefinitions);\n installStyleDefinitions(previous, styleDefinitions);\n }\n }\n if (!previous.catalogFallback && !nativeTextAnnounced && glyphDefinitions.length > 0) {\n nativeTextAnnounced = true;\n postToRenderer({ type: \"renderer-status\", backend: renderer?.kind ?? \"starting\", textEngine: \"native\" });\n }\n if (clipboardSection) {\n postToRenderer({ type: \"clipboard-write\", text: decodeClipboardWrite(clipboardSection) });\n }\n if (scrollbarSection) {\n const decoded = decodeScrollbarState(scrollbarSection);\n const scrollbar = {\n total: Number(decoded.total),\n offset: Number(decoded.offset),\n length: Number(decoded.length),\n };\n if (\n !Number.isSafeInteger(scrollbar.total) ||\n !Number.isSafeInteger(scrollbar.offset) ||\n !Number.isSafeInteger(scrollbar.length)\n )\n throw new RangeError(\"Scrollbar state exceeds JavaScript's safe integer range\");\n if (\n !previous.scrollbar ||\n previous.scrollbar.total !== scrollbar.total ||\n previous.scrollbar.offset !== scrollbar.offset ||\n previous.scrollbar.length !== scrollbar.length\n ) {\n previous.scrollbar = scrollbar;\n postToRenderer({ type: \"scrollbar-state\", sessionHandle: id, scrollbar });\n }\n }\n\n const full = (rowSection.flags & 1) !== 0;\n const useNativeCatalog = !previous.catalogFallback;\n const rows = full ? Array<string>(frame.rows).fill(\"\") : previous.rows.slice();\n const nativeRows = full\n ? Array.from({ length: frame.rows }, () => [] as GlyphInstance[])\n : previous.nativeRows.slice();\n const nativeStyleRows = full\n ? Array.from({ length: frame.rows }, () => [] as StyleRun[])\n : previous.nativeStyleRows.slice();\n const rowRevisions = full ? Array<bigint>(frame.rows).fill(0n) : previous.rowRevisions.slice();\n const replacements = decodeRowReplacements(rowSection);\n const damagedRows: number[] = [];\n if (active) active.frames.rowsDecoded += replacements.length;\n for (const replacement of replacements) {\n if (replacement.row >= frame.rows) throw new RangeError(\"Row replacement exceeds viewport\");\n if (replacement.revision < (rowRevisions[replacement.row] ?? 0n)) continue;\n rows[replacement.row] = replacement.text;\n nativeRows[replacement.row] = useNativeCatalog ? replacement.glyphs : [];\n nativeStyleRows[replacement.row] = useNativeCatalog ? replacement.styles : [];\n rowRevisions[replacement.row] = replacement.revision;\n damagedRows.push(replacement.row);\n }\n previous.rows = rows;\n previous.nativeRows = nativeRows;\n previous.nativeStyleRows = nativeStyleRows;\n previous.rowRevisions = rowRevisions;\n const geometryChanged = damagedRows.length > 0;\n const previousCursor = previous.cursor;\n const nextCursor = decodeCursorState(cursorSection);\n const cursorChanged =\n nextCursor.x !== previousCursor.x ||\n nextCursor.y !== previousCursor.y ||\n nextCursor.visible !== previousCursor.visible ||\n nextCursor.style !== previousCursor.style ||\n nextCursor.blinking !== previousCursor.blinking;\n previous.cursor = nextCursor;\n previous.layoutEpoch = frame.layoutEpoch;\n previous.sessionEpoch = frame.sessionEpoch;\n previous.sequence = frame.frameSequence;\n previous.awaitingResync = false;\n if (completingResync) postToRenderer({ type: \"frame-resync-complete\", sessionHandle: id });\n const requiresFullRedraw = full || changedSession || completingResync;\n if (!requiresFullRedraw && cursorChanged) damagedRows.push(previousCursor.y, nextCursor.y);\n const hasRowDamage = damagedRows.length > 0;\n for (const surfaceId of surfaceIdsForSession(id)) {\n if (cursorChanged) scheduleCursorBlink(surfaceId, true);\n if (requiresFullRedraw) invalidateFull(surfaceId);\n else if (hasRowDamage) invalidateRows(surfaceId, damagedRows, geometryChanged);\n }\n // Announced only once the frame is committed and its redraw scheduled, so a\n // consumer waiting on recovery is never told \"done\" ahead of the pixels.\n postToRenderer({\n type: \"frame-committed\",\n sessionHandle: id,\n sessionEpoch: frame.sessionEpoch,\n frameSequence: frame.frameSequence,\n // A resume publishes a full refresh, and `classifyFrame` only accepts a\n // resync-completing frame that carries one, so this flag is what tells a\n // recovered screen apart from a partial update of the stale one.\n fullSnapshot: fullFrame,\n });\n if (active) appendPerformanceSample(active.samples.frameApplyMs, performance.now() - applyStarted);\n}\n\nself.onmessage = (event: MessageEvent<RendererToWorkerMessage>) => {\n const message = event.data;\n try {\n if (message.type === \"mount\") {\n void mount(message.surfaceId, message.sessionHandle, message.canvas).catch((error) => {\n console.error(\"[terminal-renderer] mount failed\", error);\n });\n } else if (message.type === \"renderer-config\") {\n forceCanvasFallback = Boolean(message.forceCanvasFallback);\n } else if (message.type === \"partial-rendering\") {\n partialRenderingEnabled = Boolean(message.enabled);\n for (const id of mounts.keys()) invalidateFull(id);\n } else if (message.type === \"unmount\") {\n mounts.delete(message.surfaceId);\n dirty.delete(message.surfaceId);\n deleteSurface(message.surfaceId);\n occluded.delete(message.surfaceId);\n frozenCursors.delete(message.surfaceId);\n renderer?.unmount(message.surfaceId);\n const timer = cursorBlinkTimers.get(message.surfaceId);\n if (timer !== undefined) clearTimeout(timer);\n cursorBlinkTimers.delete(message.surfaceId);\n // The session may be remounted after zoom/layout changes. Keep its decoded\n // snapshot; only drop-session represents terminal lifetime ending.\n } else if (message.type === \"drop-session\") {\n for (const surfaceId of surfaceIdsForSession(message.sessionHandle)) {\n mounts.delete(surfaceId);\n dirty.delete(surfaceId);\n surfaces.delete(surfaceId);\n occluded.delete(surfaceId);\n frozenCursors.delete(surfaceId);\n renderer?.unmount(surfaceId);\n const timer = cursorBlinkTimers.get(surfaceId);\n if (timer !== undefined) clearTimeout(timer);\n cursorBlinkTimers.delete(surfaceId);\n }\n surfaceIdsBySession.delete(message.sessionHandle);\n dropSessionSnapshot(message.sessionHandle);\n presentationDefaults.delete(message.sessionHandle);\n performanceMeasurement?.lastFrameAt.delete(message.sessionHandle);\n } else if (message.type === \"resize\") {\n const mounted = mounts.get(message.surfaceId);\n if (!mounted) return;\n const nextSize = { width: message.width, height: message.height, dpr: message.dpr };\n const changed = renderedSizeChanged(mounted.size, nextSize);\n mounted.size = nextSize;\n if (!changed) return;\n renderer?.resize(message.surfaceId, mounted.size);\n invalidateFull(message.surfaceId);\n } else if (message.type === \"frame\") {\n try {\n applyFrame(message.packet);\n } finally {\n returnFrameCredit(message.packet.byteLength);\n }\n } else if (message.type === \"frame-gap\") {\n for (const sessionHandle of message.sessionHandles) {\n const session = snapshot(sessionHandle);\n if (session.awaitingResync) continue;\n session.awaitingResync = true;\n postToRenderer({ type: \"frame-resync-needed\", sessionHandle });\n }\n } else if (message.type === \"expect-full\") {\n snapshot(message.sessionHandle).awaitingResync = true;\n } else if (message.type === \"theme\") {\n if (message.surfaceId) {\n surface(message.surfaceId, message.sessionHandle).theme = message.theme;\n invalidateFull(message.surfaceId);\n } else {\n defaults(message.sessionHandle).theme = message.theme;\n for (const surfaceId of surfaceIdsForSession(message.sessionHandle)) {\n surfaces.get(surfaceId)!.theme = message.theme;\n invalidateFull(surfaceId);\n }\n }\n } else if (message.type === \"effects\") {\n if (message.surfaceId) {\n surface(message.surfaceId, message.sessionHandle).effects = message.effects;\n invalidateFull(message.surfaceId);\n } else {\n defaults(message.sessionHandle).effects = message.effects;\n for (const surfaceId of surfaceIdsForSession(message.sessionHandle)) {\n surfaces.get(surfaceId)!.effects = message.effects;\n invalidateFull(surfaceId);\n }\n }\n } else if (message.type === \"selection\") {\n if (message.surfaceId) {\n surface(message.surfaceId, message.sessionHandle).selection = message.selection;\n invalidateFull(message.surfaceId);\n } else {\n defaults(message.sessionHandle).selection = message.selection;\n for (const surfaceId of surfaceIdsForSession(message.sessionHandle)) {\n surfaces.get(surfaceId)!.selection = message.selection;\n invalidateFull(surfaceId);\n }\n }\n } else if (message.type === \"visibility\") {\n if (!message.surfaceId) defaults(message.sessionHandle).visible = message.visible;\n if (message.surfaceId) surface(message.surfaceId, message.sessionHandle);\n const targetIds = message.surfaceId ? [message.surfaceId] : surfaceIdsForSession(message.sessionHandle);\n for (const surfaceId of targetIds) {\n if (message.visible) {\n occluded.delete(surfaceId);\n invalidateFull(surfaceId);\n scheduleCursorBlink(surfaceId, true);\n } else {\n occluded.add(surfaceId);\n const timer = cursorBlinkTimers.get(surfaceId);\n if (timer !== undefined) clearTimeout(timer);\n cursorBlinkTimers.delete(surfaceId);\n }\n }\n } else if (message.type === \"focus\") {\n const value = surface(message.surfaceId, message.sessionHandle);\n value.focused = Boolean(message.focused);\n scheduleCursorBlink(message.surfaceId, value.focused);\n invalidateRows(message.surfaceId, [snapshot(message.sessionHandle).cursor.y]);\n } else if (message.type === \"cursor-frozen\") {\n const value = surfaces.get(message.surfaceId);\n if (!value) return;\n if (message.frozen) {\n frozenCursors.add(message.surfaceId);\n const timer = cursorBlinkTimers.get(message.surfaceId);\n if (timer !== undefined) clearTimeout(timer);\n cursorBlinkTimers.delete(message.surfaceId);\n // Rest on the visible half of the blink so the frozen screen shows the\n // cursor where the host left it.\n if (!value.cursorBlinkVisible) {\n value.cursorBlinkVisible = true;\n invalidateRows(message.surfaceId, [snapshot(value.sessionHandle).cursor.y]);\n }\n } else {\n frozenCursors.delete(message.surfaceId);\n scheduleCursorBlink(message.surfaceId, true);\n }\n } else if (message.type === \"cursor-activity\") {\n const session = snapshot(message.sessionHandle);\n for (const surfaceId of surfaceIdsForSession(message.sessionHandle)) {\n const value = surfaces.get(surfaceId)!;\n const changesPixels = cursorActivityChangesPixels(session.cursor, value.focused, value.cursorBlinkVisible);\n scheduleCursorBlink(surfaceId, true);\n if (changesPixels) invalidateRows(surfaceId, [session.cursor.y]);\n }\n } else if (message.type === \"force-full-redraw\") {\n invalidateSessionFull(message.sessionHandle);\n } else if (message.type === \"force-row-redraw\") {\n invalidateSessionRows(message.sessionHandle, [message.row]);\n } else if (message.type === \"performance-start\") {\n void ensureRenderer()\n .then(() => {\n beginPerformanceMeasurement();\n postToRenderer({ type: \"performance-started\", requestId: message.requestId });\n })\n .catch((error) => console.error(\"[terminal-renderer] failed to start performance measurement\", error));\n } else if (message.type === \"performance-finish\") {\n void finishPerformanceMeasurement(message.requestId, message.quietMs, message.timeoutMs).catch((error) => {\n console.error(\"[terminal-renderer] failed to finish performance measurement\", error);\n });\n }\n } catch (error) {\n console.error(\"[terminal-renderer] rejected worker message\", error);\n }\n};\n"],
5
- "mappings": "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",
3
+ "sources": ["../../ghosttea-frame/src/index.ts", "../src/performance.ts", "../src/renderers/types.ts", "../src/renderers/canvas-renderer.ts", "../src/cell-width.ts", "../src/renderers/render-damage.ts", "../src/renderers/shader-effects.ts", "../src/renderers/webgpu-renderer.ts", "../src/frame-sequence.ts", "../src/cursor-invalidation.ts", "../src/catalog-budget.ts", "../src/terminal-render.worker.ts"],
4
+ "sourcesContent": ["export const FRAME_MAGIC = 0x31465254;\nexport const FRAME_PROTOCOL_VERSION = 1;\nexport const FRAME_HEADER_BYTES = 64;\nexport const SECTION_HEADER_BYTES = 16;\nexport const MAX_FRAME_BYTES = 16 * 1024 * 1024;\nexport const FrameFlag = {\n FullSnapshot: 1 << 0,\n MouseTracking: 1 << 1,\n CatalogReset: 1 << 2,\n} as const;\n\nexport enum SectionKind {\n GlyphDefinitions = 1,\n StyleDefinitions = 2,\n RowReplacements = 3,\n CursorState = 4,\n SelectionSpans = 5,\n ImageDefinitions = 6,\n ImagePlacements = 7,\n ScrollbarState = 8,\n ViewportMetadata = 9,\n AccessibilityText = 10,\n ClipboardWrite = 11,\n}\n\nexport interface FrameSection {\n kind: SectionKind;\n flags: number;\n itemCount: number;\n bytes: Uint8Array;\n}\n\nexport interface TerminalFrame {\n protocolVersion: number;\n flags: number;\n sessionHandle: bigint;\n viewHandle: bigint;\n sessionEpoch: bigint;\n layoutEpoch: bigint;\n frameSequence: bigint;\n terminalRevision: bigint;\n cols: number;\n rows: number;\n sections: FrameSection[];\n}\n\nexport interface TextRow {\n row: number;\n text: string;\n}\n\nexport interface RowReplacement extends TextRow {\n revision: bigint;\n glyphs: GlyphInstance[];\n styles: StyleRun[];\n}\n\nexport enum GlyphFormat {\n Alpha8 = 0,\n Rgba8Premultiplied = 1,\n}\n\nexport interface GlyphDefinition {\n id: number;\n width: number;\n height: number;\n bearingX: number;\n bearingY: number;\n format: GlyphFormat;\n pixels: Uint8Array;\n}\n\nexport interface GlyphInstance {\n glyphId: number;\n styleId: number;\n x: number;\n y: number;\n width: number;\n height: number;\n cellStart: number;\n cellSpan: number;\n}\n\nexport interface StyleDefinition {\n id: number;\n bold: boolean;\n italic: boolean;\n faint: boolean;\n inverse: boolean;\n invisible: boolean;\n strikethrough: boolean;\n underline: boolean;\n foreground?: readonly [number, number, number];\n background?: readonly [number, number, number];\n}\n\nexport interface StyleRun {\n styleId: number;\n cellStart: number;\n cellSpan: number;\n}\n\nexport interface CursorState {\n x: number;\n y: number;\n visible: boolean;\n style: CursorStyle;\n blinking: boolean;\n}\n\nexport interface ScrollbarState {\n total: bigint;\n offset: bigint;\n length: bigint;\n}\n\nexport enum CursorStyle {\n Bar = 0,\n Block = 1,\n Underline = 2,\n HollowBlock = 3,\n}\n\nfunction assertRange(condition: boolean, message: string): asserts condition {\n if (!condition) throw new RangeError(`Invalid terminal frame: ${message}`);\n}\n\nexport function decodeFrame(buffer: ArrayBuffer): TerminalFrame {\n assertRange(buffer.byteLength >= FRAME_HEADER_BYTES, \"truncated header\");\n assertRange(buffer.byteLength <= MAX_FRAME_BYTES, \"packet exceeds limit\");\n const view = new DataView(buffer);\n assertRange(view.getUint32(0, true) === FRAME_MAGIC, \"bad magic\");\n assertRange(view.getUint16(4, true) === FRAME_PROTOCOL_VERSION, \"unsupported protocol version\");\n\n const sectionCount = view.getUint16(60, true);\n const tableEnd = FRAME_HEADER_BYTES + sectionCount * SECTION_HEADER_BYTES;\n assertRange(tableEnd <= buffer.byteLength, \"truncated section table\");\n\n const sections: FrameSection[] = [];\n for (let index = 0; index < sectionCount; index += 1) {\n const base = FRAME_HEADER_BYTES + index * SECTION_HEADER_BYTES;\n const kind = view.getUint16(base, true) as SectionKind;\n const flags = view.getUint16(base + 2, true);\n const offset = view.getUint32(base + 4, true);\n const length = view.getUint32(base + 8, true);\n const itemCount = view.getUint32(base + 12, true);\n const end = offset + length;\n assertRange(end >= offset && offset >= tableEnd && end <= buffer.byteLength, \"section out of bounds\");\n sections.push({ kind, flags, itemCount, bytes: new Uint8Array(buffer, offset, length) });\n }\n\n return {\n protocolVersion: view.getUint16(4, true),\n flags: view.getUint16(6, true),\n sessionHandle: view.getBigUint64(8, true),\n viewHandle: view.getBigUint64(16, true),\n sessionEpoch: view.getBigUint64(24, true),\n layoutEpoch: view.getBigUint64(32, true),\n frameSequence: view.getBigUint64(40, true),\n terminalRevision: view.getBigUint64(48, true),\n cols: view.getUint16(56, true),\n rows: view.getUint16(58, true),\n sections,\n };\n}\n\nexport function decodeAccessibilityRows(section: FrameSection): TextRow[] {\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n assertRange(section.bytes.byteLength >= 2, \"truncated text row header\");\n const count = view.getUint16(0, true);\n assertRange(count === section.itemCount, \"text row count mismatch\");\n const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n const rows: TextRow[] = [];\n let offset = 2;\n for (let index = 0; index < count; index += 1) {\n assertRange(offset + 6 <= section.bytes.byteLength, \"truncated text row\");\n const row = view.getUint16(offset, true);\n const length = view.getUint32(offset + 2, true);\n offset += 6;\n assertRange(offset + length <= section.bytes.byteLength, \"text row payload out of bounds\");\n rows.push({ row, text: decoder.decode(section.bytes.subarray(offset, offset + length)) });\n offset += length;\n }\n assertRange(offset === section.bytes.byteLength, \"trailing text row bytes\");\n return rows;\n}\n\nexport function decodeRowReplacements(section: FrameSection): RowReplacement[] {\n assertRange(section.kind === SectionKind.RowReplacements, \"wrong row replacement section kind\");\n assertRange(section.bytes.byteLength >= 2, \"truncated row replacement header\");\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n const count = view.getUint16(0, true);\n assertRange(count === section.itemCount, \"row replacement count mismatch\");\n const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n const rows: RowReplacement[] = [];\n let offset = 2;\n for (let index = 0; index < count; index += 1) {\n assertRange(offset + 18 <= section.bytes.byteLength, \"truncated row replacement\");\n const row = view.getUint16(offset, true);\n const revision = view.getBigUint64(offset + 2, true);\n const length = view.getUint32(offset + 10, true);\n const glyphCount = view.getUint16(offset + 14, true);\n const styleCount = view.getUint16(offset + 16, true);\n offset += 18;\n assertRange(offset + length <= section.bytes.byteLength, \"row replacement payload out of bounds\");\n const text = decoder.decode(section.bytes.subarray(offset, offset + length));\n offset += length;\n const glyphs: GlyphInstance[] = [];\n for (let glyphIndex = 0; glyphIndex < glyphCount; glyphIndex += 1) {\n assertRange(offset + 28 <= section.bytes.byteLength, \"truncated glyph instance\");\n glyphs.push({\n glyphId: view.getUint32(offset, true),\n styleId: view.getUint32(offset + 4, true),\n x: view.getFloat32(offset + 8, true),\n y: view.getFloat32(offset + 12, true),\n width: view.getFloat32(offset + 16, true),\n height: view.getFloat32(offset + 20, true),\n cellStart: view.getUint16(offset + 24, true),\n cellSpan: view.getUint16(offset + 26, true),\n });\n offset += 28;\n }\n const styles: StyleRun[] = [];\n for (let styleIndex = 0; styleIndex < styleCount; styleIndex += 1) {\n assertRange(offset + 8 <= section.bytes.byteLength, \"truncated row style run\");\n styles.push({\n styleId: view.getUint32(offset, true),\n cellStart: view.getUint16(offset + 4, true),\n cellSpan: view.getUint16(offset + 6, true),\n });\n offset += 8;\n }\n rows.push({ row, revision, text, glyphs, styles });\n }\n assertRange(offset === section.bytes.byteLength, \"trailing row replacement bytes\");\n return rows;\n}\n\nexport function decodeGlyphDefinitions(section: FrameSection): GlyphDefinition[] {\n assertRange(section.kind === SectionKind.GlyphDefinitions, \"wrong glyph definition section kind\");\n assertRange(section.bytes.byteLength >= 4, \"truncated glyph definition header\");\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n const count = view.getUint32(0, true);\n assertRange(count === section.itemCount, \"glyph definition count mismatch\");\n const definitions: GlyphDefinition[] = [];\n let offset = 4;\n for (let index = 0; index < count; index += 1) {\n assertRange(offset + 20 <= section.bytes.byteLength, \"truncated glyph definition\");\n const format = view.getUint8(offset + 12) as GlyphFormat;\n assertRange(format === GlyphFormat.Alpha8 || format === GlyphFormat.Rgba8Premultiplied, \"invalid glyph format\");\n assertRange(\n view.getUint8(offset + 13) === 0 && view.getUint16(offset + 14, true) === 0,\n \"nonzero glyph reserved bytes\",\n );\n const pixelLength = view.getUint32(offset + 16, true);\n const width = view.getUint16(offset + 4, true);\n const height = view.getUint16(offset + 6, true);\n const expectedLength = width * height * (format === GlyphFormat.Alpha8 ? 1 : 4);\n assertRange(pixelLength === expectedLength, \"glyph pixel length mismatch\");\n offset += 20;\n assertRange(offset + pixelLength <= section.bytes.byteLength, \"glyph pixels out of bounds\");\n definitions.push({\n id: view.getUint32(offset - 20, true),\n width,\n height,\n bearingX: view.getInt16(offset - 12, true),\n bearingY: view.getInt16(offset - 10, true),\n format,\n pixels: section.bytes.slice(offset, offset + pixelLength),\n });\n offset += pixelLength;\n }\n assertRange(offset === section.bytes.byteLength, \"trailing glyph definition bytes\");\n return definitions;\n}\n\nexport function decodeStyleDefinitions(section: FrameSection): StyleDefinition[] {\n assertRange(section.kind === SectionKind.StyleDefinitions, \"wrong style definition section kind\");\n assertRange(section.bytes.byteLength >= 4, \"truncated style definition header\");\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n const count = view.getUint32(0, true);\n assertRange(count === section.itemCount, \"style definition count mismatch\");\n assertRange(section.bytes.byteLength === 4 + count * 16, \"invalid style definition length\");\n const styles: StyleDefinition[] = [];\n for (let index = 0; index < count; index += 1) {\n const offset = 4 + index * 16;\n const flags = view.getUint16(offset + 4, true);\n const foregroundKind = view.getUint8(offset + 6);\n const backgroundKind = view.getUint8(offset + 7);\n assertRange((flags & ~0x7f) === 0, \"invalid style flags\");\n assertRange(foregroundKind <= 1 && backgroundKind <= 1, \"invalid style color kind\");\n assertRange(view.getUint16(offset + 14, true) === 0, \"nonzero style reserved bytes\");\n styles.push({\n id: view.getUint32(offset, true),\n bold: (flags & 1) !== 0,\n italic: (flags & 2) !== 0,\n faint: (flags & 4) !== 0,\n inverse: (flags & 8) !== 0,\n invisible: (flags & 16) !== 0,\n strikethrough: (flags & 32) !== 0,\n underline: (flags & 64) !== 0,\n ...(foregroundKind === 1\n ? { foreground: [view.getUint8(offset + 8), view.getUint8(offset + 9), view.getUint8(offset + 10)] as const }\n : {}),\n ...(backgroundKind === 1\n ? { background: [view.getUint8(offset + 11), view.getUint8(offset + 12), view.getUint8(offset + 13)] as const }\n : {}),\n });\n }\n return styles;\n}\n\nexport function decodeCursorState(section: FrameSection): CursorState {\n assertRange(section.kind === SectionKind.CursorState, \"wrong cursor section kind\");\n assertRange(section.itemCount === 1, \"cursor item count mismatch\");\n assertRange(section.bytes.byteLength === 8, \"invalid cursor payload length\");\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n const visible = view.getUint8(4);\n const style = view.getUint8(5) as CursorStyle;\n const blinking = view.getUint8(6);\n assertRange(visible <= 1, \"invalid cursor visibility\");\n assertRange(style <= CursorStyle.HollowBlock, \"invalid cursor style\");\n assertRange(blinking <= 1, \"invalid cursor blinking state\");\n assertRange(view.getUint8(7) === 0, \"nonzero cursor reserved byte\");\n return {\n x: view.getUint16(0, true),\n y: view.getUint16(2, true),\n visible: visible === 1,\n style,\n blinking: blinking === 1,\n };\n}\n\nexport function decodeScrollbarState(section: FrameSection): ScrollbarState {\n assertRange(section.kind === SectionKind.ScrollbarState, \"wrong scrollbar section kind\");\n assertRange(section.itemCount === 1, \"scrollbar item count mismatch\");\n assertRange(section.bytes.byteLength === 24, \"invalid scrollbar payload size\");\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n const total = view.getBigUint64(0, true);\n const offset = view.getBigUint64(8, true);\n const length = view.getBigUint64(16, true);\n assertRange(length <= total, \"scrollbar viewport exceeds total rows\");\n assertRange(offset <= total - length, \"scrollbar offset exceeds scrollable range\");\n return { total, offset, length };\n}\n\nexport function decodeClipboardWrite(section: FrameSection): string {\n assertRange(section.kind === SectionKind.ClipboardWrite, \"wrong clipboard section kind\");\n assertRange(section.itemCount === 1, \"clipboard item count mismatch\");\n assertRange(section.bytes.byteLength >= 4, \"truncated clipboard payload\");\n const view = new DataView(section.bytes.buffer, section.bytes.byteOffset, section.bytes.byteLength);\n const length = view.getUint32(0, true);\n assertRange(length === section.bytes.byteLength - 4, \"clipboard length mismatch\");\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(section.bytes.subarray(4));\n}\n", "export interface TerminalRenderMetrics {\n queueSubmits: number;\n fullRenders: number;\n partialRenders: number;\n damagedRows: number;\n geometryCacheHits: number;\n geometryCacheMisses: number;\n canvasPixels: number;\n renderPasses: number;\n drawCalls: number;\n rectangleVertices: number;\n monoGlyphVertices: number;\n colorGlyphVertices: number;\n fallbackGlyphVertices: number;\n vertexUploadBytes: number;\n atlasUploadBytes: number;\n atlasUploadCalls: number;\n}\n\nexport interface TerminalRenderPerformanceSnapshot {\n backend: string;\n durationMs: number;\n timedOutWaitingForIdle: boolean;\n gpuQueueDrainMs: number | null;\n frames: {\n received: number;\n bytes: number;\n full: number;\n incremental: number;\n stale: number;\n resyncRequested: number;\n rowsDecoded: number;\n glyphDefinitions: number;\n };\n scheduling: {\n flushes: number;\n renderCalls: number;\n maximumDirtyPanes: number;\n panesPerFlush: number[];\n };\n renderer: {\n queueSubmits: number;\n fullRenders: number;\n partialRenders: number;\n damagedRows: number;\n geometryCacheHits: number;\n geometryCacheMisses: number;\n canvasPixelFrames: number;\n renderPasses: number;\n drawCalls: number;\n rectangleVertices: number;\n monoGlyphVertices: number;\n colorGlyphVertices: number;\n fallbackGlyphVertices: number;\n vertexUploadBytes: number;\n atlasUploadBytes: number;\n atlasUploadCalls: number;\n };\n samples: {\n frameApplyMs: number[];\n renderCpuMs: number[];\n dirtyToRenderMs: number[];\n frameArrivalToRenderMs: number[];\n };\n}\n\nexport function emptyRenderMetrics(): TerminalRenderMetrics {\n return {\n queueSubmits: 0,\n fullRenders: 0,\n partialRenders: 0,\n damagedRows: 0,\n geometryCacheHits: 0,\n geometryCacheMisses: 0,\n canvasPixels: 0,\n renderPasses: 0,\n drawCalls: 0,\n rectangleVertices: 0,\n monoGlyphVertices: 0,\n colorGlyphVertices: 0,\n fallbackGlyphVertices: 0,\n vertexUploadBytes: 0,\n atlasUploadBytes: 0,\n atlasUploadCalls: 0,\n };\n}\n", "import {\n CursorStyle,\n type CursorState,\n type GlyphDefinition,\n type GlyphInstance,\n type StyleDefinition,\n type StyleRun,\n} from \"@vibecook/ghosttea-frame\";\nimport type { TerminalRenderMetrics } from \"../performance.js\";\n\nexport type Rgba = readonly [number, number, number, number];\n\nexport interface TerminalTheme {\n background: Rgba;\n foreground: Rgba;\n cursor: Rgba;\n cursorText?: Rgba;\n selection: Rgba;\n selectionForeground: Rgba;\n /** Apply the window background alpha to explicit cell backgrounds too. */\n backgroundOpacityCells?: boolean;\n}\n\nexport type TerminalPostProcess = \"none\" | \"better-crt\";\nexport type TerminalShaderEffect =\n \"ghosttea:better-crt\" | \"ghosttea:crt\" | \"ghosttea:vhs\" | \"ghosttea:sparks-from-fire\";\n\nexport interface TerminalEffects {\n postProcess: TerminalPostProcess;\n shaderEffects?: readonly TerminalShaderEffect[];\n animate?: boolean;\n}\n\nconst ANIMATED_SHADER_EFFECTS: ReadonlySet<TerminalShaderEffect> = new Set([\n \"ghosttea:vhs\",\n \"ghosttea:sparks-from-fire\",\n]);\n\nexport function terminalEffectsNeedAnimation(effects: TerminalEffects): boolean {\n return (\n effects.animate === true && (effects.shaderEffects?.some((effect) => ANIMATED_SHADER_EFFECTS.has(effect)) ?? false)\n );\n}\n\nexport interface CellPoint {\n column: number;\n row: number;\n}\n\nexport interface CellSelection {\n anchor: CellPoint;\n focus: CellPoint;\n}\n\nexport interface RenderView {\n rows: string[];\n nativeRows: GlyphInstance[][];\n nativeStyleRows: StyleRun[][];\n rowRevisions: readonly bigint[];\n glyphDefinitions: Map<number, GlyphDefinition>;\n styleDefinitions: Map<number, StyleDefinition>;\n sessionEpoch: bigint;\n layoutEpoch: bigint;\n cursor: CursorState;\n focused: boolean;\n cursorBlinkVisible: boolean;\n selection: CellSelection | null;\n theme: TerminalTheme;\n effects?: TerminalEffects;\n damage?: RenderDamage;\n}\n\nexport interface RenderDamage {\n full: boolean;\n rows: ReadonlySet<number>;\n geometryChanged: boolean;\n}\n\nexport function effectiveCursorStyle(view: RenderView): CursorStyle | null {\n if (!view.cursor.visible) return null;\n if (!view.focused) return CursorStyle.HollowBlock;\n if (view.cursor.blinking && !view.cursorBlinkVisible) return null;\n return view.cursor.style;\n}\n\nexport interface PixelSize {\n width: number;\n height: number;\n dpr: number;\n}\n\nfunction physicalPixels(value: number, dpr: number): number {\n return Math.max(1, Math.round(value * dpr));\n}\n\nexport function renderedSizeChanged(current: PixelSize, next: PixelSize): boolean {\n return (\n current.dpr !== next.dpr ||\n physicalPixels(current.width, current.dpr) !== physicalPixels(next.width, next.dpr) ||\n physicalPixels(current.height, current.dpr) !== physicalPixels(next.height, next.dpr)\n );\n}\n\nexport interface TerminalRenderer {\n readonly kind: \"webgpu\" | \"canvas2d\";\n mount(id: string, canvas: OffscreenCanvas): void;\n unmount(id: string): void;\n resize(id: string, size: PixelSize): void;\n render(id: string, view: RenderView): TerminalRenderMetrics | undefined;\n renderBatch?(entries: ReadonlyArray<{ id: string; view: RenderView }>): Array<TerminalRenderMetrics | undefined>;\n setPerformanceMeasurementEnabled?(enabled: boolean): void;\n settle?(): Promise<void>;\n}\n\nexport const DEFAULT_THEME: TerminalTheme = {\n background: [40 / 255, 44 / 255, 52 / 255, 1],\n foreground: [1, 1, 1, 1],\n cursor: [1, 1, 1, 1],\n cursorText: [40 / 255, 44 / 255, 52 / 255, 1],\n selection: [1, 1, 1, 1],\n selectionForeground: [40 / 255, 44 / 255, 52 / 255, 1],\n backgroundOpacityCells: false,\n};\n\nexport const DEFAULT_EFFECTS: TerminalEffects = {\n postProcess: \"none\",\n shaderEffects: [],\n animate: false,\n};\n\nexport const CELL_WIDTH = 7.83;\nexport const LINE_HEIGHT = 19;\n// Ghostty defaults window-padding-x/y to two device-independent points.\nexport const ORIGIN_X = 2;\nexport const ORIGIN_Y = 2;\n", "import { CursorStyle } from \"@vibecook/ghosttea-frame\";\nimport { emptyRenderMetrics, type TerminalRenderMetrics } from \"../performance.js\";\nimport {\n CELL_WIDTH,\n LINE_HEIGHT,\n ORIGIN_X,\n ORIGIN_Y,\n effectiveCursorStyle,\n renderedSizeChanged,\n type CellPoint,\n type PixelSize,\n type RenderView,\n type Rgba,\n type TerminalRenderer,\n} from \"./types.js\";\n\ninterface CanvasSurface extends PixelSize {\n canvas: OffscreenCanvas;\n context: OffscreenCanvasRenderingContext2D;\n}\n\nfunction css(color: Rgba): string {\n const [red, green, blue, alpha] = color;\n return `rgba(${Math.round(red * 255)}, ${Math.round(green * 255)}, ${Math.round(blue * 255)}, ${alpha})`;\n}\n\nfunction ordered(selection: RenderView[\"selection\"]): [CellPoint, CellPoint] | null {\n if (!selection) return null;\n const { anchor, focus } = selection;\n return anchor.row < focus.row || (anchor.row === focus.row && anchor.column <= focus.column)\n ? [anchor, focus]\n : [focus, anchor];\n}\n\nexport class CanvasTerminalRenderer implements TerminalRenderer {\n readonly kind = \"canvas2d\" as const;\n readonly #surfaces = new Map<string, CanvasSurface>();\n #performanceMeasurementEnabled = false;\n\n setPerformanceMeasurementEnabled(enabled: boolean): void {\n this.#performanceMeasurementEnabled = enabled;\n }\n\n mount(id: string, canvas: OffscreenCanvas): void {\n const context = canvas.getContext(\"2d\", { alpha: true });\n if (!context) throw new Error(\"Canvas2D worker backend unavailable\");\n this.#surfaces.set(id, { canvas, context, width: 1, height: 1, dpr: 1 });\n }\n\n unmount(id: string): void {\n this.#surfaces.delete(id);\n }\n\n resize(id: string, size: PixelSize): void {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n const changed = renderedSizeChanged(surface, size);\n Object.assign(surface, size);\n if (!changed) return;\n surface.canvas.width = Math.max(1, Math.round(size.width * size.dpr));\n surface.canvas.height = Math.max(1, Math.round(size.height * size.dpr));\n }\n\n render(id: string, view: RenderView): TerminalRenderMetrics | undefined {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n const { context, width, height, dpr } = surface;\n context.clearRect(0, 0, surface.canvas.width, surface.canvas.height);\n context.save();\n context.setTransform(dpr, 0, 0, dpr, 0, 0);\n context.fillStyle = css(view.theme.background);\n context.fillRect(0, 0, width, height);\n const selection = ordered(view.selection);\n if (selection) {\n context.fillStyle = css(view.theme.selection);\n const [start, end] = selection;\n for (let row = start.row; row <= end.row; row += 1) {\n const first = row === start.row ? start.column : 0;\n const last = row === end.row ? end.column : Math.max(0, view.rows[row]?.length ?? 0);\n context.fillRect(\n ORIGIN_X + first * CELL_WIDTH,\n ORIGIN_Y + row * LINE_HEIGHT,\n Math.max(1, last - first + 1) * CELL_WIDTH,\n LINE_HEIGHT,\n );\n }\n }\n context.font = \"13px ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\";\n context.textBaseline = \"top\";\n context.fillStyle = css(view.theme.foreground);\n for (let row = 0; row < view.rows.length; row += 1) {\n context.fillText(view.rows[row] ?? \"\", ORIGIN_X, ORIGIN_Y + row * LINE_HEIGHT);\n }\n if (selection) {\n const [start, end] = selection;\n context.fillStyle = css(view.theme.selectionForeground);\n for (let row = start.row; row <= end.row; row += 1) {\n const first = row === start.row ? start.column : 0;\n const last = row === end.row ? end.column : Math.max(0, view.rows[row]?.length ?? 0);\n context.save();\n context.beginPath();\n context.rect(\n ORIGIN_X + first * CELL_WIDTH,\n ORIGIN_Y + row * LINE_HEIGHT,\n Math.max(1, last - first + 1) * CELL_WIDTH,\n LINE_HEIGHT,\n );\n context.clip();\n context.fillText(view.rows[row] ?? \"\", ORIGIN_X, ORIGIN_Y + row * LINE_HEIGHT);\n context.restore();\n }\n }\n const cursorStyle = effectiveCursorStyle(view);\n if (cursorStyle !== null) {\n const x = ORIGIN_X + view.cursor.x * CELL_WIDTH;\n const y = ORIGIN_Y + view.cursor.y * LINE_HEIGHT;\n const color =\n cursorStyle === CursorStyle.HollowBlock\n ? ([view.theme.cursor[0], view.theme.cursor[1], view.theme.cursor[2], 1] as const)\n : view.theme.cursor;\n context.fillStyle = css(color);\n if (cursorStyle === CursorStyle.Bar) {\n context.fillRect(x, y, 2, LINE_HEIGHT);\n } else if (cursorStyle === CursorStyle.Underline) {\n context.fillRect(x, y + LINE_HEIGHT - 2, CELL_WIDTH, 2);\n } else if (cursorStyle === CursorStyle.HollowBlock) {\n context.strokeStyle = css(color);\n context.lineWidth = 1;\n context.strokeRect(x + 0.5, y + 0.5, CELL_WIDTH - 1, LINE_HEIGHT - 1);\n } else {\n context.fillRect(x, y, CELL_WIDTH, LINE_HEIGHT);\n context.save();\n context.beginPath();\n context.rect(x, y, CELL_WIDTH, LINE_HEIGHT);\n context.clip();\n context.fillStyle = css(view.theme.cursorText ?? view.theme.background);\n context.fillText(view.rows[view.cursor.y] ?? \"\", ORIGIN_X, ORIGIN_Y + view.cursor.y * LINE_HEIGHT);\n context.restore();\n }\n }\n context.restore();\n if (!this.#performanceMeasurementEnabled) return undefined;\n const metrics = emptyRenderMetrics();\n metrics.fullRenders = 1;\n metrics.damagedRows = Math.max(view.rows.length, view.nativeRows.length, view.nativeStyleRows.length);\n metrics.canvasPixels = surface.canvas.width * surface.canvas.height;\n metrics.renderPasses = 1;\n metrics.drawCalls = 1;\n return metrics;\n }\n}\n", "const graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\nexport function splitGraphemes(text: string): string[] {\n return Array.from(graphemeSegmenter.segment(text), ({ segment }) => segment);\n}\n\nexport function graphemeCellWidth(grapheme: string): 1 | 2 {\n const codepoint = grapheme.codePointAt(0) ?? 0;\n return /\\p{Extended_Pictographic}/u.test(grapheme) ||\n (codepoint >= 0x1100 && codepoint <= 0x115f) ||\n (codepoint >= 0x2e80 && codepoint <= 0xa4cf) ||\n (codepoint >= 0xac00 && codepoint <= 0xd7a3) ||\n (codepoint >= 0xf900 && codepoint <= 0xfaff) ||\n (codepoint >= 0xfe10 && codepoint <= 0xfe6f) ||\n (codepoint >= 0xff00 && codepoint <= 0xff60) ||\n (codepoint >= 0x1f300 && codepoint <= 0x1faff) ||\n (codepoint >= 0x20000 && codepoint <= 0x3fffd)\n ? 2\n : 1;\n}\n", "import type { RenderDamage } from \"./types.js\";\n\nexport interface RenderRows {\n full: boolean;\n rows: number[];\n}\n\nexport function rowsForDamage(rowCount: number, damage: RenderDamage | undefined, sceneValid: boolean): RenderRows {\n const full = !sceneValid || !damage || damage.full;\n if (full) return { full: true, rows: Array.from({ length: rowCount }, (_, row) => row) };\n\n const rows = new Set<number>();\n for (const damagedRow of damage.rows) {\n // Native glyph bearings can cross a row boundary. Repaint one neighbor\n // on each side so clearing stale overhang never clips combining marks.\n for (let row = damagedRow - 1; row <= damagedRow + 1; row += 1) {\n if (row >= 0 && row < rowCount) rows.add(row);\n }\n }\n return { full: false, rows: [...rows].sort((left, right) => left - right) };\n}\n", "// One pipeline serves the ordered effect registry. Each pass gets its own\n// uniform buffer and samples the previous pass, allowing an arbitrary stack\n// without recompiling pipelines or reading and writing the same texture.\nexport const SHADER_EFFECT_WGSL: string = /* wgsl */ `\n@group(0) @binding(0) var terminal_image: texture_2d<f32>;\n@group(0) @binding(1) var terminal_sampler: sampler;\n\nstruct EffectConfig {\n mode: u32,\n frame: u32,\n effect_index: u32,\n effect_count: u32,\n resolution: vec2f,\n time: f32,\n time_delta: f32,\n cursor: vec4f,\n}\n@group(0) @binding(2) var<uniform> effect: EffectConfig;\n\n@vertex fn vertex_main(@builtin(vertex_index) vertex_index: u32) -> @builtin(position) vec4f {\n let positions = array<vec2f, 3>(\n vec2f(-1.0, -1.0),\n vec2f(3.0, -1.0),\n vec2f(-1.0, 3.0),\n );\n return vec4f(positions[vertex_index], 0.0, 1.0);\n}\n\nfn sample_image(uv: vec2f) -> vec4f {\n return textureSample(terminal_image, terminal_sampler, clamp(uv, vec2f(0.0), vec2f(1.0)));\n}\n\nfn straight_rgb(sampled: vec4f) -> vec3f {\n if (sampled.a <= 0.00001) { return vec3f(0.0); }\n return sampled.rgb / sampled.a;\n}\n\nfn premultiplied(rgb: vec3f, alpha: f32) -> vec4f {\n return vec4f(max(rgb, vec3f(0.0)) * alpha, alpha);\n}\n\nfn hash21(p0: vec2f) -> f32 {\n var p = fract(p0 * vec2f(443.8975, 397.2973));\n p += dot(p, p.yx + vec2f(19.19));\n return fract(p.x * p.y);\n}\n\n// Existing Better CRT compatibility port. Its source carries the upstream\n// Shadertoy default CC BY-NC-SA terms; this mode preserves the already-bundled\n// behavior while keeping alpha intact.\nfn better_crt(position: vec2f, uv0: vec2f) -> vec4f {\n var uv = uv0;\n var dc = abs(vec2f(0.5) - uv);\n dc *= dc;\n uv.x = (uv.x - 0.5) * (1.0 + dc.y * 0.075) + 0.5;\n uv.y = (uv.y - 0.5) * (1.0 + dc.x * 0.10) + 0.5;\n let scanline = abs(sin(position.y) * 0.125);\n let sampled = sample_image(uv);\n return vec4f(sampled.rgb * (1.0 - scanline), sampled.a);\n}\n\nfn from_srgb1(value: f32) -> f32 {\n return select(pow(value / 1.055 + 0.055 / 1.055, 2.4), value / 12.92, value <= 0.04045);\n}\n\nfn to_srgb1(value: f32) -> f32 {\n return select(1.055 * pow(max(value, 0.0), 0.41666) - 0.055, value * 12.92, value < 0.0031308);\n}\n\nfn from_srgb(value: vec3f) -> vec3f {\n return vec3f(from_srgb1(value.r), from_srgb1(value.g), from_srgb1(value.b));\n}\n\nfn to_srgb(value: vec3f) -> vec3f {\n return vec3f(to_srgb1(value.r), to_srgb1(value.g), to_srgb1(value.b));\n}\n\n// WebGPU adaptation of Timothy Lottes' public-domain CRT scalar. The source\n// port is Unlicensed/public domain. This retains its warp, scan blur, shadow\n// mask, linear-light processing, and corner vignette in a compact GPU form.\nfn public_domain_crt(position: vec2f, uv0: vec2f) -> vec4f {\n let aspect = effect.resolution.x / max(1.0, effect.resolution.y);\n var centered = uv0 * 2.0 - 1.0;\n centered *= vec2f(\n 1.0 + centered.y * centered.y / (50.0 * aspect),\n 1.0 + centered.x * centered.x / 50.0,\n );\n let uv = centered * 0.5 + 0.5;\n let pixel = 1.0 / effect.resolution;\n let center_sample = sample_image(uv);\n let left = from_srgb(straight_rgb(sample_image(uv - vec2f(pixel.x, 0.0))));\n let center = from_srgb(straight_rgb(center_sample));\n let right = from_srgb(straight_rgb(sample_image(uv + vec2f(pixel.x, 0.0))));\n var color = left * 0.18 + center * 0.64 + right * 0.18;\n let scan = 0.58 + 0.42 * pow(max(0.0, cos(position.y * 2.0943951)), 2.0);\n let mask_index = u32(position.x + position.y * 3.0) % 6u;\n var mask = vec3f(0.65);\n if (mask_index < 2u) { mask.r = 1.0; }\n else if (mask_index < 4u) { mask.g = 1.0; }\n else { mask.b = 1.0; }\n color *= scan * mask;\n let vignette_axis = clamp(1.0 - centered * centered, vec2f(0.0), vec2f(1.0));\n color *= mix(0.5, 1.0, vignette_axis.x * vignette_axis.y);\n let peak = max(0.00001, max(color.r, max(color.g, color.b)));\n let tone = peak / (peak * 0.72 + 0.28);\n color *= tone / peak;\n let inside = all(uv >= vec2f(0.0)) && all(uv <= vec2f(1.0));\n let alpha = select(0.0, center_sample.a, inside);\n return premultiplied(to_srgb(color), alpha);\n}\n\n// MIT-licensed VHS effect by Alex Brinsmead, adapted from the upstream GLSL\n// to premultiplied WebGPU output.\nfn vhs(position: vec2f, uv0: vec2f) -> vec4f {\n let distortion = 1.0;\n let tape_wear = 1.75;\n let color_bleed = 2.0;\n var cc = uv0 - 0.5;\n var warped = clamp(uv0 + cc * (dot(cc, cc) * 0.02), vec2f(0.0), vec2f(1.0));\n warped.x += (\n sin(warped.y * 40.0 + effect.time * 0.5) * 0.000375 +\n sin(warped.y * 80.0 + effect.time * 0.2) * 0.0001875 +\n (hash21(vec2f(floor(position.y), floor(effect.time * 20.0))) - 0.5) * 0.0006\n ) * distortion;\n let tracking_y = fract(effect.time * 0.04);\n let band_distance = min(abs(warped.y - tracking_y), 1.0 - abs(warped.y - tracking_y));\n let band = smoothstep(0.05, 0.0, band_distance);\n let horizontal_offset = band * (hash21(vec2f(floor(position.y * 0.5), effect.time * 3.0)) - 0.5) * 0.006;\n let burst_cycle = floor(effect.time / 30.0);\n let burst_start = hash21(vec2f(burst_cycle, 88.0)) * 25.0;\n let burst_time = effect.time - floor(effect.time / 30.0) * 30.0;\n let burst = burst_time > burst_start && burst_time < burst_start + 5.0;\n let jump = select(0.0, (hash21(vec2f(floor(effect.time * 2.0), 11.3)) - 0.5) * 0.08, burst);\n let sample_uv = fract(warped + vec2f(horizontal_offset, jump));\n let aberration = (0.0003 + band * 0.0015) * color_bleed;\n let center_sample = sample_image(sample_uv);\n let red_sample = straight_rgb(sample_image(sample_uv + vec2f(aberration, 0.0)));\n let blue_sample = straight_rgb(sample_image(sample_uv - vec2f(aberration, 0.0)));\n var color = vec3f(red_sample.r, straight_rgb(center_sample).g, blue_sample.b);\n let pixel = 1.0 / effect.resolution.x;\n let neighbor = straight_rgb(sample_image(sample_uv + vec2f(pixel, 0.0))) * 0.4 +\n straight_rgb(sample_image(sample_uv + vec2f(pixel * 3.0, 0.0))) * 0.6;\n let luma_weights = vec3f(0.299, 0.587, 0.114);\n let luma = dot(color, luma_weights);\n color = vec3f(luma) + mix(color - vec3f(luma), neighbor - vec3f(dot(neighbor, luma_weights)), 0.5 * color_bleed);\n color *= 1.8;\n let grain_time = fract(effect.time);\n let noise1 = hash21(position + vec2f(grain_time * 100.0)) - 0.5;\n let noise2 = hash21(position + vec2f(grain_time * 200.0)) - 0.5;\n let gray = dot(color, luma_weights);\n color += (color - vec3f(gray)) * vec3f(noise1, noise2, -noise1) * 0.15 * tape_wear;\n color += vec3f(noise1 * 0.05 * tape_wear);\n color *= mix(vec3f(1.0), vec3f(1.03, 1.01, 0.96), tape_wear);\n let vignette = uv0 * (1.0 - uv0);\n color *= mix(1.0, clamp(vignette.x * vignette.y * 15.0, 0.0, 1.0), 0.35);\n let static_time = fract(effect.time * 20.0);\n let static_hash = hash21(vec2f(floor(position.x / 10.0), floor(position.y / 2.0) + static_time * 500.0) + vec2f(static_time * 77.0));\n color = mix(color, vec3f(1.0), step(0.9991, static_hash) * 0.135);\n return premultiplied(color, center_sample.a);\n}\n\n// Ember overlay inspired by Jan Mr\u00F3z's CC BY 3.0 shader, adapted for the\n// Ghostty pipeline. Attribution is retained in THIRD_PARTY_NOTICES.md.\nfn sparks(position: vec2f, uv: vec2f) -> vec4f {\n let terminal = sample_image(uv);\n var spark = vec3f(0.0);\n var spark_alpha = 0.0;\n for (var layer = 0u; layer < 8u; layer += 1u) {\n let layer_value = f32(layer);\n let scale = 18.0 + layer_value * 7.0;\n let drift = vec2f(effect.time * (0.35 + layer_value * 0.025), -effect.time * (0.7 + layer_value * 0.05));\n let grid = uv * vec2f(scale, scale * 1.6) + drift;\n let cell = floor(grid);\n let random = hash21(cell + vec2f(layer_value * 13.7, layer_value * 5.1));\n let local = fract(grid) - vec2f(random, fract(random * 17.17));\n let radius = 0.018 + 0.045 * hash21(cell + vec2f(31.0));\n let intensity = smoothstep(radius, 0.0, length(local)) * step(0.79, random);\n let flicker = 0.55 + 0.45 * sin(effect.time * (5.0 + random * 4.0) + random * 31.0);\n let value = intensity * flicker;\n spark += vec3f(1.5, 0.42, 0.05) * value;\n spark_alpha = max(spark_alpha, value * 0.78);\n }\n let terminal_rgb = straight_rgb(terminal);\n let background_weight = 1.0 - smoothstep(0.12, 0.55, dot(terminal_rgb, vec3f(0.2126, 0.7152, 0.0722)));\n let overlay_alpha = spark_alpha * background_weight;\n let alpha = overlay_alpha + terminal.a * (1.0 - overlay_alpha);\n let rgb = select(\n vec3f(0.0),\n (spark * overlay_alpha + terminal_rgb * terminal.a * (1.0 - overlay_alpha)) / max(alpha, 0.00001),\n alpha > 0.00001,\n );\n return premultiplied(rgb, alpha);\n}\n\n@fragment fn fragment_main(@builtin(position) position: vec4f) -> @location(0) vec4f {\n let uv = position.xy / effect.resolution;\n switch effect.mode {\n case 1u: { return better_crt(position.xy, uv); }\n case 2u: { return public_domain_crt(position.xy, uv); }\n case 3u: { return vhs(position.xy, uv); }\n case 4u: { return sparks(position.xy, uv); }\n default: { return sample_image(uv); }\n }\n}\n`;\n", "/// <reference types=\"@webgpu/types\" />\n\nimport { CursorStyle, GlyphFormat, type GlyphDefinition, type StyleDefinition } from \"@vibecook/ghosttea-frame\";\nimport { emptyRenderMetrics, type TerminalRenderMetrics } from \"../performance.js\";\n\nimport {\n CELL_WIDTH,\n LINE_HEIGHT,\n ORIGIN_X,\n ORIGIN_Y,\n effectiveCursorStyle,\n renderedSizeChanged,\n type CellPoint,\n type PixelSize,\n type RenderView,\n type Rgba,\n type TerminalRenderer,\n type TerminalShaderEffect,\n} from \"./types.js\";\nimport { graphemeCellWidth, splitGraphemes } from \"../cell-width.js\";\nimport { rowsForDamage } from \"./render-damage.js\";\nimport { SHADER_EFFECT_WGSL } from \"./shader-effects.js\";\n\nconst ATLAS_SIZE = 2048;\nconst GEOMETRY_CACHE_LIMIT = 8;\nconst FONT_STACK = \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\";\n\nconst EFFECT_MODES: Readonly<Record<TerminalShaderEffect, number>> = {\n \"ghosttea:better-crt\": 1,\n \"ghosttea:crt\": 2,\n \"ghosttea:vhs\": 3,\n \"ghosttea:sparks-from-fire\": 4,\n};\n\nexport function effectIntermediateTextureCount(effectPassCount: number): number {\n return Math.min(2, Math.max(0, Math.trunc(effectPassCount) - 1));\n}\n\nconst RECT_SHADER = /* wgsl */ `\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n @location(0) color: vec4f,\n}\n\n@vertex fn vertex_main(\n @builtin(vertex_index) vertex_index: u32,\n @location(0) p0: vec2f,\n @location(1) p1: vec2f,\n @location(2) p2: vec2f,\n @location(3) color: vec4f,\n) -> VertexOutput {\n let p3 = p1 + p2 - p0;\n let positions = array<vec2f, 6>(\n p0,\n p1,\n p2,\n p2,\n p1,\n p3,\n );\n var output: VertexOutput;\n output.position = vec4f(positions[vertex_index], 0.0, 1.0);\n output.color = color;\n return output;\n}\n\n@fragment fn fragment_main(input: VertexOutput) -> @location(0) vec4f {\n return vec4f(input.color.rgb * input.color.a, input.color.a);\n}\n`;\n\nfunction glyphShader(coverageChannel: \"r\" | \"a\"): string {\n return /* wgsl */ `\n@group(0) @binding(0) var atlas: texture_2d<f32>;\n@group(0) @binding(1) var atlas_sampler: sampler;\n\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n @location(0) uv: vec2f,\n @location(1) color: vec4f,\n}\n\n@vertex fn vertex_main(\n @builtin(vertex_index) vertex_index: u32,\n @location(0) bounds: vec4f,\n @location(1) uv_bounds: vec4f,\n @location(2) color: vec4f,\n) -> VertexOutput {\n let positions = array<vec2f, 6>(\n vec2f(bounds.x, bounds.z),\n vec2f(bounds.y, bounds.z),\n vec2f(bounds.x, bounds.w),\n vec2f(bounds.x, bounds.w),\n vec2f(bounds.y, bounds.z),\n vec2f(bounds.y, bounds.w),\n );\n let uvs = array<vec2f, 6>(\n vec2f(uv_bounds.x, uv_bounds.z),\n vec2f(uv_bounds.y, uv_bounds.z),\n vec2f(uv_bounds.x, uv_bounds.w),\n vec2f(uv_bounds.x, uv_bounds.w),\n vec2f(uv_bounds.y, uv_bounds.z),\n vec2f(uv_bounds.y, uv_bounds.w),\n );\n var output: VertexOutput;\n output.position = vec4f(positions[vertex_index], 0.0, 1.0);\n output.uv = uvs[vertex_index];\n output.color = color;\n return output;\n}\n\n@fragment fn fragment_main(input: VertexOutput) -> @location(0) vec4f {\n let coverage = textureSample(atlas, atlas_sampler, input.uv).${coverageChannel};\n let alpha = input.color.a * coverage;\n return vec4f(input.color.rgb * alpha, alpha);\n}\n`;\n}\n\nconst MONO_GLYPH_SHADER = glyphShader(\"r\");\nconst FALLBACK_GLYPH_SHADER = glyphShader(\"a\");\n\nconst COLOR_GLYPH_SHADER = /* wgsl */ `\n@group(0) @binding(0) var atlas: texture_2d<f32>;\n@group(0) @binding(1) var atlas_sampler: sampler;\n\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n @location(0) uv: vec2f,\n @location(1) color: vec4f,\n}\n\n@vertex fn vertex_main(\n @builtin(vertex_index) vertex_index: u32,\n @location(0) bounds: vec4f,\n @location(1) uv_bounds: vec4f,\n @location(2) color: vec4f,\n) -> VertexOutput {\n let positions = array<vec2f, 6>(\n vec2f(bounds.x, bounds.z),\n vec2f(bounds.y, bounds.z),\n vec2f(bounds.x, bounds.w),\n vec2f(bounds.x, bounds.w),\n vec2f(bounds.y, bounds.z),\n vec2f(bounds.y, bounds.w),\n );\n let uvs = array<vec2f, 6>(\n vec2f(uv_bounds.x, uv_bounds.z),\n vec2f(uv_bounds.y, uv_bounds.z),\n vec2f(uv_bounds.x, uv_bounds.w),\n vec2f(uv_bounds.x, uv_bounds.w),\n vec2f(uv_bounds.y, uv_bounds.z),\n vec2f(uv_bounds.y, uv_bounds.w),\n );\n var output: VertexOutput;\n output.position = vec4f(positions[vertex_index], 0.0, 1.0);\n output.uv = uvs[vertex_index];\n output.color = color;\n return output;\n}\n\n@fragment fn fragment_main(input: VertexOutput) -> @location(0) vec4f {\n return textureSample(atlas, atlas_sampler, input.uv);\n}\n`;\n\nconst premultipliedBlend: GPUBlendState = {\n color: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n};\n\nfunction premultipliedClear(color: Rgba): GPUColorDict {\n return { r: color[0] * color[3], g: color[1] * color[3], b: color[2] * color[3], a: color[3] };\n}\n\nclass DynamicVertexBuffer {\n #buffer: GPUBuffer | undefined;\n #capacity = 0;\n\n constructor(\n readonly device: GPUDevice,\n readonly label: string,\n ) {}\n\n write(vertices: Float32Array): GPUBuffer | undefined {\n if (vertices.byteLength === 0) return undefined;\n if (!this.#buffer || this.#capacity < vertices.byteLength) {\n this.#buffer?.destroy();\n this.#capacity = Math.max(4096, 2 ** Math.ceil(Math.log2(vertices.byteLength)));\n this.#buffer = this.device.createBuffer({\n label: this.label,\n size: this.#capacity,\n usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n });\n }\n this.device.queue.writeBuffer(this.#buffer, 0, vertices);\n return this.#buffer;\n }\n\n destroy(): void {\n this.#buffer?.destroy();\n this.#buffer = undefined;\n }\n}\n\ninterface GlyphLocation {\n u0: number;\n v0: number;\n u1: number;\n v1: number;\n cells: number;\n}\n\nclass FallbackGlyphAtlas {\n readonly #texture: GPUTexture;\n readonly #sampler: GPUSampler;\n readonly #bindGroup: GPUBindGroup;\n readonly #cache = new Map<string, GlyphLocation>();\n readonly #scratch = new OffscreenCanvas(1, 1);\n #x = 1;\n #y = 1;\n #rowHeight = 0;\n #uploadBytes = 0;\n #uploadCalls = 0;\n #generation = 0;\n\n constructor(\n readonly device: GPUDevice,\n bindGroupLayout: GPUBindGroupLayout,\n ) {\n this.#texture = device.createTexture({\n label: \"terminal glyph atlas\",\n size: [ATLAS_SIZE, ATLAS_SIZE],\n format: \"rgba8unorm\",\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,\n });\n this.#sampler = device.createSampler({ minFilter: \"linear\", magFilter: \"linear\" });\n this.#bindGroup = device.createBindGroup({\n label: \"terminal glyph atlas bindings\",\n layout: bindGroupLayout,\n entries: [\n { binding: 0, resource: this.#texture.createView() },\n { binding: 1, resource: this.#sampler },\n ],\n });\n }\n\n get bindGroup(): GPUBindGroup {\n return this.#bindGroup;\n }\n\n get generation(): number {\n return this.#generation;\n }\n\n prepare(values: Iterable<string>, dpr: number): void {\n const scale = Math.max(1, Math.min(3, dpr));\n const all = [...new Set(values)].filter((value) => value.trim().length > 0);\n const missing = all.filter((value) => !this.#cache.has(`${scale.toFixed(2)}:${value}`));\n if (this.#fits(missing, scale, this.#x, this.#y, this.#rowHeight)) return;\n this.#cache.clear();\n this.#generation += 1;\n this.#x = 1;\n this.#y = 1;\n this.#rowHeight = 0;\n if (!this.#fits(all, scale, this.#x, this.#y, this.#rowHeight)) {\n throw new Error(\"The diagnostic glyph atlas cannot fit the text visible in one frame\");\n }\n }\n\n #fits(values: Iterable<string>, scale: number, startX: number, startY: number, startRowHeight: number): boolean {\n let x = startX;\n let y = startY;\n let rowHeight = startRowHeight;\n for (const value of values) {\n const width = Math.max(1, Math.ceil(CELL_WIDTH * graphemeCellWidth(value) * scale));\n const height = Math.max(1, Math.ceil(LINE_HEIGHT * scale));\n if (x + width + 1 > ATLAS_SIZE) {\n x = 1;\n y += rowHeight + 1;\n rowHeight = 0;\n }\n if (y + height + 1 > ATLAS_SIZE) return false;\n x += width + 1;\n rowHeight = Math.max(rowHeight, height);\n }\n return true;\n }\n\n glyph(grapheme: string, dpr: number): GlyphLocation | undefined {\n if (grapheme.trim().length === 0) return undefined;\n const scale = Math.max(1, Math.min(3, dpr));\n const cells = graphemeCellWidth(grapheme);\n const key = `${scale.toFixed(2)}:${grapheme}`;\n const cached = this.#cache.get(key);\n if (cached) return cached;\n\n const width = Math.max(1, Math.ceil(CELL_WIDTH * cells * scale));\n const height = Math.max(1, Math.ceil(LINE_HEIGHT * scale));\n if (this.#x + width + 1 > ATLAS_SIZE) {\n this.#x = 1;\n this.#y += this.#rowHeight + 1;\n this.#rowHeight = 0;\n }\n if (this.#y + height + 1 > ATLAS_SIZE) {\n throw new Error(\"Temporary glyph atlas exhausted\");\n }\n\n this.#scratch.width = width;\n this.#scratch.height = height;\n const context = this.#scratch.getContext(\"2d\", { willReadFrequently: true });\n if (!context) throw new Error(\"Glyph raster canvas unavailable\");\n context.clearRect(0, 0, width, height);\n context.fillStyle = \"white\";\n context.font = `${13 * scale}px ${FONT_STACK}`;\n context.textBaseline = \"top\";\n context.fillText(grapheme, 0, Math.max(0, Math.floor((height - 15 * scale) / 2)));\n const image = context.getImageData(0, 0, width, height);\n this.device.queue.writeTexture(\n { texture: this.#texture, origin: [this.#x, this.#y] },\n image.data,\n { bytesPerRow: width * 4, rowsPerImage: height },\n [width, height],\n );\n this.#uploadBytes += image.data.byteLength;\n this.#uploadCalls += 1;\n const location: GlyphLocation = {\n u0: this.#x / ATLAS_SIZE,\n v0: this.#y / ATLAS_SIZE,\n u1: (this.#x + width) / ATLAS_SIZE,\n v1: (this.#y + height) / ATLAS_SIZE,\n cells,\n };\n this.#cache.set(key, location);\n this.#x += width + 1;\n this.#rowHeight = Math.max(this.#rowHeight, height);\n return location;\n }\n\n destroy(): void {\n this.#texture.destroy();\n }\n\n uploadMetrics(): { bytes: number; calls: number } {\n return { bytes: this.#uploadBytes, calls: this.#uploadCalls };\n }\n}\n\nclass NativeGlyphAtlas {\n readonly #texture: GPUTexture;\n readonly #sampler: GPUSampler;\n readonly #bindGroup: GPUBindGroup;\n readonly #cache = new Map<number, GlyphLocation>();\n #x = 1;\n #y = 1;\n #rowHeight = 0;\n #uploadBytes = 0;\n #uploadCalls = 0;\n #generation = 0;\n\n constructor(\n readonly device: GPUDevice,\n bindGroupLayout: GPUBindGroupLayout,\n readonly label: string,\n readonly format: \"r8unorm\" | \"rgba8unorm\",\n ) {\n this.#texture = device.createTexture({\n label,\n size: [ATLAS_SIZE, ATLAS_SIZE],\n format,\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,\n });\n this.#sampler = device.createSampler({ minFilter: \"linear\", magFilter: \"linear\" });\n this.#bindGroup = device.createBindGroup({\n label: `${label} bindings`,\n layout: bindGroupLayout,\n entries: [\n { binding: 0, resource: this.#texture.createView() },\n { binding: 1, resource: this.#sampler },\n ],\n });\n }\n\n get bindGroup(): GPUBindGroup {\n return this.#bindGroup;\n }\n\n get generation(): number {\n return this.#generation;\n }\n\n prepare(definitions: Iterable<GlyphDefinition>): void {\n const all = new Map<number, GlyphDefinition>();\n const missing = new Map<number, GlyphDefinition>();\n for (const definition of definitions) {\n all.set(definition.id, definition);\n if (!this.#cache.has(definition.id)) missing.set(definition.id, definition);\n }\n if (this.#fits(missing.values(), this.#x, this.#y, this.#rowHeight)) return;\n this.#cache.clear();\n this.#generation += 1;\n this.#x = 1;\n this.#y = 1;\n this.#rowHeight = 0;\n if (!this.#fits(all.values(), this.#x, this.#y, this.#rowHeight)) {\n throw new Error(`${this.label} cannot fit the glyphs visible in one frame`);\n }\n }\n\n #fits(definitions: Iterable<GlyphDefinition>, startX: number, startY: number, startRowHeight: number): boolean {\n let x = startX;\n let y = startY;\n let rowHeight = startRowHeight;\n for (const { width, height } of definitions) {\n if (width + 2 > ATLAS_SIZE || height + 2 > ATLAS_SIZE) return false;\n if (x + width + 1 > ATLAS_SIZE) {\n x = 1;\n y += rowHeight + 1;\n rowHeight = 0;\n }\n if (y + height + 1 > ATLAS_SIZE) return false;\n x += width + 1;\n rowHeight = Math.max(rowHeight, height);\n }\n return true;\n }\n\n glyph(definition: GlyphDefinition): GlyphLocation {\n const cached = this.#cache.get(definition.id);\n if (cached) return cached;\n const { width, height } = definition;\n if (this.#x + width + 1 > ATLAS_SIZE) {\n this.#x = 1;\n this.#y += this.#rowHeight + 1;\n this.#rowHeight = 0;\n }\n if (this.#y + height + 1 > ATLAS_SIZE) throw new Error(`${this.label} exhausted`);\n const pixels = definition.pixels;\n const bytesPerPixel = this.format === \"r8unorm\" ? 1 : 4;\n this.device.queue.writeTexture(\n { texture: this.#texture, origin: [this.#x, this.#y] },\n pixels,\n { bytesPerRow: width * bytesPerPixel, rowsPerImage: height },\n [width, height],\n );\n this.#uploadBytes += pixels.byteLength;\n this.#uploadCalls += 1;\n const location: GlyphLocation = {\n u0: this.#x / ATLAS_SIZE,\n v0: this.#y / ATLAS_SIZE,\n u1: (this.#x + width) / ATLAS_SIZE,\n v1: (this.#y + height) / ATLAS_SIZE,\n cells: 0,\n };\n this.#cache.set(definition.id, location);\n this.#x += width + 1;\n this.#rowHeight = Math.max(this.#rowHeight, height);\n return location;\n }\n\n destroy(): void {\n this.#texture.destroy();\n }\n\n uploadMetrics(): { bytes: number; calls: number } {\n return { bytes: this.#uploadBytes, calls: this.#uploadCalls };\n }\n}\n\ninterface WebGpuSurface extends PixelSize {\n canvas: OffscreenCanvas;\n context: GPUCanvasContext;\n sceneTexture: GPUTexture;\n effectTextures: GPUTexture[];\n effectPasses: EffectPass[];\n effectSignature: string;\n effectFrame: number;\n lastEffectTime: number;\n rectangleBuffer: DynamicVertexBuffer;\n glyphBuffer: DynamicVertexBuffer;\n colorGlyphBuffer: DynamicVertexBuffer;\n fallbackGlyphBuffer: DynamicVertexBuffer;\n cursorBuffer: DynamicVertexBuffer;\n geometryCache: Map<string, CachedGeometry>;\n geometryCandidates: Map<string, true>;\n sceneValid: boolean;\n}\n\ninterface EffectPass {\n mode: number;\n configBuffer: GPUBuffer;\n bindGroup: GPUBindGroup;\n}\n\ninterface GeometryLayout {\n rowResetInstanceCount: number;\n backgroundInstanceCount: number;\n selectionInstanceCount: number;\n decorationInstanceStart: number;\n decorationInstanceCount: number;\n rectangleInstanceCount: number;\n glyphInstanceCount: number;\n colorGlyphInstanceCount: number;\n fallbackGlyphInstanceCount: number;\n}\n\ninterface CpuGeometry extends GeometryLayout {\n rectangleData: Float32Array;\n glyphData: Float32Array;\n colorGlyphData: Float32Array;\n fallbackGlyphData: Float32Array;\n}\n\ninterface CachedGeometry extends GeometryLayout {\n rectangleBuffer: GPUBuffer | undefined;\n glyphBuffer: GPUBuffer | undefined;\n colorGlyphBuffer: GPUBuffer | undefined;\n fallbackGlyphBuffer: GPUBuffer | undefined;\n}\n\nfunction destroyCachedGeometry(geometry: CachedGeometry): void {\n geometry.rectangleBuffer?.destroy();\n geometry.glyphBuffer?.destroy();\n geometry.colorGlyphBuffer?.destroy();\n geometry.fallbackGlyphBuffer?.destroy();\n}\n\nfunction clearGeometryCache(surface: WebGpuSurface): void {\n for (const geometry of surface.geometryCache.values()) destroyCachedGeometry(geometry);\n surface.geometryCache.clear();\n surface.geometryCandidates.clear();\n}\n\nfunction createCachedVertexBuffer(device: GPUDevice, label: string, data: Float32Array): GPUBuffer | undefined {\n if (data.byteLength === 0) return undefined;\n const buffer = device.createBuffer({\n label,\n size: data.byteLength,\n usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n });\n device.queue.writeBuffer(buffer, 0, data);\n return buffer;\n}\n\nfunction geometryCacheKey(\n view: RenderView,\n rows: readonly number[],\n hasNativeRows: boolean,\n atlasGenerations: readonly [number, number, number],\n): string {\n const selection = view.selection\n ? `${view.selection.anchor.row},${view.selection.anchor.column},${view.selection.focus.row},${view.selection.focus.column}`\n : \"-\";\n return [\n view.sessionEpoch.toString(),\n view.layoutEpoch.toString(),\n hasNativeRows ? \"native\" : \"fallback\",\n rows.map((row) => `${row}:${view.rowRevisions[row]?.toString() ?? \"-\"}`).join(\",\"),\n [\n ...view.theme.background,\n ...view.theme.foreground,\n ...view.theme.cursor,\n ...(view.theme.cursorText ?? view.theme.background),\n ...view.theme.selection,\n ...view.theme.selectionForeground,\n ].join(\",\"),\n view.theme.backgroundOpacityCells ? \"opacity-cells\" : \"opaque-cells\",\n selection,\n effectiveCursorStyle(view) === CursorStyle.Block ? `${view.cursor.x},${view.cursor.y}` : \"-\",\n atlasGenerations.join(\",\"),\n ].join(\"|\");\n}\n\nfunction pushCursorVertices(\n vertices: number[],\n view: RenderView,\n renderRowSet: ReadonlySet<number>,\n scale: number,\n viewportWidth: number,\n viewportHeight: number,\n): void {\n const cursorStyle = effectiveCursorStyle(view);\n if (cursorStyle === null || cursorStyle === CursorStyle.Block || !renderRowSet.has(view.cursor.y)) return;\n const x = (ORIGIN_X + view.cursor.x * CELL_WIDTH) * scale;\n const y = (ORIGIN_Y + view.cursor.y * LINE_HEIGHT) * scale;\n const width = CELL_WIDTH * scale;\n const height = LINE_HEIGHT * scale;\n const stroke = Math.max(1, Math.round(scale));\n const cursorColor: Rgba =\n cursorStyle === CursorStyle.HollowBlock\n ? [view.theme.cursor[0], view.theme.cursor[1], view.theme.cursor[2], 1]\n : view.theme.cursor;\n if (cursorStyle === CursorStyle.Bar) {\n pushRectangle(\n vertices,\n x,\n y,\n Math.max(2, Math.round(2 * scale)),\n height,\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n } else if (cursorStyle === CursorStyle.Underline) {\n const thickness = Math.max(2, Math.round(2 * scale));\n pushRectangle(vertices, x, y + height - thickness, width, thickness, cursorColor, viewportWidth, viewportHeight);\n } else if (cursorStyle === CursorStyle.HollowBlock) {\n pushRectangle(vertices, x, y, width, stroke, cursorColor, viewportWidth, viewportHeight);\n pushRectangle(vertices, x, y + height - stroke, width, stroke, cursorColor, viewportWidth, viewportHeight);\n pushRectangle(\n vertices,\n x,\n y + stroke,\n stroke,\n Math.max(0, height - stroke * 2),\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n pushRectangle(\n vertices,\n x + width - stroke,\n y + stroke,\n stroke,\n Math.max(0, height - stroke * 2),\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n } else {\n pushRectangle(vertices, x, y, width, height, cursorColor, viewportWidth, viewportHeight);\n }\n}\n\nfunction clipX(pixel: number, width: number): number {\n return (pixel / Math.max(1, width)) * 2 - 1;\n}\n\nfunction clipY(pixel: number, height: number): number {\n return 1 - (pixel / Math.max(1, height)) * 2;\n}\n\nfunction pushRectangle(\n output: number[],\n x: number,\n y: number,\n width: number,\n height: number,\n color: Rgba,\n viewportWidth: number,\n viewportHeight: number,\n): void {\n const left = clipX(x, viewportWidth);\n const right = clipX(x + width, viewportWidth);\n const top = clipY(y, viewportHeight);\n const bottom = clipY(y + height, viewportHeight);\n output.push(left, top, right, top, left, bottom, ...color);\n}\n\nfunction pushGlyph(\n output: number[],\n x: number,\n y: number,\n width: number,\n height: number,\n glyph: GlyphLocation,\n color: Rgba,\n viewportWidth: number,\n viewportHeight: number,\n): void {\n const left = clipX(x, viewportWidth);\n const right = clipX(x + width, viewportWidth);\n const top = clipY(y, viewportHeight);\n const bottom = clipY(y + height, viewportHeight);\n output.push(left, right, top, bottom, glyph.u0, glyph.u1, glyph.v0, glyph.v1, ...color);\n}\n\nfunction ordered(selection: RenderView[\"selection\"]): [CellPoint, CellPoint] | null {\n if (!selection) return null;\n const { anchor, focus } = selection;\n return anchor.row < focus.row || (anchor.row === focus.row && anchor.column <= focus.column)\n ? [anchor, focus]\n : [focus, anchor];\n}\n\nfunction cellLength(text: string): number {\n return splitGraphemes(text).reduce((total, grapheme) => total + graphemeCellWidth(grapheme), 0);\n}\n\nconst BOX_DIRECTIONS = new Map<string, string>([\n [\"\u2500\", \"lr\"],\n [\"\u2501\", \"lr\"],\n [\"\u2502\", \"ud\"],\n [\"\u2503\", \"ud\"],\n [\"\u250C\", \"rd\"],\n [\"\u250D\", \"rd\"],\n [\"\u250E\", \"rd\"],\n [\"\u250F\", \"rd\"],\n [\"\u2510\", \"ld\"],\n [\"\u2511\", \"ld\"],\n [\"\u2512\", \"ld\"],\n [\"\u2513\", \"ld\"],\n [\"\u2514\", \"ru\"],\n [\"\u2515\", \"ru\"],\n [\"\u2516\", \"ru\"],\n [\"\u2517\", \"ru\"],\n [\"\u2518\", \"lu\"],\n [\"\u2519\", \"lu\"],\n [\"\u251A\", \"lu\"],\n [\"\u251B\", \"lu\"],\n [\"\u251C\", \"udr\"],\n [\"\u251D\", \"udr\"],\n [\"\u251E\", \"udr\"],\n [\"\u2523\", \"udr\"],\n [\"\u2524\", \"udl\"],\n [\"\u2525\", \"udl\"],\n [\"\u2526\", \"udl\"],\n [\"\u252B\", \"udl\"],\n [\"\u252C\", \"lrd\"],\n [\"\u252F\", \"lrd\"],\n [\"\u2530\", \"lrd\"],\n [\"\u2533\", \"lrd\"],\n [\"\u2534\", \"lru\"],\n [\"\u2537\", \"lru\"],\n [\"\u2538\", \"lru\"],\n [\"\u253B\", \"lru\"],\n [\"\u253C\", \"lrud\"],\n [\"\u254B\", \"lrud\"],\n [\"\u2574\", \"l\"],\n [\"\u2576\", \"r\"],\n [\"\u2575\", \"u\"],\n [\"\u2577\", \"d\"],\n [\"\u2550\", \"lr\"],\n [\"\u2551\", \"ud\"],\n [\"\u2554\", \"rd\"],\n [\"\u2557\", \"ld\"],\n [\"\u255A\", \"ru\"],\n [\"\u255D\", \"lu\"],\n [\"\u2560\", \"udr\"],\n [\"\u2563\", \"udl\"],\n [\"\u2566\", \"lrd\"],\n [\"\u2569\", \"lru\"],\n [\"\u256C\", \"lrud\"],\n [\"\u256D\", \"rd\"],\n [\"\u256E\", \"ld\"],\n [\"\u256F\", \"lu\"],\n [\"\u2570\", \"ru\"],\n]);\n\nconst ROUNDED_BOX_CORNERS = new Set([\"\u256D\", \"\u256E\", \"\u256F\", \"\u2570\"]);\n\nexport interface SpecialDrawingCells {\n box: Map<number, string>;\n block: Map<number, string>;\n}\n\nexport function specialDrawingCells(text: string): SpecialDrawingCells {\n const box = new Map<number, string>();\n const block = new Map<number, string>();\n let column = 0;\n let simple = true;\n for (let index = 0; index < text.length; index += 1) {\n const codepoint = text.charCodeAt(index);\n if (codepoint <= 0x7f) {\n column += 1;\n } else if (codepoint >= 0x2580 && codepoint <= 0x259f) {\n block.set(column, text[index]!);\n column += 1;\n } else if (BOX_DIRECTIONS.has(text[index]!)) {\n box.set(column, text[index]!);\n column += 1;\n } else {\n simple = false;\n break;\n }\n }\n if (simple) return { box, block };\n\n box.clear();\n block.clear();\n column = 0;\n for (const grapheme of splitGraphemes(text)) {\n const codepoint = grapheme.codePointAt(0) ?? 0;\n if (codepoint >= 0x2580 && codepoint <= 0x259f) block.set(column, grapheme);\n else if (BOX_DIRECTIONS.has(grapheme)) box.set(column, grapheme);\n column += graphemeCellWidth(grapheme);\n }\n return { box, block };\n}\n\nfunction rgb(color: readonly [number, number, number]): Rgba {\n return [color[0] / 255, color[1] / 255, color[2] / 255, 1];\n}\n\nfunction over(source: Rgba, backdrop: Rgba): Rgba {\n if (source[3] >= 1) return source;\n if (source[3] <= 0) return backdrop;\n const alpha = source[3] + backdrop[3] * (1 - source[3]);\n if (alpha <= Number.EPSILON) return [0, 0, 0, 0];\n return [\n (source[0] * source[3] + backdrop[0] * backdrop[3] * (1 - source[3])) / alpha,\n (source[1] * source[3] + backdrop[1] * backdrop[3] * (1 - source[3])) / alpha,\n (source[2] * source[3] + backdrop[2] * backdrop[3] * (1 - source[3])) / alpha,\n alpha,\n ];\n}\n\nfunction selectionContains(selection: [CellPoint, CellPoint] | null, row: number, column: number): boolean {\n if (!selection) return false;\n const [start, end] = selection;\n if (row < start.row || row > end.row) return false;\n const first = row === start.row ? start.column : 0;\n const last = row === end.row ? end.column : Number.MAX_SAFE_INTEGER;\n return column >= first && column <= last;\n}\n\nfunction blockCursorContains(view: RenderView, row: number, column: number, span = 1): boolean {\n return (\n effectiveCursorStyle(view) === CursorStyle.Block &&\n view.cursor.y === row &&\n view.cursor.x >= column &&\n view.cursor.x < column + Math.max(1, span)\n );\n}\n\nfunction pushBlockCursorBackground(\n vertices: number[],\n view: RenderView,\n renderRows: readonly number[],\n scale: number,\n viewportWidth: number,\n viewportHeight: number,\n): void {\n if (effectiveCursorStyle(view) !== CursorStyle.Block || !renderRows.includes(view.cursor.y)) return;\n pushRectangle(\n vertices,\n (ORIGIN_X + view.cursor.x * CELL_WIDTH) * scale,\n (ORIGIN_Y + view.cursor.y * LINE_HEIGHT) * scale,\n CELL_WIDTH * scale,\n LINE_HEIGHT * scale,\n view.theme.cursor,\n viewportWidth,\n viewportHeight,\n );\n}\n\ninterface ResolvedStyle {\n foreground: Rgba;\n background: Rgba | null;\n underline: boolean;\n strikethrough: boolean;\n invisible: boolean;\n}\n\nfunction resolveStyle(style: StyleDefinition | undefined, theme: RenderView[\"theme\"]): ResolvedStyle {\n let foreground: Rgba = style?.foreground ? rgb(style.foreground) : theme.foreground;\n let background: Rgba | null = style?.background ? rgb(style.background) : null;\n if (style?.inverse) {\n const originalForeground = foreground;\n foreground = background ?? theme.background;\n background = originalForeground;\n }\n if (background && theme.backgroundOpacityCells) {\n background = [background[0], background[1], background[2], theme.background[3]];\n }\n if (style?.faint) foreground = [foreground[0], foreground[1], foreground[2], foreground[3] * 0.55];\n return {\n foreground,\n background,\n underline: style?.underline ?? false,\n strikethrough: style?.strikethrough ?? false,\n invisible: style?.invisible ?? false,\n };\n}\n\nfunction pushBoxDrawing(\n output: number[],\n grapheme: string,\n column: number,\n row: number,\n scale: number,\n color: Rgba,\n viewportWidth: number,\n viewportHeight: number,\n): void {\n const directions = BOX_DIRECTIONS.get(grapheme);\n if (!directions) return;\n const left = (ORIGIN_X + column * CELL_WIDTH) * scale;\n const right = (ORIGIN_X + (column + 1) * CELL_WIDTH) * scale;\n const top = (ORIGIN_Y + row * LINE_HEIGHT) * scale;\n const bottom = (ORIGIN_Y + (row + 1) * LINE_HEIGHT) * scale;\n const stroke = Math.max(1, Math.round(scale));\n const centerX = Math.round((left + right - stroke) / 2);\n const centerY = Math.round((top + bottom - stroke) / 2);\n if (ROUNDED_BOX_CORNERS.has(grapheme)) {\n const x = centerX + stroke / 2;\n const y = centerY + stroke / 2;\n const points: Array<readonly [number, number]> = [];\n const [originX, originY, startAngle, endAngle] =\n grapheme === \"\u256D\"\n ? [right, bottom, -Math.PI / 2, -Math.PI]\n : grapheme === \"\u256E\"\n ? [left, bottom, -Math.PI / 2, 0]\n : grapheme === \"\u256F\"\n ? [left, top, Math.PI / 2, 0]\n : [right, top, Math.PI, Math.PI / 2];\n const radiusX = Math.abs(right - x);\n const radiusY = Math.abs(bottom - y);\n const steps = Math.max(5, Math.ceil(Math.max(radiusX, radiusY) / 2));\n for (let step = 0; step <= steps; step += 1) {\n const angle = startAngle + (endAngle - startAngle) * (step / steps);\n points.push([originX + Math.cos(angle) * radiusX, originY + Math.sin(angle) * radiusY]);\n }\n for (let index = 1; index < points.length; index += 1) {\n const from = points[index - 1]!;\n const to = points[index]!;\n const dx = to[0] - from[0];\n const dy = to[1] - from[1];\n const length = Math.hypot(dx, dy);\n if (length <= Number.EPSILON) continue;\n const nx = ((-dy / length) * stroke) / 2;\n const ny = ((dx / length) * stroke) / 2;\n output.push(\n clipX(from[0] + nx, viewportWidth),\n clipY(from[1] + ny, viewportHeight),\n clipX(to[0] + nx, viewportWidth),\n clipY(to[1] + ny, viewportHeight),\n clipX(from[0] - nx, viewportWidth),\n clipY(from[1] - ny, viewportHeight),\n ...color,\n );\n }\n return;\n }\n if (directions.includes(\"u\"))\n pushRectangle(output, centerX, top, stroke, centerY + stroke - top, color, viewportWidth, viewportHeight);\n if (directions.includes(\"d\"))\n pushRectangle(output, centerX, centerY, stroke, bottom - centerY, color, viewportWidth, viewportHeight);\n if (directions.includes(\"l\"))\n pushRectangle(output, left, centerY, centerX + stroke - left, stroke, color, viewportWidth, viewportHeight);\n if (directions.includes(\"r\"))\n pushRectangle(output, centerX, centerY, right - centerX, stroke, color, viewportWidth, viewportHeight);\n}\n\ntype FractionRect = readonly [left: number, top: number, right: number, bottom: number];\n\nconst LOWER_BLOCK_RECTANGLES = Array.from({ length: 7 }, (_, index): readonly FractionRect[] => [\n [0, 1 - (index + 1) / 8, 1, 1],\n]);\nconst LEFT_BLOCK_RECTANGLES = Array.from({ length: 7 }, (_, index): readonly FractionRect[] => [\n [0, 0, (7 - index) / 8, 1],\n]);\nconst FULL_BLOCK_RECTANGLES: readonly FractionRect[] = [[0, 0, 1, 1]];\nconst RIGHT_HALF_RECTANGLES: readonly FractionRect[] = [[0.5, 0, 1, 1]];\nconst UPPER_EIGHTH_RECTANGLES: readonly FractionRect[] = [[0, 0, 1, 1 / 8]];\nconst RIGHT_EIGHTH_RECTANGLES: readonly FractionRect[] = [[7 / 8, 0, 1, 1]];\nconst QUADRANT_RECTANGLES: readonly FractionRect[] = [\n [0, 0, 0.5, 0.5],\n [0.5, 0, 1, 0.5],\n [0, 0.5, 0.5, 1],\n [0.5, 0.5, 1, 1],\n];\nconst QUADRANT_BLOCK_RECTANGLES = new Map<number, readonly FractionRect[]>(\n [\n [0x2596, [2]],\n [0x2597, [3]],\n [0x2598, [0]],\n [0x2599, [0, 2, 3]],\n [0x259a, [0, 3]],\n [0x259b, [0, 1, 2]],\n [0x259c, [0, 1, 3]],\n [0x259d, [1]],\n [0x259e, [1, 2]],\n [0x259f, [1, 2, 3]],\n ].map(([codepoint, quadrants]) => [\n codepoint as number,\n (quadrants as number[]).map((quadrant) => QUADRANT_RECTANGLES[quadrant]!),\n ]),\n);\n\nfunction blockElementRectangles(codepoint: number): readonly FractionRect[] | undefined {\n if (codepoint >= 0x2581 && codepoint <= 0x2587) return LOWER_BLOCK_RECTANGLES[codepoint - 0x2581];\n if (codepoint === 0x2588) return FULL_BLOCK_RECTANGLES;\n if (codepoint >= 0x2589 && codepoint <= 0x258f) return LEFT_BLOCK_RECTANGLES[codepoint - 0x2589];\n if (codepoint === 0x2590) return RIGHT_HALF_RECTANGLES;\n if (codepoint === 0x2594) return UPPER_EIGHTH_RECTANGLES;\n if (codepoint === 0x2595) return RIGHT_EIGHTH_RECTANGLES;\n return QUADRANT_BLOCK_RECTANGLES.get(codepoint);\n}\n\nfunction pushBlockElement(\n output: number[],\n grapheme: string,\n column: number,\n row: number,\n scale: number,\n color: Rgba,\n viewportWidth: number,\n viewportHeight: number,\n): boolean {\n const codepoint = grapheme.charCodeAt(0);\n if (codepoint < 0x2580 || codepoint > 0x259f) return false;\n const cellLeft = (ORIGIN_X + column * CELL_WIDTH) * scale;\n const cellRight = (ORIGIN_X + (column + 1) * CELL_WIDTH) * scale;\n const cellTop = (ORIGIN_Y + row * LINE_HEIGHT) * scale;\n const cellBottom = (ORIGIN_Y + (row + 1) * LINE_HEIGHT) * scale;\n if (codepoint === 0x2580) {\n const x0 = Math.round(cellLeft);\n const x1 = Math.round(cellRight);\n const y0 = Math.round(cellTop);\n const y1 = Math.round(cellTop + (cellBottom - cellTop) * 0.5);\n pushRectangle(output, x0, y0, x1 - x0, y1 - y0, color, viewportWidth, viewportHeight);\n return true;\n }\n const rectangles = blockElementRectangles(codepoint);\n if (!rectangles) return false;\n for (const [left, top, right, bottom] of rectangles) {\n const x0 = Math.round(cellLeft + (cellRight - cellLeft) * left);\n const x1 = Math.round(cellLeft + (cellRight - cellLeft) * right);\n const y0 = Math.round(cellTop + (cellBottom - cellTop) * top);\n const y1 = Math.round(cellTop + (cellBottom - cellTop) * bottom);\n pushRectangle(output, x0, y0, x1 - x0, y1 - y0, color, viewportWidth, viewportHeight);\n }\n return true;\n}\n\nexport class WebGpuTerminalRenderer implements TerminalRenderer {\n readonly kind = \"webgpu\" as const;\n readonly #surfaces = new Map<string, WebGpuSurface>();\n readonly #rectanglePipeline: GPURenderPipeline;\n readonly #rectangleOverwritePipeline: GPURenderPipeline;\n readonly #glyphPipeline: GPURenderPipeline;\n readonly #fallbackGlyphPipeline: GPURenderPipeline;\n readonly #colorGlyphPipeline: GPURenderPipeline;\n readonly #effectPipeline: GPURenderPipeline;\n readonly #effectSampler: GPUSampler;\n readonly #monoAtlas: NativeGlyphAtlas;\n readonly #colorAtlas: NativeGlyphAtlas;\n readonly #fallbackAtlas: FallbackGlyphAtlas;\n #performanceMeasurementEnabled = false;\n\n private constructor(\n readonly device: GPUDevice,\n readonly format: GPUTextureFormat,\n ) {\n const rectangleModule = device.createShaderModule({ label: \"terminal rectangle shader\", code: RECT_SHADER });\n const glyphModule = device.createShaderModule({ label: \"terminal glyph shader\", code: MONO_GLYPH_SHADER });\n const fallbackGlyphModule = device.createShaderModule({\n label: \"terminal fallback glyph shader\",\n code: FALLBACK_GLYPH_SHADER,\n });\n const colorGlyphModule = device.createShaderModule({\n label: \"terminal color glyph shader\",\n code: COLOR_GLYPH_SHADER,\n });\n const effectModule = device.createShaderModule({\n label: \"Ghosttea shader effect registry\",\n code: SHADER_EFFECT_WGSL,\n });\n this.#rectanglePipeline = device.createRenderPipeline({\n label: \"terminal rectangle pipeline\",\n layout: \"auto\",\n vertex: {\n module: rectangleModule,\n entryPoint: \"vertex_main\",\n buffers: [\n {\n arrayStride: 40,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n { shaderLocation: 1, offset: 8, format: \"float32x2\" },\n { shaderLocation: 2, offset: 16, format: \"float32x2\" },\n { shaderLocation: 3, offset: 24, format: \"float32x4\" },\n ],\n },\n ],\n },\n fragment: {\n module: rectangleModule,\n entryPoint: \"fragment_main\",\n targets: [{ format, blend: premultipliedBlend }],\n },\n primitive: { topology: \"triangle-list\" },\n });\n this.#rectangleOverwritePipeline = device.createRenderPipeline({\n label: \"terminal row-reset overwrite pipeline\",\n layout: \"auto\",\n vertex: {\n module: rectangleModule,\n entryPoint: \"vertex_main\",\n buffers: [\n {\n arrayStride: 40,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n { shaderLocation: 1, offset: 8, format: \"float32x2\" },\n { shaderLocation: 2, offset: 16, format: \"float32x2\" },\n { shaderLocation: 3, offset: 24, format: \"float32x4\" },\n ],\n },\n ],\n },\n fragment: { module: rectangleModule, entryPoint: \"fragment_main\", targets: [{ format }] },\n primitive: { topology: \"triangle-list\" },\n });\n this.#glyphPipeline = device.createRenderPipeline({\n label: \"terminal glyph pipeline\",\n layout: \"auto\",\n vertex: {\n module: glyphModule,\n entryPoint: \"vertex_main\",\n buffers: [\n {\n arrayStride: 48,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x4\" },\n { shaderLocation: 1, offset: 16, format: \"float32x4\" },\n { shaderLocation: 2, offset: 32, format: \"float32x4\" },\n ],\n },\n ],\n },\n fragment: { module: glyphModule, entryPoint: \"fragment_main\", targets: [{ format, blend: premultipliedBlend }] },\n primitive: { topology: \"triangle-list\" },\n });\n this.#fallbackGlyphPipeline = device.createRenderPipeline({\n label: \"terminal fallback glyph pipeline\",\n layout: \"auto\",\n vertex: {\n module: fallbackGlyphModule,\n entryPoint: \"vertex_main\",\n buffers: [\n {\n arrayStride: 48,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x4\" },\n { shaderLocation: 1, offset: 16, format: \"float32x4\" },\n { shaderLocation: 2, offset: 32, format: \"float32x4\" },\n ],\n },\n ],\n },\n fragment: {\n module: fallbackGlyphModule,\n entryPoint: \"fragment_main\",\n targets: [{ format, blend: premultipliedBlend }],\n },\n primitive: { topology: \"triangle-list\" },\n });\n this.#colorGlyphPipeline = device.createRenderPipeline({\n label: \"terminal color glyph pipeline\",\n layout: \"auto\",\n vertex: {\n module: colorGlyphModule,\n entryPoint: \"vertex_main\",\n buffers: [\n {\n arrayStride: 48,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x4\" },\n { shaderLocation: 1, offset: 16, format: \"float32x4\" },\n { shaderLocation: 2, offset: 32, format: \"float32x4\" },\n ],\n },\n ],\n },\n fragment: {\n module: colorGlyphModule,\n entryPoint: \"fragment_main\",\n targets: [{ format, blend: premultipliedBlend }],\n },\n primitive: { topology: \"triangle-list\" },\n });\n this.#effectPipeline = device.createRenderPipeline({\n label: \"Ghosttea ordered shader effect pipeline\",\n layout: \"auto\",\n vertex: { module: effectModule, entryPoint: \"vertex_main\" },\n fragment: { module: effectModule, entryPoint: \"fragment_main\", targets: [{ format }] },\n primitive: { topology: \"triangle-list\" },\n });\n this.#effectSampler = device.createSampler({\n label: \"Ghosttea shader effect sampler\",\n addressModeU: \"clamp-to-edge\",\n addressModeV: \"clamp-to-edge\",\n minFilter: \"linear\",\n magFilter: \"linear\",\n });\n this.#monoAtlas = new NativeGlyphAtlas(\n device,\n this.#glyphPipeline.getBindGroupLayout(0),\n \"native monochrome glyph atlas\",\n \"r8unorm\",\n );\n this.#colorAtlas = new NativeGlyphAtlas(\n device,\n this.#colorGlyphPipeline.getBindGroupLayout(0),\n \"native color glyph atlas\",\n \"rgba8unorm\",\n );\n this.#fallbackAtlas = new FallbackGlyphAtlas(device, this.#fallbackGlyphPipeline.getBindGroupLayout(0));\n }\n\n static async create(onLost: (info: GPUDeviceLostInfo) => void): Promise<WebGpuTerminalRenderer> {\n if (!navigator.gpu) throw new Error(\"WebGPU is unavailable\");\n const adapter = await navigator.gpu.requestAdapter();\n if (!adapter) throw new Error(\"No WebGPU adapter is available\");\n const device = await adapter.requestDevice({ label: \"Electron Ghostty terminal renderer\" });\n device.addEventListener(\"uncapturederror\", (event) => {\n console.error(\"[terminal-renderer] WebGPU validation error\", event.error);\n });\n void device.lost.then((info) => {\n if (info.reason !== \"destroyed\") onLost(info);\n });\n return new WebGpuTerminalRenderer(device, navigator.gpu.getPreferredCanvasFormat());\n }\n\n setPerformanceMeasurementEnabled(enabled: boolean): void {\n this.#performanceMeasurementEnabled = enabled;\n }\n\n mount(id: string, canvas: OffscreenCanvas): void {\n const context = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!context) throw new Error(\"WebGPU canvas context unavailable\");\n const sceneTexture = this.#createSceneTexture(canvas.width, canvas.height);\n const surface: WebGpuSurface = {\n canvas,\n context,\n sceneTexture,\n effectTextures: [],\n effectPasses: [],\n effectSignature: \"\",\n effectFrame: 0,\n lastEffectTime: 0,\n width: 1,\n height: 1,\n dpr: 1,\n rectangleBuffer: new DynamicVertexBuffer(this.device, `rectangles ${id}`),\n glyphBuffer: new DynamicVertexBuffer(this.device, `glyphs ${id}`),\n colorGlyphBuffer: new DynamicVertexBuffer(this.device, `color glyphs ${id}`),\n fallbackGlyphBuffer: new DynamicVertexBuffer(this.device, `fallback glyphs ${id}`),\n cursorBuffer: new DynamicVertexBuffer(this.device, `cursor ${id}`),\n geometryCache: new Map(),\n geometryCandidates: new Map(),\n sceneValid: false,\n };\n this.#surfaces.set(id, surface);\n this.#configure(surface);\n }\n\n unmount(id: string): void {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n surface.context.unconfigure();\n surface.sceneTexture.destroy();\n for (const texture of surface.effectTextures) texture.destroy();\n for (const pass of surface.effectPasses) pass.configBuffer.destroy();\n surface.rectangleBuffer.destroy();\n surface.glyphBuffer.destroy();\n surface.colorGlyphBuffer.destroy();\n surface.fallbackGlyphBuffer.destroy();\n surface.cursorBuffer.destroy();\n clearGeometryCache(surface);\n this.#surfaces.delete(id);\n }\n\n resize(id: string, size: PixelSize): void {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n const changed = renderedSizeChanged(surface, size);\n Object.assign(surface, size);\n if (!changed) return;\n surface.canvas.width = Math.max(1, Math.round(size.width * size.dpr));\n surface.canvas.height = Math.max(1, Math.round(size.height * size.dpr));\n this.#configure(surface);\n }\n\n #configure(surface: WebGpuSurface): void {\n surface.context.configure({ device: this.device, format: this.format, alphaMode: \"premultiplied\" });\n surface.sceneTexture.destroy();\n for (const texture of surface.effectTextures) texture.destroy();\n for (const pass of surface.effectPasses) pass.configBuffer.destroy();\n surface.sceneTexture = this.#createSceneTexture(surface.canvas.width, surface.canvas.height);\n surface.effectTextures = [];\n surface.effectPasses = [];\n surface.effectSignature = \"\";\n clearGeometryCache(surface);\n surface.sceneValid = false;\n }\n\n #createSceneTexture(width: number, height: number): GPUTexture {\n return this.device.createTexture({\n label: \"terminal scene before Ghostty custom shaders\",\n size: [Math.max(1, width), Math.max(1, height)],\n format: this.format,\n usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,\n });\n }\n\n #createEffectTexture(width: number, height: number, suffix: string): GPUTexture {\n return this.device.createTexture({\n label: `terminal shader ping-pong ${suffix}`,\n size: [Math.max(1, width), Math.max(1, height)],\n format: this.format,\n usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,\n });\n }\n\n #createEffectBindGroup(texture: GPUTexture, configBuffer: GPUBuffer): GPUBindGroup {\n return this.device.createBindGroup({\n label: \"Ghosttea shader effect bindings\",\n layout: this.#effectPipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: texture.createView() },\n { binding: 1, resource: this.#effectSampler },\n { binding: 2, resource: { buffer: configBuffer } },\n ],\n });\n }\n\n #shaderStack(view: RenderView): TerminalShaderEffect[] {\n const configured = view.effects?.shaderEffects?.filter((id) => EFFECT_MODES[id] !== undefined) ?? [];\n if (configured.length > 0) return [...configured];\n return view.effects?.postProcess === \"better-crt\" ? [\"ghosttea:better-crt\"] : [];\n }\n\n #ensureEffectPasses(surface: WebGpuSurface, stack: readonly TerminalShaderEffect[]): void {\n const signature = stack.join(\"\\0\") || \"ghosttea:blit\";\n if (surface.effectSignature === signature) return;\n for (const pass of surface.effectPasses) pass.configBuffer.destroy();\n const modes = stack.length > 0 ? stack.map((id) => EFFECT_MODES[id]) : [0];\n const intermediateCount = effectIntermediateTextureCount(modes.length);\n while (surface.effectTextures.length > intermediateCount) surface.effectTextures.pop()!.destroy();\n while (surface.effectTextures.length < intermediateCount) {\n const suffix = surface.effectTextures.length === 0 ? \"A\" : \"B\";\n surface.effectTextures.push(this.#createEffectTexture(surface.canvas.width, surface.canvas.height, suffix));\n }\n surface.effectPasses = modes.map((mode, index) => {\n const configBuffer = this.device.createBuffer({\n label: `Ghosttea shader effect configuration ${index}`,\n size: 48,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n const inputTexture = index === 0 ? surface.sceneTexture : surface.effectTextures[(index - 1) % 2]!;\n return {\n mode,\n configBuffer,\n bindGroup: this.#createEffectBindGroup(inputTexture, configBuffer),\n };\n });\n surface.effectSignature = signature;\n surface.effectFrame = 0;\n surface.lastEffectTime = 0;\n }\n\n #encodeEffectStack(surface: WebGpuSurface, view: RenderView, encoder: GPUCommandEncoder): number {\n const stack = this.#shaderStack(view);\n this.#ensureEffectPasses(surface, stack);\n const now = view.effects?.animate ? performance.now() / 1_000 : 0;\n const delta = surface.lastEffectTime > 0 ? Math.min(0.1, Math.max(0, now - surface.lastEffectTime)) : 0;\n surface.lastEffectTime = now;\n const passCount = surface.effectPasses.length;\n for (let index = 0; index < passCount; index += 1) {\n const effectPass = surface.effectPasses[index]!;\n const storage = new ArrayBuffer(48);\n const values = new DataView(storage);\n values.setUint32(0, effectPass.mode, true);\n values.setUint32(4, surface.effectFrame, true);\n values.setUint32(8, index, true);\n values.setUint32(12, passCount, true);\n values.setFloat32(16, surface.canvas.width, true);\n values.setFloat32(20, surface.canvas.height, true);\n values.setFloat32(24, now, true);\n values.setFloat32(28, delta, true);\n values.setFloat32(32, (ORIGIN_X + view.cursor.x * CELL_WIDTH) * surface.dpr, true);\n values.setFloat32(36, (ORIGIN_Y + view.cursor.y * LINE_HEIGHT) * surface.dpr, true);\n values.setFloat32(40, view.cursor.visible ? 1 : 0, true);\n values.setFloat32(44, view.cursor.style, true);\n this.device.queue.writeBuffer(effectPass.configBuffer, 0, storage);\n const last = index === passCount - 1;\n const output = last\n ? surface.context.getCurrentTexture().createView()\n : surface.effectTextures[index % 2]!.createView();\n const pass = encoder.beginRenderPass({\n label: `Ghosttea shader effect pass ${index + 1}/${passCount}`,\n colorAttachments: [\n {\n view: output,\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n pass.setPipeline(this.#effectPipeline);\n pass.setBindGroup(0, effectPass.bindGroup);\n pass.draw(3);\n pass.end();\n }\n surface.effectFrame += 1;\n return passCount;\n }\n\n #encodeEffectsOnly(\n surface: WebGpuSurface,\n view: RenderView,\n encoder: GPUCommandEncoder,\n ): TerminalRenderMetrics | undefined {\n const effectPassCount = this.#encodeEffectStack(surface, view, encoder);\n if (!this.#performanceMeasurementEnabled) return undefined;\n return {\n ...emptyRenderMetrics(),\n canvasPixels: surface.canvas.width * surface.canvas.height,\n renderPasses: effectPassCount,\n drawCalls: effectPassCount,\n };\n }\n\n render(id: string, view: RenderView): TerminalRenderMetrics | undefined {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n const encoder = this.device.createCommandEncoder({ label: `terminal frame ${id}` });\n const metrics =\n view.damage?.geometryChanged === false\n ? this.#encodeCachedRender(id, view, encoder)\n : this.#encodeRender(id, view, encoder);\n this.device.queue.submit([encoder.finish()]);\n if (metrics) metrics.queueSubmits = 1;\n return metrics;\n }\n\n renderBatch(entries: ReadonlyArray<{ id: string; view: RenderView }>): Array<TerminalRenderMetrics | undefined> {\n const active = entries.filter(({ id }) => this.#surfaces.has(id));\n if (active.length === 0) return entries.map(() => undefined);\n const encoder = this.device.createCommandEncoder({ label: `terminal frame batch (${active.length} panes)` });\n const byId = new Map<string, TerminalRenderMetrics | undefined>();\n for (const { id, view } of active) {\n byId.set(\n id,\n view.damage?.geometryChanged === false\n ? this.#encodeCachedRender(id, view, encoder)\n : this.#encodeRender(id, view, encoder),\n );\n }\n this.device.queue.submit([encoder.finish()]);\n const firstMetrics = [...byId.values()].find((metrics) => metrics !== undefined);\n if (firstMetrics) firstMetrics.queueSubmits = 1;\n return entries.map(({ id }) => byId.get(id));\n }\n\n #buildGeometry(\n view: RenderView,\n renderRows: readonly number[],\n rowCount: number,\n fullRedraw: boolean,\n hasNativeRows: boolean,\n scale: number,\n viewportWidth: number,\n viewportHeight: number,\n ): CpuGeometry {\n const rectangleVertices: number[] = [];\n const glyphVertices: number[] = [];\n const colorGlyphVertices: number[] = [];\n const fallbackGlyphVertices: number[] = [];\n const resolvedStyles = new Map<number, ResolvedStyle>();\n const styleFor = (styleId: number): ResolvedStyle => {\n const cached = resolvedStyles.get(styleId);\n if (cached) return cached;\n const resolved = resolveStyle(view.styleDefinitions.get(styleId), view.theme);\n resolvedStyles.set(styleId, resolved);\n return resolved;\n };\n const monoDefinitions = new Map<number, GlyphDefinition>();\n const colorDefinitions = new Map<number, GlyphDefinition>();\n for (const row of renderRows) {\n for (const glyph of view.nativeRows[row] ?? []) {\n const definition = view.glyphDefinitions.get(glyph.glyphId);\n if (!definition) continue;\n (definition.format === GlyphFormat.Rgba8Premultiplied ? colorDefinitions : monoDefinitions).set(\n definition.id,\n definition,\n );\n }\n }\n this.#monoAtlas.prepare(monoDefinitions.values());\n this.#colorAtlas.prepare(colorDefinitions.values());\n\n if (!fullRedraw) {\n for (const row of renderRows) {\n const top = row === 0 ? 0 : (ORIGIN_Y + row * LINE_HEIGHT) * scale;\n const bottom =\n row === rowCount - 1\n ? viewportHeight\n : Math.min(viewportHeight, (ORIGIN_Y + (row + 1) * LINE_HEIGHT) * scale);\n pushRectangle(\n rectangleVertices,\n 0,\n top,\n viewportWidth,\n Math.max(0, bottom - top),\n view.theme.background,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n const rowResetInstanceCount = rectangleVertices.length / 10;\n\n for (const row of renderRows) {\n for (const run of view.nativeStyleRows[row] ?? []) {\n const style = styleFor(run.styleId);\n if (!style.background) continue;\n pushRectangle(\n rectangleVertices,\n (ORIGIN_X + run.cellStart * CELL_WIDTH) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT) * scale,\n run.cellSpan * CELL_WIDTH * scale,\n LINE_HEIGHT * scale,\n style.background,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n const backgroundInstanceCount = rectangleVertices.length / 10;\n\n const selection = ordered(view.selection);\n if (selection) {\n const [start, end] = selection;\n for (const row of renderRows) {\n if (row < start.row || row > end.row) continue;\n const first = row === start.row ? start.column : 0;\n const last = row === end.row ? end.column : Math.max(0, cellLength(view.rows[row] ?? \"\") - 1);\n pushRectangle(\n rectangleVertices,\n (ORIGIN_X + first * CELL_WIDTH) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT) * scale,\n Math.max(1, last - first + 1) * CELL_WIDTH * scale,\n LINE_HEIGHT * scale,\n view.theme.selection,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n pushBlockCursorBackground(rectangleVertices, view, renderRows, scale, viewportWidth, viewportHeight);\n const selectionInstanceCount = rectangleVertices.length / 10 - backgroundInstanceCount;\n\n if (!hasNativeRows) {\n this.#fallbackAtlas.prepare(\n renderRows.flatMap((row) => splitGraphemes(view.rows[row] ?? \"\")),\n scale,\n );\n }\n if (hasNativeRows) {\n for (const row of renderRows) {\n const { box: boxCells, block: blockCells } = specialDrawingCells(view.rows[row] ?? \"\");\n for (const instance of view.nativeRows[row] ?? []) {\n const definition = view.glyphDefinitions.get(instance.glyphId);\n if (!definition) continue;\n const style = styleFor(instance.styleId);\n if (style.invisible) continue;\n const isSelected = selectionContains(selection, row, instance.cellStart);\n const foreground = blockCursorContains(view, row, instance.cellStart, instance.cellSpan)\n ? (view.theme.cursorText ?? view.theme.background)\n : isSelected\n ? view.theme.selectionForeground\n : style.foreground;\n const boxDrawing = boxCells.get(instance.cellStart);\n if (boxDrawing) {\n let backdrop = style.background ?? view.theme.background;\n if (isSelected) backdrop = view.theme.selection;\n // Box glyphs are overlapping primitives. Flatten faint opacity\n // against the cell backdrop so joins are blended only once.\n pushBoxDrawing(\n rectangleVertices,\n boxDrawing,\n instance.cellStart,\n row,\n scale,\n over(foreground, backdrop),\n viewportWidth,\n viewportHeight,\n );\n continue;\n }\n const blockElement = blockCells.get(instance.cellStart);\n if (blockElement) {\n let backdrop = style.background ?? view.theme.background;\n if (isSelected) backdrop = view.theme.selection;\n if (\n pushBlockElement(\n rectangleVertices,\n blockElement,\n instance.cellStart,\n row,\n scale,\n over(foreground, backdrop),\n viewportWidth,\n viewportHeight,\n )\n )\n continue;\n }\n const atlas = definition.format === GlyphFormat.Alpha8 ? this.#monoAtlas : this.#colorAtlas;\n const vertices = definition.format === GlyphFormat.Alpha8 ? glyphVertices : colorGlyphVertices;\n pushGlyph(\n vertices,\n (ORIGIN_X + instance.x) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT + instance.y) * scale,\n instance.width * scale,\n instance.height * scale,\n atlas.glyph(definition),\n foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n } else {\n for (const row of renderRows) {\n let column = 0;\n for (const grapheme of splitGraphemes(view.rows[row] ?? \"\")) {\n const glyph = this.#fallbackAtlas.glyph(grapheme, scale);\n const cells = glyph?.cells ?? graphemeCellWidth(grapheme);\n if (glyph) {\n const foreground = blockCursorContains(view, row, column, cells)\n ? (view.theme.cursorText ?? view.theme.background)\n : selectionContains(selection, row, column)\n ? view.theme.selectionForeground\n : view.theme.foreground;\n pushGlyph(\n fallbackGlyphVertices,\n (ORIGIN_X + column * CELL_WIDTH) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT) * scale,\n CELL_WIDTH * cells * scale,\n LINE_HEIGHT * scale,\n glyph,\n foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n column += cells;\n }\n }\n }\n\n for (const row of renderRows) {\n for (const run of view.nativeStyleRows[row] ?? []) {\n const style = styleFor(run.styleId);\n if (style.invisible) continue;\n const x = (ORIGIN_X + run.cellStart * CELL_WIDTH) * scale;\n const width = run.cellSpan * CELL_WIDTH * scale;\n const rowTop = (ORIGIN_Y + row * LINE_HEIGHT) * scale;\n const stroke = Math.max(1, Math.round(scale));\n if (style.underline) {\n pushRectangle(\n rectangleVertices,\n x,\n Math.round(rowTop + 16 * scale),\n width,\n stroke,\n style.foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n if (style.strikethrough) {\n pushRectangle(\n rectangleVertices,\n x,\n Math.round(rowTop + 9 * scale),\n width,\n stroke,\n style.foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n }\n const decorationInstanceStart = backgroundInstanceCount + selectionInstanceCount;\n const decorationInstanceCount = rectangleVertices.length / 10 - decorationInstanceStart;\n return {\n rectangleData: new Float32Array(rectangleVertices),\n glyphData: new Float32Array(glyphVertices),\n colorGlyphData: new Float32Array(colorGlyphVertices),\n fallbackGlyphData: new Float32Array(fallbackGlyphVertices),\n rowResetInstanceCount,\n backgroundInstanceCount,\n selectionInstanceCount,\n decorationInstanceStart,\n decorationInstanceCount,\n rectangleInstanceCount: rectangleVertices.length / 10,\n glyphInstanceCount: glyphVertices.length / 12,\n colorGlyphInstanceCount: colorGlyphVertices.length / 12,\n fallbackGlyphInstanceCount: fallbackGlyphVertices.length / 12,\n };\n }\n\n #encodeRender(id: string, view: RenderView, encoder: GPUCommandEncoder): TerminalRenderMetrics | undefined {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n const monoUploadsBefore = this.#performanceMeasurementEnabled ? this.#monoAtlas.uploadMetrics() : undefined;\n const colorUploadsBefore = this.#performanceMeasurementEnabled ? this.#colorAtlas.uploadMetrics() : undefined;\n const fallbackUploadsBefore = this.#performanceMeasurementEnabled ? this.#fallbackAtlas.uploadMetrics() : undefined;\n const scale = surface.dpr;\n const viewportWidth = surface.canvas.width;\n const viewportHeight = surface.canvas.height;\n const rowCount = Math.max(view.rows.length, view.nativeRows.length, view.nativeStyleRows.length);\n const { full: fullRedraw, rows: renderRows } = rowsForDamage(rowCount, view.damage, surface.sceneValid);\n const renderRowSet = new Set(renderRows);\n const rectangleVertices: number[] = [];\n const glyphVertices: number[] = [];\n const colorGlyphVertices: number[] = [];\n const fallbackGlyphVertices: number[] = [];\n const resolvedStyles = new Map<number, ResolvedStyle>();\n const styleFor = (styleId: number): ResolvedStyle => {\n const cached = resolvedStyles.get(styleId);\n if (cached) return cached;\n const resolved = resolveStyle(view.styleDefinitions.get(styleId), view.theme);\n resolvedStyles.set(styleId, resolved);\n return resolved;\n };\n const monoDefinitions = new Map<number, GlyphDefinition>();\n const colorDefinitions = new Map<number, GlyphDefinition>();\n for (const row of renderRows) {\n for (const glyph of view.nativeRows[row] ?? []) {\n const definition = view.glyphDefinitions.get(glyph.glyphId);\n if (!definition) continue;\n (definition.format === GlyphFormat.Rgba8Premultiplied ? colorDefinitions : monoDefinitions).set(\n definition.id,\n definition,\n );\n }\n }\n this.#monoAtlas.prepare(monoDefinitions.values());\n this.#colorAtlas.prepare(colorDefinitions.values());\n\n if (!fullRedraw) {\n for (const row of renderRows) {\n const top = row === 0 ? 0 : (ORIGIN_Y + row * LINE_HEIGHT) * scale;\n const bottom =\n row === rowCount - 1\n ? viewportHeight\n : Math.min(viewportHeight, (ORIGIN_Y + (row + 1) * LINE_HEIGHT) * scale);\n pushRectangle(\n rectangleVertices,\n 0,\n top,\n viewportWidth,\n Math.max(0, bottom - top),\n view.theme.background,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n const rowResetInstanceCount = rectangleVertices.length / 10;\n\n for (const row of renderRows) {\n for (const run of view.nativeStyleRows[row] ?? []) {\n const style = styleFor(run.styleId);\n if (!style.background) continue;\n pushRectangle(\n rectangleVertices,\n (ORIGIN_X + run.cellStart * CELL_WIDTH) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT) * scale,\n run.cellSpan * CELL_WIDTH * scale,\n LINE_HEIGHT * scale,\n style.background,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n const backgroundInstanceCount = rectangleVertices.length / 10;\n\n const selection = ordered(view.selection);\n if (selection) {\n const [start, end] = selection;\n for (const row of renderRows) {\n if (row < start.row || row > end.row) continue;\n const first = row === start.row ? start.column : 0;\n const last = row === end.row ? end.column : Math.max(0, cellLength(view.rows[row] ?? \"\") - 1);\n pushRectangle(\n rectangleVertices,\n (ORIGIN_X + first * CELL_WIDTH) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT) * scale,\n Math.max(1, last - first + 1) * CELL_WIDTH * scale,\n LINE_HEIGHT * scale,\n view.theme.selection,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n pushBlockCursorBackground(rectangleVertices, view, renderRows, scale, viewportWidth, viewportHeight);\n const selectionInstanceCount = rectangleVertices.length / 10 - backgroundInstanceCount;\n\n const hasNativeRows = view.nativeRows.some((row) => row.length > 0);\n if (!hasNativeRows) {\n this.#fallbackAtlas.prepare(\n renderRows.flatMap((row) => splitGraphemes(view.rows[row] ?? \"\")),\n scale,\n );\n }\n if (hasNativeRows) {\n for (const row of renderRows) {\n const { box: boxCells, block: blockCells } = specialDrawingCells(view.rows[row] ?? \"\");\n for (const instance of view.nativeRows[row] ?? []) {\n const definition = view.glyphDefinitions.get(instance.glyphId);\n if (!definition) continue;\n const style = styleFor(instance.styleId);\n if (style.invisible) continue;\n const isSelected = selectionContains(selection, row, instance.cellStart);\n const foreground = blockCursorContains(view, row, instance.cellStart, instance.cellSpan)\n ? (view.theme.cursorText ?? view.theme.background)\n : isSelected\n ? view.theme.selectionForeground\n : style.foreground;\n const boxDrawing = boxCells.get(instance.cellStart);\n if (boxDrawing) {\n let backdrop = style.background ?? view.theme.background;\n if (isSelected) backdrop = view.theme.selection;\n // Box glyphs are assembled from several overlapping primitives. Flatten\n // faint opacity against the cell backdrop first so joins are blended once,\n // instead of producing a brighter seam at every cell boundary.\n const boxColor = over(foreground, backdrop);\n pushBoxDrawing(\n rectangleVertices,\n boxDrawing,\n instance.cellStart,\n row,\n scale,\n boxColor,\n viewportWidth,\n viewportHeight,\n );\n continue;\n }\n const blockElement = blockCells.get(instance.cellStart);\n if (blockElement) {\n let backdrop = style.background ?? view.theme.background;\n if (isSelected) backdrop = view.theme.selection;\n const blockColor = over(foreground, backdrop);\n if (\n pushBlockElement(\n rectangleVertices,\n blockElement,\n instance.cellStart,\n row,\n scale,\n blockColor,\n viewportWidth,\n viewportHeight,\n )\n )\n continue;\n }\n const atlas = definition.format === GlyphFormat.Alpha8 ? this.#monoAtlas : this.#colorAtlas;\n const vertices = definition.format === GlyphFormat.Alpha8 ? glyphVertices : colorGlyphVertices;\n pushGlyph(\n vertices,\n (ORIGIN_X + instance.x) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT + instance.y) * scale,\n instance.width * scale,\n instance.height * scale,\n atlas.glyph(definition),\n foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n } else {\n for (const row of renderRows) {\n let column = 0;\n for (const grapheme of splitGraphemes(view.rows[row] ?? \"\")) {\n const glyph = this.#fallbackAtlas.glyph(grapheme, scale);\n const cells = glyph?.cells ?? graphemeCellWidth(grapheme);\n if (glyph) {\n const foreground = blockCursorContains(view, row, column, cells)\n ? (view.theme.cursorText ?? view.theme.background)\n : selectionContains(selection, row, column)\n ? view.theme.selectionForeground\n : view.theme.foreground;\n pushGlyph(\n fallbackGlyphVertices,\n (ORIGIN_X + column * CELL_WIDTH) * scale,\n (ORIGIN_Y + row * LINE_HEIGHT) * scale,\n CELL_WIDTH * cells * scale,\n LINE_HEIGHT * scale,\n glyph,\n foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n column += cells;\n }\n }\n }\n\n for (const row of renderRows) {\n for (const run of view.nativeStyleRows[row] ?? []) {\n const style = styleFor(run.styleId);\n if (style.invisible) continue;\n const x = (ORIGIN_X + run.cellStart * CELL_WIDTH) * scale;\n const width = run.cellSpan * CELL_WIDTH * scale;\n const rowTop = (ORIGIN_Y + row * LINE_HEIGHT) * scale;\n const stroke = Math.max(1, Math.round(scale));\n if (style.underline) {\n pushRectangle(\n rectangleVertices,\n x,\n Math.round(rowTop + 16 * scale),\n width,\n stroke,\n style.foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n if (style.strikethrough) {\n pushRectangle(\n rectangleVertices,\n x,\n Math.round(rowTop + 9 * scale),\n width,\n stroke,\n style.foreground,\n viewportWidth,\n viewportHeight,\n );\n }\n }\n }\n const decorationInstanceStart = backgroundInstanceCount + selectionInstanceCount;\n const decorationInstanceCount = rectangleVertices.length / 10 - decorationInstanceStart;\n\n const cursorStyle = effectiveCursorStyle(view);\n if (cursorStyle !== null && renderRowSet.has(view.cursor.y)) {\n const x = (ORIGIN_X + view.cursor.x * CELL_WIDTH) * scale;\n const y = (ORIGIN_Y + view.cursor.y * LINE_HEIGHT) * scale;\n const width = CELL_WIDTH * scale;\n const height = LINE_HEIGHT * scale;\n const stroke = Math.max(1, Math.round(scale));\n const cursorColor: Rgba =\n cursorStyle === CursorStyle.HollowBlock\n ? [view.theme.cursor[0], view.theme.cursor[1], view.theme.cursor[2], 1]\n : view.theme.cursor;\n if (cursorStyle === CursorStyle.Bar) {\n pushRectangle(\n rectangleVertices,\n x,\n y,\n Math.max(2, Math.round(2 * scale)),\n height,\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n } else if (cursorStyle === CursorStyle.Underline) {\n const thickness = Math.max(2, Math.round(2 * scale));\n pushRectangle(\n rectangleVertices,\n x,\n y + height - thickness,\n width,\n thickness,\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n } else if (cursorStyle === CursorStyle.HollowBlock) {\n pushRectangle(rectangleVertices, x, y, width, stroke, cursorColor, viewportWidth, viewportHeight);\n pushRectangle(\n rectangleVertices,\n x,\n y + height - stroke,\n width,\n stroke,\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n pushRectangle(\n rectangleVertices,\n x,\n y + stroke,\n stroke,\n Math.max(0, height - stroke * 2),\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n pushRectangle(\n rectangleVertices,\n x + width - stroke,\n y + stroke,\n stroke,\n Math.max(0, height - stroke * 2),\n cursorColor,\n viewportWidth,\n viewportHeight,\n );\n } else if (cursorStyle !== CursorStyle.Block) {\n pushRectangle(rectangleVertices, x, y, width, height, cursorColor, viewportWidth, viewportHeight);\n }\n }\n const rectangleData = new Float32Array(rectangleVertices);\n const glyphData = new Float32Array(glyphVertices);\n const colorGlyphData = new Float32Array(colorGlyphVertices);\n const fallbackGlyphData = new Float32Array(fallbackGlyphVertices);\n const rectangleBuffer = surface.rectangleBuffer.write(rectangleData);\n const glyphBuffer = surface.glyphBuffer.write(glyphData);\n const colorGlyphBuffer = surface.colorGlyphBuffer.write(colorGlyphData);\n const fallbackGlyphBuffer = surface.fallbackGlyphBuffer.write(fallbackGlyphData);\n const cursorInstanceStart = decorationInstanceStart + decorationInstanceCount;\n const cursorInstanceCount = rectangleVertices.length / 10 - cursorInstanceStart;\n\n const pass = encoder.beginRenderPass({\n label: `terminal pass ${id}`,\n colorAttachments: [\n {\n view: surface.sceneTexture.createView(),\n clearValue: premultipliedClear(view.theme.background),\n loadOp: fullRedraw ? \"clear\" : \"load\",\n storeOp: \"store\",\n },\n ],\n });\n if (rectangleBuffer && rowResetInstanceCount > 0) {\n pass.setPipeline(this.#rectangleOverwritePipeline);\n pass.setVertexBuffer(0, rectangleBuffer);\n pass.draw(6, rowResetInstanceCount);\n }\n if (rectangleBuffer && backgroundInstanceCount > rowResetInstanceCount) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, rectangleBuffer);\n pass.draw(6, backgroundInstanceCount - rowResetInstanceCount, 0, rowResetInstanceCount);\n }\n if (rectangleBuffer && selectionInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, rectangleBuffer);\n pass.draw(6, selectionInstanceCount, 0, backgroundInstanceCount);\n }\n if (glyphBuffer && glyphData.length > 0) {\n pass.setPipeline(this.#glyphPipeline);\n pass.setBindGroup(0, this.#monoAtlas.bindGroup);\n pass.setVertexBuffer(0, glyphBuffer);\n pass.draw(6, glyphVertices.length / 12);\n }\n if (colorGlyphBuffer && colorGlyphData.length > 0) {\n pass.setPipeline(this.#colorGlyphPipeline);\n pass.setBindGroup(0, this.#colorAtlas.bindGroup);\n pass.setVertexBuffer(0, colorGlyphBuffer);\n pass.draw(6, colorGlyphVertices.length / 12);\n }\n if (fallbackGlyphBuffer && fallbackGlyphData.length > 0) {\n pass.setPipeline(this.#fallbackGlyphPipeline);\n pass.setBindGroup(0, this.#fallbackAtlas.bindGroup);\n pass.setVertexBuffer(0, fallbackGlyphBuffer);\n pass.draw(6, fallbackGlyphVertices.length / 12);\n }\n if (rectangleBuffer && decorationInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, rectangleBuffer);\n pass.draw(6, decorationInstanceCount, 0, decorationInstanceStart);\n }\n if (rectangleBuffer && cursorInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, rectangleBuffer);\n pass.draw(6, cursorInstanceCount, 0, cursorInstanceStart);\n }\n pass.end();\n\n const effectPassCount = this.#encodeEffectStack(surface, view, encoder);\n surface.sceneValid = true;\n if (!this.#performanceMeasurementEnabled) return undefined;\n const monoUploadsAfter = this.#monoAtlas.uploadMetrics();\n const colorUploadsAfter = this.#colorAtlas.uploadMetrics();\n const fallbackUploadsAfter = this.#fallbackAtlas.uploadMetrics();\n return {\n queueSubmits: 0,\n fullRenders: Number(fullRedraw),\n partialRenders: Number(!fullRedraw),\n damagedRows: renderRows.length,\n geometryCacheHits: 0,\n geometryCacheMisses: 0,\n canvasPixels: viewportWidth * viewportHeight,\n renderPasses: 1 + effectPassCount,\n drawCalls:\n Number(rowResetInstanceCount > 0) +\n Number(backgroundInstanceCount > rowResetInstanceCount) +\n Number(selectionInstanceCount > 0) +\n Number(glyphData.length > 0) +\n Number(colorGlyphData.length > 0) +\n Number(fallbackGlyphData.length > 0) +\n Number(decorationInstanceCount > 0) +\n Number(cursorInstanceCount > 0) +\n effectPassCount,\n rectangleVertices: (rectangleVertices.length / 10) * 6,\n monoGlyphVertices: (glyphVertices.length / 12) * 6,\n colorGlyphVertices: (colorGlyphVertices.length / 12) * 6,\n fallbackGlyphVertices: (fallbackGlyphVertices.length / 12) * 6,\n vertexUploadBytes:\n rectangleData.byteLength + glyphData.byteLength + colorGlyphData.byteLength + fallbackGlyphData.byteLength,\n atlasUploadBytes:\n monoUploadsAfter.bytes -\n monoUploadsBefore!.bytes +\n (colorUploadsAfter.bytes - colorUploadsBefore!.bytes) +\n (fallbackUploadsAfter.bytes - fallbackUploadsBefore!.bytes),\n atlasUploadCalls:\n monoUploadsAfter.calls -\n monoUploadsBefore!.calls +\n (colorUploadsAfter.calls - colorUploadsBefore!.calls) +\n (fallbackUploadsAfter.calls - fallbackUploadsBefore!.calls),\n };\n }\n\n #encodeCachedRender(id: string, view: RenderView, encoder: GPUCommandEncoder): TerminalRenderMetrics | undefined {\n const surface = this.#surfaces.get(id);\n if (!surface) return;\n if (!surface.sceneValid || !view.damage || view.damage.full) {\n return this.#encodeRender(id, view, encoder);\n }\n const rowCount = Math.max(view.rows.length, view.nativeRows.length, view.nativeStyleRows.length);\n const damage = rowsForDamage(rowCount, view.damage, surface.sceneValid);\n if (damage.rows.length === 0) return this.#encodeEffectsOnly(surface, view, encoder);\n const monoUploadsBefore = this.#performanceMeasurementEnabled ? this.#monoAtlas.uploadMetrics() : undefined;\n const colorUploadsBefore = this.#performanceMeasurementEnabled ? this.#colorAtlas.uploadMetrics() : undefined;\n const fallbackUploadsBefore = this.#performanceMeasurementEnabled ? this.#fallbackAtlas.uploadMetrics() : undefined;\n const scale = surface.dpr;\n const viewportWidth = surface.canvas.width;\n const viewportHeight = surface.canvas.height;\n const renderRowSet = new Set(damage.rows);\n const hasNativeRows = view.nativeRows.some((row) => row.length > 0);\n let geometry: CachedGeometry;\n let geometryUploadBytes = 0;\n const generations = (): [number, number, number] => [\n this.#monoAtlas.generation,\n this.#colorAtlas.generation,\n this.#fallbackAtlas.generation,\n ];\n let key = geometryCacheKey(view, damage.rows, hasNativeRows, generations());\n const cached = surface.geometryCache.get(key);\n const cacheHit = cached !== undefined;\n if (cached) {\n geometry = cached;\n surface.geometryCache.delete(key);\n surface.geometryCache.set(key, cached);\n } else {\n const admitted = surface.geometryCandidates.has(key);\n const candidateKey = key;\n const cpu = this.#buildGeometry(\n view,\n damage.rows,\n rowCount,\n false,\n hasNativeRows,\n scale,\n viewportWidth,\n viewportHeight,\n );\n key = geometryCacheKey(view, damage.rows, hasNativeRows, generations());\n const promote = admitted && key === candidateKey;\n geometry = {\n rectangleBuffer: promote\n ? createCachedVertexBuffer(this.device, `cached rectangles ${id}`, cpu.rectangleData)\n : surface.rectangleBuffer.write(cpu.rectangleData),\n glyphBuffer: promote\n ? createCachedVertexBuffer(this.device, `cached glyphs ${id}`, cpu.glyphData)\n : surface.glyphBuffer.write(cpu.glyphData),\n colorGlyphBuffer: promote\n ? createCachedVertexBuffer(this.device, `cached color glyphs ${id}`, cpu.colorGlyphData)\n : surface.colorGlyphBuffer.write(cpu.colorGlyphData),\n fallbackGlyphBuffer: promote\n ? createCachedVertexBuffer(this.device, `cached fallback glyphs ${id}`, cpu.fallbackGlyphData)\n : surface.fallbackGlyphBuffer.write(cpu.fallbackGlyphData),\n rowResetInstanceCount: cpu.rowResetInstanceCount,\n backgroundInstanceCount: cpu.backgroundInstanceCount,\n selectionInstanceCount: cpu.selectionInstanceCount,\n decorationInstanceStart: cpu.decorationInstanceStart,\n decorationInstanceCount: cpu.decorationInstanceCount,\n rectangleInstanceCount: cpu.rectangleInstanceCount,\n glyphInstanceCount: cpu.glyphInstanceCount,\n colorGlyphInstanceCount: cpu.colorGlyphInstanceCount,\n fallbackGlyphInstanceCount: cpu.fallbackGlyphInstanceCount,\n };\n geometryUploadBytes =\n cpu.rectangleData.byteLength +\n cpu.glyphData.byteLength +\n cpu.colorGlyphData.byteLength +\n cpu.fallbackGlyphData.byteLength;\n if (promote) {\n surface.geometryCandidates.delete(key);\n surface.geometryCache.set(key, geometry);\n while (surface.geometryCache.size > GEOMETRY_CACHE_LIMIT) {\n const oldestKey = surface.geometryCache.keys().next().value as string | undefined;\n if (oldestKey === undefined) break;\n const oldest = surface.geometryCache.get(oldestKey);\n if (oldest) destroyCachedGeometry(oldest);\n surface.geometryCache.delete(oldestKey);\n }\n } else {\n surface.geometryCandidates.delete(key);\n surface.geometryCandidates.set(key, true);\n while (surface.geometryCandidates.size > GEOMETRY_CACHE_LIMIT) {\n const oldestKey = surface.geometryCandidates.keys().next().value as string | undefined;\n if (oldestKey === undefined) break;\n surface.geometryCandidates.delete(oldestKey);\n }\n }\n }\n\n const cursorVertices: number[] = [];\n pushCursorVertices(cursorVertices, view, renderRowSet, scale, viewportWidth, viewportHeight);\n const cursorData = new Float32Array(cursorVertices);\n const cursorBuffer = surface.cursorBuffer.write(cursorData);\n const cursorInstanceStart = 0;\n const cursorInstanceCount = cursorData.length / 10;\n const pass = encoder.beginRenderPass({\n label: `terminal pass ${id}`,\n colorAttachments: [\n {\n view: surface.sceneTexture.createView(),\n clearValue: premultipliedClear(view.theme.background),\n loadOp: \"load\",\n storeOp: \"store\",\n },\n ],\n });\n if (geometry.rectangleBuffer && geometry.rowResetInstanceCount > 0) {\n pass.setPipeline(this.#rectangleOverwritePipeline);\n pass.setVertexBuffer(0, geometry.rectangleBuffer);\n pass.draw(6, geometry.rowResetInstanceCount);\n }\n if (geometry.rectangleBuffer && geometry.backgroundInstanceCount > geometry.rowResetInstanceCount) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, geometry.rectangleBuffer);\n pass.draw(\n 6,\n geometry.backgroundInstanceCount - geometry.rowResetInstanceCount,\n 0,\n geometry.rowResetInstanceCount,\n );\n }\n if (geometry.rectangleBuffer && geometry.selectionInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, geometry.rectangleBuffer);\n pass.draw(6, geometry.selectionInstanceCount, 0, geometry.backgroundInstanceCount);\n }\n if (geometry.glyphBuffer && geometry.glyphInstanceCount > 0) {\n pass.setPipeline(this.#glyphPipeline);\n pass.setBindGroup(0, this.#monoAtlas.bindGroup);\n pass.setVertexBuffer(0, geometry.glyphBuffer);\n pass.draw(6, geometry.glyphInstanceCount);\n }\n if (geometry.colorGlyphBuffer && geometry.colorGlyphInstanceCount > 0) {\n pass.setPipeline(this.#colorGlyphPipeline);\n pass.setBindGroup(0, this.#colorAtlas.bindGroup);\n pass.setVertexBuffer(0, geometry.colorGlyphBuffer);\n pass.draw(6, geometry.colorGlyphInstanceCount);\n }\n if (geometry.fallbackGlyphBuffer && geometry.fallbackGlyphInstanceCount > 0) {\n pass.setPipeline(this.#fallbackGlyphPipeline);\n pass.setBindGroup(0, this.#fallbackAtlas.bindGroup);\n pass.setVertexBuffer(0, geometry.fallbackGlyphBuffer);\n pass.draw(6, geometry.fallbackGlyphInstanceCount);\n }\n if (geometry.rectangleBuffer && geometry.decorationInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, geometry.rectangleBuffer);\n pass.draw(6, geometry.decorationInstanceCount, 0, geometry.decorationInstanceStart);\n }\n if (cursorBuffer && cursorInstanceCount > 0) {\n pass.setPipeline(this.#rectanglePipeline);\n pass.setVertexBuffer(0, cursorBuffer);\n pass.draw(6, cursorInstanceCount, 0, cursorInstanceStart);\n }\n pass.end();\n\n const effectPassCount = this.#encodeEffectStack(surface, view, encoder);\n surface.sceneValid = true;\n if (!this.#performanceMeasurementEnabled) return undefined;\n const monoUploadsAfter = this.#monoAtlas.uploadMetrics();\n const colorUploadsAfter = this.#colorAtlas.uploadMetrics();\n const fallbackUploadsAfter = this.#fallbackAtlas.uploadMetrics();\n return {\n queueSubmits: 0,\n fullRenders: 0,\n partialRenders: 1,\n damagedRows: damage.rows.length,\n geometryCacheHits: Number(cacheHit),\n geometryCacheMisses: Number(!cacheHit),\n canvasPixels: viewportWidth * viewportHeight,\n renderPasses: 1 + effectPassCount,\n drawCalls:\n Number(geometry.rowResetInstanceCount > 0) +\n Number(geometry.backgroundInstanceCount > geometry.rowResetInstanceCount) +\n Number(geometry.selectionInstanceCount > 0) +\n Number(geometry.glyphInstanceCount > 0) +\n Number(geometry.colorGlyphInstanceCount > 0) +\n Number(geometry.fallbackGlyphInstanceCount > 0) +\n Number(geometry.decorationInstanceCount > 0) +\n Number(cursorInstanceCount > 0) +\n effectPassCount,\n rectangleVertices: (geometry.rectangleInstanceCount + cursorInstanceCount) * 6,\n monoGlyphVertices: geometry.glyphInstanceCount * 6,\n colorGlyphVertices: geometry.colorGlyphInstanceCount * 6,\n fallbackGlyphVertices: geometry.fallbackGlyphInstanceCount * 6,\n vertexUploadBytes: geometryUploadBytes + cursorData.byteLength,\n atlasUploadBytes:\n monoUploadsAfter.bytes -\n monoUploadsBefore!.bytes +\n (colorUploadsAfter.bytes - colorUploadsBefore!.bytes) +\n (fallbackUploadsAfter.bytes - fallbackUploadsBefore!.bytes),\n atlasUploadCalls:\n monoUploadsAfter.calls -\n monoUploadsBefore!.calls +\n (colorUploadsAfter.calls - colorUploadsBefore!.calls) +\n (fallbackUploadsAfter.calls - fallbackUploadsBefore!.calls),\n };\n }\n\n settle(): Promise<void> {\n return this.device.queue.onSubmittedWorkDone();\n }\n\n destroy(): void {\n for (const id of [...this.#surfaces.keys()]) this.unmount(id);\n this.#monoAtlas.destroy();\n this.#colorAtlas.destroy();\n this.#fallbackAtlas.destroy();\n this.device.destroy();\n }\n}\n", "export interface AppliedFrameState {\n sessionEpoch: bigint;\n layoutEpoch: bigint;\n sequence: bigint;\n awaitingResync: boolean;\n}\n\nexport interface IncomingFrameState {\n sessionEpoch: bigint;\n layoutEpoch: bigint;\n sequence: bigint;\n full: boolean;\n}\n\nexport function classifyFrame(\n previous: AppliedFrameState,\n incoming: IncomingFrameState,\n): \"accept\" | \"stale\" | \"resync\" {\n const sameSession = previous.sessionEpoch === 0n || incoming.sessionEpoch === previous.sessionEpoch;\n if (\n sameSession &&\n (incoming.layoutEpoch < previous.layoutEpoch ||\n (incoming.layoutEpoch === previous.layoutEpoch && incoming.sequence <= previous.sequence))\n )\n return \"stale\";\n if (previous.awaitingResync && !incoming.full) return \"resync\";\n const changedSession = !sameSession;\n const missingInitialSnapshot = previous.sessionEpoch === 0n && !incoming.full;\n const sequenceGap =\n previous.sessionEpoch === incoming.sessionEpoch &&\n previous.sequence !== 0n &&\n incoming.sequence !== previous.sequence + 1n;\n return !incoming.full && (changedSession || missingInitialSnapshot || sequenceGap) ? \"resync\" : \"accept\";\n}\n", "import type { CursorState } from \"@vibecook/ghosttea-frame\";\n\nexport function cursorActivityChangesPixels(\n cursor: CursorState,\n focused: boolean,\n cursorBlinkVisible: boolean,\n): boolean {\n return focused && cursor.visible && cursor.blinking && !cursorBlinkVisible;\n}\n", "export interface GlyphCatalogBudget {\n maxDefinitions: number;\n maxSharedDefinitions: number;\n maxSessionPixelBytes: number;\n maxSharedPixelBytes: number;\n}\n\nexport type CatalogAdmission = \"install\" | \"request-full\" | \"text-fallback\";\n\nexport function catalogAdmission(\n resetsCatalog: boolean,\n alreadyUsingFallback: boolean,\n fits: boolean,\n): CatalogAdmission {\n if (alreadyUsingFallback && !resetsCatalog) return \"text-fallback\";\n if (fits) return \"install\";\n return resetsCatalog ? \"text-fallback\" : \"request-full\";\n}\n\ninterface GlyphLike {\n id: number;\n pixels: { byteLength: number };\n}\n\nexport function glyphCatalogFits<T extends GlyphLike>(\n sessionDefinitions: ReadonlyMap<number, T>,\n sessionPixelBytes: number,\n sharedDefinitions: ReadonlyMap<number, { definition: T }>,\n sharedPixelBytes: number,\n definitions: readonly T[],\n budget: GlyphCatalogBudget,\n): boolean {\n if (definitions.length === 0) return true;\n let nextDefinitionCount = sessionDefinitions.size;\n let nextSharedDefinitionCount = sharedDefinitions.size;\n let nextSessionPixelBytes = sessionPixelBytes;\n let nextSharedPixelBytes = sharedPixelBytes;\n const pending = new Set<number>();\n for (const definition of definitions) {\n if (sessionDefinitions.has(definition.id) || pending.has(definition.id)) continue;\n pending.add(definition.id);\n const shared = sharedDefinitions.get(definition.id);\n const pixelBytes = shared?.definition.pixels.byteLength ?? definition.pixels.byteLength;\n nextDefinitionCount += 1;\n nextSessionPixelBytes += pixelBytes;\n if (!shared) {\n nextSharedDefinitionCount += 1;\n nextSharedPixelBytes += pixelBytes;\n }\n if (\n nextDefinitionCount > budget.maxDefinitions ||\n nextSharedDefinitionCount > budget.maxSharedDefinitions ||\n nextSessionPixelBytes > budget.maxSessionPixelBytes ||\n nextSharedPixelBytes > budget.maxSharedPixelBytes\n )\n return false;\n }\n return true;\n}\n\nexport function definitionCatalogFits<T extends { id: number }>(\n installed: ReadonlyMap<number, T>,\n definitions: readonly T[],\n maxDefinitions: number,\n retainedDefinitions = installed.size,\n maxRetainedDefinitions = Number.MAX_SAFE_INTEGER,\n): boolean {\n if (definitions.length === 0) return true;\n let nextDefinitionCount = installed.size;\n let nextRetainedDefinitions = retainedDefinitions;\n const pending = new Set<number>();\n for (const definition of definitions) {\n if (installed.has(definition.id) || pending.has(definition.id)) continue;\n pending.add(definition.id);\n nextDefinitionCount += 1;\n nextRetainedDefinitions += 1;\n if (nextDefinitionCount > maxDefinitions || nextRetainedDefinitions > maxRetainedDefinitions) return false;\n }\n return true;\n}\n", "/// <reference lib=\"webworker\" />\n/// <reference types=\"@webgpu/types\" />\n\nimport {\n decodeClipboardWrite,\n decodeCursorState,\n decodeFrame,\n decodeGlyphDefinitions,\n decodeRowReplacements,\n decodeScrollbarState,\n decodeStyleDefinitions,\n FrameFlag,\n type CursorState,\n type GlyphDefinition,\n type GlyphInstance,\n type StyleDefinition,\n type StyleRun,\n SectionKind,\n} from \"@vibecook/ghosttea-frame\";\nimport type { TerminalScrollbarState } from \"@vibecook/ghosttea-protocol\";\nimport { CanvasTerminalRenderer } from \"./renderers/canvas-renderer.js\";\nimport {\n DEFAULT_EFFECTS,\n DEFAULT_THEME,\n type CellSelection,\n type PixelSize,\n type RenderView,\n type TerminalRenderer,\n type TerminalEffects,\n type TerminalTheme,\n renderedSizeChanged,\n terminalEffectsNeedAnimation,\n} from \"./renderers/types.js\";\nimport { WebGpuTerminalRenderer } from \"./renderers/webgpu-renderer.js\";\nimport { classifyFrame } from \"./frame-sequence.js\";\nimport { cursorActivityChangesPixels } from \"./cursor-invalidation.js\";\nimport { emptyRenderMetrics, type TerminalRenderPerformanceSnapshot } from \"./performance.js\";\nimport type { RendererToWorkerMessage, WorkerToRendererMessage } from \"./worker-messages.js\";\nimport { catalogAdmission, definitionCatalogFits, glyphCatalogFits } from \"./catalog-budget.js\";\n\ninterface SessionSnapshot {\n rows: string[];\n nativeRows: GlyphInstance[][];\n nativeStyleRows: StyleRun[][];\n glyphDefinitions: Map<number, GlyphDefinition>;\n glyphPixelBytes: number;\n styleDefinitions: Map<number, StyleDefinition>;\n rowRevisions: bigint[];\n cursor: CursorState;\n layoutEpoch: bigint;\n sessionEpoch: bigint;\n sequence: bigint;\n awaitingResync: boolean;\n catalogFallback: boolean;\n scrollbar: TerminalScrollbarState | null;\n}\n\ninterface SurfaceSnapshot {\n sessionHandle: string;\n focused: boolean;\n cursorBlinkVisible: boolean;\n selection: CellSelection | null;\n theme: TerminalTheme;\n effects: TerminalEffects;\n damage: { full: boolean; rows: Set<number>; geometryChanged: boolean };\n}\n\ninterface MountedCanvas {\n canvas: OffscreenCanvas;\n size: PixelSize;\n sessionHandle: string;\n}\n\ninterface SessionPresentationDefaults {\n theme: TerminalTheme;\n effects: TerminalEffects;\n selection: CellSelection | null;\n visible: boolean;\n}\n\nconst hiddenCursor: CursorState = { x: 0, y: 0, visible: false, style: 1, blinking: false };\nconst CURSOR_BLINK_INTERVAL_MS = 600;\nconst MAX_SESSION_GLYPH_DEFINITIONS = 65_536;\nconst MAX_SESSION_GLYPH_PIXEL_BYTES = 64 * 1024 * 1024;\nconst MAX_SESSION_STYLE_DEFINITIONS = 65_536;\nconst MAX_SHARED_GLYPH_DEFINITIONS = 131_072;\nconst MAX_SHARED_GLYPH_PIXEL_BYTES = 128 * 1024 * 1024;\nconst MAX_RETAINED_STYLE_DEFINITIONS = 262_144;\nconst GLYPH_CATALOG_BUDGET = {\n maxDefinitions: MAX_SESSION_GLYPH_DEFINITIONS,\n maxSharedDefinitions: MAX_SHARED_GLYPH_DEFINITIONS,\n maxSessionPixelBytes: MAX_SESSION_GLYPH_PIXEL_BYTES,\n maxSharedPixelBytes: MAX_SHARED_GLYPH_PIXEL_BYTES,\n} as const;\nconst NO_GLYPH_DEFINITIONS: readonly GlyphDefinition[] = [];\nconst NO_STYLE_DEFINITIONS: readonly StyleDefinition[] = [];\nconst MAX_PERFORMANCE_SAMPLES = 100_000;\nconst FRAME_CREDIT_BATCH_BYTES = 4 * 1024 * 1024;\nconst FRAME_CREDIT_MAX_DELAY_MS = 8;\nconst snapshots = new Map<string, SessionSnapshot>();\nconst sharedGlyphDefinitions = new Map<number, { definition: GlyphDefinition; references: number }>();\nlet sharedGlyphPixelBytes = 0;\nlet retainedStyleDefinitions = 0;\nconst surfaces = new Map<string, SurfaceSnapshot>();\nconst surfaceIdsBySession = new Map<string, Set<string>>();\nconst noSurfaceIds: ReadonlySet<string> = new Set();\nconst presentationDefaults = new Map<string, SessionPresentationDefaults>();\nconst mounts = new Map<string, MountedCanvas>();\nconst cursorBlinkTimers = new Map<string, ReturnType<typeof setTimeout>>();\nconst dirty = new Set<string>();\n// Occluded surfaces continue ingesting frames so they resume from current state,\n// but do not schedule GPU flushes or cursor timers while their native tab is hidden.\nconst occluded = new Set<string>();\n// A frozen replica must not animate: a blinking cursor on a screen the host\n// stopped updating reads as a live session. Focus is left untouched, since the\n// runtime owns focus truth for control reclaim.\nconst frozenCursors = new Set<string>();\nlet renderer: TerminalRenderer | undefined;\nlet rendererPromise: Promise<TerminalRenderer> | undefined;\nlet flushScheduled = false;\nlet recoveryAttempts = 0;\nlet recovering = false;\nlet nativeTextAnnounced = false;\nlet forceCanvasFallback = false;\nlet partialRenderingEnabled = true;\nlet pendingFrameCreditBytes = 0;\nlet frameCreditTimer: ReturnType<typeof setTimeout> | undefined;\nlet shaderAnimationScheduled = false;\n\ninterface ActivePerformanceMeasurement {\n startedAt: number;\n lastActivityAt: number;\n lastFrameAt: Map<string, number>;\n dirtySince: Map<string, number>;\n frames: TerminalRenderPerformanceSnapshot[\"frames\"];\n scheduling: TerminalRenderPerformanceSnapshot[\"scheduling\"];\n renderer: TerminalRenderPerformanceSnapshot[\"renderer\"];\n samples: TerminalRenderPerformanceSnapshot[\"samples\"];\n}\n\nlet performanceMeasurement: ActivePerformanceMeasurement | undefined;\n\nfunction appendPerformanceSample(samples: number[], value: number): void {\n if (samples.length < MAX_PERFORMANCE_SAMPLES) samples.push(value);\n}\n\nfunction flushFrameCredit(): void {\n if (frameCreditTimer !== undefined) clearTimeout(frameCreditTimer);\n frameCreditTimer = undefined;\n if (pendingFrameCreditBytes === 0) return;\n const bytes = pendingFrameCreditBytes;\n pendingFrameCreditBytes = 0;\n postToRenderer({ type: \"frame-credit\", bytes });\n}\n\nfunction returnFrameCredit(bytes: number): void {\n pendingFrameCreditBytes += bytes;\n if (pendingFrameCreditBytes >= FRAME_CREDIT_BATCH_BYTES) {\n flushFrameCredit();\n } else if (frameCreditTimer === undefined) {\n frameCreditTimer = setTimeout(flushFrameCredit, FRAME_CREDIT_MAX_DELAY_MS);\n }\n}\n\nfunction beginPerformanceMeasurement(): void {\n const now = performance.now();\n performanceMeasurement = {\n startedAt: now,\n lastActivityAt: now,\n lastFrameAt: new Map(),\n dirtySince: new Map(),\n frames: {\n received: 0,\n bytes: 0,\n full: 0,\n incremental: 0,\n stale: 0,\n resyncRequested: 0,\n rowsDecoded: 0,\n glyphDefinitions: 0,\n },\n scheduling: { flushes: 0, renderCalls: 0, maximumDirtyPanes: 0, panesPerFlush: [] },\n renderer: {\n queueSubmits: 0,\n fullRenders: 0,\n partialRenders: 0,\n damagedRows: 0,\n geometryCacheHits: 0,\n geometryCacheMisses: 0,\n canvasPixelFrames: 0,\n renderPasses: 0,\n drawCalls: 0,\n rectangleVertices: 0,\n monoGlyphVertices: 0,\n colorGlyphVertices: 0,\n fallbackGlyphVertices: 0,\n vertexUploadBytes: 0,\n atlasUploadBytes: 0,\n atlasUploadCalls: 0,\n },\n samples: { frameApplyMs: [], renderCpuMs: [], dirtyToRenderMs: [], frameArrivalToRenderMs: [] },\n };\n renderer?.setPerformanceMeasurementEnabled?.(true);\n}\n\nfunction notePerformanceActivity(now = performance.now()): void {\n if (performanceMeasurement) performanceMeasurement.lastActivityAt = now;\n}\n\nfunction recordRenderMetrics(metrics: ReturnType<typeof emptyRenderMetrics>): void {\n const target = performanceMeasurement?.renderer;\n if (!target) return;\n target.queueSubmits += metrics.queueSubmits;\n target.fullRenders += metrics.fullRenders;\n target.partialRenders += metrics.partialRenders;\n target.damagedRows += metrics.damagedRows;\n target.geometryCacheHits += metrics.geometryCacheHits;\n target.geometryCacheMisses += metrics.geometryCacheMisses;\n target.canvasPixelFrames += metrics.canvasPixels;\n target.renderPasses += metrics.renderPasses;\n target.drawCalls += metrics.drawCalls;\n target.rectangleVertices += metrics.rectangleVertices;\n target.monoGlyphVertices += metrics.monoGlyphVertices;\n target.colorGlyphVertices += metrics.colorGlyphVertices;\n target.fallbackGlyphVertices += metrics.fallbackGlyphVertices;\n target.vertexUploadBytes += metrics.vertexUploadBytes;\n target.atlasUploadBytes += metrics.atlasUploadBytes;\n target.atlasUploadCalls += metrics.atlasUploadCalls;\n}\n\nasync function finishPerformanceMeasurement(requestId: number, quietMs: number, timeoutMs: number): Promise<void> {\n const active = performanceMeasurement;\n if (!active) throw new Error(\"No terminal render performance measurement is active\");\n const deadline = performance.now() + timeoutMs;\n let timedOutWaitingForIdle = false;\n let gpuQueueDrainMs: number | null = null;\n\n while (true) {\n const now = performance.now();\n const hasVisibleDirty = [...dirty].some((id) => !occluded.has(id));\n if (!flushScheduled && !hasVisibleDirty && now - active.lastActivityAt >= quietMs) {\n const beforeDrainActivity = active.lastActivityAt;\n if (renderer?.settle) {\n const drainStarted = performance.now();\n await renderer.settle();\n gpuQueueDrainMs = performance.now() - drainStarted;\n }\n if (active.lastActivityAt === beforeDrainActivity && !flushScheduled) break;\n }\n if (now >= deadline) {\n timedOutWaitingForIdle = true;\n break;\n }\n await new Promise((resolve) => setTimeout(resolve, Math.min(25, Math.max(1, quietMs / 4))));\n }\n\n if (timedOutWaitingForIdle && renderer?.settle) {\n const drainStarted = performance.now();\n await renderer.settle();\n gpuQueueDrainMs = performance.now() - drainStarted;\n }\n const snapshot: TerminalRenderPerformanceSnapshot = {\n backend: renderer?.kind ?? \"starting\",\n durationMs: performance.now() - active.startedAt,\n timedOutWaitingForIdle,\n gpuQueueDrainMs,\n frames: active.frames,\n scheduling: active.scheduling,\n renderer: active.renderer,\n samples: active.samples,\n };\n renderer?.setPerformanceMeasurementEnabled?.(false);\n if (performanceMeasurement === active) performanceMeasurement = undefined;\n postToRenderer({ type: \"performance-result\", requestId, snapshot });\n}\n\nfunction postToRenderer(message: WorkerToRendererMessage): void {\n self.postMessage(message);\n}\n\nfunction snapshot(sessionHandle: string): SessionSnapshot {\n let value = snapshots.get(sessionHandle);\n if (!value) {\n value = {\n rows: [],\n nativeRows: [],\n nativeStyleRows: [],\n glyphDefinitions: new Map(),\n glyphPixelBytes: 0,\n styleDefinitions: new Map(),\n rowRevisions: [],\n cursor: hiddenCursor,\n layoutEpoch: 0n,\n sessionEpoch: 0n,\n sequence: 0n,\n awaitingResync: false,\n catalogFallback: false,\n scrollbar: null,\n };\n snapshots.set(sessionHandle, value);\n }\n return value;\n}\n\nfunction clearSessionCatalog(session: SessionSnapshot): void {\n for (const glyphId of session.glyphDefinitions.keys()) {\n const shared = sharedGlyphDefinitions.get(glyphId);\n if (!shared) continue;\n shared.references -= 1;\n if (shared.references <= 0) {\n sharedGlyphDefinitions.delete(glyphId);\n sharedGlyphPixelBytes -= shared.definition.pixels.byteLength;\n }\n }\n session.glyphDefinitions.clear();\n session.glyphPixelBytes = 0;\n retainedStyleDefinitions -= session.styleDefinitions.size;\n session.styleDefinitions.clear();\n}\n\nfunction installGlyphDefinitions(session: SessionSnapshot, definitions: readonly GlyphDefinition[]): void {\n for (const decoded of definitions) {\n if (session.glyphDefinitions.has(decoded.id)) continue;\n let shared = sharedGlyphDefinitions.get(decoded.id);\n const pixelBytes = shared?.definition.pixels.byteLength ?? decoded.pixels.byteLength;\n if (shared) {\n shared.references += 1;\n } else {\n shared = { definition: decoded, references: 1 };\n sharedGlyphDefinitions.set(decoded.id, shared);\n sharedGlyphPixelBytes += decoded.pixels.byteLength;\n }\n session.glyphDefinitions.set(decoded.id, shared.definition);\n session.glyphPixelBytes += pixelBytes;\n }\n}\n\nfunction installStyleDefinitions(session: SessionSnapshot, definitions: readonly StyleDefinition[]): void {\n for (const definition of definitions) {\n if (session.styleDefinitions.has(definition.id)) continue;\n session.styleDefinitions.set(definition.id, definition);\n retainedStyleDefinitions += 1;\n }\n}\n\nfunction dropSessionSnapshot(sessionHandle: string): void {\n const session = snapshots.get(sessionHandle);\n if (session) clearSessionCatalog(session);\n snapshots.delete(sessionHandle);\n}\n\nfunction defaults(sessionHandle: string): SessionPresentationDefaults {\n let value = presentationDefaults.get(sessionHandle);\n if (!value) {\n value = { theme: DEFAULT_THEME, effects: DEFAULT_EFFECTS, selection: null, visible: true };\n presentationDefaults.set(sessionHandle, value);\n }\n return value;\n}\n\nfunction surface(surfaceId: string, sessionHandle: string): SurfaceSnapshot {\n const existing = surfaces.get(surfaceId);\n if (existing) {\n if (existing.sessionHandle !== sessionHandle) throw new Error(`Surface ${surfaceId} changed sessions`);\n return existing;\n }\n const initial = defaults(sessionHandle);\n const value: SurfaceSnapshot = {\n sessionHandle,\n focused: false,\n cursorBlinkVisible: true,\n selection: initial.selection,\n theme: initial.theme,\n effects: initial.effects,\n damage: { full: true, rows: new Set(), geometryChanged: true },\n };\n surfaces.set(surfaceId, value);\n let sessionSurfaceIds = surfaceIdsBySession.get(sessionHandle);\n if (!sessionSurfaceIds) {\n sessionSurfaceIds = new Set();\n surfaceIdsBySession.set(sessionHandle, sessionSurfaceIds);\n }\n sessionSurfaceIds.add(surfaceId);\n if (!initial.visible) occluded.add(surfaceId);\n return value;\n}\n\nfunction surfaceIdsForSession(sessionHandle: string): ReadonlySet<string> {\n return surfaceIdsBySession.get(sessionHandle) ?? noSurfaceIds;\n}\n\nfunction deleteSurface(surfaceId: string): SurfaceSnapshot | undefined {\n const value = surfaces.get(surfaceId);\n if (!value) return undefined;\n surfaces.delete(surfaceId);\n const sessionSurfaceIds = surfaceIdsBySession.get(value.sessionHandle);\n sessionSurfaceIds?.delete(surfaceId);\n if (sessionSurfaceIds?.size === 0) surfaceIdsBySession.delete(value.sessionHandle);\n return value;\n}\n\nfunction renderView(session: SessionSnapshot, presentation: SurfaceSnapshot): RenderView {\n return {\n rows: session.rows,\n nativeRows: session.nativeRows,\n nativeStyleRows: session.nativeStyleRows,\n rowRevisions: session.rowRevisions,\n glyphDefinitions: session.glyphDefinitions,\n styleDefinitions: session.styleDefinitions,\n sessionEpoch: session.sessionEpoch,\n layoutEpoch: session.layoutEpoch,\n cursor: session.cursor,\n focused: presentation.focused,\n cursorBlinkVisible: presentation.cursorBlinkVisible,\n selection: presentation.selection,\n theme: presentation.theme,\n effects: presentation.effects,\n damage: presentation.damage,\n };\n}\n\nfunction scheduleCursorBlink(surfaceId: string, reset: boolean): void {\n const existing = cursorBlinkTimers.get(surfaceId);\n if (existing !== undefined) clearTimeout(existing);\n cursorBlinkTimers.delete(surfaceId);\n const value = surfaces.get(surfaceId);\n if (!value) return;\n const session = snapshot(value.sessionHandle);\n if (reset) value.cursorBlinkVisible = true;\n if (\n occluded.has(surfaceId) ||\n frozenCursors.has(surfaceId) ||\n !value.focused ||\n !session.cursor.visible ||\n !session.cursor.blinking\n )\n return;\n cursorBlinkTimers.set(\n surfaceId,\n setTimeout(() => {\n cursorBlinkTimers.delete(surfaceId);\n const current = surfaces.get(surfaceId);\n const currentSession = current ? snapshots.get(current.sessionHandle) : undefined;\n if (\n occluded.has(surfaceId) ||\n !current ||\n !currentSession ||\n !current.focused ||\n !currentSession.cursor.visible ||\n !currentSession.cursor.blinking\n )\n return;\n current.cursorBlinkVisible = !current.cursorBlinkVisible;\n invalidateRows(surfaceId, [currentSession.cursor.y]);\n scheduleCursorBlink(surfaceId, false);\n }, CURSOR_BLINK_INTERVAL_MS),\n );\n}\n\nasync function createRenderer(): Promise<TerminalRenderer> {\n if (forceCanvasFallback) {\n const canvas = new CanvasTerminalRenderer();\n postToRenderer({ type: \"renderer-status\", backend: canvas.kind, recovered: true });\n return canvas;\n }\n try {\n const gpu = await WebGpuTerminalRenderer.create((info) => void recoverDevice(info));\n recoveryAttempts = 0;\n postToRenderer({ type: \"renderer-status\", backend: gpu.kind });\n return gpu;\n } catch (error) {\n console.warn(\"[terminal-renderer] WebGPU unavailable; using diagnostic Canvas2D\", error);\n const canvas = new CanvasTerminalRenderer();\n postToRenderer({ type: \"renderer-status\", backend: canvas.kind });\n return canvas;\n }\n}\n\nasync function ensureRenderer(): Promise<TerminalRenderer> {\n rendererPromise ??= createRenderer();\n renderer = await rendererPromise;\n return renderer;\n}\n\nasync function recoverDevice(info: GPUDeviceLostInfo): Promise<void> {\n if (recovering || renderer?.kind === \"canvas2d\") return;\n recovering = true;\n recoveryAttempts += 1;\n console.warn(`[terminal-renderer] WebGPU device lost (${info.reason}): ${info.message}`);\n renderer = undefined;\n rendererPromise = WebGpuTerminalRenderer.create((nextInfo) => void recoverDevice(nextInfo));\n try {\n const next = await rendererPromise;\n renderer = next;\n recoveryAttempts = 0;\n recovering = false;\n for (const [id, mount] of mounts) {\n next.mount(id, mount.canvas);\n next.resize(id, mount.size);\n invalidateFull(id);\n }\n scheduleShaderAnimation();\n postToRenderer({ type: \"renderer-status\", backend: next.kind, recovered: true });\n } catch (error) {\n console.error(\"[terminal-renderer] WebGPU recovery failed\", error);\n rendererPromise = undefined;\n recovering = false;\n if (recoveryAttempts >= 3) {\n postToRenderer({ type: \"renderer-reload-required\", reason: \"webgpu-device-loss\" });\n return;\n }\n const delay = Math.min(5_000, 250 * 2 ** Math.min(recoveryAttempts, 4));\n setTimeout(() => void recoverDevice(info), delay);\n }\n}\n\nfunction scheduleFlush(): void {\n if (flushScheduled) return;\n flushScheduled = true;\n const run = (): void => {\n flushScheduled = false;\n void flush();\n };\n if (typeof self.requestAnimationFrame === \"function\") self.requestAnimationFrame(run);\n else setTimeout(run, 8);\n}\n\nfunction shaderAnimationActive(surfaceId: string, presentation: SurfaceSnapshot): boolean {\n return (\n renderer?.kind === \"webgpu\" &&\n mounts.has(surfaceId) &&\n !occluded.has(surfaceId) &&\n presentation.focused &&\n terminalEffectsNeedAnimation(presentation.effects)\n );\n}\n\nfunction scheduleShaderAnimation(): void {\n if (\n shaderAnimationScheduled ||\n ![...surfaces].some(([surfaceId, presentation]) => shaderAnimationActive(surfaceId, presentation))\n )\n return;\n shaderAnimationScheduled = true;\n const run = (): void => {\n shaderAnimationScheduled = false;\n for (const [surfaceId, presentation] of surfaces) {\n if (shaderAnimationActive(surfaceId, presentation)) markDirty(surfaceId);\n }\n scheduleShaderAnimation();\n };\n if (typeof self.requestAnimationFrame === \"function\") self.requestAnimationFrame(run);\n else setTimeout(run, 16);\n}\n\nasync function flush(): Promise<void> {\n const backend = await ensureRenderer();\n const ids = [...dirty].filter((id) => !occluded.has(id));\n if (performanceMeasurement && ids.length > 0) {\n performanceMeasurement.scheduling.flushes += 1;\n appendPerformanceSample(performanceMeasurement.scheduling.panesPerFlush, ids.length);\n performanceMeasurement.scheduling.maximumDirtyPanes = Math.max(\n performanceMeasurement.scheduling.maximumDirtyPanes,\n ids.length,\n );\n }\n for (const id of ids) dirty.delete(id);\n const entries = ids.flatMap((id) => {\n const presentation = surfaces.get(id);\n const session = presentation ? snapshots.get(presentation.sessionHandle) : undefined;\n return mounts.has(id) && presentation && session ? [{ id, view: renderView(session, presentation) }] : [];\n });\n if (entries.length > 0) {\n try {\n const active = performanceMeasurement;\n const beforeRender = active ? performance.now() : 0;\n const metrics = backend.renderBatch\n ? backend.renderBatch(entries)\n : entries.map(({ id, view }) => backend.render(id, view));\n const renderedAt = active ? performance.now() : 0;\n for (const { id } of entries) {\n const damage = surfaces.get(id)?.damage;\n if (!damage) continue;\n damage.full = false;\n damage.rows.clear();\n damage.geometryChanged = false;\n }\n if (active && performanceMeasurement === active) {\n active.scheduling.renderCalls += entries.length;\n appendPerformanceSample(active.samples.renderCpuMs, renderedAt - beforeRender);\n for (let index = 0; index < entries.length; index += 1) {\n const { id } = entries[index]!;\n const dirtySince = active.dirtySince.get(id);\n const sessionHandle = surfaces.get(id)?.sessionHandle;\n const lastFrameAt = sessionHandle ? active.lastFrameAt.get(sessionHandle) : undefined;\n if (dirtySince !== undefined)\n appendPerformanceSample(active.samples.dirtyToRenderMs, renderedAt - dirtySince);\n if (lastFrameAt !== undefined)\n appendPerformanceSample(active.samples.frameArrivalToRenderMs, renderedAt - lastFrameAt);\n active.dirtySince.delete(id);\n recordRenderMetrics(metrics[index] ?? emptyRenderMetrics());\n }\n notePerformanceActivity(renderedAt);\n }\n } catch (error) {\n console.error(`[terminal-renderer] failed to render ${entries.length} view(s)`, error);\n }\n }\n if ([...dirty].some((id) => !occluded.has(id))) scheduleFlush();\n}\n\nfunction markDirty(id: string): void {\n if (performanceMeasurement && !performanceMeasurement.dirtySince.has(id)) {\n performanceMeasurement.dirtySince.set(id, performance.now());\n }\n dirty.add(id);\n if (!occluded.has(id)) scheduleFlush();\n}\n\nfunction invalidateFull(id: string): void {\n const value = surfaces.get(id);\n if (!value) return;\n const damage = value.damage;\n damage.full = true;\n damage.rows.clear();\n damage.geometryChanged = true;\n markDirty(id);\n}\n\nfunction invalidateRows(id: string, rows: Iterable<number>, geometryChanged = false): void {\n if (!partialRenderingEnabled) {\n invalidateFull(id);\n return;\n }\n const value = surfaces.get(id);\n if (!value) return;\n const damage = value.damage;\n if (!damage.full) {\n damage.geometryChanged ||= geometryChanged;\n for (const row of rows) {\n if (Number.isSafeInteger(row) && row >= 0) damage.rows.add(row);\n }\n }\n markDirty(id);\n}\n\nfunction invalidateSessionFull(sessionHandle: string): void {\n for (const surfaceId of surfaceIdsForSession(sessionHandle)) invalidateFull(surfaceId);\n}\n\nfunction invalidateSessionRows(sessionHandle: string, rows: Iterable<number>, geometryChanged = false): void {\n const damagedRows = [...rows];\n for (const surfaceId of surfaceIdsForSession(sessionHandle)) invalidateRows(surfaceId, damagedRows, geometryChanged);\n}\n\nasync function mount(surfaceId: string, sessionHandle: string, canvas: OffscreenCanvas): Promise<void> {\n if (mounts.has(surfaceId)) renderer?.unmount(surfaceId);\n snapshot(sessionHandle);\n surface(surfaceId, sessionHandle);\n const entry: MountedCanvas = { canvas, size: { width: 1, height: 1, dpr: 1 }, sessionHandle };\n mounts.set(surfaceId, entry);\n const backend = await ensureRenderer();\n if (mounts.get(surfaceId) !== entry) return;\n backend.mount(surfaceId, canvas);\n backend.resize(surfaceId, entry.size);\n invalidateFull(surfaceId);\n scheduleShaderAnimation();\n}\n\nfunction applyFrame(packet: ArrayBuffer): void {\n const active = performanceMeasurement;\n const applyStarted = active ? performance.now() : 0;\n if (active) {\n active.frames.received += 1;\n active.frames.bytes += packet.byteLength;\n active.lastActivityAt = applyStarted;\n }\n const frame = decodeFrame(packet);\n const id = frame.sessionHandle.toString();\n if (active) {\n active.lastFrameAt.set(id, applyStarted);\n if ((frame.flags & FrameFlag.FullSnapshot) !== 0) active.frames.full += 1;\n else active.frames.incremental += 1;\n }\n const previous = snapshot(id);\n const fullFrame = (frame.flags & FrameFlag.FullSnapshot) !== 0;\n const catalogReset = (frame.flags & FrameFlag.CatalogReset) !== 0;\n if (catalogReset && !fullFrame) {\n if (active) {\n active.frames.resyncRequested += 1;\n appendPerformanceSample(active.samples.frameApplyMs, performance.now() - applyStarted);\n }\n previous.awaitingResync = true;\n postToRenderer({ type: \"frame-resync-needed\", sessionHandle: id });\n return;\n }\n const classification = classifyFrame(previous, {\n sessionEpoch: frame.sessionEpoch,\n layoutEpoch: frame.layoutEpoch,\n sequence: frame.frameSequence,\n full: fullFrame,\n });\n if (classification === \"stale\") {\n if (active) {\n active.frames.stale += 1;\n appendPerformanceSample(active.samples.frameApplyMs, performance.now() - applyStarted);\n }\n return;\n }\n const changedSession = previous.sessionEpoch !== 0n && frame.sessionEpoch !== previous.sessionEpoch;\n if (classification === \"resync\") {\n if (active) {\n active.frames.resyncRequested += 1;\n appendPerformanceSample(active.samples.frameApplyMs, performance.now() - applyStarted);\n }\n previous.awaitingResync = true;\n postToRenderer({ type: \"frame-resync-needed\", sessionHandle: id });\n return;\n }\n const completingResync = previous.awaitingResync;\n const rowSection = frame.sections.find((candidate) => candidate.kind === SectionKind.RowReplacements);\n const cursorSection = frame.sections.find((candidate) => candidate.kind === SectionKind.CursorState);\n const glyphSection = frame.sections.find((candidate) => candidate.kind === SectionKind.GlyphDefinitions);\n const styleSection = frame.sections.find((candidate) => candidate.kind === SectionKind.StyleDefinitions);\n const clipboardSection = frame.sections.find((candidate) => candidate.kind === SectionKind.ClipboardWrite);\n const scrollbarSection = frame.sections.find((candidate) => candidate.kind === SectionKind.ScrollbarState);\n if (!rowSection || !cursorSection) {\n if (active) appendPerformanceSample(active.samples.frameApplyMs, performance.now() - applyStarted);\n return;\n }\n\n const glyphDefinitions = glyphSection ? decodeGlyphDefinitions(glyphSection) : NO_GLYPH_DEFINITIONS;\n const styleDefinitions = styleSection ? decodeStyleDefinitions(styleSection) : NO_STYLE_DEFINITIONS;\n if (active) active.frames.glyphDefinitions += glyphDefinitions.length;\n const resetsCatalog = changedSession || completingResync || catalogReset;\n const wasCatalogFallback = previous.catalogFallback;\n if (resetsCatalog) {\n previous.rows = [];\n previous.nativeRows = [];\n previous.nativeStyleRows = [];\n clearSessionCatalog(previous);\n previous.rowRevisions = [];\n const catalogFits =\n glyphCatalogFits(\n previous.glyphDefinitions,\n previous.glyphPixelBytes,\n sharedGlyphDefinitions,\n sharedGlyphPixelBytes,\n glyphDefinitions,\n GLYPH_CATALOG_BUDGET,\n ) &&\n definitionCatalogFits(\n previous.styleDefinitions,\n styleDefinitions,\n MAX_SESSION_STYLE_DEFINITIONS,\n retainedStyleDefinitions,\n MAX_RETAINED_STYLE_DEFINITIONS,\n );\n const admission = catalogAdmission(true, wasCatalogFallback, catalogFits);\n previous.catalogFallback = admission === \"text-fallback\";\n if (admission === \"install\") {\n installGlyphDefinitions(previous, glyphDefinitions);\n installStyleDefinitions(previous, styleDefinitions);\n } else if (!wasCatalogFallback) {\n postToRenderer({\n type: \"catalog-pressure\",\n sessionHandle: id,\n reason: \"working-set-exceeds-budget\",\n });\n }\n } else if (!previous.catalogFallback) {\n const catalogFits =\n glyphCatalogFits(\n previous.glyphDefinitions,\n previous.glyphPixelBytes,\n sharedGlyphDefinitions,\n sharedGlyphPixelBytes,\n glyphDefinitions,\n GLYPH_CATALOG_BUDGET,\n ) &&\n definitionCatalogFits(\n previous.styleDefinitions,\n styleDefinitions,\n MAX_SESSION_STYLE_DEFINITIONS,\n retainedStyleDefinitions,\n MAX_RETAINED_STYLE_DEFINITIONS,\n );\n const admission = catalogAdmission(false, false, catalogFits);\n if (admission === \"request-full\") {\n if (active) {\n active.frames.resyncRequested += 1;\n appendPerformanceSample(active.samples.frameApplyMs, performance.now() - applyStarted);\n }\n previous.awaitingResync = true;\n postToRenderer({ type: \"frame-resync-needed\", sessionHandle: id });\n return;\n }\n if (admission === \"install\") {\n installGlyphDefinitions(previous, glyphDefinitions);\n installStyleDefinitions(previous, styleDefinitions);\n }\n }\n if (!previous.catalogFallback && !nativeTextAnnounced && glyphDefinitions.length > 0) {\n nativeTextAnnounced = true;\n postToRenderer({ type: \"renderer-status\", backend: renderer?.kind ?? \"starting\", textEngine: \"native\" });\n }\n if (clipboardSection) {\n postToRenderer({ type: \"clipboard-write\", text: decodeClipboardWrite(clipboardSection) });\n }\n if (scrollbarSection) {\n const decoded = decodeScrollbarState(scrollbarSection);\n const scrollbar = {\n total: Number(decoded.total),\n offset: Number(decoded.offset),\n length: Number(decoded.length),\n };\n if (\n !Number.isSafeInteger(scrollbar.total) ||\n !Number.isSafeInteger(scrollbar.offset) ||\n !Number.isSafeInteger(scrollbar.length)\n )\n throw new RangeError(\"Scrollbar state exceeds JavaScript's safe integer range\");\n if (\n !previous.scrollbar ||\n previous.scrollbar.total !== scrollbar.total ||\n previous.scrollbar.offset !== scrollbar.offset ||\n previous.scrollbar.length !== scrollbar.length\n ) {\n previous.scrollbar = scrollbar;\n postToRenderer({ type: \"scrollbar-state\", sessionHandle: id, scrollbar });\n }\n }\n\n const full = (rowSection.flags & 1) !== 0;\n const useNativeCatalog = !previous.catalogFallback;\n const rows = full ? Array<string>(frame.rows).fill(\"\") : previous.rows.slice();\n const nativeRows = full\n ? Array.from({ length: frame.rows }, () => [] as GlyphInstance[])\n : previous.nativeRows.slice();\n const nativeStyleRows = full\n ? Array.from({ length: frame.rows }, () => [] as StyleRun[])\n : previous.nativeStyleRows.slice();\n const rowRevisions = full ? Array<bigint>(frame.rows).fill(0n) : previous.rowRevisions.slice();\n const replacements = decodeRowReplacements(rowSection);\n const damagedRows: number[] = [];\n if (active) active.frames.rowsDecoded += replacements.length;\n for (const replacement of replacements) {\n if (replacement.row >= frame.rows) throw new RangeError(\"Row replacement exceeds viewport\");\n if (replacement.revision < (rowRevisions[replacement.row] ?? 0n)) continue;\n rows[replacement.row] = replacement.text;\n nativeRows[replacement.row] = useNativeCatalog ? replacement.glyphs : [];\n nativeStyleRows[replacement.row] = useNativeCatalog ? replacement.styles : [];\n rowRevisions[replacement.row] = replacement.revision;\n damagedRows.push(replacement.row);\n }\n previous.rows = rows;\n previous.nativeRows = nativeRows;\n previous.nativeStyleRows = nativeStyleRows;\n previous.rowRevisions = rowRevisions;\n const geometryChanged = damagedRows.length > 0;\n const previousCursor = previous.cursor;\n const nextCursor = decodeCursorState(cursorSection);\n const cursorChanged =\n nextCursor.x !== previousCursor.x ||\n nextCursor.y !== previousCursor.y ||\n nextCursor.visible !== previousCursor.visible ||\n nextCursor.style !== previousCursor.style ||\n nextCursor.blinking !== previousCursor.blinking;\n previous.cursor = nextCursor;\n previous.layoutEpoch = frame.layoutEpoch;\n previous.sessionEpoch = frame.sessionEpoch;\n previous.sequence = frame.frameSequence;\n previous.awaitingResync = false;\n if (completingResync) postToRenderer({ type: \"frame-resync-complete\", sessionHandle: id });\n const requiresFullRedraw = full || changedSession || completingResync;\n if (!requiresFullRedraw && cursorChanged) damagedRows.push(previousCursor.y, nextCursor.y);\n const hasRowDamage = damagedRows.length > 0;\n for (const surfaceId of surfaceIdsForSession(id)) {\n if (cursorChanged) scheduleCursorBlink(surfaceId, true);\n if (requiresFullRedraw) invalidateFull(surfaceId);\n else if (hasRowDamage) invalidateRows(surfaceId, damagedRows, geometryChanged);\n }\n // Announced only once the frame is committed and its redraw scheduled, so a\n // consumer waiting on recovery is never told \"done\" ahead of the pixels.\n postToRenderer({\n type: \"frame-committed\",\n sessionHandle: id,\n sessionEpoch: frame.sessionEpoch,\n frameSequence: frame.frameSequence,\n // A resume publishes a full refresh, and `classifyFrame` only accepts a\n // resync-completing frame that carries one, so this flag is what tells a\n // recovered screen apart from a partial update of the stale one.\n fullSnapshot: fullFrame,\n });\n if (active) appendPerformanceSample(active.samples.frameApplyMs, performance.now() - applyStarted);\n}\n\nself.onmessage = (event: MessageEvent<RendererToWorkerMessage>) => {\n const message = event.data;\n try {\n if (message.type === \"mount\") {\n void mount(message.surfaceId, message.sessionHandle, message.canvas).catch((error) => {\n console.error(\"[terminal-renderer] mount failed\", error);\n });\n } else if (message.type === \"renderer-config\") {\n forceCanvasFallback = Boolean(message.forceCanvasFallback);\n } else if (message.type === \"partial-rendering\") {\n partialRenderingEnabled = Boolean(message.enabled);\n for (const id of mounts.keys()) invalidateFull(id);\n } else if (message.type === \"unmount\") {\n mounts.delete(message.surfaceId);\n dirty.delete(message.surfaceId);\n deleteSurface(message.surfaceId);\n occluded.delete(message.surfaceId);\n frozenCursors.delete(message.surfaceId);\n renderer?.unmount(message.surfaceId);\n const timer = cursorBlinkTimers.get(message.surfaceId);\n if (timer !== undefined) clearTimeout(timer);\n cursorBlinkTimers.delete(message.surfaceId);\n // The session may be remounted after zoom/layout changes. Keep its decoded\n // snapshot; only drop-session represents terminal lifetime ending.\n } else if (message.type === \"drop-session\") {\n for (const surfaceId of surfaceIdsForSession(message.sessionHandle)) {\n mounts.delete(surfaceId);\n dirty.delete(surfaceId);\n surfaces.delete(surfaceId);\n occluded.delete(surfaceId);\n frozenCursors.delete(surfaceId);\n renderer?.unmount(surfaceId);\n const timer = cursorBlinkTimers.get(surfaceId);\n if (timer !== undefined) clearTimeout(timer);\n cursorBlinkTimers.delete(surfaceId);\n }\n surfaceIdsBySession.delete(message.sessionHandle);\n dropSessionSnapshot(message.sessionHandle);\n presentationDefaults.delete(message.sessionHandle);\n performanceMeasurement?.lastFrameAt.delete(message.sessionHandle);\n } else if (message.type === \"resize\") {\n const mounted = mounts.get(message.surfaceId);\n if (!mounted) return;\n const nextSize = { width: message.width, height: message.height, dpr: message.dpr };\n const changed = renderedSizeChanged(mounted.size, nextSize);\n mounted.size = nextSize;\n if (!changed) return;\n renderer?.resize(message.surfaceId, mounted.size);\n invalidateFull(message.surfaceId);\n } else if (message.type === \"frame\") {\n try {\n applyFrame(message.packet);\n } finally {\n returnFrameCredit(message.packet.byteLength);\n }\n } else if (message.type === \"frame-gap\") {\n for (const sessionHandle of message.sessionHandles) {\n const session = snapshot(sessionHandle);\n if (session.awaitingResync) continue;\n session.awaitingResync = true;\n postToRenderer({ type: \"frame-resync-needed\", sessionHandle });\n }\n } else if (message.type === \"expect-full\") {\n snapshot(message.sessionHandle).awaitingResync = true;\n } else if (message.type === \"theme\") {\n if (message.surfaceId) {\n surface(message.surfaceId, message.sessionHandle).theme = message.theme;\n invalidateFull(message.surfaceId);\n } else {\n defaults(message.sessionHandle).theme = message.theme;\n for (const surfaceId of surfaceIdsForSession(message.sessionHandle)) {\n surfaces.get(surfaceId)!.theme = message.theme;\n invalidateFull(surfaceId);\n }\n }\n } else if (message.type === \"effects\") {\n if (message.surfaceId) {\n surface(message.surfaceId, message.sessionHandle).effects = message.effects;\n invalidateFull(message.surfaceId);\n } else {\n defaults(message.sessionHandle).effects = message.effects;\n for (const surfaceId of surfaceIdsForSession(message.sessionHandle)) {\n surfaces.get(surfaceId)!.effects = message.effects;\n invalidateFull(surfaceId);\n }\n }\n scheduleShaderAnimation();\n } else if (message.type === \"selection\") {\n if (message.surfaceId) {\n surface(message.surfaceId, message.sessionHandle).selection = message.selection;\n invalidateFull(message.surfaceId);\n } else {\n defaults(message.sessionHandle).selection = message.selection;\n for (const surfaceId of surfaceIdsForSession(message.sessionHandle)) {\n surfaces.get(surfaceId)!.selection = message.selection;\n invalidateFull(surfaceId);\n }\n }\n } else if (message.type === \"visibility\") {\n if (!message.surfaceId) defaults(message.sessionHandle).visible = message.visible;\n if (message.surfaceId) surface(message.surfaceId, message.sessionHandle);\n const targetIds = message.surfaceId ? [message.surfaceId] : surfaceIdsForSession(message.sessionHandle);\n for (const surfaceId of targetIds) {\n if (message.visible) {\n occluded.delete(surfaceId);\n invalidateFull(surfaceId);\n scheduleCursorBlink(surfaceId, true);\n } else {\n occluded.add(surfaceId);\n const timer = cursorBlinkTimers.get(surfaceId);\n if (timer !== undefined) clearTimeout(timer);\n cursorBlinkTimers.delete(surfaceId);\n }\n }\n scheduleShaderAnimation();\n } else if (message.type === \"focus\") {\n const value = surface(message.surfaceId, message.sessionHandle);\n value.focused = Boolean(message.focused);\n scheduleCursorBlink(message.surfaceId, value.focused);\n invalidateRows(message.surfaceId, [snapshot(message.sessionHandle).cursor.y]);\n scheduleShaderAnimation();\n } else if (message.type === \"cursor-frozen\") {\n const value = surfaces.get(message.surfaceId);\n if (!value) return;\n if (message.frozen) {\n frozenCursors.add(message.surfaceId);\n const timer = cursorBlinkTimers.get(message.surfaceId);\n if (timer !== undefined) clearTimeout(timer);\n cursorBlinkTimers.delete(message.surfaceId);\n // Rest on the visible half of the blink so the frozen screen shows the\n // cursor where the host left it.\n if (!value.cursorBlinkVisible) {\n value.cursorBlinkVisible = true;\n invalidateRows(message.surfaceId, [snapshot(value.sessionHandle).cursor.y]);\n }\n } else {\n frozenCursors.delete(message.surfaceId);\n scheduleCursorBlink(message.surfaceId, true);\n }\n } else if (message.type === \"cursor-activity\") {\n const session = snapshot(message.sessionHandle);\n for (const surfaceId of surfaceIdsForSession(message.sessionHandle)) {\n const value = surfaces.get(surfaceId)!;\n const changesPixels = cursorActivityChangesPixels(session.cursor, value.focused, value.cursorBlinkVisible);\n scheduleCursorBlink(surfaceId, true);\n if (changesPixels) invalidateRows(surfaceId, [session.cursor.y]);\n }\n } else if (message.type === \"force-full-redraw\") {\n invalidateSessionFull(message.sessionHandle);\n } else if (message.type === \"force-row-redraw\") {\n invalidateSessionRows(message.sessionHandle, [message.row]);\n } else if (message.type === \"performance-start\") {\n void ensureRenderer()\n .then(() => {\n beginPerformanceMeasurement();\n postToRenderer({ type: \"performance-started\", requestId: message.requestId });\n })\n .catch((error) => console.error(\"[terminal-renderer] failed to start performance measurement\", error));\n } else if (message.type === \"performance-finish\") {\n void finishPerformanceMeasurement(message.requestId, message.quietMs, message.timeoutMs).catch((error) => {\n console.error(\"[terminal-renderer] failed to finish performance measurement\", error);\n });\n }\n } catch (error) {\n console.error(\"[terminal-renderer] rejected worker message\", error);\n }\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["SectionKind", "GlyphFormat", "CursorStyle", "surface", "surface", "ordered", "snapshot", "mount"]
7
7
  }