|
CFF and OpenType Font Subsetting Functions
|
顶部 EnableFontSubsetting 目录 |
|
这些单元级函数公开 HotPDF 嵌入字体流程使用的 CFF 和 OpenType-CFF 字体子集接口。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 原地重写 CFF 字体载荷,保留 glyph ID,并把未使用的 CharStrings 与子例程替换为最小 stub。适合已从字体容器中提取出 CFF table 的调用方
HPDFIsCFF2Font 检测带
HPDFSubsetCFF2Font 执行同样的默认坐标 instancing,同时把未使用的 glyph program 替换为空 CharStrings。它保留 glyph IDs、multi-FD 字典、private hint 数据和 font matrices
HPDFIsTrueTypeVariableFont 检测包含
HPDFSfntIsOTF 检测版本为 OTTO 的 sfnt container。HPDFOTFFindCFFTable 定位嵌入的 'CFF ' table。HPDFSubsetOTFContainer 对嵌入 CFF 或 CFF2 数据做子集化,返回 sfnt checksum 有效的 OTF container。HPDFExtractTTFPostScriptName 从 sfnt 读取 name ID 6
底层 CFF 整数解码器、FDArray / FDSelect 解析器和子例程扫描器是此公开 helper surface 背后的实现细节
子集化器同时识别 name-keyed CFF(单个 Private DICT、单个 Local Subr INDEX)和 CID-keyed CFF(Top DICT 中的 ROS 操作符、含多个子字体 Private DICT 的 FDArray、FDSelect 字形到 FD 的映射、每个 FD 各自的 Local Subr INDEX)。CID 支持覆盖 CJK / Indic / 阿拉伯文的 OpenType-CFF 字体;闭包扫描会跟踪每个保留下来的 CharString 所属的 FD 上下文,因此各 FD 的 Local Subr INDEX 是独立做子集化的
Type 1 and CFF parser units
|
原生字形渲染器实现了标准的 Type 2 布尔、算术、条件、暂存数组和栈操作,包括 put、get、ifelse、random、dup、exch、index 和 roll
暂存值在每个字形开始时重置,随机值可复现;操作数、暂存数组、递归和执行上限会拒绝畸形的程序,不会返回部分轮廓
子集扫描器会解析局部和全局子程序调用用到的算术与暂存数组表达式,包括 Type 2 16.16 定点操作数
当随机值、未知的暂存状态或跨过程的栈效应导致调用目标无法确定时,子集化会保留所有候选子程序,而不是丢弃可能可达的轮廓依赖
保留的和已弃用的 Multiple Master 操作仍不支持,会显式失败