「OpenTypeフォント」の版間の差分

提供: 個人的記録
移動: 案内検索
(使用ツール)
 
(同じ利用者による、間の19版が非表示)
1行目: 1行目:
 
[[Category:Software]]
 
[[Category:Software]]
  
TrueTypeFontについて調査。
+
OpenTypeフォントについて調査。
  
= TTFの仕様 =
+
= OpenTypeフォントの仕様 =
 
* http://www.microsoft.com/typography/otspec/otff.htm
 
* http://www.microsoft.com/typography/otspec/otff.htm
  
= TTFファイルのヘッダ構造 =
+
= OpenTypeフォントのヘッダ構造 =
 
{| class="wikitable" style="width: 75%;"  
 
{| class="wikitable" style="width: 75%;"  
|+ TTCヘッダ
+
|+ ヘッダ
 
|-
 
|-
 
!オフセット||型||説明
 
!オフセット||型||説明
 
|-
 
|-
|0||固定値||TTFヘッダのバージョン、0x00010000 が格納されている
+
|0||4バイト||ヘッダのバージョン、TrueTypeフォント(ttfファイル)なら 0x00010000 が、PostScriptフォント(otfファイル)なら 0x4F54544F ('OTTO') が格納されている
 
|-
 
|-
 
|4||2バイト整数||格納されているテーブルの数
 
|4||2バイト整数||格納されているテーブルの数
22行目: 22行目:
 
|10||2バイト整数||rangeShift「NumTables x 16-searchRange」と説明にあるがよくわからない
 
|10||2バイト整数||rangeShift「NumTables x 16-searchRange」と説明にあるがよくわからない
 
|}
 
|}
 +
 +
上記ヘッダの後に、ヘッダに記載のテーブル数だけ以下の構造が続く
 +
{|
 +
{| class="wikitable" style="width: 75%;"
 +
|+ オフセットテーブル
 +
|-
 +
!オフセット||型||説明
 +
|-
 +
|0||4バイト文字列||テーブル識別子。4バイトのASCII文字列。テーブルに記述されている内容の種別が記録されている。
 +
|-
 +
|4||4バイト符号なし整数||チェックサム
 +
|-
 +
|8||4バイト符号なし整数||ファイル先頭からデータ部分までのオフセット。
 +
|-
 +
|12||4バイト符号なし整数||データ部分の長さ。
 +
|}
 +
 +
 +
== テーブル識別子 ==
 +
オフセットテーブルに指定されているテーブル識別子でデータ部分に何が含まれているかを判断できる。<br>
 +
テーブル識別子の一覧の以下のようになっている。
 +
 +
{|
 +
{| class="wikitable" style="width: 75%;"
 +
|+ テーブル識別子
 +
|-
 +
!識別子||説明
 +
|-
 +
!colspan="2"|以下の識別子は必須
 +
|-
 +
||cmap||文字コードからグリフIDへの変換
 +
|-
 +
||head||基本的な情報
 +
|-
 +
||hhea||水平レイアウトの情報
 +
|-
 +
||hmtx||水平グリフの送り幅などの情報
 +
|-
 +
||maxp||色々な最大値の定義
 +
|-
 +
||name||フォント名など
 +
|-
 +
||OS/2||OS/2 と Windows の情報
 +
|-
 +
||post||PostScript 情報
 +
|-
 +
!colspan="2"|TrueType アウトラインの場合のみ
 +
|-
 +
||cvt ||グリフの制御データ (option)
 +
|-
 +
||fpgm||Font program (option)
 +
|-
 +
||glyf||グリフデータ
 +
|-
 +
||loca||各グリフのオフセット位置
 +
|-
 +
||prep||CVT Program (option)
 +
|-
 +
||gasp||Grid-fitting/Scan-conversion (option)
 +
|-
 +
!colspan="2"|CFF アウトラインの場合のみ
 +
|-
 +
||CFF ||Compact Font Format 1.0
 +
|-
 +
||CFF2||Compact Font Format 2.0
 +
|-
 +
||VORG||縦書き時の各グリフごとのY原点 (option)
 +
|-
 +
!colspan="2"|SVG アウトライン
 +
|-
 +
||SVG ||SVG
 +
|-
 +
!colspan="2"|ビットマップグリフ
 +
|-
 +
||EBDT||埋め込みビットマップ データ
 +
|-
 +
||EBLC||埋め込みビットマップ location data
 +
|-
 +
||EBSC||埋め込みビットマップ scaling data
 +
|-
 +
||CBDT||カラービットマップ データ
 +
|-
 +
||CBLC||カラービットマップ location data
 +
|-
 +
||sbix||PNG/JPEG/TIFF などの形式のビットマップデータ
 +
|-
 +
!colspan="2"|OpenType 拡張
 +
|-
 +
||BASE||各言語ごとのベースライン情報
 +
|-
 +
||GDEF||個々のグリフに関する情報。
 +
|-
 +
!colspan="2"|タイプ、合字キャレットなど。
 +
|-
 +
||GPOS||グリフ配置。濁点の配置や文字間隔の調整など。
 +
|-
 +
||GSUB||グリフ置換。縦書き変換や合字など。
 +
|-
 +
||JSTF||行揃え
 +
|-
 +
||MATH||数式レイアウト情報
 +
|-
 +
!colspan="2"|OpenType バリエーション
 +
|-
 +
||avar||Axis variations
 +
|-
 +
||cvar||CVT variations (TrueType アウトラインのみ)
 +
|-
 +
||fvar||Font variations
 +
|-
 +
||gvar||Glyph variations (TrueType アウトラインのみ)
 +
|-
 +
||HVAR||水平レイアウト
 +
|-
 +
||MVAR||Metrics variations
 +
|-
 +
||STAT||スタイル属性。
 +
|-
 +
!colspan="2"|非バリエーションフォントでもオプションとして使われる。
 +
|-
 +
||VVAR||垂直レイアウト
 +
|-
 +
!colspan="2"|カラーフォント
 +
|-
 +
||COLR||カラーテーブル
 +
|-
 +
||CPAL||カラーパレットテーブル
 +
|-
 +
||CBDT||カラービットマップ データ
 +
|-
 +
||CBLC||カラービットマップ location data
 +
|-
 +
!colspan="2"|ほか
 +
|-
 +
||DSIG||デジタル署名
 +
|-
 +
||hdmx||特定のピクセルサイズ時の各グリフの水平レイアウト幅
 +
|-
 +
||kern||カーニング
 +
|-
 +
||LTSH||Linear threshold data
 +
|-
 +
||MERG||アンチエイリアス処理時、各グリフを個別に実行するか、特定のグリフペアを一緒に処理するかの指定
 +
|-
 +
||meta||メタデータ
 +
|-
 +
||PCLT||PCL 5 データ
 +
|-
 +
||VDMX||Vertical device metrics
 +
|-
 +
||vhea||垂直レイアウトの情報
 +
|-
 +
||vmtx||垂直グリフの情報
 +
|}
 +
 +
=== name テーブル ===
 +
フォントファミリ名や著作権表示が記録されているテーブル。<br>
 +
うちの用途ではフォントファミリが取得できれば十分だったのでnameテーブルのみ調査した。
 +
 +
オフセットテーブルで name 識別子で指定された先には以下の構造が記録されている。
 +
 +
{|
 +
{| class="wikitable" style="width: 75%;"
 +
|+ name テーブルヘッダ
 +
|-
 +
!オフセット||型||説明
 +
|-
 +
||0||2バイト整数||バージョン
 +
|-
 +
||2||2バイト整数||レコードの件数
 +
|-
 +
||4||2バイト整数||テーブルヘッダの先頭から、データ部分までのオフセット
 +
|-
 +
!colspan="3"| ここからレコード部分。レコードの件数回、下記内容を繰り返す
 +
|-
 +
||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バイト整数||データ部分の先頭からこのレコードで参照するデータまでのオフセット
 +
|-
 +
!colspan="3"|バージョン1移行
 +
|-
 +
||18+12n||2バイト整数||言語テーブルの数。
 +
|-
 +
!colspan="3"| ここから言語テーブル部分。言語テーブルの件数回、下記内容を繰り返す
 +
|-
 +
||20+12n+4m||2バイト整数||言語タグの文字列バイト数
 +
|-
 +
||22+12+4m||2バイト整数||データ部分の先頭から言語テーブルが参照するデータまでのオフセット。データはUTF-16BEでエンコードされている。
 +
|}
 +
 +
プラットフォームIDとエンコーディングIDの対応は下記に記載があった。
 +
[[https://docs.microsoft.com/en-us/typography/opentype/spec/name]]
 +
 +
{|
 +
{| class="wikitable" style="width: 75%;"
 +
|+ 名前ID
 +
|-
 +
!|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で指定されたエンコードで文字列にすると名前が特定できる。
 +
 +
<del> pdfboxで使用する場合、フォント名の指定は postscript フォント名で指定するので ID=6 のほうが都合がよいかもしれない </del>
 +
pdfbox 2.0 以後、 TrueTypeCollection クラスで TTC を扱える。
  
 
= 使用ツール =
 
= 使用ツール =
* [http://www.microsoft.com/typography/tools/tools.aspx Microsoft Typography]
 
*: TTFを解体するのに使用
 
  
== TTFDump.exe ===
+
=== TTFDump.exe ===
TTFのヘッダを参照するのに使用。<br>
+
* [http://www.microsoft.com/typography/tools/tools.aspx Microsoft Typography]
 +
*: OpenTypeフォントを解体するのに使用
 
* 使い方
 
* 使い方
 
*:<pre>ttfdump.exe <TTFフォント></pre>
 
*:<pre>ttfdump.exe <TTFフォント></pre>
 +
 +
=== T2FAnalyzer ===
 +
* [https://onedrive.live.com/?id=11D6139819C0B60%21216&cid=011D6139819C0B60]
 +
*: Microsoft Typographyが取れなくなっていたのでかわりに使用
 +
 +
 +
== 参考サイト ==
 +
* https://aznote.jakou.com/prog/opentype/02_struct.html
 +
* http://vanillasky-room.cocolog-nifty.com/blog/2008/02/opentype3name-a.html

2024年8月21日 (水) 21:09時点における最新版


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 のほうが都合がよいかもしれない pdfbox 2.0 以後、 TrueTypeCollection クラスで TTC を扱える。

使用ツール

TTFDump.exe

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

T2FAnalyzer

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


参考サイト