Підтримка формування сирійської, монгольської та деванагарі писемності

Інтерфейси можливостей роботи з кількома писемностями (v2.119.53 - v2.119.55)

 

Арабське формування  Автоматичний конвеєр формування  Рушій GSUB

HotPDF надає інтерфейси можливостей класів з'єднання / позиційного аналізу / індійських складів для трьох складних систем писемності, крім арабської: сирійської (U+0700-U+074F), монгольської (U+1800-U+18AF) та деванагарі (U+0900-U+097F) Кожна можливість дозволяє викликаючим програмам керувати писемністю через існуючий рушій OpenType GSUB для правильного формування, залишаючи при цьому складні завдання (визначення меж кластерів, розв'язання BiDi, позиціонування GPOS) поза межами HotPDF

 

Можливість формування сирійської писемності (v2.119.53)

Два нові методи надають доступ до поведінки з'єднання сирійської писемності:

 

function GetSyriacJoiningClass(CP: Cardinal): TJoiningClass;

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

 

Сирійське письмо наслідує той самий фреймворк чотирьох класів з'єднання справа / подвійного з'єднання / прозорого / без з'єднання, що й арабське; GetSyriacJoiningClass класифікує кожну кодову точку в блоці U+0700-U+074F відповідно до властивості з'єднання Unicode. GetSyriacPosition обходить сирійську послідовність і визначає ізольовану / початкову / серединну / кінцеву позицію кожного символу на основі класів з'єднання його безпосередніх сусідів

 

На відміну від арабської, сирійський блок не має презентаційних форм, попередньо закодованих в Unicode - немає сирійського еквівалента арабських блоків презентаційних форм U+FB50-FDFF / U+FE70-FEFC. Тому користувачі повинні керувати сирійським формуванням через визначені шрифтом пошуки GSUB (зазвичай init / medi / fina / isol + rlig), а не через перезапис кодових точок. Рівень можливостей вище надає викликаючим програмам мітки позицій, необхідні для запиту відповідної функції GSUB для кожного гліфа

 

Можливість формування монгольської писемності (v2.119.54)

Два паралельні методи для монгольської мови:

 

function GetMongolianJoiningClass(CP: Cardinal): TJoiningClass;

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

 

Покриття включає базову монгольську (U+1820-U+1842), тодо (U+1843-U+1877), сібе (U+1880-U+18A8), маньчжурську та розширення алі-галі. Селектори варіантів FVS1 / FVS2 / FVS3 (U+180B-U+180D), м'який дефіс NIRUGU (U+180A) та знаки голосних алі-галі класифікуються як прозорі (клас T), тому они беруть участь у з'єднанні, не перериваючи обхід

 

Як і сирійське письмо, монгольське не має презентаційних форм, попередньо закодованих в Unicode. Очікується, що традиційне vertical розташування монгольського письма, складні правила варіації форми літер та вибір форми на основі FVS керуватимуться визначеними шрифтом пошуками GSUB (зазвичай init / medi / fina / isol + ccmp / rlig / locl); рівень можливостей надає викликаючим програмам мітки позицій, необхідні для запиту цих функцій

 

Можливість індійського формування деванагарі (v2.119.55)

Деванагарі фундаментально відрізняється від арабського / сирійського / монгольського письма - це індійський абугіда-скрипт, де смисловою одиницею є складний кластер (акшара), а не окрема літера, і порядок візуалізації гліфів усередині кластера часто відрізняється від логічного порядку Unicode. Два методи надають доступ до індійського рівня можливостей деванагарі:

 

function GetDevanagariCategory(CP: Cardinal): TIndicCategory;

procedure ApplyDevanagariReorder(var Run: array of Cardinal);

 

Метод GetDevanagariCategory класифікує кожну кодову точку в U+0900-U+097F в одну з 13 індійських складських категорій (базова / приголосна / голосна / незалежна голосна / знак голосної / пре-базова матра / надбазова матра / підбазова матра / халант вірама / рефа / анусвара / вісарга / інша), щоб викликаючі програми могли виявляти межі складів та визначати, які позиції всередині кожного кластера потребують перевпорядкування

 

Метод ApplyDevanagariReorder є попереднім проходом, який обходить вхідну послідовність і застосовує два основні правила перевпорядкування деванагарі: (1) Repha (Ra + Halant на початку складу) переміщується в позицію після базової приголосної кластера, щоб вона відображалася як надрядковий гачок; (2) пре-базовий I-matra (U+093F DEVANAGARI VOWEL SIGN I) переміщується перед базовою приголосною кластера, щоб відображатися як лівосторонній гачок. Інші перевпорядкування Indic (надбазова матра, підбазова матра, формування кон'юнктів) залишаються для рушія GSUB шрифту, оскільки вони потребують специфічних для шрифту таблиць пошуку

 

Автоматична інтеграція (v2.119.67): коли sfIndicShaping знаходиться у PDF.ShapingFeatures, метод ApplyDevanagariReorder застосовується автоматично як попередній прохід усередині трьох допоміжних методів BuildUnicode*FieldContent. Тоді рушій GSUB переглядача сприймає склад у правильному порядку та застосовує власні правила контекстного формування. Див. Автоматичний конвеєр формування

 

Типовий процес роботи (сирійське письмо)

 

PDF.RegisterUnicodeTTF('Estrangelo', 'SyrCOMEdessa.otf');

PDF.SetGSUBScript('syrc');  // див. док. рушія GSUB

for i := 0 to Length(Run) - 1 do

begin

  Pos := PDF.GetSyriacPosition(Run, i);  // init / medi / fina / isol

  // запит до GSUB для вибору відповідного за позицією гліфа заміни

  // виведення + MarkUnicodeGlyphUsed

end;

 

Типовий процес роботи (деванагарі з автоматичним перевпорядкуванням)

 

PDF.RegisterUnicodeTTF('NotoDeva', 'NotoSansDevanagari-Regular.ttf');

PDF.ShapingFeatures := [sfIndicShaping];  // автоматичне перевпорядкування Repha + I-matra

PDF.CurrentPage.SetFont('NotoDeva', [], 14);

PDF.CurrentPage.UnicodeTextOut(50, 700, 0,

  UnicodeString(#$0939#$093F#$0928#$094D#$0926#$0940)); // "Hindi"

 

Допоміжні методи для підмножин Unicode та вилучення

Метод RegisterToUnicodeReverseMapping записує вихідні кодові точки для сформованих або синтетичних гліфів. ClearToUnicodeReverseMappings скидає таблицю, ToUnicodeReverseMappingCount повертає її розмір, GetUnicodeGlyphForCodepoint повертає зареєстрований ідентифікатор гліфа шрифту для кодової точки Unicode, а EnableShapingFeatureForSubset позначає гліфи заміни з функції GSUB для включення у вбудовану підмножину

 

Область застосування та обмеження

Поточна інтеграція на стороні генератора

Формування для сирійської, монгольської, тибетської та індійських писемностей тепер має окремі довідкові сторінки API. Сирійське формування можна ввімкнути за допомогою AutoShapeSyriac, монгольське - через sfMongolianShaping, тибетське - через sfTibetanShaping, перевпорядкування Indic - через sfIndicShaping, а повне формування GSUB для індійських мов - через sfIndicGSUB. Детальні точки входу задокументовані в розділах Методи формування для тибетського/монгольського/сирійського письма та Методи формування для індійського письма

Поточна область також охоплює N'Ko та Adlam як RTL cursive скрипти, упорядкування тайського/лаоського SARA AM та знаків тону, упорядкування ніккуду івриту та яванські пре-базові знаки. Ці шляхи задокументовані в розділі Методи попередньої обробки формування скриптів

 

 

Див. також: Підтримка формування арабської, перської та урду писемності, Автоматичний конвеєр формування (Фаза 8), Рушій заміни OpenType GSUB, THotPDF.AssignSyntheticCodepointForGID