|
Syriac / Mongolian / Devanagari Shaping Support Multi-script capability surfaces (v2.119.53 - v2.119.55)
|
Arabic Shaping Auto Shaping Pipeline GSUB Engine |
|
HotPDF는 Arabic 외의 세 가지 복합 문자 체계인 Syriac(U+0700-U+074F), Mongolian(U+1800-U+18AF), Devanagari(U+0900-U+097F)에 대해 joining-class / positional-analysis / Indic syllabic-category 기능 표면을 제공합니다. 각 기능을 통해 호출자는 기존 OpenType GSUB engine으로 스크립트를 전달해 올바른 shaping을 수행할 수 있으며, cluster boundary detection, BiDi resolution, GPOS positioning 같은 무거운 처리는 HotPDF의 범위 밖에 둡니다
Syriac shaping capability (v2.119.53) Two new methods expose Syriac's joining behavior:
function GetSyriacJoiningClass(CP: Cardinal): TJoiningClass; function GetSyriacPosition(const Run: array of Cardinal; Index: Integer): TPosition;
Syriac은 Arabic과 같은 Right-Joining / Dual-Joining / Transparent / Non-Joining 네 가지 클래스 체계를 따릅니다.
Arabic과 달리 Syriac 블록에는 Unicode에 미리 인코딩된 Presentation Forms가 없습니다. 즉 U+FB50-FDFF / U+FE70-FEFC Arabic Presentation Forms 블록에 해당하는 Syriac 블록은 없습니다. 따라서 소비자는 codepoint rewriting이 아니라 글꼴이 정의한 GSUB lookup(일반적으로 init / medi / fina / isol + rlig)을 통해 Syriac shaping을 수행해야 합니다. 위의 기능 계층은 각 glyph에 맞는 GSUB feature를 조회하는 데 필요한 position label을 호출자에게 제공합니다
Mongolian shaping capability (v2.119.54) Two parallel methods for Mongolian:
function GetMongolianJoiningClass(CP: Cardinal): TJoiningClass; function GetMongolianPosition(const Run: array of Cardinal; Index: Integer): TPosition;
범위에는 기본 Mongolian(U+1820-U+1842), Todo(U+1843-U+1877), Sibe(U+1880-U+18A8), Manchu, Ali Gali 확장이 포함됩니다. Variation Selectors FVS1 / FVS2 / FVS3(U+180B-U+180D), soft hyphen NIRUGU(U+180A), Ali Gali vowel mark는 모두 Transparent(T-class)로 분류되므로 순회를 끊지 않고 joining에 참여합니다
Syriac과 마찬가지로 Mongolian에는 Unicode에 미리 인코딩된 Presentation Forms가 없습니다. Mongolian의 전통적인 세로 배치, 복잡한 글자 모양 변형 규칙, FVS 기반 모양 선택은 모두 글꼴이 정의한 GSUB lookup(일반적으로 init / medi / fina / isol + ccmp / rlig / locl)으로 처리되어야 하며, 기능 계층은 이러한 feature를 조회하는 데 필요한 position label을 호출자에게 제공합니다
Devanagari Indic shaping capability (v2.119.55) Devanagari는 Arabic / Syriac / Mongolian과 근본적으로 다릅니다. 단일 글자가 아니라 음절 cluster(akshara)가 의미 단위인 Indic abugida 스크립트이며, cluster 안의 glyph 렌더링 순서가 논리적 Unicode 순서와 다른 경우가 많습니다. 두 메서드가 Devanagari의 Indic 기능 계층을 노출합니다
function GetDevanagariCategory(CP: Cardinal): TIndicCategory; procedure ApplyDevanagariReorder(var Run: array of Cardinal);
자동 통합(v2.119.67):
Typical 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;
Typical workflow (Devanagari with automatic reorder)
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 and Extraction Helpers
Scope and limitations 현재 producer-side 통합 Syriac, Mongolian, Tibetan, Indic shaping에는 이제 명시적인 API reference page가 있습니다. Syriac은 현재 범위에는 RTL cursive scripts인 N'Ko 및 Adlam, Thai/Lao SARA AM 및 tone-mark ordering, Hebrew niqqud ordering, Javanese pre-base signs도 포함됩니다. 이러한 경로는 script shaping preprocess methods에 문서화되어 있습니다
참조: Arabic / Persian / Urdu Shaping Support, Automatic Shaping Pipeline (Phase 8), OpenType GSUB Substitution Engine, THotPDF.AssignSyntheticCodepointForGID |