Dukungan Shaping Syriac / Mongolian / Devanagari

Permukaan kapabilitas multi-aksara (v2.119.53 - v2.119.55)

 

Arabic Shaping  Auto Shaping Pipeline  GSUB Engine

HotPDF mengekspos permukaan kapabilitas joining-class / positional-analysis / kategori suku kata Indic untuk tiga aksara kompleks di luar Arabic: Syriac (U+0700-U+074F), Mongolian (U+1800-U+18AF), dan Devanagari (U+0900-U+097F). Setiap kapabilitas memungkinkan pemanggil menggerakkan aksara melalui OpenType GSUB engine yang sudah ada untuk shaping yang benar, sambil menjaga pekerjaan berat (deteksi batas cluster, resolusi BiDi, positioning GPOS) di luar cakupan HotPDF

 

Kapabilitas shaping Syriac (v2.119.53)

Dua metode baru mengekspos perilaku joining Syriac:

 

function GetSyriacJoiningClass(CP: Cardinal): TJoiningClass;

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

 

Syriac mengikuti kerangka empat kelas yang sama seperti Arabic: Right-Joining / Dual-Joining / Transparent / Non-Joining; GetSyriacJoiningClass mengklasifikasikan setiap codepoint di blok U+0700-U+074F menurut properti joining Unicode. GetSyriacPosition menelusuri run Syriac dan menyelesaikan setiap karakter ke posisi isolated / initial / medial / final berdasarkan kelas joining dari tetangga langsungnya

 

Tidak seperti Arabic, blok Syriac tidak memiliki Presentation Forms yang sudah dienkode di Unicode - tidak ada padanan Syriac untuk blok Arabic Presentation Forms U+FB50-FDFF / U+FE70-FEFC. Karena itu, pemanggil harus menggerakkan shaping Syriac melalui lookup GSUB yang didefinisikan font (biasanya init / medi / fina / isol + rlig) alih-alih menulis ulang codepoint. Lapisan kapabilitas di atas memberi pemanggil label posisi yang mereka perlukan untuk menanyakan fitur GSUB yang tepat bagi setiap glyph

 

Kapabilitas shaping Mongolian (v2.119.54)

Dua metode paralel untuk Mongolian:

 

function GetMongolianJoiningClass(CP: Cardinal): TJoiningClass;

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

 

Cakupan mencakup Mongolian dasar (U+1820-U+1842), Todo (U+1843-U+1877), Sibe (U+1880-U+18A8), Manchu, dan ekstensi Ali Gali. Variation Selector FVS1 / FVS2 / FVS3 (U+180B-U+180D), soft hyphen NIRUGU (U+180A), dan tanda vokal Ali Gali semuanya diklasifikasikan sebagai Transparent (kelas T) sehingga ikut dalam joining tanpa memutus penelusuran

 

Seperti Syriac, Mongolian tidak memiliki Presentation Forms yang sudah dienkode di Unicode. Tata letak vertikal tradisional Mongolian, aturan variasi bentuk huruf yang kompleks, dan pemilihan bentuk yang digerakkan FVS semuanya diharapkan ditangani oleh lookup GSUB yang didefinisikan font (biasanya init / medi / fina / isol + ccmp / rlig / locl); lapisan kapabilitas memberi pemanggil label posisi yang dibutuhkan untuk menanyakan fitur-fitur tersebut

 

Kapabilitas shaping Indic Devanagari (v2.119.55)

Devanagari pada dasarnya berbeda dari Arabic / Syriac / Mongolian - ini adalah skrip Indic abugida di mana unit bermakna adalah cluster suku kata (akshara), bukan satu huruf, dan urutan glyph yang dirender di dalam cluster sering berbeda dari urutan logis Unicode. Dua metode mengekspos lapisan kapabilitas Indic Devanagari:

 

function GetDevanagariCategory(CP: Cardinal): TIndicCategory;

procedure ApplyDevanagariReorder(var Run: array of Cardinal);

 

GetDevanagariCategory mengklasifikasikan setiap codepoint di U+0900-U+097F ke salah satu dari 13 kategori suku kata Indic (Base / Consonant / Vowel / Independent Vowel / Vowel Mark / Pre-base Matra / Above-base Matra / Below-base Matra / Halant Virama / Repha / Anusvara / Visarga / Other) sehingga pemanggil dapat mendeteksi batas suku kata dan mengidentifikasi posisi mana di dalam setiap cluster yang perlu diurutkan ulang

 

ApplyDevanagariReorder adalah pre-pass yang menelusuri run input dan menerapkan dua aturan reorder Devanagari utama: (1) Repha (Ra + Halant di awal cluster suku kata) dipindahkan ke posisi setelah konsonan dasar cluster sehingga dirender sebagai kait superskrip; (2) I-matra pre-base (U+093F DEVANAGARI VOWEL SIGN I) dipindahkan sebelum konsonan dasar cluster sehingga dirender sebagai kait di sisi kiri. Reorder Indic lain (matra above-base, matra below-base, pembentukan conjunct) diserahkan ke engine GSUB font karena membutuhkan tabel lookup khusus font

 

Integrasi otomatis (v2.119.67): ketika sfIndicShaping in PDF.ShapingFeatures, ApplyDevanagariReorder diterapkan otomatis sebagai pre-pass di dalam tiga helper BuildUnicode*FieldContent. Engine GSUB milik pembaca kemudian mengambil suku kata dalam urutan yang benar dan menerapkan aturan shaping kontekstualnya sendiri. Lihat Pipeline Shaping Otomatis

 

Alur kerja umum (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;

 

Alur kerja umum (Devanagari dengan reorder otomatis)

 

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"

 

Helper Subset dan Ekstraksi Unicode

RegisterToUnicodeReverseMapping mencatat codepoint sumber untuk output glyph yang di-shape atau sintetis. ClearToUnicodeReverseMappings mengatur ulang tabel, ToUnicodeReverseMappingCount melaporkan ukurannya, GetUnicodeGlyphForCodepoint mengembalikan ID glyph font yang terdaftar untuk codepoint Unicode, dan EnableShapingFeatureForSubset menandai glyph pengganti dari fitur GSUB agar disertakan dalam subset tertanam

 

Cakupan dan batasan

Integrasi sisi produsen saat ini

Shaping Syriac, Mongolian, Tibetan, dan Indic kini memiliki halaman referensi API yang eksplisit. Syriac dapat diaktifkan melalui AutoShapeSyriac, Mongolian melalui sfMongolianShaping, Tibetan melalui sfTibetanShaping, reorder Indic melalui sfIndicShaping, dan shaping GSUB Indic penuh melalui sfIndicGSUB. Titik masuk yang lebih rinci didokumentasikan di metode shaping Tibetan/Mongolian/Syriac dan metode shaping Indic

Cakupan saat ini juga mencakup N'Ko dan Adlam sebagai skrip cursive RTL, pengurutan SARA AM dan tanda nada Thai/Lao, pengurutan niqqud Hebrew, dan tanda pre-base Javanese. Jalur-jalur ini didokumentasikan di metode preprocess shaping skrip

 

 

Lihat juga: Dukungan Shaping Arabic / Persian / Urdu, Pipeline Shaping Otomatis (Phase 8), Engine Substitusi OpenType GSUB, THotPDF.AssignSyntheticCodepointForGID