CFF and OpenType Font Subsetting Functions

PDF Filter Support

 

Вверх  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 с таблицей CFF2 таблица. HPDFInstantiateCFF2Font разрешает выбранные fvar координаты через avar 1.0 или 2.0, вычисляет опирающиеся на VariationStore blend операции через рекурсивные сабрутины, запекает HVAR, VVAR, и MVAR метрики, удаляет вариативные таблицы и возвращает статический sfnt с корректными контрольными суммами

 

HPDFSubsetCFF2Font выполняет то же инстанцирование с координатами по умолчанию, заменяя неиспользуемые программы глифов пустыми CharStrings. Сохраняются glyph ID, словари multi-FD, приватные hint-данные и матрицы шрифта

 

распознаёт sfnt, содержащий fvar, glyf, и loca. HPDFInstantiateTrueTypeVariableFont отображает выбранные оси через avar, вычисляет gvar кортежи и IUP-интерполяцию, обновляет простые и составные контуры плюс метрики фантомных точек, применяет HVAR, VVAR, и MVAR где применимо, удаляет вариативные таблицы и возвращает статический sfnt с корректными контрольными суммами

 

HPDFSfntIsOTF распознаёт sfnt-контейнер с версией OTTO. HPDFOTFFindCFFTable находит встроенную таблицу «CFF ». HPDFSubsetOTFContainer сабсетит встроенные данные CFF или CFF2 и возвращает OTF-контейнер с корректными sfnt-контрольными суммами. HPDFExtractTTFPostScriptName читает name ID 6 из sfnt name таблицы и возвращает PostScript-имя шрифта, если оно есть

 

Сабсеттер распознаёт как 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

HPDFType1Core, HPDFType1Glyphs, HPDFType1CFFHandler, и HPDFType1PFBHandler предоставляют переиспользуемое чтение байтовых массивов, извлечение команд контуров глифов Type 1, разбор CFF Header / INDEX / словарей / charset / encoding, а также метаданные Type 1 PFB и помощники поиска глифов. HPDFType1CFFHandler разрешает SyntheticBase наследование по FontSet для значений Top и Private DICT, CharStrings, charset, Encoding и Local Subrs, отвергая некорректные индексы, циклы и чрезмерную глубину. HPDFType1CB предоставляет удобную для C++Builder точку входа парсера. Модули включены в пакеты Delphi и C++Builder, чтобы приложения могли инспектировать данные Type 1 PFB и CFF, не переопределяя бинарные парсеры

 

См. также: EnableFontSubsetting, FontEmbedding, Поддержка фильтров PDF

Стековые операции Type 2 и безопасность сабрутин

Нативный рендерер глифов реализует стандартные логические, арифметические, условные, 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 по-прежнему не поддерживаются и завершаются явной ошибкой