Yabu.log

ITなどの雑記

C言語で美咲フォントを扱う2

次回はコンソールに美咲フォントを出力して見たい

お約束の品です?

00111100
01000010
00000010
00001100
00010000
00000000
00010000
00000000

0を抜くとなんの文字かわかりやすいかもしれません

  1111
 1    1
      1
    11
   1

   1

前回記事のヘッダの解説が若干不足しているのでそこの補足と データ格納部の説明をしたいと思います。

$ ./font
hdader size is 18
filesignature is FONTX2
fontname is MISAKI
width is 8
hight is 8
char code flg is 1
blocks is 5c
  0 blocks start code is 0x4081
  0 blocks end   code is 0x7e81
  1 blocks start code is 0x8081
  1 blocks end   code is 0xac81
  2 blocks start code is 0xb881
  2 blocks end   code is 0xbf81
  3 blocks start code is 0xc881
  3 blocks end   code is 0xce81
・・・略
 91 blocks start code is 0x80ea
 91 blocks end   code is 0xa4ea

こんな感じでヘッダが18バイト続いた後、 blockテーブル(文字コードの範囲で一まとまりにしたblockの情報をまとめたテーブル) が18バイトめの値(美咲フォントの場0x5C = 十進数で92)分だけ続く

だからフォントのデータはファイル先頭から

18+92*4=386=0x182バイト目から始まります。

で、Sjis0x8140から順番に収められているが、 そこからヘッダ分の0x182を引いた適当なオフセットで計算すればいい。。。 というそんな単純なものではありません。

例えばSjisには文字が入っていないエリアがあります。

http://charset.7jp.net/sjis.html

例えば0x9f94〜0xe040です ここはブロックが変わったときに飛ばされています。

69 blocks end   code is 0xfc9f
70 blocks start code is 0x40e0

という訳で、

  • 文字のSJISのコードを得る
  • Sjisのコードから配置ブロックを探る
  • ブロックの中でのインデックスを求める

という手間が必要な訳です。 次回はこの辺の処理をうまく完成させます。

今日の疑問

前から結構思っていますが、16進数リテラルを表現する方法は色々あるけど

0x16
16H

10進数リテラルを表現する方法はマイナーな気がする

10D

一応後ろにDとつけることで10進数という意味になるらしいが、あまり見ない。 基本的に数値に何もプリフィックス、サフィックスがついていない場合は10進数と皆しても問題ないと思うが、 個人的にこの値は16進数じゃないよ~ということを明示したい時もある*1

余談:美咲フォントに登録されている最終文字は「熙」

91ブロックめの最後です。

91 blocks end   code is 0xa4ea
1111 11
1 1  11
11 1 11
1 1  1
1111 11

1 1 1 1

読めなくないですか。ビットマップにすればいけるのかな?うーん

*1:文字セットとして10進数は16進数の完全なサブセットなため紛らわしい