|
OpenType GSUB Substitution Engine Glyph substitution capability surface (v2.119.43 - v2.119.50)
|
Arabic Shaping CFF / OpenType Subsetting |
|
HotPDF:n sisäinen OpenType GSUB (Glyph SUBstitution) -moottori antaa kutsujien kysellä, ohjata ja upottaa kaikenlaisia glyph-korvauksia, joita OpenType-fontti ilmoittaa – ligatuureja, tyylillisiä vaihtoehtoja, kontekstuaalisia variantteja, arabialaisia / intialaisia muotoiluja, CJK-vaihtoehtomuotoja ja niin edelleen. Jokainen OpenType GSUB LookupType 1–8 on toteutettu ja tuotu esille pelkkänä kyselyrajapintana; kutsuja ohjaa tekstin tulostusta ja päättää, mikä korvaava glyph kirjoitetaan sivun sisältövirtaan
Public API type TGSUBStringArray = array of AnsiString;
// LookupType 1 - Single Substitution (one glyph -> one glyph) function GetSingleSubstituteGlyph(InputGID: Word; const FeatureTag: AnsiString): Word;
// LookupType 2 - Multiple Substitution (yksi glyyfi -> glyyfisarja) function GetMultipleSubstituteGlyphs(InputGID: Word; const FeatureTag: AnsiString; var OutGIDs: array of Word): Boolean;
// LookupType 3 - Alternate Substitution (yksi glyyfi -> yksi N:stä vaihtoehdosta) function GetAlternateGlyphCount(InputGID: Word; const FeatureTag: AnsiString): Integer; function GetAlternateGlyph(InputGID: Word; const FeatureTag: AnsiString; AlternateIndex: Integer): Word;
// LookupType 4 - Ligature Substitution (N glyyfiä -> yksi ligatuuri) 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;
// Script / LangSys selection (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 subsetter closure (Phase 9) procedure MarkUnicodeGlyphUsed(GID: Word);
Kuvaus Moottori aktivoituu sen jälkeen, kun
Puolustava sopimus kautta linjan: fontit ilman GSUB-taulukkoa, muut kuin 4-tavuiset ominaisuustunnisteet, ominaisuudet joita valittu kirjoitusjärjestelmä / kieli ei ilmoita, GID:t joita mikään alitaulukko ei kata ja LookupFlag-lipulla ohitetut syöteglyfit palauttavat kaikki turvallisen tyhjän toiminnon (False / OutGID = InputGID / tyhjä OutGIDs / ConsumedCount = 1), jotta kutsujat eivät koskaan kohtaa poikkeuksia rutiininomaisissa tapauksissa, joissa "mitään korvausta ei sovelleta"
LookupType matrix LookupType 1 (Single Substitution) – yksi glyfi kartoitetaan yhdeksi korvaavaksi glyfiksi. Tyypilliset ominaisuudet: LookupType 2 (Multiple Substitution) – yksi glyfi jakautuu korvaavien glyfien sarjaksi. Tyypillinen käyttäjä: LookupType 3 (Alternate Substitution) – yksi glyfi kartoittuu yhdeksi N vaihtoehdosta. Tyypilliset ominaisuudet: LookupType 4 (Ligature Substitution) – N syöteglyfiä yhdistyy yhdeksi ligatuuriksi. Tyypilliset ominaisuudet: LookupType 5 (Contextual Substitution) + LookupType 6 (Chained Contextual Substitution) – täsmää syötteen glyfisarjaan ja lähettää sisäkkäisiä hakuja tietyissä kohdissa täsmäyksen sisällä. Kaikki kolme muotovarianttia (1 literaalisarja, 2 ClassDef-sarja, 3 Coverage-sarja) on toteutettu; SequenceLookupRecord-lähettäjä siirtyy uudelleen LookupList-luetteloon ja käsittelee sisäkkäiset Single- / Multiple- / Alternate- (ensimmäinen) / Ligature-haut reaaliaikaisella MatchPositions-seurannalla. Tyypilliset ominaisuudet: LookupType 7 (Extension Substitution) – puhdas epäsuoruustaso, jonka OpenType-määritys määrittelee fonteille, joiden korvausalitaulukko sijaitsee LookupList-listan 16-bittisen ulottuvuuden ulkopuolella. Jokainen julkinen API seuraa läpinäkyvästi 32-bittistä Offset32-epäsuoruutta todelliseen LookupType 1 / 2 / 3 / 4 / 5 / 6 / 8 -alitaulukkoon. Helpottaa raskaiden CJK- / intialaisten fonttien (Noto Sans CJK, Noto Sans Devanagari) käsittelyä, joiden GSUB ylittää 64 kt. Ei erillistä API-rajapintaa – purkaminen on automaattista LookupType 8 (Reverse Chained Contextual Single Substitution) – kontekstitietoinen 1:1-korvaus, jonka erottuva piirre on se, että kutsujien on sovellettava sitä KÄÄNTEISESSÄ läpikäyntijärjestyksessä usean glyfin sarjassa (lopusta alkuun), koska kukin korvaus voi riippua TULEVASTA eteenpäin suuntautuvasta kontekstista, jota ei saa vielä olla korvattu. Tyypillinen käyttö: arabian / syyrian / n'kon / intialaisten kirjoitusjärjestelmien kontekstuaaliset vaihtoehdot, joiden lopullinen muoto riippuu seuraavasta glyfistä. Käytä metodia
Script / LangSys selection Oletusarvoisesti moottori suosii
Tarkka vs. varallaolo -semantiikka: tuntematon
LookupFlag-kunnioitus ja GDEF Jokainen kysely lukee kunkin Lookup-taulukon LookupFlag-lipun (ja valinnaisen perässä olevan markFilteringSet uint16 -arvon, kun
TTF subsetter closure (MarkUnicodeGlyphUsed) HotPDF:n version v2.84.0 TTF-alijoukkoistaja johtaa käytettyjen glyfien joukkonsa kohteesta
Tulostettuasi minkä tahansa metodin
Typical workflow (Latin small caps)
PDF.RegisterUnicodeTTF('myFont', 'C:\\Windows\\Fonts\\arial.ttf'); PDF.SetGSUBScript('latn'); PDF.SetGSUBLanguage(''); // default LangSys SmallCapGID := PDF.GetSingleSubstituteGlyph(InputGID, 'smcp'); if SmallCapGID <> InputGID then begin // tuota SmallCapGID sivun sisältövirtaan... PDF.MarkUnicodeGlyphUsed(SmallCapGID); // vedä alijoukkoon end;
Tyypillinen työnkulku (arabiankielinen LAM-ALEF-ligatuuri)
PDF.SetGSUBScript('arab'); Run := [LamGID, FathaGID, AlefGID]; // post-cmap GID-tunnukset if PDF.ApplyLigatureSubstitution(Run, 0, 'rlig', LigGID, ConsumedCount) then begin // tuota LigGID + etene arvolla ConsumedCount PDF.MarkUnicodeGlyphUsed(LigGID); end;
Laajuus ja rajoitukset Moottori on vain kyvykkyyksiä kysyvä rajapinta: se vastaa kysymykseen "mitä GSUB tekisi tässä", mutta se ei aja automaattista muotoiluputkea (Harfbuzz-luokan asettelu, klusteritietoinen intialaisten järjestely, BiDi-ratkaisu, GPOS-sijoittelu, merkin liittäminen). Kutsujat ovat vastuussa skannausilmukan ajamisesta, sen valitsemisesta, mikä korvike / vaihtoehto lähetetään, metodin
Tuottajapuolen arabian / persian / urdun muotoilu (pakollinen LAM-ALEF-ligatuuri + arabian esitysmuodot-A) on toteutettu erillisenä sisäänrakennettuna putkena, joka ajetaan automaattisesti tekstin tulostuksen aikana - katso Arabic / Persian / Urdu Shaping
Version trace v2.119.43 Single Substitution + vaihe 1. v2.119.44 Multiple + Alternate (vaihe 2). v2.119.45 Ligature (vaihe 3). v2.119.46 Extension + GDEF + LookupFlag-kunnioitus (vaihe 4). v2.119.47 Contextual + Chained Contextual + SequenceLookupRecord-lähetin (vaihe 5). v2.119.48 Reverse Chained Contextual - LookupType 1-8 -matriisi suljettu (vaihe 6). v2.119.49 Script- / LangSys-valinta-API (vaihe 7). v2.119.50 TTF-osittajan sulkeuma metodin
Katso myös: Arabic / Persian / Urdu Shaping, CFF / OpenType Font Subsetting Functions, THotPDF.EnableFontSubsetting |