Syriac / Mongolian / Devanagari Shaping Support

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

 

Arabic Shaping  Auto Shaping Pipeline  GSUB Engine

HotPDF открывает capability surfaces joining-class / positional-analysis / Indic syllabic-category для трех сложных scripts помимо Arabic: Syriac (U+0700-U+074F), Mongolian (U+1800-U+18AF) и Devanagari (U+0900-U+097F). Каждая capability позволяет callers вести script через существующий OpenType GSUB engine для корректного shaping, оставляя heavy lifting вроде cluster boundary detection, BiDi resolution и GPOS positioning вне области HotPDF

 

Syriac shaping capability (v2.119.53)

Two new methods expose Syriac's joining behaviour:

 

function GetSyriacJoiningClass(CP: Cardinal): TJoiningClass;

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

 

Syriac следует той же четырехклассовой схеме Right-Joining / Dual-Joining / Transparent / Non-Joining, что и Arabic; GetSyriacJoiningClass классифицирует каждый codepoint в блоке U+0700-U+074F согласно Unicode joining property. GetSyriacPosition проходит Syriac run и определяет для каждого символа isolated / initial / medial / final position на основе joining classes ближайших соседей

 

В отличие от Arabic, блок Syriac не имеет Presentation Forms, заранее закодированных в Unicode; эквивалента Arabic Presentation Forms blocks U+FB50-FDFF / U+FE70-FEFC для Syriac нет. Поэтому consumers должны вести Syriac shaping через GSUB lookups, определенные шрифтом (обычно init / medi / fina / isol + rlig), а не через codepoint rewriting. Capability layer выше дает callers position labels, нужные для запроса правильного GSUB feature для каждого glyph

 

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;

 

Покрытие включает basic Mongolian (U+1820-U+1842), Todo (U+1843-U+1877), Sibe (U+1880-U+18A8), Manchu и Ali Gali extensions. Variation Selectors FVS1 / FVS2 / FVS3 (U+180B-U+180D), soft hyphen NIRUGU (U+180A) и Ali Gali vowel marks классифицируются как Transparent (T-class), поэтому участвуют в joining, не прерывая walk

 

Как и Syriac, Mongolian не имеет Presentation Forms, заранее закодированных в Unicode. Traditional vertical layout Mongolian, complex letter-shape variation rules и FVS-driven shape selection должны управляться GSUB lookups, определенными font (обычно init / medi / fina / isol + ccmp / rlig / locl); capability layer дает callers position labels, нужные для запроса этих features

 

Devanagari Indic shaping capability (v2.119.55)

Devanagari принципиально отличается от Arabic / Syriac / Mongolian: это Indic abugida script, где значимая единица — syllable cluster (akshara), а не отдельная буква, и rendered order glyphs внутри cluster часто отличается от logical Unicode order. Два метода открывают Indic capability layer Devanagari:

 

function GetDevanagariCategory(CP: Cardinal): TIndicCategory;

procedure ApplyDevanagariReorder(var Run: array of Cardinal);

 

GetDevanagariCategory классифицирует каждый codepoint в U+0900-U+097F в одну из 13 Indic syllabic categories (Base / Consonant / Vowel / Independent Vowel / Vowel Mark / Pre-base Matra / Above-base Matra / Below-base Matra / Halant Virama / Repha / Anusvara / Visarga / Other), чтобы callers могли находить syllable boundaries и позиции внутри cluster, требующие reorder

 

ApplyDevanagariReorder — pre-pass, который проходит input run и применяет два основных Devanagari reorder rules: (1) Repha (Ra + Halant в начале syllable cluster) переносится в позицию после base consonant cluster, чтобы рендериться как superscript hook; (2) Pre-base I-matra (U+093F DEVANAGARI VOWEL SIGN I) переносится перед base consonant cluster, чтобы рендериться как left-side hook. Остальные Indic reorders оставлены GSUB engine шрифта, потому что требуют font-specific lookup tables

 

Автоматическая интеграция (v2.119.67): когда sfIndicShaping находится в PDF.ShapingFeatures, ApplyDevanagariReorder автоматически применяется как pre-pass внутри трех helpers BuildUnicode*FieldContent. GSUB engine consumer reader затем получает syllable в правильном порядке и применяет собственные contextual shaping rules. См. 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 записывает source codepoints для shaped или synthetic glyph output. ClearToUnicodeReverseMappings сбрасывает таблицу, ToUnicodeReverseMappingCount сообщает ее размер, GetUnicodeGlyphForCodepoint возвращает registered font glyph ID для Unicode codepoint, а EnableShapingFeatureForSubset помечает substitute glyphs из GSUB feature для включения в embedded subset

 

Scope and limitations

Текущая интеграция на стороне создателя

Формирование Syriac, Mongolian, Tibetan и Indic теперь имеет явные справочные страницы API. Syriac можно включить через AutoShapeSyriac, Mongolian через sfMongolianShaping, Tibetan через sfTibetanShaping, перестановку Indic через sfIndicShaping, а полное формирование Indic GSUB через sfIndicGSUB. Подробные точки входа описаны в Tibetan/Mongolian/Syriac shaping methods и Indic shaping methods

Текущая область также охватывает N'Ko и Adlam как курсивные RTL-письменности, Thai/Lao для SARA AM и тоновых знаков, Hebrew для порядка niqqud и Javanese для предбазовых знаков. Эти пути описаны в script shaping preprocess methods

 

 

См. также: Arabic / Persian / Urdu Shaping Support, Automatic Shaping Pipeline (Phase 8), OpenType GSUB Substitution Engine, THotPDF.AssignSyntheticCodepointForGID