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

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 Sequences14
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 BMP4
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
6PostScript名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テーブルは良く似た階層構造を持ちます。

各テーブルの階層構造
テーブル第一層第二層第三層第四層
GPOSScript Tags Language Tags Feature Tags Lookup Tables
GSUBScript Tags Language Tags Feature Tags Lookup Tables
BASE HorizAxis/
VertAxis
Baseline Tags
Script Tags Base Values
JSTF Script Tags Glyphs
Language Tags 拡張優先度
縮小優先度
GDEFGlyph Class Def
Attachment List
Ligature Caret ListLigature Caret
Mark Glyph Class
Mark Glyph List
Lookupテーブルの種類
番号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テーブル

和文・欧文の主な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
jp04JIS2004字形1
jp78JIS78字形1
jp83JIS83字形1
jp90JIS90字形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
twid1

GPOSテーブル

和文の主なGPOS機能
機能名 説明Lookupテーブル例
halt全角文字を半角スペースにする。1
kernカーニング2
palt全角文字をプロポーショナルスペースにする。1
vhal全角文字を垂直半角スペースにする。1
vkrn垂直カーニング2
vpal全角文字をプロポーショナルスペースにする。1
cpsp全大文字用のスペーシングにする。1

BASEテーブル

BASEテーブルは、ラテン文字・仮名漢字・チベット文字・数式のベースラインを合わせるのに利用します。

和文フォントの場合は仮想ボディ・平均字面を設定できます。 そのため、和欧混植を行う際に、欧文のベースラインと和文のベースラインの調整に利用できます。

和文仮想ボディ
種類 BASEテーブル設定済 BASEテーブル未設定
仮想ボディの下BASE.horizAxis.ideoOS/2.sTypoDescender
仮想ボディの上BASE.horizAxis.idtpOS/2.sTypoAscender
仮想ボディの幅BASE.vertAxis.idtp head.unitsPerEm
和文平均字面
種類 BASEテーブル設定済 BASEテーブル未設定
平均字面の下BASE.horizAxis.icfbOS/2.sTypoDescender
平均字面の上BASE.horizAxis.icftOS/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 等が縦書きリガチャフォントに対応しています。 縦書きリガチャ対応のフォントを作成する際の注意点は以下のとおりです。

絵文字

「絵文字」は、通常の文字とは異なり、色が使えます。Appleが開発し、MacOS Lionから添付しているフォントに含まれる "sbix" テーブルには、ビットマップの絵文字を含めることができます。また、W3Cにて現在標準化が策定されている "SVG "テーブルを使うことで、SVGで記述されたアウトライン型の色・グラデーション・アニメーションが可能な絵文字が利用できます。

sbixテーブル

`Apple Color Emoji' は、glyfデータの代わりに sbixデータが入ります。 以下に、`sbix' データのフォーマット(推定)を示します。

sbix
Type Name 内容(推定) AppleColorEmoji.ttfの値
ULONGversion バージョン番号 0x00010001
ULONGnumImgTables 画像テーブルの個数 7
ULONGoffset[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文字)
VARIABLEimagedata[] 各画像データ
画像データ
Type Name 内容(推定) AppleColorEmoji.ttf の値
ULONG ?? 00000000
ULONG Kind 画像種類 706E6720 (`PNG ')
VARIABLEBinary バイナリデータPNGバイナリ

文字コードから画像データ番号への変換にはcmapを用います。文字の横幅・縦幅の情報のうち、縦幅(横幅)の情報はsbix.heightで取得できますが、 他方の値の取得方法は不明です。 (正方形であることを仮定するか、PNGデータから取得するか、hmtx, vmtx などのadvance値から取得する等の方法が考えられます。)

Apple Color Emoji データ
項目数値
maxp.numGlyphs728
unitsPerEm800
OS/2.sTypoAscender750
OS/2.sTypoDescender-250
hhea.advanceWidthMax800
vhea.ascent500
vhea.descent-500
vhea.advanceHeightMax800
vmtx.height800
vmtx.topSideBearing0

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型)

ツール類

関連リンク・資料集