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 識別子で指定された先には以下の構造が記録されている。
オフセット | 型 | 説明 |
---|---|---|
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 | 説明 |
---|---|
0 | 著作権注釈 |
1 | フォントファミリ名 |
2 | フォントサブファミリ名 |
3 | フォント識別子 |
4 | 完全なフォント名 |
5 | バージョン文字列 |
6 | PostScript名 |
7 | 商標 |
8 | 製造社名 |
TTCファイルからフォントの完全な名前を取り出すには
- TTCファイルを読み込み、OpenTypeフォントのオフセットを特定する。
- OpenTypeフォントのオフセットセットからヘッダとオフセットテーブルを読み出し、name識別子のオフセットを特定する。このオフセットはファイルの先頭からのオフセット。
- name識別子のテーブルを読み込み、名前データを含むデータ部分までのオフセットを特定する。
- name識別子のレコードを読み込み、名前ID=4(完全なフォント名)のレコードを特定する
- 言語IDごとに複数存在することがある
- エンコード、データ長、オフセットを取り出す
- ファイルの先頭から「2で特定したオフセット+3で特定したオフセット+4で特定したオフセット」の部分をデータ長だけ読み込む。この値を4で指定されたエンコードで文字列にすると名前が特定できる。
pdfboxで使用する場合、フォント名の指定は postscript フォント名で指定するので ID=6 のほうが都合がよいかもしれない
使用ツール
TTFDump.exe
- Microsoft Typography
- OpenTypeフォントを解体するのに使用
- 使い方
ttfdump.exe <TTFフォント>
T2FAnalyzer
- [2]
- Microsoft Typographyが取れなくなっていたのでかわりに使用
参考サイト
- https://aznote.jakou.com/prog/opentype/02_struct.html
- http://vanillasky-room.cocolog-nifty.com/blog/2008/02/opentype3name-a.html