|
Автоматичний конвеєр формування переводить рушій OpenType GSUB із простої поверхні запитів можливостей у функцію на стороні генератора, яка застосовується автоматично під час виведення тексту в потоки вмісту PDF. Викликаючий код вмикає певні функції GSUB за допомогою типізованої множини (ShapingFeatures: THPDFShapingFeatures), а HotPDF піклується про виконання відповідних замін, позначення замінених гліфів у вбудованій підмножині шрифту та виведення записів зворотного відображення ToUnicode CMap, необхідних для спеціальних можливостей
Фреймворк активації (v2.119.59 / Фаза 8a)
Нове перелічення та властивість керують тим, які автоматичні заміни виконуються під час виведення тексту:
type
THPDFShapingFeature = (
sfArabicGSUB, // нативні арабські init / medi / fina / isol + rlig / calt / rclt
sfStandardLigatures, // латинські 'liga' (ff / fi / fl / ffi / ffl / sft / st)
sfContextualLigatures,// латинські 'clig' (контекстні лігатури)
sfContextualAlternates,// 'rclt' (необхідні контекстні альтернативи)
sfIndicShaping); // Devanagari Repha + попереднє перевпорядкування I-matra
THPDFShapingFeatures = set of THPDFShapingFeature;
property ShapingFeatures: THPDFShapingFeatures read ... write ...;
Значення за замовчуванням - [] (порожня множина), що зберігає байт-ідентичний вивід для тих, хто залежить від статичного формувача пост-проходу версій v2.119.32-58. Встановлення одного або кількох прапорців переводить рушій в автоматичний режим для відповідних функцій
sfArabicGSUB - нативне арабське формування GSUB (v2.185.0)
Коли встановлено sfArabicGSUB, HotPDF відображає логічний арабський запуск на базові ідентифікатори гліфів, застосовує позиційні пошуки init, medi, fina та isol зареєстрованого шрифту у вибраних позиціях з'єднання для кожної літери, а потім застосовує rlig, calt та rclt до сформованої послідовності. Замінені гліфи, які не мають кодової точки Unicode, виводяться через шлях синтетичних кодових точок із зворотними відображеннями ToUnicode, тому шрифти, чиї контекстні арабські гліфи знаходяться посиланням поза cmap, все одно можуть бути правильно вбудовані та скопійовані
Встановлення sfArabicGSUB неявно обходить статичний 4-позиційний формувач для арабської мови версії v2.85.0 - викликаючі програми, яким потрібно, щоб статичний формувач продовжував обробляти кодові точки поза тим, що оголошує GSUB шрифту, повинні залишати sfArabicGSUB вимкненим
sfStandardLigatures / sfContextualLigatures - Фаза 8b (v2.119.65)
Коли встановлено sfStandardLigatures, стандартні латинські лігатури згортаються автоматично за допомогою функції liga шрифту. ApplyLatinLigatureRefinement націлений на блок Alphabetic Presentation Forms (U+FB00-FB4F) - зазвичай FB00 ff, FB01 fi, FB02 fl, FB03 ffi, FB04 ffl, FB05 long-s + t, FB06 st. sfContextualLigatures додає другий прохід для функції clig шрифту. Обидва проходи використовують той самий механізм зворотного cmap, що й sfArabicGSUB, і виводять 7 нових записів зворотного відображення ToUnicode CMap (FB00-FB06), щоб копіювання / вставка у переглядачі повертало лігатуру назад до вихідних літер
sfContextualAlternates - GSUB 'rclt' (v2.119.66)
Коли встановлено sfContextualAlternates, застосовується функція шрифту rclt (необхідні контекстні альтернативи). ApplyArabicGSUBContextualRefinement використовує точку входу ApplyContextualSubst версії v2.119.47 і обробляє вивід змінної довжини N-до-M (заміна фіксується лише тоді, коли кожен замінений GID є доступним через зворотний cmap). Діапазон зворотного cmap розширено до FB00-FDFF + FE70-FEFF, щоб охопити презентаційні форми латиниці, арабської мови та івриту
Основні випадки використання rclt: арабські init / medi / fina / isol, коли шрифт керує позиційним формуванням через GSUB замість кодових точок Unicode Presentation Forms; певні правила однозначності латинських послідовностей; функції формування Indic pres / blws / psts / half / pstf / cjct, коли вони зареєстровані дизайнером шрифту як rclt
sfIndicShaping - Фаза 8e (v2.119.67)
Коли встановлено sfIndicShaping, функція Devanagari ApplyDevanagariReorder версії v2.119.55 переходить із ручного методу в автоматичний попередній прохід, який застосовується всередині трьох допоміжних методів BuildUnicode*FieldContent. У послідовностях Devanagari символ Repha (Ra + Halant на початку кластера) переміщується в позицію після бази, а пре-базовий I-matra (U+093F) переміщується перед базовою приголосною кластера, щоб рушій GSUB переглядача сприймав склад у правильному порядку рендерингу. Інші перевпорядкування Indic (надбазові / підбазові matra, формування кон'юнктів) залишаються в GSUB шрифту
Підтримка попередніх запитів (v2.119.64 / Фаза 8c.5)
Супутній API надає кешовану em-частку /W, щоб викликаючі програми могли правильно обчислювати перенесення слів під час виведення замінених гліфів GSUB:
function GetCodepointAdvance(CP: Cardinal): Single;
Повертає отриману з hmtx ширину кроку як частку em для розв'язаного через cmap гліфа за адресою CP. У цьому ж випуску також виправлено CodeUnitAdvance для класифікації арабських презентаційних форм (U+FB50-FDFF + U+FE70-FEFF) як NARROW замість WIDE (евристичне резервне значення було неправильним до версії v2.65)
Типовий процес роботи (повне автоформування арабської мови)
PDF.RegisterUnicodeTTF('NotoArab', 'NotoSansArabic-Regular.ttf');
PDF.ShapingFeatures :=
[sfArabicGSUB, // нативні контекстні гліфи арабської мови GSUB
sfCursiveAttachment]; // анкери входу / виходу курсиву GPOS
PDF.SetGSUBScript('arab');
PDF.BeginDoc;
PDF.CurrentPage.SetFont('NotoArab', [], 14);
PDF.CurrentPage.RtLTextOut(100, 700, 0,
UnicodeString(#$0628#$0633#$0645#$0020#$0627#$0644#$0644#$0647));
PDF.EndDoc;
Типовий процес роботи (латинські стандартні лігатури + перевпорядкування Devanagari)
PDF.RegisterUnicodeTTF('NotoSans', 'NotoSans-Regular.ttf');
PDF.RegisterUnicodeTTF('NotoDeva', 'NotoSansDevanagari-Regular.ttf');
PDF.ShapingFeatures :=
[sfStandardLigatures, // латинські liga FB00-FB06
sfContextualLigatures, // + clig
sfIndicShaping]; // Devanagari Repha + перевпорядкування I-matra
Завершення дорожньої карти Фази 8
Фаза 8a (v2.119.59) фреймворк активації + можливості арабської мови; Фаза 8b (v2.119.65) стандартні латинські лігатури; Фаза 8c.1 (v2.119.60) Аллах; Фаза 8c.2 (v2.119.63) GSUB rlig на рівні GID; Фаза 8c.3 (v2.119.61) зворотне відображення ToUnicode; Фаза 8c.4 (v2.119.62) Бісміллах; Фаза 8c.5 (v2.119.64) попередній запит + евристичне виправлення; Фаза 8c.6 (v2.119.68) виведення синтетичних кодових точок PUA; Фазу 8d було включено до підфаз 8c; Фаза 8e (v2.119.67) автоперевпорядкування Devanagari. З версією v2.119.68 матриця можливостей Фази 8 закрита; подальші вдосконалення (додаткові індійські писемності, позиціонування OpenType GPOS, роздільна здатність BiDi) відстежуються в окремих пунктах дорожньої карти
Scope and limitations
Конвеєр активації навмисно доданий поверх статичного формувача пост-проходу - існуючі викликаючі програми не бачать змін у поведінці, якщо вони не активують цю функцію. Стандартна множина [] є безпечним вибором для байт-стабільної регресії. Шрифти без запитаних таблиць функцій GSUB дають безпечний пустий результат (заміна не застосовується, винятки не виникають)
Поточна карта API формування
Поточний конвеєр більше не обмежується лише заміною: sfKerning застосовує кернінг пар GPOS, sfMarkPositioning застосовує зміщення Mark-to-Base та Mark-to-Mark, sfMarkToLigature застосовує розміщення Mark-to-Ligature, sfCursiveAttachment застосовує вирівнювання анкерів входу/виходу курсиву, sfTibetanShaping застосовує формування Tibetan GSUB, sfMongolianShaping застосовує позиційні форми монгольської писемності, а sfIndicGSUB застосовує ланцюжок функцій Indic GSUB після перевпорядкування складів. Див. ShapingFeatures, методи GPOS та методи формування Indic
Нещодавні доповнення додають sfLocalizedForms для locl, calt через ApplyGSUBContextualFeature, контекстний і вертикальний GPOS кернінг, власне формування арабських GSUB контекстних гліфів, а також шляхи для N'Ko, Adlam, Thai/Lao, Hebrew і Javanese. Див. методи попередньої обробки формування письма
Див. також: OpenType GSUB Substitution Engine, Arabic / Persian / Urdu Shaping Support, Syriac / Mongolian / Devanagari Shaping, THotPDF.AssignSyntheticCodepointForGID, CFF / OpenType Font Subsetting
|