/** Worker-side atlas loading and batched MSDF rendering for DOM-synchronized text. * @module three-blocks/text/worker */ import { Matrix4 } from 'three/webgpu'; import { type MissingGlyphDiagnostic, type TextConfiguration, type TextErrorState, type TextFallbackSignal, type TextFontRoute, type TextReadyState, type TextSyncBatch, type TextSyncDelivery } from '../text-runtime/index.js'; export interface TextFontMetrics { readonly descender: number; readonly atlasWidth?: number; readonly atlasHeight?: number; /** Atlas generation size (px per em); used with distanceRange to scale synthetic weight. */ readonly size?: number; readonly distanceRange?: number; has(codePoint: number): boolean; } export interface TextTexture { readonly image?: { readonly width?: number; readonly height?: number; }; dispose?(): void; } export interface TextBatch { name: string; renderOrder: number; weightBias: number; readonly material: object; addText(options: { readonly lines: readonly unknown[]; readonly matrix: Matrix4; readonly fontSize: number; readonly letterSpacing: number; readonly color: number; readonly opacity: number; }): number; removeText(id: number): unknown; setColorAt(id: number, color: number): unknown; setOpacityAt(id: number, opacity: number): unknown; setLayoutAt(id: number, options: { readonly fontSize: number; readonly letterSpacing: number; }): unknown; setLinesAt(id: number, lines: readonly { readonly text: string; readonly x: number; readonly y: number; readonly width: number; }[]): unknown; setMatrixAt(id: number, matrix: Matrix4): unknown; setViewport(width: number, height: number): unknown; setScreenOffset(x: number, y: number): unknown; dispose(): void; } export interface TextScene { add(object: object): unknown; remove(object: object): unknown; } export interface LoadedTextFont { readonly font: TextFontMetrics; readonly map: TextTexture; /** Called after every batch using this load is disposed. Must be idempotent. */ release?(): void; } export interface TextFontLoadContext { readonly key: string; /** Route with `atlas`/`metrics` already resolved to the requested weight variant. */ readonly route: TextFontRoute; /** Baked weight of the atlas variant being loaded. */ readonly weight: number; readonly revision: number; } export type TextFontLoader = (context: TextFontLoadContext) => PromiseLike; export interface CreateTextBatchOptions { readonly font: TextFontMetrics; readonly map: TextTexture; readonly screenSpace: true; readonly maxTextCount: number; readonly maxGlyphCount: number; } export interface TextRendererOptions { readonly configuration: TextConfiguration; readonly renderer: unknown; readonly scene: TextScene; readonly transcoderPath?: string; readonly resolveUrl?: (url: string) => string; readonly loadFont?: TextFontLoader; readonly createBatch?: (options: CreateTextBatchOptions) => TextBatch; readonly registerMaterial?: (key: string, material: object) => void; readonly registerContainer?: (key: string, container: object) => void; readonly onReady?: (state: TextReadyState) => void; readonly onError?: (state: TextErrorState) => void; readonly onFallback?: (signal: TextFallbackSignal) => void; readonly onDiagnostic?: (diagnostic: MissingGlyphDiagnostic) => void; readonly maxTextCountPerBatch?: number; readonly maxGlyphCountPerBatch?: number; readonly baseRenderOrder?: number; } /** Long-lived render-side text owner with incremental updates and atomic font/config swaps. */ export declare class TextRenderer { #private; /** Stable container for shader-precompile value addressing across configuration swaps. */ readonly resources: { fonts: Map; }; constructor(options: TextRendererOptions); get configuration(): TextConfiguration; get size(): number; get batchCount(): number; whenReady(): Promise; applyDelivery(delivery: TextSyncDelivery): boolean; applyBatch(batch: TextSyncBatch): boolean; applySnapshot(batch: TextSyncBatch): boolean; setViewport(width: number, height: number): void; /** Preload and build against a detached candidate; commit only after full validation. */ replaceConfiguration(configuration: TextConfiguration): Promise; dispose(): Promise; } export declare function createTextRenderer(options: TextRendererOptions): TextRenderer;