「OpenTypeフォント」の版間の差分
提供: 個人的記録
(→使用ツール) |
|||
| (同じ利用者による、間の19版が非表示) | |||
| 1行目: | 1行目: | ||
[[Category:Software]] | [[Category:Software]] | ||
| − | + | OpenTypeフォントについて調査。 | |
| − | = | + | = OpenTypeフォントの仕様 = |
* http://www.microsoft.com/typography/otspec/otff.htm | * http://www.microsoft.com/typography/otspec/otff.htm | ||
| − | = | + | = OpenTypeフォントのヘッダ構造 = |
{| class="wikitable" style="width: 75%;" | {| class="wikitable" style="width: 75%;" | ||
| − | |+ | + | |+ ヘッダ |
|- | |- | ||
!オフセット||型||説明 | !オフセット||型||説明 | ||
|- | |- | ||
| − | |0|| | + | |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 を扱える。 | ||
= 使用ツール = | = 使用ツール = | ||
| − | |||
| − | |||
| − | == TTFDump.exe === | + | === TTFDump.exe === |
| − | + | * [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 識別子で指定された先には以下の構造が記録されている。
| オフセット | 型 | 説明 |
|---|---|---|
| 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 のほうが都合がよいかもしれない
pdfbox 2.0 以後、 TrueTypeCollection クラスで TTC を扱える。
使用ツール
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