概要
status bar用ビットマップフォントの輪郭を抽出してTrueTypeフォント(.ttf
)に変換した.
OpenTypeビットマップフォントは使えない?
Opentype bitmap font.otb
は現在, pangoで唯一サポートしているの ビットマップフォントフォーマットですが. fonttoolsのfontBuilderはビットマップフォントを対応していない. 直接にEBDT/EBLC tablesなどを書き込むのためpatchが必要みたいです. また,.otb
の移植性などの懸念などいろんな問題があるの結果, 今は安定したttfベクターフォントを最初に作り上げることを決めた.
Patchはmonobitの実現によると: https://github.com/robhagemans/monobit/blob/3d19d930344f18080253b4046bb711aaea5620ba/monobit/formats/sfnt/fonttools/__init__.py#L24)
流れ
まずテキストフォントを作る: https://github.com/6e5d/sb7x8. 一行目はunicode数,そして幅×高の1 bitピクセルデータ:
48
1111111
11...11
11..111
11.1111
1111.11
111..11
1111111
.......
TrueType自体はcontourの回り方向の要求はないが, 一応左手方向=内部を定義する(ソリッド=左巻き,穴=右巻き). この設計を利用して,tracingの時パスは簡単に左回りルールで選択できる. こんな回りの辺を作るため,ピクセルずつ左回りで辺を追加が, その辺は2回作る(必ず逆の方向)の場合は相殺する:
この辺の集合を作った後,通常に,全部の辺を順序に連結してパスを作り上げる. しかし,頂点は2つではなく,4つの辺を接続する場合は,パスを簡単に決めることができない. ここで左手法則に利用して左回りだけパスを選択する.
左は左手法則に従っていない(左はピクセルではなく) 一方, 右は左回りだけを使って,字体の輪郭が正しく囲まれる.
最後はfonttools.fontBuilderを使って輪郭パスを書き込む. fontBuilderのソースコードに使用例が添付されている: https://github.com/fonttools/fonttools/blob/1ef556995973759cb0bc0b123dfc8748e09a9843/Lib/fontTools/fontBuilder.py#L25.
参考
ソースコード: https://github.com/6e5d/bit2svg
-
fonttosfnt: https://gitlab.freedesktop.org/xorg/app/fonttosfnt
-
fonttools: https://github.com/fonttools/fonttools