2014/12/16(火) [n年前の日記]
#1 [dxruby][font] BDFフォントについてまだ調べてたり
いくつか分かってきたことがあるのでメモ。
◎ STARTCHARの謎。 :
BDFフォントは、1文字分の情報を、STARCHAR xxxx 〜 ENDCHAR の間で記述してるのだけど。
自分、てっきり、STARTCHAR xxxx の xxxx は、文字番号だろうと思い込んでいたわけで。
ところが、色々なBDFを眺めてたら、どうもそうではないようで。
おそらく、STARTCHAR の後ろには、それが何の文字なのかを示す文字列が書いてあるだけ、なのかなと。
すると文字の番号はどこに書いてあるかと言うと、STARTCHAR の次の行にある ENCODING がそれっぽくて。
てなわけで、昨日書いた DXRuby で BDFフォントを描画するソレは、BDFフォントによっては全然表示できなかったりするはずなので、現在手元で修正中。
自分、てっきり、STARTCHAR xxxx の xxxx は、文字番号だろうと思い込んでいたわけで。
STARTCHAR 0x0025 ... ENDCHAR STARTCHAR 0x0026 ...
ところが、色々なBDFを眺めてたら、どうもそうではないようで。
... ENDCHAR STARTCHAR space ... ENDCHAR STARTCHAR exclam ...
おそらく、STARTCHAR の後ろには、それが何の文字なのかを示す文字列が書いてあるだけ、なのかなと。
すると文字の番号はどこに書いてあるかと言うと、STARTCHAR の次の行にある ENCODING がそれっぽくて。
... ENDCHAR STARTCHAR space ENCODING 32 ...
てなわけで、昨日書いた DXRuby で BDFフォントを描画するソレは、BDFフォントによっては全然表示できなかったりするはずなので、現在手元で修正中。
◎ CHARSETの謎。 :
BDFフォントは CHARSET_REGISTRY で文字コードを指定してるようで。今現在手元にあるBDFを眺めたら、どうも以下の種類があるらしく。
iso8859 は、ASCIIコードみたいなもんだから問題無いかなと。Ruby の場合 _String#ord で、文字列から数値に変換できるので、ソレを使ってハッシュと照らし合わせて文字情報を取ってくればOKだろうと。
jisx0208 は、SJIS から jisx0208 に変換する公式が _文字コードまめ知識 で紹介されてたので、これもどうにか。
iso10646 は、Ruby 1.9 の場合、 _String#encode で SJIS から UTF-8 に変換したらそれっぽくなったのでOK。str.encode("UTF-8", "SJIS").ord みたいな。
分からんのが、jisx0213。sjis からどうやってコレに変換すればいいのやら…。nkfモジュールその他も調べてみたけど、何が何やら。
- iso8859 ... 英数字
- jisx0201 ... 半角カナ
- jisx0208 ... ひらがな、漢字
- iso10646 ... UTF-8みたいなもの
- jisx0213
iso8859 は、ASCIIコードみたいなもんだから問題無いかなと。Ruby の場合 _String#ord で、文字列から数値に変換できるので、ソレを使ってハッシュと照らし合わせて文字情報を取ってくればOKだろうと。
jisx0208 は、SJIS から jisx0208 に変換する公式が _文字コードまめ知識 で紹介されてたので、これもどうにか。
iso10646 は、Ruby 1.9 の場合、 _String#encode で SJIS から UTF-8 に変換したらそれっぽくなったのでOK。str.encode("UTF-8", "SJIS").ord みたいな。
分からんのが、jisx0213。sjis からどうやってコレに変換すればいいのやら…。nkfモジュールその他も調べてみたけど、何が何やら。
◎ バウンディングボックスの謎。 :
Adobe から BDFフォントのサンプルとして公開されてたらしい、courR14.bdf を描画してみたら、abcdefg のあたりの上下がガタガタになってしまったのですよ。
調べてみたら、BDFフォントってのは、ベースラインの位置を原点とするようで。 _itouh: BDFについて を眺めると分かりますが。かつ、オフセット値のy方向は、上がプラスで下がマイナス、として記録されてる模様。
ということで、左上の位置を描画位置として指定したつもりの場合、
x方向は、描画したい文字のバウンディングボックスのxオフセット値を足すだけでいいみたい。
調べてみたら、BDFフォントってのは、ベースラインの位置を原点とするようで。 _itouh: BDFについて を眺めると分かりますが。かつ、オフセット値のy方向は、上がプラスで下がマイナス、として記録されてる模様。
ということで、左上の位置を描画位置として指定したつもりの場合、
- y座標に、フォント全体のバウンディングボックスの縦幅を足して、
- フォント全体のバウンディングボックスのyオフセット値(えてしてマイナス値)を足して、
- 描画したい文字のバウンディングボックスの縦幅を引いて、
- 描画したい文字のバウンディングボックスのyオフセット値を引く。
x方向は、描画したい文字のバウンディングボックスのxオフセット値を足すだけでいいみたい。
◎ 2014/12/17追記。 :
SJIS から jisx0213 の変換は、jisx0208 と同じ公式でいいのかもしれない。試してみたら文字が出た。もしかして、jisx0208 に文字を追加 → jisx0213、なのだろうか…?
[ ツッコむ ]
以上です。