借り初めのひみつきち

仮ブログです。

Rust 自作 OS 日記/Part 4 フォントのはなし

古きよき太古のコンピューターは ROM にフォントを内蔵していたので文字コードを指定するだけで画面に文字を表示することができました。 現代のコンピューターは広大な画面に自由に図形を描画できるようになった代償として文字を表示するためにフォントが必要になりました。

ラスターフォントとベクターフォント

さて、フォントデータの形式は大きく分けるとラスターフォントとベクターフォントの2種類に大別されます。

ラスターフォントはラスタライズされたピクセルの集合で表現します。 メリットはコンピューターの画面もほぼ同じ仕組みで画像を表示しているので表示するための処理が簡単なところです。 デメリットはあらかじめ設計された固定サイズの表示が基本となり、拡大や縮小は無理やりアルゴリズムで補完してもあまり綺麗な表示はできません。 古いコンピューターや組み込み用途でよく使われます。自作 OS も大半はこの方式のフォントです。

ベクターフォントはペンで書くための座標の軌跡の組み合わせのようなデータ表現です。 メリットは座標の組み合わせのデータなので拡大縮小が容易です。ただし、小さいサイズや極端に大きいサイズはそのままではあまり綺麗に描画できません。 デメリットは画面に表示するためにペンを動かして描画する必要があるため処理が複雑になります。 現代の OS の GUI フォントは基本こちらを利用します。

このようにふたつのフォント形式はほぼ反対の性質を持っているので適材適所で使い分けされます。

コンソール用途ではラスターフォントで十分ですが、 GUI の画面はさまざまなフォントが必要になってくるためラスターフォントでは対応するのが困難になってきます。ベクターフォントが欲しいところです。

Hershey フォント

ベクターフォントといえば TrueType や OpenType が有名ですね。 こちらもそのうち対応したいところですが、仕様が複雑すぎていきなり実装は無理なので良いライブラリを探してくる必要がありそうです。

ところで、実はもっと簡単に対応できるフォントがあります。

Hershey fonts - Wikipedia

このフォントは座標のセットがテキストでエンコードされており、デコードして直線で繋ぐだけで描画できます。 理論上、 32 x 32 くらいのサイズを超えるフォントは実現不可能で曲線も表現できないのでそれほど複雑なフォントは表現できないですが、 それでもベクターフォントなのである程度の拡大縮小は自在です。

私の OS

そんなわけで私の OS にも実装してみました。

f:id:neriring16:20201013202656p:plain

f:id:neriring16:20201013202714p:plain

f:id:neriring16:20201013202725p:plain

このようにさまざまなフォントがさまざまなサイズで描画されて、だいぶそれっぽくなってきました。

見た目だけなら moe に近づいてきたか、もう追い越してる感じがしてきました。

ほんとのところは別のところに手をつけたかったですが、さいきん時間があまり取れなくて日記を書くのが遅れてしまいました(/ _ ; )