Syriac / Mongolian / Devanagari Shaping Support

Multi-script capability surfaces (v2.119.53 - v2.119.55)

 

Arabic Shaping  Auto Shaping Pipeline  GSUB Engine

HotPDF exponerar capability-ytor för joining-class / positional-analysis / Indic syllabic-category för tre komplexa skriftsystem utöver Arabic: Syriac (U+0700-U+074F), Mongolian (U+1800-U+18AF) och Devanagari (U+0900-U+097F). Varje capability låter anropare driva skriftsystemet genom den befintliga OpenType GSUB-motorn för korrekt shaping, samtidigt som de tunga delarna (klustergränsdetektering, BiDi-upplösning, GPOS-positionering) hålls utanför HotPDF:s scope.

 

Shaping-capability för Syriac (v2.119.53)

Två nya metoder exponerar Syriacs joining-beteende:

 

function GetSyriacJoiningClass(CP: Cardinal): TJoiningClass;

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

 

Syriac följer samma fyrklassramverk Right-Joining / Dual-Joining / Transparent / Non-Joining som Arabic; GetSyriacJoiningClass klassificerar varje kodpunkt i blocket U+0700-U+074F enligt Unicode joining property. GetSyriacPosition går igenom en Syriac-run och löser varje tecken till isolated / initial / medial / final-position baserat på joining-klasserna hos de omedelbara grannarna.

 

Till skillnad från Arabic har Syriac-blocket inga Presentation Forms förkodade i Unicode - det finns ingen Syriac-motsvarighet till blocken U+FB50-FDFF / U+FE70-FEFC Arabic Presentation Forms. Konsumenter måste därför driva Syriac-shaping genom fontdefinierade GSUB-lookups (typiskt init / medi / fina / isol + rlig) i stället för kodpunktsomskrivning. Capability-lagret ovan ger anropare positionsetiketterna de behöver för att fråga rätt GSUB-feature för varje glyph.

 

Shaping-capability för Mongolian (v2.119.54)

Två parallella metoder för Mongolian:

 

function GetMongolianJoiningClass(CP: Cardinal): TJoiningClass;

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

 

Täckningen omfattar grundläggande Mongolian (U+1820-U+1842), Todo (U+1843-U+1877), Sibe (U+1880-U+18A8), Manchu och Ali Gali-utökningar. Variation Selectors FVS1 / FVS2 / FVS3 (U+180B-U+180D), soft hyphen NIRUGU (U+180A) och Ali Gali-vokalmärken klassificeras alla som Transparent (T-class) så att de deltar i joining utan att bryta genomgången.

 

Liksom Syriac har Mongolian inga Presentation Forms förkodade i Unicode. Mongolians traditionella vertikala layout, komplexa regler för bokstavsformsvariation och FVS-driven formval förväntas alla drivas av fontdefinierade GSUB-lookups (typiskt init / medi / fina / isol + ccmp / rlig / locl); capability-lagret ger anropare positionsetiketterna som behövs för att fråga dessa features.

 

Indic shaping-capability för Devanagari (v2.119.55)

Devanagari skiljer sig i grunden från Arabic / Syriac / Mongolian - det är ett Indic abugida-skriftsystem där den meningsbärande enheten är ett stavelsekluster (akshara), inte en enskild bokstav, och den renderade ordningen på glyphs inuti ett kluster skiljer sig ofta från den logiska Unicode-ordningen. Två metoder exponerar Devanagaris Indic capability-lager:

 

function GetDevanagariCategory(CP: Cardinal): TIndicCategory;

procedure ApplyDevanagariReorder(var Run: array of Cardinal);

 

GetDevanagariCategory klassificerar varje kodpunkt i U+0900-U+097F i en av 13 Indic syllabic categories (Base / Consonant / Vowel / Independent Vowel / Vowel Mark / Pre-base Matra / Above-base Matra / Below-base Matra / Halant Virama / Repha / Anusvara / Visarga / Other), så att anropare kan upptäcka stavelsegränser och identifiera vilka positioner i varje kluster som behöver omordnas.

 

ApplyDevanagariReorder är en pre-pass som går igenom input-run och tillämpar de två huvudsakliga Devanagari-omordningsreglerna: (1) Repha (Ra + Halant i början av ett stavelsekluster) flyttas till positionen efter klustrets baskonsonant så att den renderas som en upphöjd hake; (2) Pre-base I-matra (U+093F DEVANAGARI VOWEL SIGN I) flyttas före klustrets baskonsonant så att den renderas som en vänstersidig hake. Andra Indic-omordningar (above-base matra, below-base matra, conjunct formation) lämnas till fontens GSUB-motor eftersom de kräver fontspecifika lookup-tabeller.

 

Automatisk integrering (v2.119.67): när sfIndicShaping in PDF.ShapingFeatures används tillämpas ApplyDevanagariReorder automatiskt som en pre-pass inuti de tre BuildUnicode*FieldContent-hjälparna. Konsumentläsarens GSUB-motor hämtar sedan stavelsen i rätt ordning och tillämpar sina egna kontextuella shaping-regler. Se Automatisk shaping-pipeline.

 

Typiskt arbetsflöde (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;

 

Typiskt arbetsflöde (Devanagari med automatisk omordning)

 

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"

 

Unicode subset- och extraktionshjälpare

RegisterToUnicodeReverseMapping registrerar källkodpunkter för format eller syntetiskt glyph-utdata. ClearToUnicodeReverseMappings återställer tabellen, ToUnicodeReverseMappingCount rapporterar dess storlek, GetUnicodeGlyphForCodepoint returnerar registrerat font-glyph-ID för en Unicode-kodpunkt, och EnableShapingFeatureForSubset markerar ersättningsglyphs från en GSUB-feature för inkludering i det inbäddade subsetet

 

Scope och begränsningar

Aktuell integration på producentsidan

Syriac-, Mongolian-, Tibetan- och Indic-formning har nu uttryckliga API-referenssidor. Syriac kan aktiveras via AutoShapeSyriac, Mongolian via sfMongolianShaping, Tibetan via sfTibetanShaping, Indic-omordning via sfIndicShaping och full Indic GSUB-formning via sfIndicGSUB. De detaljerade ingångarna dokumenteras i Tibetan/Mongolian/Syriac shaping methods och Indic shaping methods

Aktuellt omfång täcker också N'Ko och Adlam som RTL-kursivskrifter, Thai/Lao för SARA AM och tonmärken, Hebrew för niqqud-ordning och Javanese för pre-base-tecken. Dessa vägar dokumenteras i script shaping preprocess methods

 

 

Se även: Arabic / Persian / Urdu Shaping Support, Automatic Shaping Pipeline (Phase 8), OpenType GSUB Substitution Engine, THotPDF.AssignSyntheticCodepointForGID