hhea, hmtx テーブル

hhea, hmtx テーブル
hhea と hmtx テーブルには、水平レイアウト (横書き) の情報が格納されています。

hhea」には、ヘッダ情報が格納されており、
hmtx」には、各グリフの「advance width」と「left side bearing」が格納されています。
グリフの水平レイアウトについて


ascender
原点からグリフの上端までの距離です。

descender
原点からグリフの下端までの距離です。
基本的に負の値です。

ascender - descender」が、文字の高さとなります。

lineGap
行間の幅です。
現在の原点位置から、次の行の原点までの高さは、「ascender - descender + lineGap」となります。

行間が広いフォントは、ここで値が設定されていることが多いです。

xMin, xMax
グリフの輪郭の、左端と右端の X 座標値です。

TrueType アウトラインでは glyf テーブルにこの値が存在しますが、PostScript アウトラインではこのデータは存在しません。

advance width (略して "aw")
その文字の原点から、次の文字の原点までの距離です。
グリフを1文字描画した後は、X 座標にこの値を足して、次の文字の位置へ移動します。

空白文字 (U+0020) などでは、GID は存在しますが、アウトラインデータはありません。
(TrueType アウトラインの場合は空のグリフデータになりますが、PostScript アウトラインの場合は、空白文字でもグリフデータはあります)
しかし、アウトラインデータはなくても、空白分の距離は移動しなければならないので、advance width の値を使います。

hmtx テーブル内にこの値が含まれています。
なお、PostScript アウトラインの CFF データ (ver 1) 内では、グリフデータと共にこの値も含まれています。

left side bearing (略して "lsb")
原点から、グリフの輪郭の左端の位置までの距離です。
基本的に xMin の値と同じです。

なお、この値は「グリフデータの各座標点の最小 X 位置」ではなく、「実際の輪郭線の最小 X 位置」です。
輪郭線上にない制御点の位置は含みません。

hmtx テーブル内にこの値が含まれています。

right side beargin (略して "rsb")
グリフの輪郭の右端の位置から、次の文字の位置 (advance width の位置) までの距離です。
値としてはどこにも存在せず、計算で求めます。

rsb = advanceWidth - lsb - (xMax - xMin)
hhea テーブル
hhea テーブルには、hmtx テーブルのデータ情報も含まれています。

uint16メジャーバージョン = 1
uint16マイナーバージョン = 0
FWORD ascenderベースラインからの高さ
FWORD descenderベースラインからの深さ
FWORD lineGap行間
UFWORD advanceWidthMax各グリフの advance width の最大値
FWORD minLeftSideBearinglsb の最小値
FWORD minRightSideBearingrsb の最小値。
Min(advanceWidth - lsb - (xMax - xMin))
FWORD xMaxExtent原点からグリフの輪郭の右端までの距離の最大値。
Max(lsb + (xMax - xMin))
int16 caretSlopeRise斜体フォント時のカーソルの傾きを計算するための値。
垂直なら 1。
「caretSlopeRise / caretSlopeRun = tan(角度)」となる。
int16 caretSlopeRun上と同じ。垂直なら 0。
int16 caretOffset斜体フォント時のカーソル位置の移動量。
傾斜していないフォントの場合は 0。
int16 [4]予約 = 0
int16 metricDataFormathmtx テーブルのデータフォーマット。
現在は 0 のみ。
uint16 numberOfHMetricshmtx テーブルの hMetric 配列の数
hmtx テーブル
すべてのグリフの lsb と aw が格納されています。

numberOfHMetrics は、hhea テーブル内の値です。
numGlyphs は、maxp テーブル内の値です。

longHorMetric hMetrics[numberOfHMetrics]各グリフのデータの配列。
グリフインデックス値を配列の添字とする。

numberOfHMetrics が numGlyphs より少ない場合は、配列の最後の advanceWidth 値を、残りのすべてのグリフに適用する。
int16 leftSideBearings[numGlyphs - numberOfHMetrics]numberOfHMetrics 以上のグリフ ID の、各 lsb 値

longHorMetric
int16 advanceWidth送り幅 (フォントデザイン単位)
int16 lsbleft side bearing 値 (フォントデザイン単位)
プログラム
>> 09_hhea_hmtx.c

hhea と hmtx テーブルのデータを表示します。
グリフ数が多い場合は行数が長いので、テキストに出力するなどしてください。

numGlyphs: 12239

---- hhea ----

version: 1.0
ascender: 1802
descender: -246
lineGap: 0
advanceWidthMax: 2048
minLeftSideBearing: -553
minRightSideBearing: -551
xMaxExtent: 2048
caretSlopeRise: 1
caretSlopeRun: 0
caretOffset: 0
metricDataFormat: 0
numberOfHMetrics: 12218

---- hmtx ----

[ gid ] aw, lsb
[00000] 2048, 205
[00001] 0, 0
[00002] 0, 0
[00003] 553, 0
[00004] 610, 199
[00005] 692, 104
...

グリフ ID = 0 にもデータがありますが、フォントによっては、フォント内に存在しないグリフを表すためのグリフデータが定義されている場合があります。

グリフ ID = 0 のグリフを FontForge で確認したい場合は、メニューから「表示」>「移動」で、入力欄に「.notdef」(グリフ ID = 0 のグリフ名) を入力して移動すると、グリフを確認できます。