にせねこメモ

はてなダイアリーがUTF-8じゃないので移ってきました。

Appleカラーフォントのビットマップの表示位置

Appleカラーフォントを弄っていて、‘sbix’テーブルに含まれるビットマップが表示される位置はどのように決められるのだろうと疑問に思ったので試した。

Apple Color Emoji.ttf では、units per em が 800, ascendt が 800, descent が -250 に設定されている。
また、sbixにビットマップが指定されているグリフには、アウトラインとして、「(0, 0)の点」「(800, 800)の点」が含まれている。


ここでは、とりあえず units per em が 800, ascender が 800, descender が -250の値を使う。
まずは原色の正方形のpng(128x128)をsbixのビットマップとして使う。


アウトラインに何も設定しない状態でビットマップを表示すると、ベースラインより少し下に表示されるようである。
また、アウトラインが含まれるかによって表示される位置が変わってくるようだ。


以下の画像では、色のついた四角は単色に塗りつぶした128x128のビットマップ(ppem=128, dpi=72)であり、黒い線がアウトラインである。
一番左がベースラインとアセンダハイトとグリフの幅を示す(0, 0) - (800, 800)の正方形とその下にディセンダ(y=-250)を示す直線を引いている。
これを見るとアウトラインの位置によってビットマップが表示される位置が変わってくるようである。
f:id:nixeneko:20150609234116p:plain


次の画像は、各グリフに長方形のストロークをもたせているが、上辺を固定して下辺の位置を変化させたものである。
一番左がストロークに何も指定しない場合、次が(0, 0)-(800, 800)の四角とディセンダを示すアウトライン、その次からが正方形のビットマップの上にアウトラインを指定した場合である。
f:id:nixeneko:20150610001119p:plain
ここから、ストロークがある場合、そのyの最小値よりもいくらか下にビットマップが描かれているようだとわかる。ストロークがない場合は、ストロークのyの最小値が0である時と同じ扱いになるようだ。


ここで、Units/EMを1050にし、 ascent=800, descent=-250 の値と整合性をもたせてみる。(units/emの数値とascent+descentは特に一致している必要はない。Fontforgeではunits/em = ascent + descentとなるようにしか設定できないが。)
次の画像がそれである。
f:id:nixeneko:20150615202143p:plain
幅は800になっている。縦の幅がアセンダからディセンダまでの幅になっているようだ。また、グリフの横幅が800なので次のグリフに重なっている。画像が表示されるサイズはUnits/EMが基準になっているのがわかる。


次に、逆にUnits/EMを800のままascent = 800, descent = 0 にして整合性を持たせてみる。
f:id:nixeneko:20150616112219p:plain
縦の幅も800 units/emなので、ビットマップが縦に連なったりストロークによってはビットマップが重なったりしている。

また、次の画像のように、他のフォントと混植するとそのフォントに合わせてディセンダが広がる。
f:id:nixeneko:20150616112849p:plain


また、Units/EMを800のままascent = 800, descent = -250に戻す。この状態でフォントサイズを小さくするとアウトラインとビットマップがずれる。24ptくらいより小さくするとずれるっぽい?
f:id:nixeneko:20150616165430p:plain

ppem=128のstrikeだけしかないのが原因なのかと思い、ppem=16のstrikeを追加してみた。
f:id:nixeneko:20150616165608p:plain
変化がわからない。

さらにppem=36を追加。ビットマップとアウトラインにずれがあるのに変わりはない。
f:id:nixeneko:20150616165652p:plain
ひょっとしたら、これはアウトラインの方の問題なのかもしれない。

(書き足したい)