hhea, hmtx テーブル
hhea と hmtx テーブルには、水平レイアウト (横書き) の情報が格納されています。
「hhea」には、ヘッダ情報が格納されており、
「hmtx」には、各グリフの「advance width」と「left side bearing」が格納されています。
「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 minLeftSideBearing | lsb の最小値 |
FWORD minRightSideBearing | rsb の最小値。 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 metricDataFormat | hmtx テーブルのデータフォーマット。 現在は 0 のみ。 |
uint16 numberOfHMetrics | hmtx テーブルの hMetric 配列の数 |
hmtx テーブル
すべてのグリフの lsb と aw が格納されています。
※ numberOfHMetrics は、hhea テーブル内の値です。
※ numGlyphs は、maxp テーブル内の値です。
※ numberOfHMetrics は、hhea テーブル内の値です。
※ numGlyphs は、maxp テーブル内の値です。
longHorMetric hMetrics[numberOfHMetrics] | 各グリフのデータの配列。 グリフインデックス値を配列の添字とする。 numberOfHMetrics が numGlyphs より少ない場合は、配列の最後の advanceWidth 値を、残りのすべてのグリフに適用する。 |
---|---|
int16 leftSideBearings[numGlyphs - numberOfHMetrics] | numberOfHMetrics 以上のグリフ ID の、各 lsb 値 |
longHorMetric
int16 advanceWidth | 送り幅 (フォントデザイン単位) |
---|---|
int16 lsb | left side bearing 値 (フォントデザイン単位) |
プログラム
>> 09_hhea_hmtx.c
hhea と hmtx テーブルのデータを表示します。
グリフ数が多い場合は行数が長いので、テキストに出力するなどしてください。
グリフ ID = 0 にもデータがありますが、フォントによっては、フォント内に存在しないグリフを表すためのグリフデータが定義されている場合があります。
グリフ ID = 0 のグリフを FontForge で確認したい場合は、メニューから「表示」>「移動」で、入力欄に「.notdef」(グリフ ID = 0 のグリフ名) を入力して移動すると、グリフを確認できます。
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 のグリフ名) を入力して移動すると、グリフを確認できます。