CFF および OpenType フォント サブセット化関数

PDF フィルターサポート

 

トップへ  EnableFontSubsetting  目次

これらのユニットレベルの関数は、HotPDFの埋め込みフォントパイプラインで使用される、パブリックなCFF、OpenType-CFF、およびsfntのフォント検査サーフェスを公開します。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 フォントのペイロードをその場で書き換え、グリフ ID を保持したまま、未使用の CharString とサブルーチンを最小限のスタブに置き換えます。フォントコンテナから CFF テーブルを既に抽出している呼び出し元向けのヘルパーです

 

HPDFIsCFF2Font は CFF2 テーブルを持つ sfnt を検出します。HPDFInstantiateCFF2Font は選択された fvar 座標を avar 1.0 / 2.0 経由で解決し、再帰的なサブルーチンにまたがる VariationStore バックエンドの blend 操作を評価し、HVAR、VVAR、MVAR のメトリクスを焼き込み、可変テーブルを取り除き、チェックサムが正しい静的 sfnt を返します

 

HPDFSubsetCFF2Font は、既定の座標でのインスタンス化を行いながら、未使用のグリフプログラムを空の CharString に置き換えます。グリフ ID、複数 FD のディクショナリー、プライベートヒントデータ、フォントマトリックスは保持されます

 

HPDFIsTrueTypeVariableFont は、fvar、glyf、loca を含む sfnt を検出します。HPDFInstantiateTrueTypeVariableFont は選択された軸を avar 経由でマップし、gvar タプルと IUP 補間を評価し、シンプルおよびコンポジットのアウトラインとファントムポイントのメトリクスを更新し、該当する場合には HVAR、VVAR、MVAR を適用し、可変テーブルを取り除き、チェックサムが正しい静的 sfnt を返します

 

HPDFSfntIsOTF は、バージョンが OTTO の sfnt コンテナを検出します。HPDFOTFFindCFFTable は埋め込まれた 'CFF ' テーブルを特定します。HPDFSubsetOTFContainer は埋め込まれた CFF または CFF2 データをサブセット化し、有効な sfnt チェックサムを持つ OTF コンテナを返します。HPDFExtractTTFPostScriptName は sfnt の name テーブルから name ID 6 を読み取り、存在すれば PostScript フォント名を返します

 

サブセッターは、name キー付き CFF(単一の Private DICT、単一の Local Subr INDEX)と、CID キー付き CFF(Top DICT の ROS 演算子、複数のサブフォント Private DICT からなる FDArray、FDSelect のグリフ対 FD マップ、FD ごとの Local Subr INDEX)の両方を認識します。CID 対応は CJK / Indic / アラビア語の OpenType-CFF フォントをカバーし、クロージャースキャンは保持された各 CharString の FD コンテキストを追跡するため、FD ごとの Local Subr INDEX は独立してサブセット化されます

 

低レベルの CFF 整数デコーダ、FDArray / FDSelect パーサー、およびサブルーチンスキャナーは、このパブリックヘルパーサーフェスの背後にある実装の詳細です

 

Type 1 および CFF パーサーユニット

HPDFType1Core、HPDFType1Glyphs、HPDFType1CFFHandler、および HPDFType1PFBHandler は、再利用可能なバイト配列リーダー、Type 1 グリフアウトラインコマンドの抽出、CFF ヘッダー / INDEX / 辞書 / 文字セット / エンコーディングの解析、および Type 1 PFB メタデータとグリフルックアップヘルパーを提供します。HPDFType1CFFHandler は、FontSet 内の Top DICT と Private DICT の値、CharStrings、charset、Encoding、Local Subrs について、無効なインデックス、循環、過度な深さを拒否しながら SyntheticBase の継承を解決します。HPDFType1CB は C++Builder 向けのパーサーエントリポイントを提供します。これらのユニットは Delphi および C++Builder のパッケージプロジェクトに含まれているため、アプリケーションはバイナリパーサーを再実装することなく、Type 1 PFB および CFF データを検査できます

 

See also: EnableFontSubsetting, フォントの埋め込み, PDF フィルターサポート

Type 2 スタック操作とサブルーチンの安全性

ネイティブのグリフレンダラーは、put、get、ifelse、random、dup、exch、index、roll を含む標準的な Type 2 のブール演算、算術演算、条件分岐、一時配列、スタック操作を実装しています

一時値はグリフごとにリセットされ、乱数は再現可能です。オペランド、一時配列、再帰、実行の各上限は、部分的なアウトラインを返すことなく不正なプログラムを拒否します

サブセットスキャナは、ローカルおよびグローバルのサブルーチン呼び出しで使われる算術式や一時配列式を解決します。Type 2 の 16.16 固定小数点オペランドも含まれます

乱数値、未知の一時状態、プロシージャ間のスタック効果により呼び出し先が不確実な場合、サブセット化は到達可能性のあるアウトライン依存を切り捨てないよう、候補となるサブルーチンをすべて保持します

予約済みおよび非推奨の Multiple Master 操作は引き続きサポート対象外で、明示的に失敗します