言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

Squeak 日本語フォントの仕組み

http://squeak.qp.land.to/mt/archives/2005/08/svg_exporter_fo.html で疑問がありましたので、Squeak のフォントについて知ってる事を書いてみます。

Squeak にとってフォントとは何か?

一番基本的なビットマップフォントである StrikeFont クラスのコメントによれば、フォントとは、ある文字の姿を表現するための何かで、具体的には #displayString:on:from:to:at:kern: が実装されたクラスです。このメソッドは、ある文字列と描画情報(BitBlt)を受け取り、描画情報に文字列の姿(グリフ)を書き込みます。「文字」ではなく「文字列」なのはパフォーマンス上の理由だと思われます。

よく「フォント」と言うときには、大きさの違いや斜体などの強調を纏めて一つのフォントだと言ってしまう事もありますが、ここで言うフォントは大きさや強調が変わるだけでも別物です。ただし、色違いだけは同じフォントです。

話が前後しますが、最適化の為(?) 描画の前に#installOn:foregroundColor:backgroundColor: によってある程度事前に情報をフォントに伝えます。これ以外はだいたい「ステートレス」です。つまり、描画ごとに必要な情報をフォントオブジェクトに伝える必要があります。

テキストとフォント

Squeak の特徴の一つに、文字が書ける場所ならどこでも大体複数の書体を混ぜる事が出来るという事があります。これら書体が混ざった文書を Text オブジェクトと言います。しかし、フォント自体は一つの書体の書き方しか知らないため、複数のフォントを組み合わせて表示します。このあたりのソースは何度も読んだのですが、ものすごい複雑で今読み返しても分からないので省略します。

日本語フォント

日本語を表示させるためには、StrikeFont ではなく、StrikeFontSet を使います。StrikeFontSet は StrikeFont と同じメソッドを持つクラスで、多言語化された Squeak では、StrikeFont を直接使う事はありません。StrikeFontSet には言語ごとに複数のグリフが割り当てられており、同じ文字コードでも言語によって別のグリフを表示する事が出来ます。Nihongo7 では、Acunny という名前のフォントに東雲ビットマップフォントが割り当てられています。(http://d.hatena.ne.jp/propella/20041216/p2 参照)。つまり、ここでは Acunny フォントに「標準フォント」としての意味合いが込められています。

フォールバック

フォントによっては、ある文字コードにグリフが存在しない場合があります。このような時にフォールバックフォントが使われます。フォールバックフォントはフォントごとに存在し、多くの場合近いサイズの Acunny が使われます。Acunny 自体のフォールバックフォントは?マークとなっており、最終的に何も表示できる物が無ければ?が表示されます。

アウトライン

ライセンスの問題から、Nihongo7 には標準でアウトラインフォントが含まれていません。もしも Nihongo 7 Release Note の手順でアウトラインフォントがインストールされると、TTC ファイルに記述されたフォント名(MultiMSGothic) でインストールされると共に、全てのアウトラインフォントのフォールバックに、MSゴシックが設定されます。

何故テキストモーフのフォント名が BitStreamVeraSans なのか

標準で、テキストモーフには BitStreamVeraSans が使われています。これには日本語の書体が無いので、Nihongo7 ではフォールバックに指定された東雲が表示されます。もしもMSゴシックをインストールした後ならMSゴシックが表示されます。

ややこしい原因は何か

多分、論理フォント名を使うべきなんだろうと思います。