OS/2 テーブル

OS/2 テーブル
'OS/2' テーブル」には、フォントの色々な情報が格納されています。
必須テーブルです。

テーブルデータのバージョンは 0〜5 まであります。

ver 0TrueType revision 1.5 で定義
ver 1TrueType revision 1.66 で定義
ver 2OpenType 1.1 で定義
ver 3OpenType 1.4 で定義
ver 4OpenType 1.5 で定義
ver 5OpenType 1.7 で定義

実際には、ver 1 or 3 を使用しているフォントが多いです。
テーブルデータ
uint16 versionバージョン番号。0〜5
int16 xAvgCharWidthフォント内のすべての、幅が 0 でないグリフの平均幅。
uint16 usWeightClassフォントの太さ (1〜1000)。

100 : Thin
200 : Extra-light (Ultra-light)
300 : Light
400 : Normal (Regular)
500 : Medium
600 : Semi-bold (Demi-bold)
700 : Bold
800 : Extra-bold (Ultra-bold)
900 : Black (Heavy)
uint16 usWidthClassフォントの相対的な文字幅。

1 : Ultra-condensed [50%]
2 : Extra-condensed [62.5%]
3 : Condensed [75%]
4 : Semi-condensed [87.5%]
5 : Medium (normal) [100%]
6 : Semi-expanded [112.5%]
7 : Expanded [125%]
8 : Extra-expanded [150%]
9 : Ultra-expanded [200%]
uint16 fsTypeドキュメントへのフォント埋め込みに関するフラグ。

0-3bit: 使用許可。有効な値な以下のみ。
[0] フォントは埋め込み可能で、そのフォントをインストールすることもできる
[2] 埋め込みを許可しない
[4] 表示と印刷のためにのみ埋め込むことが可能
[8] 編集可能 (表示と印刷に加えて、編集を行うこができる)

8bit: フォントの埋め込み時に、サブセットを許可しない
9bit: ビットマップのみ埋め込み可能

他のビットは予約扱いで、0。
int16 ySubscriptXSize下付き文字の推奨水平幅 (フォントデザイン単位)
int16 ySubscriptYSize下付き文字の推奨垂直高さ
int16 ySubscriptXOffset下付き文字の推奨 x 移動値
int16 ySubscriptYOffset下付き文字の推奨 y 移動値
int16 ySuperscriptXSize上付き文字の推奨水平幅
int16 ySuperscriptYSize上付き文字の推奨垂直高さ
int16 ySuperscriptXOffset上付き文字の推奨 x 移動値
int16 ySuperscriptYOffset上付き文字の推奨 y 移動値
int16 yStrikeoutSize取り消し線の太さ (フォントデザイン単位)
int16 yStrikeoutPosition取り消し線の上の位置 (ベースラインに対する位置)
int16 sFamilyClass上位バイトにファミリークラス、下位バイトにサブクラス。
'Sans Serif' などのファミリーに分類させる。
ClassID = 0、SubclassID = 0 で、定義なし。
uint8 panose[10]各バイトで書体の特性を定義。
PANOSE

書体でフォントをマッチングする時に使います。
最初の 1byte がファミリの種類で、以降の値は、その種類によって異なります。

[0] Family Kind
2=Latin text(通常), 3=Latin Hand Written(手書き), 4=Latin Decorative(装飾), 5=Latin Symbol(記号など)

なお、10個の各値は、共通で以下の値を指定できます。
0 = Any (任意の数値にマッチ)
1 = No Fit (適合しない。未定義の書体時など)
uint32 ulUnicodeRange1
uint32 ulUnicodeRange2
uint32 ulUnicodeRange3
uint32 ulUnicodeRange4
計 128 bitのフラグ値。
((ulUnicodeRange4 << 96) | (ulUnicodeRange3 << 64) | (ulUnicodeRange2 << 32) | ulUnicodeRange1)

cmap に「platformID = 3、encodingID = 1 or 10」(Windows における Unicode) が含まれる場合、フォントに含まれている Unicode ブロックを指定するためのフラグ。
Tag achVendIDフォントベンダーID。
Microsoft によって ID が登録されている。
空白にする場合は、スペースを4つ並べる。
自作フォントの場合は、適当な名前を付ける。
uint16 fsSelectionフォントパターンに関するフラグ。

0 bit : italic or oblique の斜体グリフが含まれる
1 bit : 下線が引かれている
2 bit : グリフの前景と背景が逆になる
3 bit : 中を塗りつぶさないアウトライン
4 bit : 打ち消し線が引かれている
5 bit : 太字
6 bit : 標準の太さ
7 bit : デフォルトの行間として、以下の式を勧める
「sTypoAscender - sTypoDescender + sTypoLineGap」
8 bit : name テーブルの nameID = 21, 22 を使用しない
9 bit : oblique の斜体グリフが含まれる
10-15 bit : 予約(0)
uint16 usFirstCharIndexcmap に「platformID = 3、encodingID = 0 or 1」が含まれる場合、フォント内の最小の Unicode インデックス。
他の ASCII 文字などの文字セットでは、0x0020 となる。
最小値が 0x10000 以上の場合は、0xFFFF をセットする。
uint16 usLastCharIndex上と同じで、最大の Unicode インデックス。
U+10000 以上をサポートする場合は、0xFFFF にする。
int16 sTypoAscender印刷上のグリフの高さ。
縦書きの場合、em ボックスの上。
int16 sTypoDescender印刷上のグリフの深さ。
縦書きの場合、em ボックスの下。
int16 sTypoLineGap印刷上の行間。
sTypoAscender/sTypoDescender の値と組み合わせて行間を決める。
uint16 usWinAscentWindows でのグリフの高さ。
Windows GDI では、usWinAscent/usWinDecent を使って、レンダリング時のサイズが決められている。
座標が usWinAscent より上の位置はクリッピングされるため、クリッピングさせたくない場合はこの値を yMax 以上にする。
uint16 usWinDescentWindows でのグリフの深さ
ver 1 以降の場合、以下が続く
uint32 ulCodePageRange1
uint32 ulCodePageRange2
計 64 bit のフラグ値。
((ulCodePageRange2 << 32) | ulCodePageRange1)

cmap に「platformID = 3、encodingID = 1」 (Unicode BMP) が含まれる場合、どのコードページ (言語) が含まれているかを表す。

 bit   | code | 説明
       | page |
-------------------------
 0 bit | 1252 | Latin 1
 1 bit | 1250 | Latin 2: Eastern Europe
...
17 bit | 932  | JIS/Japan
...
31 bit | ---- | Symbol Character Set
ver 2 以降の場合、以下が続く
int16 sxHeightベースラインと、「x」のグリフの高さの間の距離。
文字「x」がない場合は、0 に設定する。
int16 sCapHeightベースラインと、「H」のグリフの高さの間の距離。
uint16 usDefaultCharフォントでサポートされていない文字の場合に、デフォルトとして使用する文字の Unicode 値。
0 の場合は、グリフ ID = 0 とする。
アプリケーションはこの値を使用しないことを推奨する。
uint16 usBreakCharデフォルトのブレーク文字の Unicode 値。
ほとんどのフォントでは、U+0020 (空白) を指定する。
アプリケーションはこの値を使用しないことを推奨する。
uint16 usMaxContext合字などの機能で、先読みする文字の最大数。
フォントがペアカーニングの機能のみを持つのであれば、2文字を扱うので、2。
3文字を1文字に置き換えるような機能があれば、3。
ver 5 以降の場合、以下が続く
uint16 usLowerOpticalPointSize
uint16 usUpperOpticalPointSize
この値は STAT テーブルに置き換えられています
プログラム
>> 06_os2.c

OS/2 テーブルのデータを表示するプログラムです。

---- OS/2 ----

version: 3
xAvgCharWidth: 956
usWeightClass: 400
usWidthClass: 5
fsType: 0x0000
ySubscriptXSize: 1024
ySubscriptYSize: 1579
ySubscriptXOffset: 0
ySubscriptYOffset: 307
ySuperscriptXSize: 1024
ySuperscriptYSize: 1579
ySuperscriptXOffset: 0
ySuperscriptYOffset: 0
yStrikeoutSize: 160
yStrikeoutPosition: 858
sFamilyClass: 0x0801
panose: 2,11,5,0,0,0,0,0,0,0,
ulUnicodeRange1-4: 0x00000000_00000012_3AC7EDFA_E00002FF
achVendID: 'IPA '
fsSelection: 0000_0000_0100_0000b
usFirstCharIndex: 0x0020
usLastCharIndex: 0xFFE8
sTypoAscender: 1802
sTypoDescender: -246
sTypoLineGap: 0
usWinAscent: 1802
usWinDescent: 401
ulCodePageRange1-2: 0x00000000_00020001
sxHeight: 1040
sCapHeight: 1483
usDefaultChar: 0x0000
usBreakChar: 0x0020
usMaxContext: 6