|
OpenType GSUB helyettesítő motor Glifa-helyettesítési képességfelület (v2.119.43 - v2.119.50)
|
Arab formázás CFF / OpenType részhalmazképzés |
|
A HotPDF-en belüli OpenType GSUB (Glyph SUBstitution – glifa-helyettesítés) motor lehetővé teszi a hívók számára, hogy lekérdezzék, vezéreljék és beágyazzák az OpenType betűtípusok által deklarált összes glifa-helyettesítést – ligatúrákat, stilisztikai alternatívákat, kontextuális variánsokat, arab / indiai formázási formákat, CJK alternatív formákat és így tovább. Minden OpenType GSUB LookupType 1-től 8-ig implementálva van, és csak képesség-alapú lekérdező felületként érhető el; a hívó vezérli a szövegkibocsátást, és dönti el, hogy melyik helyettesítő glifát írja be az oldal tartalomfolyamába
Nyilvános API type TGSUBStringArray = array of AnsiString;
// LookupType 1 - Egyszeres helyettesítés (egy glifa -> egy glifa) function GetSingleSubstituteGlyph(InputGID: Word; const FeatureTag: AnsiString): Word;
// LookupType 2 - Többszörös helyettesítés (egy glifa -> glifák sorozata) function GetMultipleSubstituteGlyphs(InputGID: Word; const FeatureTag: AnsiString; var OutGIDs: array of Word): Boolean;
// LookupType 3 - Alternatív helyettesítés (egy glifa -> az N alternatíva egyike) function GetAlternateGlyphCount(InputGID: Word; const FeatureTag: AnsiString): Integer; function GetAlternateGlyph(InputGID: Word; const FeatureTag: AnsiString; AlternateIndex: Integer): Word;
// LookupType 4 - Ligatúra helyettesítés (N glifa -> egy ligatúra) function ApplyLigatureSubstitution(const InputGIDs: array of Word; StartIndex: Integer; const FeatureTag: AnsiString; out OutGID: Word; out ConsumedCount: Integer): Boolean;
// LookupType 5 + 6 - Kontextuális / láncolt kontextuális helyettesítés function ApplyContextualSubst(const InputGIDs: array of Word; var OutGIDs: array of Word; out ConsumedLen: Integer): Boolean; // LookupType 8 - Fordított láncolt kontextuális egyszeres helyettesítés
function ApplyReverseChainedContextualSubst(const InputGIDs: array of Word; out OutGID: Word): Boolean; // Script / LangSys választás (Phase 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 részhalmazképző lezárás (Phase 9) procedure MarkUnicodeGlyphUsed(GID: Word);
Leírás A motor azután aktiválódik, miután a
Védelmi szerződés a teljes folyamatban: a GSUB táblával nem rendelkező betűtípusok, a nem 4 bájtos funkciócímkék, a kiválasztott script / nyelv által nem reklámozott funkciók, az alkulcstábla által le nem fedett GID-ek, valamint a LookupFlag által figyelmen kívül hagyott bemeneti glifák mind biztonságos üres műveletet (no-op) adnak vissza (False / OutGID = InputGID / üres OutGIDs / ConsumedCount = 1), így a hívók soha nem látnak kivételt a rutinszerű "nincs helyettesítés" esetekben LookupType mátrix
LookupType 1 (Egyszeres helyettesítés) - egy glifa egy helyettesítőre képeződik le. Kanonikus funkciók:
LookupType 2 (Többszörös helyettesítés) - egy glifa feloszlik egy helyettesítő glifák sorozatára. Kanonikus felhasználó: LookupType 3 (Alternatív helyettesítés) - egy glifa az N alternatíva egyikére képeződik le. Kanonikus funkciók: LookupType 4 (Ligatúra helyettesítés) - N bemeneti glifa egy ligatúrába vonódik össze. Kanonikus funkciók: LookupType 5 (Kontextuális helyettesítés) + LookupType 6 (Láncolt kontextuális helyettesítés) - megegyezik egy bemeneti glifasorozattal, és beágyazott kereséseket indít az egyezésen belüli meghatározott pozíciókban. Mindhárom formátumváltozat (1 literál sorozat, 2 ClassDef sorozat, 3 Coverage sorozat) implementálva van; a SequenceLookupRecord elosztó újra belép a LookupList-be, és kezeli a Single / Multiple / Alternate (első) / Ligature beágyazott kereséseket élő MatchPositions követéssel. Kanonikus funkciók: LookupType 7 (Kiterjesztési helyettesítés) - tiszta közvetett réteg, amelyet az OpenType specifikáció határoz meg az olyan betűtípusokhoz, amelyek helyettesítési alkulcstáblája túlmutat a LookupList 16 bites elérésén. Minden nyilvános API átláthatóan követi a 32 bites Offset32 közvetettséget a valós LookupType 1 / 2 / 3 / 4 / 5 / 6 / 8 alkulcstáblához. Feloldja a nehéz CJK / indiai betűtípusokat (Noto Sans CJK, Noto Sans Devanagari), amelyek GSUB mérete meghaladja a 64 KB-ot. Nincs külön API – a kibontás automatikus LookupType 8 (Fordított láncolt kontextuális egyszeres helyettesítés) - kontextus-tudatos 1:1 helyettesítés, amelynek megkülönböztető jellemzője, hogy a hívóknak REVERSE (fordított) beolvasási sorrendben kell alkalmazniuk egy többglifás futamon (vége -> kezdete), mivel minden helyettesítés függhet a JÖVŐBELI előretekintő kontextustól, amelyet még nem szabad helyettesíteni. Kanonikus használat: arab / szír / N'Ko / indiai kontextuális alternatívák, amelyek végső formája a következő glifától függ. Használja az Script / LangSys választás Alapértelmezés szerint a motor a
Szigorú vagy tartalék (fallback) szemantika: egy ismeretlen LookupFlag tiszteletben tartása és GDEF
Minden lekérdezés beolvassa az egyes Lookup táblák LookupFlag beállítását (és az opcionális záró markFilteringSet uint16-ot, ha a
TTF részhalmazképző lezárás (MarkUnicodeGlyphUsed) A HotPDF v2.84.0-s TTF részhalmazképzője a használt glifák készletét a
Miután a Tipikus munkafolyamat (latin kiskapitális betűk)
PDF.RegisterUnicodeTTF('myFont', 'C:\\Windows\\Fonts\\arial.ttf');
PDF.SetGSUBScript('latn');
PDF.SetGSUBLanguage(''); // alapértelmezett LangSys SmallCapGID := PDF.GetSingleSubstituteGlyph(InputGID, 'smcp'); if SmallCapGID <> InputGID then begin // emit SmallCapGID into the page content stream... PDF.MarkUnicodeGlyphUsed(SmallCapGID); // behúzás a részhalmazba end; Tipikus munkafolyamat (arab LAM-ALEF ligatúra) PDF.SetGSUBScript('arab');
Run := [LamGID, FathaGID, AlefGID]; // cmap utáni GID-ek
if PDF.ApplyLigatureSubstitution(Run, 0, 'rlig', LigGID, ConsumedCount) then // LigGID kibocsátása + léptetés a ConsumedCount értékkel PDF.MarkUnicodeGlyphUsed(LigGID); Hatókör és korlátozások A motor csak képesség-alapú lekérdező felület: választ ad arra, hogy "mit tenne a GSUB itt", de nem futtat automatikus formázási pipeline-t (Harfbuzz-osztályú elrendezés, klaszter-tudatos újrarendezés az Indic nyelvhez, BiDi feloldás, GPOS pozicionálás, jel-csatolás). A hívók felelősek a beolvasási ciklus vezérléséért, a kibocsátandó helyettesítő / alternatív glifa kiválasztásáért, a Az előállító-oldali arab / perzsa / urdu formázás (LAM-ALEF kötelező ligatúra + arab Presentation Forms-A) külön beépített pipeline-ként van implementálva, amely automatikusan fut a szövegkibocsátás során – lásd: arab / perzsa / urdu formázás Verziókövetés
v2.119.43 Single Substitution + 1. fázis. v2.119.44 Multiple + Alternate (2. fázis). v2.119.45 Ligature (3. fázis). v2.119.46 Extension + GDEF + LookupFlag honor (4. fázis). v2.119.47 Contextual + Chained Contextual + SequenceLookupRecord dispatcher (5. fázis). v2.119.48 Reverse Chained Contextual - LookupType 1-8 mátrix lezárva (6. fázis). v2.119.49 Script / LangSys kiválasztási API (7. fázis). v2.119.50 TTF subsetter closure via MarkUnicodeGlyphUsed (9. fázis; a 8. fázis előállítói oldali formázási integrációs kísérlet volt, és jövőbeli revíziókhoz 8a-8f részekre vált szét) See also: Arabic / Persian / Urdu Shaping, CFF / OpenType Font Subsetting Functions, THotPDF.EnableFontSubsetting
Producer-side Arabic / Persian / Urdu shaping (LAM-ALEF mandatory ligature + Arabic Presentation Forms-A) is implemented as a separate built-in pipeline that runs automatically during text emission - see Arabic / Persian / Urdu Shaping.
Version trace v2.119.43 Single Substitution + 1. fázis. v2.119.44 Multiple + Alternate (2. fázis). v2.119.45 Ligature (3. fázis). v2.119.46 Extension + GDEF + LookupFlag honor (4. fázis). v2.119.47 Contextual + Chained Contextual + SequenceLookupRecord dispatcher (5. fázis). v2.119.48 Reverse Chained Contextual - LookupType 1-8 mátrix lezárva (6. fázis). v2.119.49 Script / LangSys kiválasztási API (7. fázis). v2.119.50 TTF subsetter closure via MarkUnicodeGlyphUsed (9. fázis; a 8. fázis előállítói oldali formázási integrációs kísérlet volt, és jövőbeli revíziókhoz 8a-8f részekre vált szét)
See also: Arabic / Persian / Urdu Shaping, CFF / OpenType Font Subsetting Functions, THotPDF.EnableFontSubsetting |