import type { uint16, uint32 } from "../../types.ts"; import type { Reader } from "../binary/reader.ts"; /** * AAT Feature Name table (feat) * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6feat.html * * Defines the font's typographic features that can be controlled by the user. * Each feature has a type and settings with human-readable names. */ export interface FeatTable { version: number; features: FeatureRecord[]; } /** * A single feature record */ export interface FeatureRecord { /** Feature type (e.g., 1 = ligatures, 2 = cursive connection) */ featureType: uint16; /** Number of settings for this feature */ nSettings: uint16; /** Offset to setting name array */ settingTableOffset: uint32; /** Feature flags */ featureFlags: uint16; /** Default setting index */ defaultSettingIndex: uint16; /** Name table ID for feature name */ nameId: uint16; /** Parsed settings */ settings: FeatureSetting[]; } /** * A single feature setting */ export interface FeatureSetting { /** Setting value to use in morx feature table */ settingValue: uint16; /** Name table ID for setting name */ nameId: uint16; } /** * Feature type constants (Apple-defined) */ export declare enum FeatureType { /** All typographic features */ AllTypographicFeatures = 0, /** Ligatures */ Ligatures = 1, /** Cursive connection */ CursiveConnection = 2, /** Letter case */ LetterCase = 3, /** Vertical substitution */ VerticalSubstitution = 4, /** Linguistic rearrangement */ LinguisticRearrangement = 5, /** Number spacing */ NumberSpacing = 6, /** Smart swashes */ SmartSwashes = 8, /** Diacritics */ Diacritics = 9, /** Vertical position */ VerticalPosition = 10, /** Fractions */ Fractions = 11, /** Overlapping characters */ OverlappingCharacters = 13, /** Typographic extras */ TypographicExtras = 14, /** Mathematical extras */ MathematicalExtras = 15, /** Ornament sets */ OrnamentSets = 16, /** Character alternatives */ CharacterAlternatives = 17, /** Design complexity */ DesignComplexity = 18, /** Style options */ StyleOptions = 19, /** Character shape */ CharacterShape = 20, /** Number case */ NumberCase = 21, /** Text spacing */ TextSpacing = 22, /** Transliteration */ Transliteration = 23, /** Annotation */ Annotation = 24, /** Kana spacing */ KanaSpacing = 25, /** Ideographic spacing */ IdeographicSpacing = 26, /** Unicode decomposition */ UnicodeDecomposition = 27, /** Ruby kana */ RubyKana = 28, /** CJK symbol alternatives */ CJKSymbolAlternatives = 29, /** Ideographic alternatives */ IdeographicAlternatives = 30, /** CJK vertical roman placement */ CJKVerticalRomanPlacement = 31, /** Italic CJK roman */ ItalicCJKRoman = 32, /** Case-sensitive layout */ CaseSensitiveLayout = 33, /** Alternate kana */ AlternateKana = 34, /** Stylistic alternatives */ StylisticAlternatives = 35, /** Contextual alternatives */ ContextualAlternatives = 36, /** Lower case */ LowerCase = 37, /** Upper case */ UpperCase = 38, /** Language tag */ LanguageTag = 39, /** CJK roman spacing */ CJKRomanSpacing = 103 } /** * Common ligature settings */ export declare enum LigatureSetting { RequiredLigaturesOn = 0, RequiredLigaturesOff = 1, CommonLigaturesOn = 2, CommonLigaturesOff = 3, RareLigaturesOn = 4, RareLigaturesOff = 5, LogosOn = 6, LogosOff = 7, RebusPicturesOn = 8, RebusPicturesOff = 9, DiphthongLigaturesOn = 10, DiphthongLigaturesOff = 11, SquaredLigaturesOn = 12, SquaredLigaturesOff = 13, AbbrevSquaredLigaturesOn = 14, AbbrevSquaredLigaturesOff = 15, SymbolLigaturesOn = 16, SymbolLigaturesOff = 17, ContextualLigaturesOn = 18, ContextualLigaturesOff = 19, HistoricalLigaturesOn = 20, HistoricalLigaturesOff = 21 } /** * Vertical position settings */ export declare enum VerticalPositionSetting { NormalPosition = 0, Superiors = 1, Inferiors = 2, Ordinals = 3, ScientificInferiors = 4 } /** * Number case settings */ export declare enum NumberCaseSetting { LowerCaseNumbers = 0, UpperCaseNumbers = 1 } /** * Number spacing settings */ export declare enum NumberSpacingSetting { MonospacedNumbers = 0, ProportionalNumbers = 1, ThirdWidthNumbers = 2, QuarterWidthNumbers = 3 } /** * Fractions settings */ export declare enum FractionsSetting { NoFractions = 0, VerticalFractions = 1, DiagonalFractions = 2 } /** * Case-sensitive layout settings */ export declare enum CaseSensitiveLayoutSetting { CaseSensitiveLayoutOn = 0, CaseSensitiveLayoutOff = 1, CaseSensitiveSpacingOn = 2, CaseSensitiveSpacingOff = 3 } /** * Stylistic alternatives settings */ export declare enum StylisticAlternativesSetting { NoStylisticAlternates = 0, StylisticAltOneOn = 2, StylisticAltOneOff = 3, StylisticAltTwoOn = 4, StylisticAltTwoOff = 5, StylisticAltThreeOn = 6, StylisticAltThreeOff = 7, StylisticAltFourOn = 8, StylisticAltFourOff = 9, StylisticAltFiveOn = 10, StylisticAltFiveOff = 11, StylisticAltSixOn = 12, StylisticAltSixOff = 13, StylisticAltSevenOn = 14, StylisticAltSevenOff = 15, StylisticAltEightOn = 16, StylisticAltEightOff = 17, StylisticAltNineOn = 18, StylisticAltNineOff = 19, StylisticAltTenOn = 20, StylisticAltTenOff = 21, StylisticAltElevenOn = 22, StylisticAltElevenOff = 23, StylisticAltTwelveOn = 24, StylisticAltTwelveOff = 25, StylisticAltThirteenOn = 26, StylisticAltThirteenOff = 27, StylisticAltFourteenOn = 28, StylisticAltFourteenOff = 29, StylisticAltFifteenOn = 30, StylisticAltFifteenOff = 31, StylisticAltSixteenOn = 32, StylisticAltSixteenOff = 33, StylisticAltSeventeenOn = 34, StylisticAltSeventeenOff = 35, StylisticAltEighteenOn = 36, StylisticAltEighteenOff = 37, StylisticAltNineteenOn = 38, StylisticAltNineteenOff = 39, StylisticAltTwentyOn = 40, StylisticAltTwentyOff = 41 } /** * Contextual alternatives settings */ export declare enum ContextualAlternativesSetting { ContextualAlternatesOn = 0, ContextualAlternatesOff = 1, SwashAlternatesOn = 2, SwashAlternatesOff = 3, ContextualSwashAlternatesOn = 4, ContextualSwashAlternatesOff = 5 } /** * Lower case settings */ export declare enum LowerCaseSetting { DefaultLowerCase = 0, LowerCaseSmallCaps = 1, LowerCasePetiteCaps = 2 } /** * Upper case settings */ export declare enum UpperCaseSetting { DefaultUpperCase = 0, UpperCaseSmallCaps = 1, UpperCasePetiteCaps = 2 } /** * Smart swash settings */ export declare enum SmartSwashSetting { WordInitialSwashesOn = 0, WordInitialSwashesOff = 1, WordFinalSwashesOn = 2, WordFinalSwashesOff = 3, LineInitialSwashesOn = 4, LineInitialSwashesOff = 5, LineFinalSwashesOn = 6, LineFinalSwashesOff = 7, NonFinalSwashesOn = 8, NonFinalSwashesOff = 9 } /** * Diacritics settings */ export declare enum DiacriticsSetting { ShowDiacritics = 0, HideDiacritics = 1, DecomposeDiacritics = 2 } /** * Character shape settings (CJK) */ export declare enum CharacterShapeSetting { TraditionalCharacters = 0, SimplifiedCharacters = 1, JIS1978Characters = 2, JIS1983Characters = 3, JIS1990Characters = 4, TraditionalAltOne = 5, TraditionalAltTwo = 6, TraditionalAltThree = 7, TraditionalAltFour = 8, TraditionalAltFive = 9, ExpertCharacters = 10, NLCCharacters = 13, JIS2004Characters = 11, HojoCharacters = 12 } /** * Feature flag bits */ export declare enum FeatureFlags { /** Feature settings are mutually exclusive */ Exclusive = 32768, /** Use default setting index if not specified */ UseDefault = 16384 } /** * Parse feat table */ export declare function parseFeat(reader: Reader): FeatTable; /** * Get a feature by type */ export declare function getFeature(table: FeatTable, featureType: FeatureType | uint16): FeatureRecord | undefined; /** * Get all features of a given type */ export declare function getAllFeatures(table: FeatTable): FeatureRecord[]; /** * Check if a feature is exclusive (only one setting can be active) */ export declare function isExclusiveFeature(feature: FeatureRecord): boolean; /** * Get the default setting for a feature */ export declare function getDefaultSetting(feature: FeatureRecord): FeatureSetting | undefined; /** * Get a setting by value */ export declare function getSettingByValue(feature: FeatureRecord, settingValue: uint16): FeatureSetting | undefined; /** * Check if a feature has a specific setting */ export declare function hasSettingValue(feature: FeatureRecord, settingValue: uint16): boolean; /** * Convert AAT feature type/setting to OpenType feature tag * This is a best-effort mapping as there's no 1:1 correspondence */ export declare function aatToOpenTypeTag(featureType: FeatureType | uint16, settingValue: uint16): string | null; /** * Convert OpenType feature tag to AAT feature type/setting * Returns null if no mapping exists */ export declare function openTypeTagToAat(tag: string): { featureType: FeatureType; settingValue: uint16; } | null;