OpenTypeフォント

提供: 個人的記録
移動: 案内検索


OpenTypeフォントについて調査。

OpenTypeフォントの仕様

OpenTypeフォントのヘッダ構造

ヘッダ
オフセット 説明
0 4バイト ヘッダのバージョン、TrueTypeフォント(ttfファイル)なら 0x00010000 が、PostScriptフォント(otfファイル)なら 0x4F54544F ('OTTO') が格納されている
4 2バイト整数 格納されているテーブルの数
6 2バイト整数 search Range 「(Maximum power of 2 <= numTables) x 16.」と説明にあるがよくわからない
8 2バイト整数 entrySelector 「Log2(maximum power of 2 <= numTables).」と説明にあるがよくわからない
10 2バイト整数 rangeShift「NumTables x 16-searchRange」と説明にあるがよくわからない

上記ヘッダの後に、ヘッダに記載のテーブル数だけ以下の構造が続く

オフセットテーブル
オフセット 説明
0 4バイト文字列 テーブル識別子。4バイトのASCII文字列。テーブルに記述されている内容の種別が記録されている。
4 4バイト符号なし整数 チェックサム
8 4バイト符号なし整数 ファイル先頭からデータ部分までのオフセット。
12 4バイト符号なし整数 データ部分の長さ。


テーブル識別子

オフセットテーブルに指定されているテーブル識別子でデータ部分に何が含まれているかを判断できる。
テーブル識別子の一覧の以下のようになっている。

テーブル識別子
識別子 説明
以下の識別子は必須
cmap 文字コードからグリフIDへの変換
head 基本的な情報
hhea 水平レイアウトの情報
hmtx 水平グリフの送り幅などの情報
maxp 色々な最大値の定義
name フォント名など
OS/2 OS/2 と Windows の情報
post PostScript 情報
TrueType アウトラインの場合のみ
cvt グリフの制御データ (option)
fpgm Font program (option)
glyf グリフデータ
loca 各グリフのオフセット位置
prep CVT Program (option)
gasp Grid-fitting/Scan-conversion (option)
CFF アウトラインの場合のみ
CFF Compact Font Format 1.0
CFF2 Compact Font Format 2.0
VORG 縦書き時の各グリフごとのY原点 (option)
SVG アウトライン
SVG SVG
ビットマップグリフ
EBDT 埋め込みビットマップ データ
EBLC 埋め込みビットマップ location data
EBSC 埋め込みビットマップ scaling data
CBDT カラービットマップ データ
CBLC カラービットマップ location data
sbix PNG/JPEG/TIFF などの形式のビットマップデータ
OpenType 拡張
BASE 各言語ごとのベースライン情報
GDEF 個々のグリフに関する情報。
タイプ、合字キャレットなど。
GPOS グリフ配置。濁点の配置や文字間隔の調整など。
GSUB グリフ置換。縦書き変換や合字など。
JSTF 行揃え
MATH 数式レイアウト情報
OpenType バリエーション
avar Axis variations
cvar CVT variations (TrueType アウトラインのみ)
fvar Font variations
gvar Glyph variations (TrueType アウトラインのみ)
HVAR 水平レイアウト
MVAR Metrics variations
STAT スタイル属性。
非バリエーションフォントでもオプションとして使われる。
VVAR 垂直レイアウト
カラーフォント
COLR カラーテーブル
CPAL カラーパレットテーブル
CBDT カラービットマップ データ
CBLC カラービットマップ location data
ほか
DSIG デジタル署名
hdmx 特定のピクセルサイズ時の各グリフの水平レイアウト幅
kern カーニング
LTSH Linear threshold data
MERG アンチエイリアス処理時、各グリフを個別に実行するか、特定のグリフペアを一緒に処理するかの指定
meta メタデータ
PCLT PCL 5 データ
VDMX Vertical device metrics
vhea 垂直レイアウトの情報
vmtx 垂直グリフの情報

name テーブル

フォントファミリ名や著作権表示が記録されているテーブル。
うちの用途ではフォントファミリが取得できれば十分だったのでnameテーブルのみ調査した。

オフセットテーブルで name 識別子で指定された先には以下の構造が記録されている。

name テーブルヘッダ
オフセット 説明
0 2バイト整数 バージョン
2 2バイト整数 レコードの件数
4 2バイト整数 テーブルヘッダの先頭から、データ部分までのオフセット
ここからレコード部分。レコードの件数回、下記内容を繰り返す
6+12n 2バイト整数 プラットフォームID。プラットフォームを識別する値が格納されている。次のエンコーディングIDとのセットで文字列のエンコードが決まる。
8+12n 2バイト整数 エンコーディングID。文字列部分のエンコードが記録されている。プラットフォームごとに定義が異なるらしい
10+12n 2バイト整数 言語ID。同じ内容でも言語ごとにエンコードが違うため言語ID違いで複数のレコードを持つ。0=英語(たぶんこれが標準)、他はプラットフォームIDによって値がかわる。
12+12n 2バイト整数 名前ID。格納されている内容の種別。後述
14+12n 2バイト整数 文字列の長さ
16+12n 2バイト整数 データ部分の先頭からこのレコードで参照するデータまでのオフセット
バージョン1移行
18+12n 2バイト整数 言語テーブルの数。
ここから言語テーブル部分。言語テーブルの件数回、下記内容を繰り返す
20+12n+4m 2バイト整数 言語タグの文字列バイト数
22+12+4m 2バイト整数 データ部分の先頭から言語テーブルが参照するデータまでのオフセット。データはUTF-16BEでエンコードされている。

プラットフォームIDとエンコーディングIDの対応は下記に記載があった。 [[1]]

名前ID
ID 説明
0 著作権注釈
1 フォントファミリ名
2 フォントサブファミリ名
3 フォント識別子
4 完全なフォント名
5 バージョン文字列
6 PostScript名
7 商標
8 製造社名

TTCファイルからフォントの完全な名前を取り出すには

  1. TTCファイルを読み込み、OpenTypeフォントのオフセットを特定する。
  2. OpenTypeフォントのオフセットセットからヘッダとオフセットテーブルを読み出し、name識別子のオフセットを特定する。このオフセットはファイルの先頭からのオフセット。
  3. name識別子のテーブルを読み込み、名前データを含むデータ部分までのオフセットを特定する。
  4. name識別子のレコードを読み込み、名前ID=4(完全なフォント名)のレコードを特定する
    • 言語IDごとに複数存在することがある
    • エンコード、データ長、オフセットを取り出す
  5. ファイルの先頭から「2で特定したオフセット+3で特定したオフセット+4で特定したオフセット」の部分をデータ長だけ読み込む。この値を4で指定されたエンコードで文字列にすると名前が特定できる。

pdfboxで使用する場合、フォント名の指定は postscript フォント名で指定するので ID=6 のほうが都合がよいかもしれない

使用ツール

TTFDump.exe

  • Microsoft Typography
    OpenTypeフォントを解体するのに使用
  • 使い方
    ttfdump.exe <TTFフォント>

T2FAnalyzer

  • [2]
    Microsoft Typographyが取れなくなっていたのでかわりに使用


参考サイト