言語ゲーム

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

Twitter: @propella

Squeak のフォントについて

私がアホすぎて Squeak のフォントは難くて分からなくて忘れるのでメモ。

文字とは何か?

Squeak では文字列と文字は厳密に区別されている。文字は 'もじれつ' だけど、文字は $も のようにプログラムの中で書く。それぞれの文字ごとに、コンピュータの中で違った数字が割り当てられていて、asciiValue で取り出す事が出来る。asciiValue は ascii とは関係無い Squeak 独自の文字コードだ。

$も asciiValue 20983938

この 20983938 という数字は何かと言うと、「も」の unicode 番号の 0x3082(charCode と呼ぶ)、日本語文字を表す番号(leadingChar と呼ぶ) 5、マジックナンバー 0x400000 を組み合わせ次の式で求める事が出来る。下位 1-22 ビットを charCode (1ビット分オマケか?)、その上 23-30 ビットを leadingChar に使っていると考えても良い。

4194304 * 5 + 12418 = 20983938 (10進)
0x400000 * 5 + 0x3082 = 0x1403082 (16進)

leadingChar は、日本語以外に次の物があって、LanguageEnvironment
class>>leadingChar で定義されている。かなり欠番がある。

  • Latin1 0
  • Japanese 5
  • SimplifiedChinese 6
  • Greek 13
  • Latin2 14
  • Russian 15

フォントとは何か

文字コードから文字の形への対応がフォントだ。普通フォントと言うと字の形だけ言う時もあるけど、この場合形やサイズや太字や斜めや、そういうちょっと属性の違う物も別のフォントと数える。また、は文字コード(asciiValue)では無く、charCode(UNICODE) を使って対応を行う。実装の自由度を上げるため(?) Squeak の中ではコードから画像を得るメソッドは必須では無く、代わりにdisplayString:on:from:to:at:kern: という BitBlt に文字列を描画するメソッドが必要条件になっている。なので、テストは面倒だ。

| bb |
bb _ Display getCanvas privatePort.
bb combinationRule: Form paint.
TextStyle defaultFont installOn: bb foregroundColor: Color black backgroundColor: Color white.
TextStyle defaultFont displayString: 'も' on: bb from: 1 to: 1 at: 10@100 kern: 1.

フォントの違い

AbstractFont 以下、様々なクラスが定義されている。

  • StrikeFont : ビットマップフォント
  • StrikeFontSet : leadingChar に応じて複数の StrikeFont を格納出来る。まず leadingChar に対応する場所を調べ、次に Latin1 の場所を調べる。
  • TTCFont : ベクターフォント
  • MultiTTCFont : TTCFont のマルチバイト版?
  • TTCFontSet : StrikeFontSet のベクターフォント版?

フォント読み込みの手順

続く。