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 네 가지 클래스 체계를 따릅니다. GetSyriacJoiningClass는 U+0700-U+074F 블록의 각 코드포인트를 Unicode joining property에 따라 분류합니다. GetSyriacPosition은 Syriac run을 순회하며 바로 이웃한 문자의 joining class를 기준으로 각 문자를 isolated / initial / medial / final 위치로 해석합니다

 

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);

 

GetDevanagariCategory는 U+0900-U+097F의 각 코드포인트를 13가지 Indic syllabic category(Base / Consonant / Vowel / Independent Vowel / Vowel Mark / Pre-base Matra / Above-base Matra / Below-base Matra / Halant Virama / Repha / Anusvara / Visarga / Other) 중 하나로 분류합니다. 이를 통해 호출자는 syllable boundary를 감지하고 각 cluster 내부에서 재정렬이 필요한 위치를 식별할 수 있습니다

 

ApplyDevanagariReorder는 입력 run을 순회하며 두 가지 주요 Devanagari reorder 규칙을 적용하는 pre-pass입니다. (1) Repha(음절 cluster 시작의 Ra + Halant)는 위첨자 hook으로 렌더링되도록 cluster의 base consonant 뒤 위치로 이동합니다. (2) Pre-base I-matra(U+093F DEVANAGARI VOWEL SIGN I)는 왼쪽 hook으로 렌더링되도록 cluster의 base consonant 앞 위치로 이동합니다. 기타 Indic reorder(above-base matra, below-base matra, conjunct formation)는 글꼴별 lookup table이 필요하므로 글꼴의 GSUB engine에 맡깁니다

 

자동 통합(v2.119.67): PDF.ShapingFeaturessfIndicShaping이 있으면 ApplyDevanagariReorder가 세 가지 BuildUnicode*FieldContent helper 내부에서 pre-pass로 자동 적용됩니다. 그러면 소비자 reader의 GSUB engine이 올바른 순서의 음절을 받아 자체 contextual shaping 규칙을 적용합니다. Automatic Shaping Pipeline을 참조하십시오

 

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

RegisterToUnicodeReverseMapping은 shaped 또는 synthetic glyph 출력에 대한 source codepoint를 기록합니다. ClearToUnicodeReverseMappings는 테이블을 재설정하고, ToUnicodeReverseMappingCount는 크기를 보고하며, GetUnicodeGlyphForCodepoint는 Unicode codepoint에 등록된 font glyph ID를 반환하고, EnableShapingFeatureForSubset은 GSUB feature의 대체 glyph를 embedded subset에 포함되도록 표시합니다

 

Scope and limitations

현재 producer-side 통합

Syriac, Mongolian, Tibetan, Indic shaping에는 이제 명시적인 API reference page가 있습니다. Syriac은 AutoShapeSyriac, Mongolian은 sfMongolianShaping, Tibetan은 sfTibetanShaping, Indic reorder는 sfIndicShaping, 전체 Indic GSUB shaping은 sfIndicGSUB으로 사용할 수 있습니다. 자세한 entry point는 Tibetan/Mongolian/Syriac shaping methods와 Indic shaping methods에 문서화되어 있습니다

현재 범위에는 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