import { type Coverage } from "../../layout/structures/coverage.ts"; import { type FeatureList, type ScriptList } from "../../layout/structures/layout-common.ts"; import { SetDigest } from "../../layout/structures/set-digest.ts"; import type { GlyphId, uint16 } from "../../types.ts"; import type { Reader } from "../binary/reader.ts"; import { type ChainingContextSubstSubtable, type ContextSubstSubtable } from "./gsub-contextual.ts"; /** GSUB lookup types */ export declare enum GsubLookupType { Single = 1, Multiple = 2, Alternate = 3, Ligature = 4, Context = 5, ChainingContext = 6, Extension = 7, ReverseChainingSingle = 8 } /** Base interface for all GSUB lookups */ export interface GsubLookup { type: GsubLookupType; flag: uint16; markFilteringSet?: uint16; /** Bloom filter for fast O(1) glyph rejection */ digest: SetDigest; } /** Single substitution lookup (Type 1) */ export interface SingleSubstLookup extends GsubLookup { type: GsubLookupType.Single; subtables: SingleSubstSubtable[]; } export interface SingleSubstSubtable { format: 1 | 2; coverage: Coverage; deltaGlyphId?: number; substituteGlyphIds?: GlyphId[]; } /** Multiple substitution lookup (Type 2) */ export interface MultipleSubstLookup extends GsubLookup { type: GsubLookupType.Multiple; subtables: MultipleSubstSubtable[]; } export interface MultipleSubstSubtable { coverage: Coverage; sequences: GlyphId[][]; } /** Alternate substitution lookup (Type 3) */ export interface AlternateSubstLookup extends GsubLookup { type: GsubLookupType.Alternate; subtables: AlternateSubstSubtable[]; } export interface AlternateSubstSubtable { coverage: Coverage; alternateSets: GlyphId[][]; } /** Ligature substitution lookup (Type 4) */ export interface LigatureSubstLookup extends GsubLookup { type: GsubLookupType.Ligature; subtables: LigatureSubstSubtable[]; } export interface LigatureSubstSubtable { coverage: Coverage; ligatureSets: LigatureSet[]; } export interface LigatureSet { ligatures: Ligature[]; } export interface Ligature { ligatureGlyph: GlyphId; componentGlyphIds: GlyphId[]; } /** Context substitution lookup (Type 5) */ export interface ContextSubstLookup extends GsubLookup { type: GsubLookupType.Context; subtables: ContextSubstSubtable[]; } /** Chaining context substitution lookup (Type 6) */ export interface ChainingContextSubstLookup extends GsubLookup { type: GsubLookupType.ChainingContext; subtables: ChainingContextSubstSubtable[]; } /** Reverse chaining single substitution lookup (Type 8) */ export interface ReverseChainingSingleSubstLookup extends GsubLookup { type: GsubLookupType.ReverseChainingSingle; subtables: ReverseChainingSingleSubstSubtable[]; } export interface ReverseChainingSingleSubstSubtable { coverage: Coverage; backtrackCoverages: Coverage[]; lookaheadCoverages: Coverage[]; substituteGlyphIds: GlyphId[]; } /** Union of all GSUB lookup types */ export type AnyGsubLookup = SingleSubstLookup | MultipleSubstLookup | AlternateSubstLookup | LigatureSubstLookup | ContextSubstLookup | ChainingContextSubstLookup | ReverseChainingSingleSubstLookup; /** GSUB table */ export interface GsubTable { version: { major: number; minor: number; }; scriptList: ScriptList; featureList: FeatureList; lookups: AnyGsubLookup[]; } export type { SequenceLookupRecord } from "./gsub-contextual.ts"; export declare function parseGsub(reader: Reader): GsubTable; declare function parseGsubLookup(reader: Reader, _lookupListReader: Reader, _lookupOffset: number): AnyGsubLookup | null; declare function parseExtensionLookup(reader: Reader, subtableOffsets: number[], baseProps: { flag: uint16; markFilteringSet?: uint16; }): AnyGsubLookup | null; export declare function applySingleSubst(lookup: SingleSubstLookup, glyphId: GlyphId): GlyphId | null; export declare function applyLigatureSubst(lookup: LigatureSubstLookup, glyphIds: GlyphId[], startIndex: number): { ligatureGlyph: GlyphId; consumed: number; } | null; /** * Apply ligature substitution using a Uint16Array directly (avoids Array.from allocation). * glyphIds is a pre-allocated typed array, matchLen is the valid length to consider. */ export declare function applyLigatureSubstDirect(lookup: LigatureSubstLookup, glyphIds: Uint16Array, matchLen: number, startIndex: number): { ligatureGlyph: GlyphId; consumed: number; } | null; export declare const __testing: { parseGsubLookup: typeof parseGsubLookup; parseExtensionLookup: typeof parseExtensionLookup; };