見出し画像

フォントを読む 第14回 フォントのサイズと位置合わせ

 さらっと流される割に難解な気がする。

 フォントの座標軸は左下を0,0とし、その線をbaselineと指定し、それより下にある部分をdescender、上をascenderと指定する。

フォントの座標系

 この数字は、hhea,hvmtxに格納されているのだが確認してみよう。

HHEA

Ascender 1160
Descender -288
Line Gap 0
Advance Width Max 3000
Min Left Side Bearing -1002
Min Right Side Bearing -551

Notosans-JP-Regular

 Ascenderは1160、Descenderは-288に設定されている。Line Gapは0のなので、縦は、$${1160 - -288 + 0 = 1448}になる。一方Advance Widthの最大値は3000だが、min LSBとmin RSBがマイナスに設定されているので、実際の最大幅は$${3000 - 1002 - 551 = 1447}$$が計算できるが、min LSBかつmin RSBにならない可能性を考えると縦と同じ1448だろう。

 実際のところAdvance Widthはグリフ1つ1つに設定されているのでグリフIDを取得してhmtxを読み出す必要がある。

1: avance width 555
g : advance width 564
あ: advance width 1000
御: advance width 1000

 実際のフォントは漢字は基本的にBASELINEより上に配置されるので、その部分が削られてAdvance widthは1000が標準になっていた。

 しかしコンピュータグラフィックの座標系は右上を(0, 0)にするので座標系の変換が必要になる。

 それだけではなく、実際の画面に表示するピクセル数はディスプレイのDPIとフォントサイズ(pt = 1/72インチ)で決まる。

 96DPIのディスプレイに16ptのフォントの場合、縦は24px になる。問題は横で、$${ 24 \times advance\_width/ (Ascender -  Descender + Linegap)  }$$になるはず。フォントによって24pxだったり、16pxだったりする。

 問題は、Linegapでこれが入ると突然、計算が面倒になる。Linegapが入って居るフォントの漢字は概ねBASELINEからはみ出ている。例えば游明朝はaccenderが1802が、avance width 2048なので漢字は2048x2048になる。BASELINEより下に食い込んでいるらしい。さらにLinegapが1000存在する。Linegapは下に余白を入れるのでサイズがさらに小さくなるはず。もっともLinegapは推奨値なので無視しても良いはずなのだが。

 なお、この値はCFFフォントでは意味をなさない。CFFは無視しないと正しく展開できなかった。CFF2では使うらしい。

この記事が気に入ったらサポートをしてみませんか?