1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Fonttoolsを使ってビットマップ(風)TrueTypeフォントを作る

Last updated at Posted at 2023-09-15

概要

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?