Syriac / Mongolian / Devanagari Shaping Support

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

 

Arabic Shaping  Auto Shaping Pipeline  GSUB Engine

HotPDF, Arabic dışında üç karmaşık script için joining-class / positional-analysis / Indic syllabic-category capability yüzeyleri sunar: Syriac (U+0700-U+074F), Mongolian (U+1800-U+18AF) ve Devanagari (U+0900-U+097F). Her capability, callerın doğru shaping için scripti mevcut OpenType GSUB engine üzerinden yürütmesine izin verirken ağır işleri (cluster boundary detection, BiDi resolution, GPOS positioning) HotPDF kapsamının dışında tutar.

 

Syriac shaping capability (v2.119.53)

İki yeni method Syriac joining behavior değerini açığa çıkarır:

 

function GetSyriacJoiningClass(CP: Cardinal): TJoiningClass;

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

 

Syriac, Arabic ile aynı Right-Joining / Dual-Joining / Transparent / Non-Joining dört sınıflı frameworkü izler; GetSyriacJoiningClass U+0700-U+074F bloğundaki her codepointi Unicode joining property değerine göre sınıflandırır. GetSyriacPosition bir Syriac run üzerinde yürür ve her characterı immediate neighborlarının joining classlarına göre isolated / initial / medial / final pozisyonuna çözer.

 

Arabic aksine, Syriac bloğunda Unicode içine önceden kodlanmış Presentation Forms yoktur - U+FB50-FDFF / U+FE70-FEFC Arabic Presentation Forms bloklarının Syriac eşdeğeri yoktur. Bu nedenle consumerlar Syriac shaping işlemini codepoint rewriting yerine font-defined GSUB lookup değerleriyle (genellikle init / medi / fina / isol + rlig) yürütmelidir. Yukarıdaki capability layer, her glyph için doğru GSUB feature sorgusunu yapmaya gereken position label değerlerini callerlara verir.

 

Mongolian shaping capability (v2.119.54)

Mongolian için iki paralel method:

 

function GetMongolianJoiningClass(CP: Cardinal): TJoiningClass;

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

 

Kapsam basic Mongolian (U+1820-U+1842), Todo (U+1843-U+1877), Sibe (U+1880-U+18A8), Manchu ve Ali Gali extensionlarını içerir. Variation Selectors FVS1 / FVS2 / FVS3 (U+180B-U+180D), soft hyphen NIRUGU (U+180A) ve Ali Gali vowel marklarının tümü Transparent (T-class) olarak sınıflandırılır; böylece joining işlemine katılırlar ve yürüyüşü bozmazlar.

 

Syriac gibi Mongolian da Unicode içinde önceden kodlanmış Presentation Forms taşımaz. Mongolian geleneksel dikey layoutu, karmaşık letter-shape variation kuralları ve FVS-driven shape selection değerlerinin tamamının font-defined GSUB lookup değerleriyle (genellikle init / medi / fina / isol + ccmp / rlig / locl) yürütülmesi beklenir; capability layer, callerların bu featureları sorgulamak için ihtiyaç duyduğu position label değerlerini sağlar.

 

Devanagari Indic shaping capability (v2.119.55)

Devanagari, Arabic / Syriac / Mongolian’dan temelde farklıdır - anlamlı birimin tek harf değil syllable cluster (akshara) olduğu bir Indic abugida scriptidir ve cluster içindeki glyphlerin rendered order değeri çoğu zaman logical Unicode order değerinden farklıdır. İki method Devanagari'nin Indic capability layerını açığa çıkarır:

 

function GetDevanagariCategory(CP: Cardinal): TIndicCategory;

procedure ApplyDevanagariReorder(var Run: array of Cardinal);

 

GetDevanagariCategory U+0900-U+097F içindeki her codepointi 13 Indic syllabic category değerinden birine sınıflandırır (Base / Consonant / Vowel / Independent Vowel / Vowel Mark / Pre-base Matra / Above-base Matra / Below-base Matra / Halant Virama / Repha / Anusvara / Visarga / Other); böylece callerlar syllable boundary tespit edebilir ve her cluster içinde hangi pozisyonların reorder gerektirdiğini belirleyebilir.

 

ApplyDevanagariReorder input run üzerinde yürüyen ve iki ana Devanagari reorder kuralını uygulayan bir pre-pass işlemidir: (1) Repha (syllable cluster başında Ra + Halant), superscript hook olarak render edilmesi için clusterın base consonant sonrasındaki pozisyona taşınır; (2) Pre-base I-matra (U+093F DEVANAGARI VOWEL SIGN I), left-side hook olarak render edilmesi için clusterın base consonant öncesine taşınır. Diğer Indic reorder işlemleri (above-base matra, below-base matra, conjunct formation) font-specific lookup tabloları gerektirdiği için fontun GSUB engine tarafına bırakılır.

 

Otomatik entegrasyon (v2.119.67): sfIndicShaping in PDF.ShapingFeatures olduğunda ApplyDevanagariReorder, üç BuildUnicode*FieldContent helperı içinde pre-pass olarak otomatik uygulanır. Consumer readerın GSUB engine değeri ardından syllable değerini doğru sırada alır ve kendi contextual shaping kurallarını uygular. Bkz. Automatic Shaping Pipeline.

 

Tipik workflow (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;

 

Tipik workflow (automatic reorder ile Devanagari)

 

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 ve extraction helperları

RegisterToUnicodeReverseMapping shaped veya synthetic glyph output için source codepointleri kaydeder. ClearToUnicodeReverseMappings tabloyu sıfırlar, ToUnicodeReverseMappingCount boyutunu bildirir, GetUnicodeGlyphForCodepoint bir Unicode codepoint için kayıtlı font glyph ID döndürür ve EnableShapingFeatureForSubset bir GSUB featuredan gelen substitute glyphleri embedded subsete dahil edilmek üzere işaretler

 

Kapsam ve sınırlamalar

Geçerli üretici tarafı tümleştirme

Syriac, Mongolian, Tibetan ve Indic şekillendirme artık açık API başvuru sayfalarına sahiptir. Syriac AutoShapeSyriac ile, Mongolian sfMongolianShaping ile, Tibetan sfTibetanShaping ile, Indic yeniden sıralama sfIndicShaping ile ve tam Indic GSUB şekillendirme sfIndicGSUB ile etkinleştirilebilir. Ayrıntılı giriş noktaları Tibetan/Mongolian/Syriac shaping methods ve Indic shaping methods içinde belgelenmiştir

Geçerli kapsam ayrıca RTL bitişik yazılar olarak N'Ko ve Adlam, SARA AM ve ton işaretleri için Thai/Lao, niqqud sıralaması için Hebrew ve taban öncesi işaretler için Javanese içerir. Bu yollar script shaping preprocess methods içinde belgelenmiştir

 

 

Ayrıca bkz.: Arabic / Persian / Urdu Shaping Support, Automatic Shaping Pipeline (Phase 8), OpenType GSUB Substitution Engine, THotPDF.AssignSyntheticCodepointForGID