Hỗ trợ tạo hình Syriac / Mongolian / Devanagari

Các bề mặt năng lực đa script (v2.119.53 - v2.119.55)

 

Hỗ trợ tạo hình Arabic  Chuỗi tạo hình tự động  Bộ máy GSUB OpenType

HotPDF cung cấp các bề mặt năng lực về joining-class, positional-analysis và Indic syllabic-category cho ba script phức tạp ngoài Arabic: Syriac (U+0700-U+074F), Mongolian (U+1800-U+18AF) và Devanagari (U+0900-U+097F). Mỗi năng lực cho phép bên gọi điều khiển script qua OpenType GSUB engine hiện có để tạo hình đúng, trong khi phần việc nặng như phát hiện ranh giới cụm, phân giải BiDi và định vị GPOS vẫn nằm ngoài phạm vi của HotPDF

 

Năng lực tạo hình Syriac (v2.119.53)

Hai phương thức mới phơi bày hành vi nối chữ của Syriac

 

function GetSyriacJoiningClass(CP: Cardinal): TJoiningClass;

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

 

Syriac dùng cùng khung bốn lớp Right-Joining / Dual-Joining / Transparent / Non-Joining như Arabic; GetSyriacJoiningClass phân loại từng codepoint trong khối U+0700-U+074F theo thuộc tính nối Unicode. GetSyriacPosition lần theo một dải Syriac và xác định từng ký tự thành vị trí isolated / initial / medial / final dựa trên lớp nối của các ký tự kề bên

 

Khác với Arabic, khối Syriac không có Presentation Forms được mã hóa sẵn trong Unicode - không có khối tương đương với Arabic Presentation Forms U+FB50-FDFF / U+FE70-FEFC. Vì vậy bên tiêu thụ phải điều khiển tạo hình Syriac qua các tra cứu GSUB do phông định nghĩa, thường là init / medi / fina / isol + rlig, thay vì viết lại codepoint. Lớp năng lực ở trên cho bên gọi các nhãn vị trí cần thiết để truy vấn đúng tính năng GSUB cho từng glyph

 

Năng lực tạo hình Mongolian (v2.119.54)

Hai phương thức song song cho Mongolian

 

function GetMongolianJoiningClass(CP: Cardinal): TJoiningClass;

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

 

Phạm vi bao gồm Mongolian cơ bản (U+1820-U+1842), Todo (U+1843-U+1877), Sibe (U+1880-U+18A8), Manchu và các phần mở rộng Ali Gali. Các Variation Selector FVS1 / FVS2 / FVS3 (U+180B-U+180D), soft hyphen NIRUGU (U+180A) và các dấu nguyên âm Ali Gali đều được xếp là Transparent (T-class) nên chúng tham gia vào quá trình nối mà không làm đứt bước đi

 

Giống như Syriac, Mongolian không có Presentation Forms được mã hóa sẵn trong Unicode. Bố cục dọc truyền thống của Mongolian, các quy tắc biến đổi hình chữ phức tạp và việc chọn dạng dựa trên FVS đều được kỳ vọng sẽ do các tra cứu GSUB do phông định nghĩa điều khiển (thường là init / medi / fina / isol + ccmp / rlig / locl); lớp năng lực này cung cấp cho bên gọi các nhãn vị trí cần thiết để truy vấn những feature đó

 

Năng lực tạo hình Indic của Devanagari (v2.119.55)

Devanagari về cơ bản khác với Arabic / Syriac / Mongolian - đây là một script abugida Indic trong đó đơn vị có ý nghĩa là một cụm âm tiết (akshara), không phải một chữ cái đơn lẻ, và thứ tự glyph được kết xuất bên trong cụm thường khác với thứ tự Unicode logic. Hai phương thức phơi bày lớp năng lực Indic của Devanagari

 

function GetDevanagariCategory(CP: Cardinal): TIndicCategory;

procedure ApplyDevanagariReorder(var Run: array of Cardinal);

 

GetDevanagariCategory phân loại từng codepoint trong U+0900-U+097F thành một trong 13 danh mục âm tiết Indic (Base / Consonant / Vowel / Independent Vowel / Vowel Mark / Pre-base Matra / Above-base Matra / Below-base Matra / Halant Virama / Repha / Anusvara / Visarga / Other) để bên gọi có thể phát hiện ranh giới âm tiết và xác định những vị trí nào trong mỗi cụm cần reorder

 

ApplyDevanagariReorder là một bước tiền xử lý đi qua dải đầu vào và áp dụng hai quy tắc reorder chính của Devanagari: (1) Repha (Ra + Halant ở đầu cụm âm tiết) được chuyển sang vị trí sau phụ âm gốc của cụm để nó hiển thị như một móc phía trên; (2) Pre-base I-matra (U+093F DEVANAGARI VOWEL SIGN I) được chuyển ra trước phụ âm gốc của cụm để nó hiển thị như một móc bên trái. Các reorder Indic khác (matra trên, matra dưới, tạo conjunct) để lại cho bộ máy GSUB của phông vì chúng cần các bảng tra cứu riêng cho từng phông

 

Tích hợp tự động (v2.119.67): khi sfIndicShaping in PDF.ShapingFeatures, ApplyDevanagariReorder được áp dụng tự động như một pre-pass bên trong ba helper BuildUnicode*FieldContent. Khi đó bộ máy GSUB của trình đọc phía consumer sẽ bắt đúng âm tiết theo thứ tự chuẩn rồi áp dụng các quy tắc tạo hình theo ngữ cảnh của nó. Xem Chuỗi tạo hình tự động

 

Quy trình điển hình (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;

 

Quy trình điển hình (Devanagari với reorder tự động)

 

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"

 

Trợ giúp tập con Unicode và trích xuất

RegisterToUnicodeReverseMapping ghi lại các codepoint nguồn cho đầu ra glyph đã shaping hoặc glyph tổng hợp. ClearToUnicodeReverseMappings đặt lại bảng, ToUnicodeReverseMappingCount báo cáo kích thước của bảng, GetUnicodeGlyphForCodepoint trả về ID glyph phông chữ đã đăng ký cho một codepoint Unicode, và EnableShapingFeatureForSubset đánh dấu các glyph thay thế từ một tính năng GSUB để đưa vào subset được nhúng

 

Phạm vi và giới hạn

Tích hợp hiện tại phía producer

Tạo hình Syriac, Mongolian, Tibetan và Indic hiện đã có các trang tham khảo API riêng. Syriac có thể bật qua AutoShapeSyriac, Mongolian qua sfMongolianShaping, Tibetan qua sfTibetanShaping, reorder Indic qua sfIndicShaping, và tạo hình Indic GSUB đầy đủ qua sfIndicGSUB. Các điểm vào chi tiết được ghi trong các phương thức tạo hình Tibetan/Mongolian/Syriac và các phương thức tạo hình Indic

Phạm vi hiện tại cũng bao gồm N'Ko và Adlam như các script chữ viết tay RTL, thứ tự SARA AM và dấu thanh Thai/Lao, thứ tự niqqud Hebrew, và các dấu tiền-base của Javanese. Các đường dẫn này được ghi trong các phương thức tiền xử lý tạo hình script

 

 

Xem thêm: Hỗ trợ tạo hình Arabic / Persian / Urdu, Chuỗi tạo hình tự động (Phase 8), Bộ máy thay thế OpenType GSUB, THotPDF.AssignSyntheticCodepointForGID