Suport pentru modelarea internațională a scripturilor

Suprafețe de capabilități multi-script (v2.119.53 - v2.119.55)

 

Modelare arabă  Pipelina automată de modelare  Motor GSUB

HotPDF expune suprafețe de capabilitate pentru analiza clasei de alipire / analiza pozițională / categoria silabică Indic pentru trei scripturi complexe din afara arabicii: Syriac (U+0700-U+074F), Mongolian (U+1800-U+18AF) și Devanagari (U+0900-U+097F). Fiecare capabilitate le permite apelanților să conducă scriptul prin motorul existent OpenType GSUB pentru o formare corectă, păstrând în același timp partea grea (detectarea limitelor de cluster, rezolvarea BiDi, poziționarea GPOS) în afara domeniului HotPDF

 

Capabilitate de formare Syriac (v2.119.53)

Două metode noi expun comportamentul de joining al Syriac:

 

function GetSyriacJoiningClass(CP: Cardinal): TJoiningClass;

function GetSyriacPosition(const Run: array of Cardinal; Index: Integer): TPosition;

 

Syriac urmează același cadru în patru clase Right-Joining / Dual-Joining / Transparent / Non-Joining ca arabica; GetSyriacJoiningClass clasifică fiecare codepoint din blocul U+0700-U+074F în funcție de proprietatea Unicode joining. GetSyriacPosition parcurge o secvență Syriac și rezolvă fiecare caracter la poziția sa isolated / initial / medial / final pe baza claselor de joining ale vecinilor imediat apropiați

 

Spre deosebire de arabică, blocul Syriac nu are Forme de prezentare pre-încodificate în Unicode - nu există un echivalent Syriac al blocurilor U+FB50-FDFF / U+FE70-FEFC Arabic Presentation Forms. Consumatorii trebuie deci să conducă formarea Syriac prin căutări GSUB definite de font (de obicei init / medi / fina / isol + rlig) în locul rescrierii codepoint-urilor. Stratul de capabilitate de mai sus le oferă apelanților etichetele de poziție necesare pentru a interoga funcția GSUB potrivită pentru fiecare glif

 

Capabilitate de formare Mongolian (v2.119.54)

Două metode paralele pentru Mongolian:

 

function GetMongolianJoiningClass(CP: Cardinal): TJoiningClass;

function GetMongolianPosition(const Run: array of Cardinal; Index: Integer): TPosition;

 

Acoperirea include Mongolian de bază (U+1820-U+1842), Todo (U+1843-U+1877), Sibe (U+1880-U+18A8), extinderile Manchu și Ali Gali. Variation Selectors FVS1 / FVS2 / FVS3 (U+180B-U+180D), soft hyphen-ul NIRUGU (U+180A) și semnele vocalice Ali Gali sunt toate clasificate ca Transparent (clasa T), astfel încât participă la joining fără a rupe parcurgerea

 

La fel ca Syriac, Mongolian nu are Forme de prezentare pre-încodificate în Unicode. Layoutul vertical tradițional al Mongolian, regulile complexe de variație a formei literelor și selectarea formei controlată de FVS ar trebui toate conduse de căutări GSUB definite de font (de obicei init / medi / fina / isol + ccmp / rlig / locl); stratul de capabilitate le oferă apelanților etichetele de poziție necesare pentru a interoga acele funcții

 

Capabilitate de formare Indic Devanagari (v2.119.55)

Devanagari este fundamental diferit de arabică / Syriac / Mongolian - este un script Indic abugida în care unitatea cu sens este un cluster silabic (akshara), nu o literă singulară, iar ordinea randată a glifelor din interiorul clusterului este adesea diferită de ordinea logică Unicode. Două metode expun stratul de capabilitate Indic al Devanagari:

 

function GetDevanagariCategory(CP: Cardinal): TIndicCategory;

procedure ApplyDevanagariReorder(var Run: array of Cardinal);

 

GetDevanagariCategory clasifică fiecare codepoint din U+0900-U+097F într-una din 13 categorii silabice Indic (Base / Consonant / Vowel / Independent Vowel / Vowel Mark / Pre-base Matra / Above-base Matra / Below-base Matra / Halant Virama / Repha / Anusvara / Visarga / Other), astfel încât apelanții să poată detecta limitele silabelor și să identifice ce poziții din fiecare cluster au nevoie de reordonare

 

ApplyDevanagariReorder este un pre-pass care parcurge secvența de intrare și aplică cele două reguli principale de reordonare Devanagari: (1) Repha (Ra + Halant la începutul unui cluster silabic) este mutat după consoana de bază a clusterului, astfel încât să fie randat ca un cârlig superscript; (2) Pre-base I-matra (U+093F DEVANAGARI VOWEL SIGN I) este mutat înaintea consoanei de bază a clusterului, astfel încât să fie randat ca un cârlig în partea stângă. Alte reordonări Indic (above-base matra, below-base matra, formarea conjunctelor) sunt lăsate motorului GSUB al fontului, deoarece au nevoie de tabele de căutare specifice fontului

 

Integrare automată (v2.119.67): când sfIndicShaping in PDF.ShapingFeatures, ApplyDevanagariReorder este aplicat automat ca pre-pas în interiorul celor trei ajutoare BuildUnicode*FieldContent. Motorul GSUB al cititorului preia apoi silaba în ordinea corectă și aplică propriile reguli contextuale de modelare. Vezi Pipelina automată de modelare

 

Flux de lucru tipic (Syriac)

 

PDF.RegisterUnicodeTTF('Estrangelo', 'SyrCOMEdessa.otf');

PDF.SetGSUBScript('syrc');  // see GSUB engine doc

for i := 0 to Length(Run) - 1 do

begin

  Pos := PDF.GetSyriacPosition(Run, i);  // init / medi / fina / isol

  // query GSUB for the position-appropriate substitute glyph

  // emit + MarkUnicodeGlyphUsed

end;

 

Flux de lucru tipic (Devanagari cu reordonare automată)

 

PDF.RegisterUnicodeTTF('NotoDeva', 'NotoSansDevanagari-Regular.ttf');

PDF.ShapingFeatures := [sfIndicShaping];  // auto Repha + I-matra reorder

PDF.CurrentPage.SetFont('NotoDeva', [], 14);

PDF.CurrentPage.UnicodeTextOut(50, 700, 0,

  UnicodeString(#$0939#$093F#$0928#$094D#$0926#$0940)); // "Hindi"

 

Ajutoare pentru subsetul Unicode și extragere

RegisterToUnicodeReverseMapping înregistrează codepoint-urile sursă pentru ieșirea de glife modelate sau sintetice. ClearToUnicodeReverseMappings resetează tabelul, ToUnicodeReverseMappingCount raportează dimensiunea lui, GetUnicodeGlyphForCodepoint returnează ID-ul de glif înregistrat al fontului pentru un codepoint Unicode, iar EnableShapingFeatureForSubset marchează glifele de substituție dintr-o funcție GSUB pentru includere în subsetul încorporat

 

Domeniu și limitări

Integrare curentă pe partea de producător

Formarea pentru Syriac, Mongolian, Tibetan și Indic are acum pagini explicite de referință API. Syriac poate fi activat prin AutoShapeSyriac, Mongolian prin sfMongolianShaping, Tibetan prin sfTibetanShaping, reordonarea Indic prin sfIndicShaping, iar formarea Indic GSUB completă prin sfIndicGSUB. Punctele de intrare detaliate sunt documentate în Metode de modelare tibetană / mongolă / siriacă și Metode de modelare Indic

Domeniul curent acoperă și N'Ko și Adlam ca scripturi cursive RTL, ordinea pentru SARA AM și semnele de ton din Thai/Lao, ordinea niqqud în Hebrew și semnele pre-base din Javanese. Aceste căi sunt documentate în Metode de preprocesare pentru modelarea scripturilor

 

 

Vezi și: Suport pentru modelarea arabă / persană / urdu, Pipelina automată de modelare (Faza 8), Motorul de substituție OpenType GSUB, THotPDF.AssignSyntheticCodepointForGID