|
CFF and OpenType Font Subsetting Functions
|
Вверх EnableFontSubsetting Содержание |
|
Эти функции уровня модуля открывают публичную поверхность инспекции шрифтов CFF, OpenType-CFF и sfnt, которую использует конвейер встроенных шрифтов HotPDF. HotPDF также поставляет переиспользуемые модули парсеров Type 1 PFB и CFF для тех, кому нужен низкоуровневый разбор шрифтов
Синтаксис Delphi function HPDFSubsetCFF(const CFFBytes: TBytes; const KeepGlyph: array of Boolean): TBytes; function HPDFIsCFF2Font(const FontBytes: TBytes): Boolean; function HPDFInstantiateCFF2Font(const FontBytes: TBytes; const AxisValues: THPDFVariableFontAxisValueArray): TBytes; function HPDFSubsetCFF2Font(const FontBytes: TBytes; const KeepGlyph: array of Boolean): TBytes; function HPDFIsTrueTypeVariableFont(const FontBytes: TBytes): Boolean; function HPDFInstantiateTrueTypeVariableFont(const FontBytes: TBytes; const AxisValues: THPDFVariableFontAxisValueArray): TBytes; function HPDFSfntIsOTF(const Data: TBytes): Boolean; function HPDFOTFFindCFFTable(const Data: TBytes; out TableOff: Cardinal; out TableLen: Cardinal): Boolean; function HPDFSubsetOTFContainer(const OTFBytes: TBytes; const KeepGlyph: array of Boolean): TBytes; function HPDFExtractTTFPostScriptName(const Data: TBytes): AnsiString;
Описание HPDFSubsetCFF переписывает payload шрифта CFF на месте, сохраняя glyph ID и заменяя неиспользуемые CharStrings и сабрутины минимальными заглушками. Это помощник для тех, кто уже извлёк таблицу CFF из контейнера шрифта
распознаёт sfnt с таблицей
HPDFSubsetCFF2Font выполняет то же инстанцирование с координатами по умолчанию, заменяя неиспользуемые программы глифов пустыми CharStrings. Сохраняются glyph ID, словари multi-FD, приватные hint-данные и матрицы шрифта
распознаёт sfnt, содержащий
HPDFSfntIsOTF распознаёт sfnt-контейнер с версией OTTO. HPDFOTFFindCFFTable находит встроенную таблицу «CFF ». HPDFSubsetOTFContainer сабсетит встроенные данные CFF или CFF2 и возвращает OTF-контейнер с корректными sfnt-контрольными суммами. HPDFExtractTTFPostScriptName читает name ID 6 из sfnt
Сабсеттер распознаёт как name-keyed CFF (один Private DICT, один Local Subr INDEX), так и CID-keyed CFF (ROS-оператор Top DICT, FDArray из нескольких Private DICT под-шрифтов, карта FDSelect glyph-to-FD, отдельные Local Subr INDEX на FD). Поддержка CID покрывает шрифты CJK / Indic / Arabic OpenType-CFF; скан замыкания отслеживает FD-контекст каждого сохранённого CharString, поэтому per-FD Local Subr INDEX сабсетятся независимо
Низкоуровневые целочисленные декодеры CFF, парсеры FDArray / FDSelect и сканеры сабрутин — детали реализации за этой публичной поверхностью помощников
Модули парсеров Type 1 и CFF
См. также: EnableFontSubsetting, FontEmbedding, Поддержка фильтров PDF |
Нативный рендерер глифов реализует стандартные логические, арифметические, условные, transient-array и стековые операции Type 2, включая put, get, ifelse, random, dup, exch, index и roll
Transient-значения сбрасываются для каждого глифа, случайные значения воспроизводимы, а лимиты на операнды, transient-array, рекурсию и выполнение отклоняют некорректные программы, не возвращая частичный контур
Сканер сабсета разрешает арифметические и transient-array выражения, используемые вызовами локальных и глобальных сабрутин, включая операнды fixed-point 16.16 Type 2
Когда случайные значения, неизвестное transient-состояние или межпроцедурные стековые эффекты делают цель вызова неопределённой, сабсеттинг сохраняет каждую кандидатскую сабрутину, а не выбрасывает потенциально достижимую зависимость контура
Зарезервированные и устаревшие операции Multiple Master по-прежнему не поддерживаются и завершаются явной ошибкой