|
OpenType GSUB-substitutionsmotor Kapacitetsyta för glyfsubstitution (v2.119.43 - v2.119.50)
|
Arabisk formning CFF / OpenType-subsetting |
|
OpenType GSUB-motorn (Glyph SUBstitution) i HotPDF låter anropare fråga, styra och bädda in varje typ av glyfsubstitution som ett OpenType-typsnitt deklarerar - ligaturer, stilistiska alternativ, kontextuella varianter, arabiska / indiska formningsformer, alternativa CJK-former och så vidare. Varje OpenType GSUB LookupType 1 till 8 är implementerad och exponerad som en ren kapacitetsfrågeyta; anroparen styr textemissionen och väljer vilken ersättningsglyf som ska skrivas till sidans innehållsström.
Offentligt API type TGSUBStringArray = array of AnsiString;
// LookupType 1 - Single Substitution (en glyf -> en glyf) function GetSingleSubstituteGlyph(InputGID: Word; const FeatureTag: AnsiString): Word;
// LookupType 2 - Multiple Substitution (en glyf -> glyfsekvens) function GetMultipleSubstituteGlyphs(InputGID: Word; const FeatureTag: AnsiString; var OutGIDs: array of Word): Boolean;
// LookupType 3 - Alternate Substitution (en glyf -> ett av N alternativ) function GetAlternateGlyphCount(InputGID: Word; const FeatureTag: AnsiString): Integer; function GetAlternateGlyph(InputGID: Word; const FeatureTag: AnsiString; AlternateIndex: Integer): Word;
// LookupType 4 - Ligature Substitution (N glyfer -> en ligatur) function ApplyLigatureSubstitution(const InputGIDs: array of Word; StartIndex: Integer; const FeatureTag: AnsiString; out OutGID: Word; out ConsumedCount: Integer): Boolean;
// LookupType 5 + 6 - Contextual / Chained Contextual Substitution function ApplyContextualSubst(const InputGIDs: array of Word; StartIndex: Integer; const FeatureTag: AnsiString; var OutGIDs: array of Word; out ConsumedLen: Integer): Boolean;
// LookupType 8 - Reverse Chained Contextual Single Substitution function ApplyReverseChainedContextualSubst(const InputGIDs: array of Word; StartIndex: Integer; const FeatureTag: AnsiString; out OutGID: Word): Boolean;
// Val av Script / LangSys (fas 7) procedure SetGSUBScript(const ScriptTag: AnsiString); procedure SetGSUBLanguage(const LangTag: AnsiString); function GetGSUBScripts: TGSUBStringArray; function GetGSUBLanguages(const ScriptTag: AnsiString): TGSUBStringArray; function GetGSUBFeatures(const ScriptTag, LangTag: AnsiString): TGSUBStringArray;
// TTF-subsettarens slutning (fas 9) procedure MarkUnicodeGlyphUsed(GID: Word);
Beskrivning Motorn aktiveras efter att
Defensivt kontrakt genomgående: typsnitt utan GSUB-tabell, feature-taggar som inte är 4 byte, funktioner som valt script / språk inte annonserar, GID:er som ingen undertabell täcker och ingångsglyfer som ignoreras av LookupFlag returnerar alla ett säkert no-op (False / OutGID = InputGID / tomma OutGIDs / ConsumedCount = 1), så anropare aldrig får undantag för rutinfall där "ingen substitution gäller".
LookupType-matris LookupType 1 (Single Substitution) - en glyf mappas till en ersättare. Kanoniska funktioner: LookupType 2 (Multiple Substitution) - en glyf delas upp i en sekvens av ersättningsglyfer. Kanonisk användare: LookupType 3 (Alternate Substitution) - en glyf mappas till ett av N alternativ. Kanoniska funktioner: LookupType 4 (Ligature Substitution) - N ingångsglyfer viks ihop till en ligatur. Kanoniska funktioner: LookupType 5 (Contextual Substitution) + LookupType 6 (Chained Contextual Substitution) - matchar en ingångsglyfsekvens och skickar nästlade lookupar till specifika positioner i matchningen. Alla tre Format-varianter (1 literal sekvens, 2 ClassDef-sekvens, 3 Coverage-sekvens) är implementerade; SequenceLookupRecord-dispatchern går in i LookupList igen och hanterar nästlade Single / Multiple / Alternate (första) / Ligature-lookupar med live-spårning av MatchPositions. Kanoniska funktioner: LookupType 7 (Extension Substitution) - rent indirektionslager som OpenType-specifikationen definierar för typsnitt vars substitutionsundertabell ligger utanför LookupListens 16-bitars räckvidd. Varje offentligt API följer transparent 32-bitars Offset32-indirektionen till den verkliga LookupType 1 / 2 / 3 / 4 / 5 / 6 / 8-undertabellen. Det låser upp tunga CJK / indiska typsnitt (Noto Sans CJK, Noto Sans Devanagari) vars GSUB överstiger 64 KB. Inget separat API - uppackningen är automatisk. LookupType 8 (Reverse Chained Contextual Single Substitution) - kontextmedveten 1:1-substitution vars särskilda egenskap är att anropare måste använda den i OMVÄND skanningsordning över en flerglyfskörning (slut -> start), eftersom varje ersättare kan bero på FRAMTIDA lookahead-kontext som ännu inte får ha substituerats. Kanonisk användning: arabiska / syriska / N'Ko / indiska kontextuella alternativ vars slutform beror på följande glyf. Använd
Val av Script / LangSys Som standard föredrar motorn scriptet
Strict-vs-fallback-semantik: en okänd
LookupFlag-respekt och GDEF Varje fråga läser varje Lookup-tabells LookupFlag (och valfri avslutande markFilteringSet uint16 när
TTF-subsettarens slutning (MarkUnicodeGlyphUsed) HotPDF:s TTF-subsetter i v2.84.0 härleder sin uppsättning använda glyfer från
Efter att du har emitterat någon GID som returneras av
Typiskt arbetsflöde (latinska kapitäler)
PDF.RegisterUnicodeTTF('myFont', 'C:\\Windows\\Fonts\\arial.ttf'); PDF.SetGSUBScript('latn'); PDF.SetGSUBLanguage(''); // standard-LangSys SmallCapGID := PDF.GetSingleSubstituteGlyph(InputGID, 'smcp'); if SmallCapGID <> InputGID then begin // emittera SmallCapGID till sidans innehållsström... PDF.MarkUnicodeGlyphUsed(SmallCapGID); // dra in i delmängden end;
Typiskt arbetsflöde (arabisk LAM-ALEF-ligatur)
PDF.SetGSUBScript('arab'); Run := [LamGID, FathaGID, AlefGID]; // GID:er efter cmap if PDF.ApplyLigatureSubstitution(Run, 0, 'rlig', LigGID, ConsumedCount) then begin // emittera LigGID + avancera med ConsumedCount PDF.MarkUnicodeGlyphUsed(LigGID); end;
Omfattning och begränsningar Motorn är en ren kapacitetsfrågeyta: den svarar på "vad skulle GSUB göra här", men den kör ingen automatisk formningspipeline (layout i Harfbuzz-klass, klustermedveten omordning för indiska skript, BiDi-upplösning, GPOS-positionering, mark attachment). Anropare ansvarar för att driva skanningsloopen, välja vilken ersättare / alternativ glyf som ska emitteras, anropa
Producentstyrd arabisk / persisk / urdu-formning (obligatorisk LAM-ALEF-ligatur + Arabic Presentation Forms-A) är implementerad som en separat inbyggd pipeline som körs automatiskt under textemission - se arabisk / persisk / urdu-formning.
Versionsspår v2.119.43 Single Substitution + fas 1. v2.119.44 Multiple + Alternate (fas 2). v2.119.45 Ligature (fas 3). v2.119.46 Extension + GDEF + LookupFlag-respekt (fas 4). v2.119.47 Contextual + Chained Contextual + SequenceLookupRecord-dispatcher (fas 5). v2.119.48 Reverse Chained Contextual - LookupType 1-8-matrisen stängd (fas 6). v2.119.49 API för val av Script / LangSys (fas 7). v2.119.50 TTF-subsettarens slutning via
Se även: Arabisk / persisk / urdu-formning, Funktioner för CFF / OpenType-typsnittssubsetting, THotPDF.EnableFontSubsetting |