|
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 можно включить через Текущая область также охватывает 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 |