OpenType
OpenTypeフォントは、従来のCFF (Compact Font Format) フォント形式と、TrueTypeフォント形式を、TrueTypeの`sfnt'テーブル格納形式に沿った形で融合し、高度な組版に使用するフォントデータの格納方式を両者で共通化させたフォント形式です。 CFFを由来とするフォントは拡張子が ".otf" に、TrueTypeを由来とするフォントは拡張子が ".ttf" となり、これらを複数束ねたフォントは、".ttc" と呼ばれる拡張子になります。 `sfnt' 形式は、ヘッダ (head) テーブル等、4文字のテーブル名を持つ複数のテーブルから構成されます。
OpenTypeのテーブル
OpenType仕様には、32種類のテーブルが標準化されています。 ※印があるのは、必須のテーブルです。
| 種類 | OpenType Font | AAT Font (参考) | ||
|---|---|---|---|---|
| 共用 | CFF型 | TrueType型 | ||
| メタデータ | name※, post※, OS/2※ | name, post, OS/2 | ||
| 字形(アウトライン) | CFF | glyf, fpgm, cvt , prep | glyf, cvt , cvar, fpgm, prep | |
| 字形(ビットマップ) | EBDT, EBSC | bdat, bhed, EBSC | ||
| 対応(文字→グリフ) | cmap※ | cmap | ||
| 対応(グリフ→グリフ) | GSUB | morx, feat, gvar | ||
| 対応(アウトライン) | (CFF) | loca | loca | |
| 対応(ビットマップ) | EBLC | bloc | ||
| 文字送り(水平) | hhea※, hmtx※ | hdmx | hhea, hmtx | |
| 文字送り(垂直) | vhea, vmtx | VORG | VMDX | vhea, vmtx |
| 文字間隔調整 | kern, JSTF | kern, just | ||
| ベースライン調整 | BASE | bsln | ||
| 位置調整 | GPOS | opbd | ||
| 低解像度・灰色表示 | gasp | LTSH | gasp | |
| 組版・編集等 | GDEF | lcar, prop | ||
| メモリ管理 | maxp | maxp | ||
| その他・特殊 | PCLT, DSIG | |||
- `CFF ' にはメタデータの一部も格納されます。
- `VORG' には、縦書きフォントの縦開始位置が格納されます。 縦開始位置は、CFFのCHARSTRINGの境界ボックスの上辺から、vmtx.topSideBearing値を足しても計算できますが、VORGを使えば境界ボックス計算が不要になるため、高速・正確に縦開始位置を求められます。
cmap
cmapテーブルは、「文字コード→グリフID」の関係を定義します。 文字コードは platform ID, encoding IDの組み合わせで決まり、テーブルの構造は cmap format で決まります。 この中で必須なのは platformID=3, encodingID=1 のテーブル(Windows Unicode BMP)のみです。 Mac等とWindowsでは、同じUnicodeでもグリフ対応が異なる場合が稀にあるので注意します。
| platform ID | encoding ID | 文字コード | テーブル構造形式番号 |
|---|---|---|---|
| 0 (Unicode) | 3 | Unicode BMP | 4 |
| 4 | Unicode | 8,10,12,13 | |
| 5 | Variation Sequences | 14 | |
| 1 (Apple) | 0 | MacRoman | 0,2,4,6 |
| 1 | MacJapanese | 2,4,6 | |
| 2 (ISO) | - | 未使用 | |
| 3 (Microsoft) | 0 | 記号類 | 0,2,4,6 |
| 1 | Windows Unicode BMP | 4 | |
| 2 | Shift_JIS (CP932) | 2,4,6 | |
| 10 | Windows Unicode | 8,10,12,13 | |
| 4 (Custom) | 任意 | 任意 |
| 形式番号 | 符号長 | 内容 |
|---|---|---|
| 0 | 8bit | 1:1テーブル |
| 2 | 16bit | 8/16bit 混合テーブル |
| 4 | 16bit | セグメントテーブル |
| 6 | 16bit | トリム配列 (trimmed array) |
| 8 | 32bit | 16/32bit 混合テーブル |
| 10 | 32bit | トリム配列 (trimmed array) |
| 12 | 32bit | セグメントテーブル |
| 13 | 32bit | 多:1テーブル(LastResrotフォント用) |
| 14 | 32bit | IVS用テーブル |
name
`name' テーブルはフォント名や著作権、フォントの制作者や会社名、URL等を格納します。 各IDには複数の言語を入れることができます。
| ID | 内容 | 小塚明朝での例 |
|---|---|---|
| 0 | 著作権表示 | Copyright © 1997-2009 Adobe Systems Incorporated. All Rights Reserved. |
| 1 | フォントファミリ名 | Kozuka Mincho Pr6N M |
| 2 | サブファミリ名称 | Regular |
| 3 | サブファミリ識別子 | 6.008;ADBE;KozMinPr6N-Medium |
| 4 | フル名称 | Kozuka Mincho Pr6N M |
| 5 | バージョン番号 | Version 6.008;PS 6.002;hotconv 1.0.57;makeotf.lib2.0.21895 |
| 6 | PostScript名 | KozMinPr6N-Medium |
| 7 | トレードマーク告知 | Kozuka Mincho is either a registered trademark or trademark of Adobe Systems Incorporated in the United States and/or other countries. |
| 8 |
フォントファミリ名におけるフォントの管理
あるフォントファミリXXXXが、XXXX-Regular, XXXX-Italic, XXXX-Bold, XXXX-BoldItalicの4書体のみ(またはそれ以下)持つ場合は、Family (ID=1), SubFamily (ID=2) および OS/2.fsSelection によってフォントファミリを管理します。
しかし、フォントファミリがXXXX-Light, XXXX-Medium, XXXX-SemiBold, XXXX-Bold, XXXX-ExtraBoldのように、4書体以上のフォントで構成される場合は、preferredFamily (ID=16), preferredSubFamily (ID=17) を使ってフォントファミリを管理します。
この場合、Family (ID=1) と preferredFamily (ID=16) 、および SubFamily (ID=2) と preferredSubFamily (ID=17) は必ず異なる必要があります。通常は、Family (ID=1) には、preferredFamily と preferredSubFamily を空白で繋げた文字を入れ、SubFamily には `Regular' を入れ、preferredSubFamily は、`Regular' の代わりに `Medium' を入れることが多いようです。
GSUB, GPOS, BASE, JSTF, GDEF
上記のテーブルのうち、 GSUB, GPOS, BASE, JSTF, GDEFテーブルは良く似た階層構造を持ちます。
| テーブル | 第一層 | 第二層 | 第三層 | 第四層 |
|---|---|---|---|---|
| GPOS | Script Tags | Language Tags | Feature Tags | Lookup Tables |
| GSUB | Script Tags | Language Tags | Feature Tags | Lookup Tables |
| BASE | HorizAxis/ VertAxis |
Baseline Tags | ||
| Script Tags | Base Values | |||
| JSTF | Script Tags | Glyphs | ||
| Language Tags | 拡張優先度 | |||
| 縮小優先度 | ||||
| GDEF | Glyph Class Def | |||
| Attachment List | ||||
| Ligature Caret List | Ligature Caret | |||
| Mark Glyph Class | ||||
| Mark Glyph List |
| 番号 | GSUB名称 | GSUB機能 | GPOS名称 | GPOS機能 |
|---|---|---|---|---|
| 1 | Single | グリフの1:1置換 | Single adjustment | 単独の位置調整 |
| 2 | Multiple | グリフの1:n置換 | Pair adjustment | カーニング |
| 3 | Alternate | 1グリフをグリフ選択で置換 | Cursive attachment | 筆記体の接続 |
| 4 | Ligature | nグリフを1グリフに置換 | MarkToBase attachment | 文字と記号の接続 |
| 5 | Context | 文脈より複数グリフを置換 | MarkToLigature attachment | リガチャと記号の接続 |
| 6 | Chaining Context | 連鎖文脈より複数グリフを置換 | MarkToMark attachment | 記号と記号の接続 |
| 7 | Extension Substitution | 64K以上のテーブルの他の置換を拡張 | Context positioning | 文脈位置調整 |
| 8 | Reverse chaining context single | 連鎖文脈より単独グリフを逆順に置換 | Chained Context positioning | 連鎖文脈位置調整 |
| 9 | Reserved | 未使用 | Extension positioning | 拡張位置調整 |
| 10+ | Reserved | 未使用 |
GSUBテーブル
| 機能名 | InDesignメニュー名 | Lookupテーブル例 |
|---|---|---|
| afrc | 分数 | 4 |
| ccmp | 字体組版・分解 | 4 |
| dlig | 任意の合字 | 4 |
| dnom | 分母 | 1 |
| expt | エクスパート字形 | 1 |
| frac | スラッシュを用いた分数 | 4→6 |
| fwid | 等幅全角字形 | 1 |
| hkna | 横組み用かな | 1 |
| hojo | 補助漢字 | 1 |
| hwid | 等幅半角字形 | 1 |
| ital | 欧文イタリック | 1 |
| jp04 | JIS2004字形 | 1 |
| jp78 | JIS78字形 | 1 |
| jp83 | JIS83字形 | 1 |
| jp90 | JIS90字形 | 1 |
| liga | 欧文合字 | 4 |
| nalt | 修飾字形 | 1→3 |
| nlck | 印刷標準字体 | 1 |
| numr | 分子 | 1 |
| pwid | プロポーショナル字形 | 1 |
| qwid | 等幅四分字形 | 1 |
| ruby | ルビ用字形 | 1 |
| sinf | 下付き用数字 | 1 |
| sups | 上付き用数字 | 1 |
| subs | 下付き文字 | 1 |
| trad | 旧字体 | 1→3 |
| vert | 縦組み用全角字形 | 1 |
| vkna | 縦組み用かな | 1 |
| vrt2 | 縦組み用回転字形 | 1 |
| zero | スラッシュ付きゼロ | 1 |
| aalt | すべての異体字 | 3→7 |
| ordn | 上付き序数表記 | 1 |
| swsh | スワッシュ字形 | 1 |
| titl | タイトル用字形 | 1 |
| calt | 前後関係に依存する字形 | 6→6→…→4 |
| smcp | すべてスモールキャップス | 1 |
| ss01-ss20 | デザインのセット | 1 |
| init | 位置依存形-語頭形 | 1 |
| medi | 位置依存形-語中形 | 1 |
| fina | 位置依存形-語尾形 | 4 |
| isol | 位置依存形-独立形 | 1→6 |
| tnum | 等幅ライニング文字 | 1 |
| onum | オールドスタイル数字 | 1 |
| lnum | ライニング数字 | 1 |
| tnum+onum | 等幅オールドスタイル数字 | |
| pkna | プロポーショナルかな | 1 |
| twid | ? | 1 |
GPOSテーブル
| 機能名 | 説明 | Lookupテーブル例 |
|---|---|---|
| halt | 全角文字を半角スペースにする。 | 1 |
| kern | カーニング | 2 |
| palt | 全角文字をプロポーショナルスペースにする。 | 1 |
| vhal | 全角文字を垂直半角スペースにする。 | 1 |
| vkrn | 垂直カーニング | 2 |
| vpal | 全角文字をプロポーショナルスペースにする。 | 1 |
| cpsp | 全大文字用のスペーシングにする。 | 1 |
BASEテーブル
BASEテーブルは、ラテン文字・仮名漢字・チベット文字・数式のベースラインを合わせるのに利用します。
和文フォントの場合は仮想ボディ・平均字面を設定できます。 そのため、和欧混植を行う際に、欧文のベースラインと和文のベースラインの調整に利用できます。
| 種類 | BASEテーブル設定済 | BASEテーブル未設定 |
|---|---|---|
| 仮想ボディの下 | BASE.horizAxis.ideo | OS/2.sTypoDescender |
| 仮想ボディの上 | BASE.horizAxis.idtp | OS/2.sTypoAscender |
| 仮想ボディの幅 | BASE.vertAxis.idtp | head.unitsPerEm |
| 種類 | BASEテーブル設定済 | BASEテーブル未設定 |
|---|---|---|
| 平均字面の下 | BASE.horizAxis.icfb | OS/2.sTypoDescender |
| 平均字面の上 | BASE.horizAxis.icft | OS/2.sTypoAscender |
| 平均字面の左 | BASE.vertAxis.icfb | 0 |
| 平均字面の右 | BASE.vertAxis.icft | head.unitsPerEm |
通常、仮想ボディと平均字面のマージンは上下左右で一致するため、下側のBASE.horizAxis.icfb だけ設定すれば、残りの上・左右のマージンは (BASE.horizAxis.icfb - BASE.horizAxis.ideo) の値で統一されます。
CFFテーブル
CFFテーブルは、それ自体が一つのフォント表現になっています。 そのため、CFFテーブルには単にグリフデータがあるだけではなく、フォント名やRegistry等のメタデータが格納されています。 フォントのROS (Registry, Order, Supplement) 情報(Adobe-Japan1-6等)はCFFに格納されます。
vhea, vmtx テーブル
vheaは日本語縦書き時のデフォルトの文字送りを、vmtxは縦書き時の個別の文字送り情報を格納するテーブルです。
日本語フォントの場合は、ベースラインを左右中心にします。 そのため、vhea.vertTypoAscenderやvhea.vertTypoDescender値は、head.unitPerEmの半分にします。
OpenTypeの漢字メトリックの例
以下に、OpenTypeの漢字のメトリック例を示します。
ベースライン例
横書き例
縦書き例
縦書きリガチャ
縦書き対応フォントは、さらに「縦書きリガチャ」に対応させることができます。現在、Adobe の Illustrator, InDesign 等が縦書きリガチャフォントに対応しています。 縦書きリガチャ対応のフォントを作成する際の注意点は以下のとおりです。
- 縦書きリガチャ用のグリフは Adobe-Japan1 では提供されていないため、CFF型では使い捨てROS (Adobe-Identity-0) を使います。
- OS/2 テーブルでは、UnicodeRangeにひらがな・漢字を、codePageRangeに932, 1251を指定して、日本語フォントであることを示します。
- 縦書きにおけるカーニングは、GPOSの`vkrn'で指定します。
- 縦書きリガチャは、GSUBの vert → liga の順番で適用されるように記述します。
- `vmtx'/`VORG' は、縦の開始位置は指定できても横の開始位置は指定できません。横の開始位置は (-1/2 * hmtx.advanceWidth) で決定されるため、縦書きにおいて横方向をずらしたい場合は、hmtx.advanceWidth を変えた別のグリフを用意して、`vert' でグリフを切り替えます。
絵文字
「絵文字」は、通常の文字とは異なり、色が使えます。Appleが開発し、MacOS Lionから添付しているフォントに含まれる "sbix" テーブルには、ビットマップの絵文字を含めることができます。また、W3Cにて現在標準化が策定されている "SVG "テーブルを使うことで、SVGで記述されたアウトライン型の色・グラデーション・アニメーションが可能な絵文字が利用できます。sbixテーブル
`Apple Color Emoji' は、glyfデータの代わりに sbixデータが入ります。 以下に、`sbix' データのフォーマット(推定)を示します。
| Type | Name | 内容(推定) | AppleColorEmoji.ttfの値 |
|---|---|---|---|
| ULONG | version | バージョン番号 | 0x00010001 |
| ULONG | numImgTables | 画像テーブルの個数 | 7 |
| ULONG | offset[numImgTables] | 画像テーブルへのオフセット | 00000024, 00077818, 0015da84, 00289574, 004129e8, 0065846c, 00a74190 |
| Type | Name | 内容(推定) | AppleColorEmoji.ttf の値 |
|---|---|---|---|
| USHORT | height | 文字の高さ(ピクセル数) | 20, 32, 40, 48, 64, 96, 160 |
| USHORT | DPI | 解像度 | 72 |
| ULONG | ImageOffset[maxp.numGlyphs+1] | 各画像データへのオフセット | (728文字) |
| VARIABLE | imagedata[] | 各画像データ |
| Type | Name | 内容(推定) | AppleColorEmoji.ttf の値 |
|---|---|---|---|
| ULONG | ?? | 00000000 | |
| ULONG | Kind | 画像種類 | 706E6720 (`PNG ') |
| VARIABLE | Binary | バイナリデータ | PNGバイナリ |
文字コードから画像データ番号への変換にはcmapを用います。文字の横幅・縦幅の情報のうち、縦幅(横幅)の情報はsbix.heightで取得できますが、 他方の値の取得方法は不明です。 (正方形であることを仮定するか、PNGデータから取得するか、hmtx, vmtx などのadvance値から取得する等の方法が考えられます。)
| 項目 | 数値 |
|---|---|
| maxp.numGlyphs | 728 |
| unitsPerEm | 800 |
| OS/2.sTypoAscender | 750 |
| OS/2.sTypoDescender | -250 |
| hhea.advanceWidthMax | 800 |
| vhea.ascent | 500 |
| vhea.descent | -500 |
| vhea.advanceHeightMax | 800 |
| vmtx.height | 800 |
| vmtx.topSideBearing | 0 |
unitPerEmは800、OS/2.sTypoAscenderが750, OS/2.sTypoDescenderが250、vmtx.topSideBearingは0ですので、欧文ベースラインでの横書き時は全体の1/16だけベースラインの下に、15/16はベースラインの上に描画します。 和文の場合はベースラインは漢字と同様に扱います。
SVGテーブル
SVGテーブルは、各テーブル値の導出表
以下は、OpenTypeの各テーブル値のうち、他テーブル値や情報から導出できる値の一覧表です。
漢字フォントは、head.unitPerEm(横幅ユニット)が、OS/2.sTypoAscender+OS/2.sTypoDescender(縦幅ユニット)と一致することが前提となります。 (欧文フォントでも、head.unitPerEmとOS/2.sTypoAscender+OS/2.sTypoDescenderの値が一致することが推奨されます。)
| テーブル値 | 内容 | |
|---|---|---|
| head.unitPerEm | 推奨 | OS/2.sTypoAscender+OS/2.sTypoDescender(漢字フォントのみ) (TrueType型は256/1024等の2のべき乗数, CFF型は1000が多い。) |
| cmap.platformID | 推奨 | name.nameRecord.platformID |
| cmap.encodingID | 推奨 | name.nameRecord.encodingID |
| hhea.advanceWidthMax | 必須 | Max(hmtx.advance) |
| hhea.ascender | 必須 | Max(glyf.yMax) |
| hhea.descender | 必須 | -Min(glyf.yMin) |
| hhea.minLeftSideBearing | 必須 | Min(hmtx.leftSideBearing) |
| hhea.minRightSideBearing | 必須 | Min(hmtx.advanceWidth - hmtx.leftSideBearing - glyf.xMax + glyf.xMin) |
| hhea.xMaxExtent | 必須 | Max(hmtx.leftSideBearing + glyf.xMax - glyf.xMin) |
| hmtx.leftSideBearing | 必須 | glyf.xmin (TrueType型) |
| vhea.minBottomSideBearing | 必須 | Min(vmtx.advanceHeight - vmtx.topSideBearing - glyh.yMax + glyh.yMin) |
| vhea.minTopSideBearing | 必須 | Min(vmtx.topSideBearing) |
| vhea.vertTypoAscender | 推奨 | head.unitPerEm/2 |
| vhea.vertTypoDescender | 推奨 | head.unitPerEm/2 |
| vhea.vertTypoLineGap | 推奨 | head.unitPerEm*(0.07〜0.10) |
| vhea.yMaxExtent | 必須 | Max(vmtx.topSideBearing + glyf.yMax- glyf.yMin) |
| vmtx.advanceHeight | 推奨 | OS/2.sTypoAscender+OS/2.sTypoDescender |
| vmtx.topSideBearing | 推奨 | OS/2.sTypoAscender-glyf.yMax |
| BASE.horizAxis.ideo | 推奨 | OS/2.sTypoDescender |
| BASE.horizAxis.idtp | 推奨 | OS/2.sTypoAscender |
| BASE.vertAxis.ideo | 必須 | 0 |
| BASE.vertAxis.idtp | 推奨 | head.unitPerEm |
| BASE.horizAxis.icfb | 推奨 | BASE.horizAxis.ideo + unitPerEm*(0.04前後) (他の平均字面の値は設定不要) |
| BASE.horizAxis.icft | 推奨 | BASE.horizAxis.idtp - unitPerEm*(0.04前後) (不要) |
| BASE.vertAxis.icfb | 推奨 | unitPerEm*(0.04前後) (不要) |
| BASE.vertAxis.icft | 推奨 | BASE.vertAxis.idtp - unitPerEm*(0.04前後) (不要) |
| GDEF.AttachList.Coverage | 推奨 | GPOSの対象グリフの一覧 |
| OS/2.sTypoLineGap | 推奨 | head.unitPerEm*(0.07〜0.10) |
| VORG.vertOriginY | 必須 | CFF.仮想yMax+vmtx.topSideBearing (CFF型) |
ツール類
- George Williams, FontForge
- Just van Rossum, TTX/FontTools
- ttftinker
- Adobe Systems Inc., Adobe Font Development Kit for OpenType (AFDKO)
- Adobe Systems Inc., Tin
関連リンク・資料集
- OpenType仕様書:Microsoft版, 国際規格版(ISO/IEC 14496-22:2009)(PAS から入手可能。)
- OpenType仕様書:Recommendation for OpenType Fonts
- Adobe Systems, Font technical notes
- TK, ChartWell Font
- BibLaTeXファイル