HOME > bdf2bmp | Time-stamp: "Feb 03 2002" |
BDFフォントに含まれている字形を、BMP画像ファイルに出力します。
たとえば、courR18.bdf というBDFフォントから、このような画像ファイル
東雲(しののめ)フォントパッケージには、bdf2bit というツールが含まれています。 わたしのこの bdf2bmp というツールもそれと設計思想は同じです。
「BDFフォントファイルの中で、ビットマップデータの部分だけは変換して出力し、そのほかの部分には手をつけない」という考えで作ってあります。bdf2bit の場合は、ビットマップデータを 2値ビットマップふうの文字で出力するわけですが、bdf2bmpの場合は、別ファイルに BMP画像として出力する、というだけの違いです。
更新履歴
ver0.6 (2001/1/10)
ベースラインも色分けして表示するようにした
ver0.5 (2000/12/30)
文字ごとの幅を色分けして表示できるようにした
ver0.1 (2000/12/17)
$ bdf2bmp courR18.bdf courR18.bmp |
文字ごとの幅、ベースラインも表示する
$ bdf2bmp -w timI18.bdf t.bmp |
文字の幅を色であらわしたサンプルです。bdf2bmpに -wオプションを指定して生成しました。timI18.bdf
(この画像は version 0.5 のものです。2倍拡大)
この図の示すところを、BDFファイルの中身と対照して説明します。
紫色の枠のなかに箱がならんでいます。この箱の幅・高さはどの文字も同じになっています。この数値は BDFファイル timI18.bdf の冒頭の
FONTBOUNDINGBOX 21 22 -2 -5
という指定によって決まります。
箱の幅:21 高さ:22 となります。
timI18.bdf の「 f 」の文字で見てみましょう。
この箱の中は、まずグレイと白の部分を先に描写して、そのあとで 文字の白黒部分が描写するように、このソフトではなっています。
最初に、(1)を描写したあとで、上書きする形で、(2)を書き込みます。
(2)を書き込むとこうなります。
(1)の箱の グレイと白の意味を説明します。 フォントのバウンディングボックスの原点は、「FONTBOUNDINGBOX 21 22 -2 -5」で示されるオフセット (-2, -5) から計算されます。
オフセット offset という単語は、「ある点からどれだけ離れているか」「ある点からの距離」といった意味があります。この原点より左側はグレイにしてあります。
次に、(2)の文字について説明します。「BBX 9 17 -1 -4」と記述してあるので、このグリフ単独のバウンディングボックス(フォントのバウンディングボックスとは別ものです)の大きさは、幅: 9 高さ: 17 です。
STARTCHAR f ENCODING 102 SWIDTH 278 0 DWIDTH 5 0 BBX 9 17 -1 -4 BITMAP 0700 -----###-------- 0D80 ----##-##------- 0C00 ----##---------- 1800 ---##----------- 1800 ---##----------- 7E00 -######--------- 1800 ---##----------- 1800 ---##----------- 1800 ---##----------- 1000 ---#------------ 3000 --##------------ 3000 --##------------ 3000 --##------------ 2000 --#------------- 2000 --#------------- E000 ###------------- C000 ##-------------- ENDCHAR(注: 16進数のあとの 「-」(2進数の 0)と「#」(2進数の 1)は筆者が勝手に付け加えたものです)
ビットマップデータ上は水平方向に16文字ぶんの 1 と 0 が並んでいますが、
グリフ単独の
バウンディングボックスの幅は 9なので、このビットマップデータの左側 9文字ぶんの 1 と 0 だけが使われます。残りの右側 7文字は、バイト境界にあわせるだけのための詰めもの(パディング)です。
このビットマップデータをどこに配置するかは、「BBX 9 17 -1 -4」から得られる、このグリフ単独のオフセット (-1, -4) で決まります。
bdf2bmp 0.5.xで -wオプションをつけたときのBMP画像によってわかることは、とりあえずこれで全部です。
version0.6で -wオプションの動作を少し変更しました。ベースラインより上か下かで、グレイを色分けするようにしました。サンプル timI18.bdf
( 微妙な色使いなんで見分けにくいかもしれません。ソースコードの 35行めくらいからを変更すれば、生成されるBMP画像の色を変えることができます )
色分けによる利点は、原点の位置がわかることです。このベースラインは何かというと、フォントのバウンディングボックスの y=0 の直線です。つまりこの直線は、各グリフごとの原点 (0,0) を通っています。
縦のグレイ境界線と横のグレイ境界線の交わるところが2つありますね。左側の交点が 現在のグリフの原点。右側のは、次のグリフの原点になります。
「e」の文字で見てみましょう。
ちなみに、「e」のデータはこうなってます。
なぜ原点の位置が重要なんでしょうか。
日本語のグリフの並べかたは、基本的に 矩形を隣あわせに並べていく、という手法でおこなわれています。たとえて言えば原稿用紙です。つまり、その矩形の箱1つ1つは重なりません。
それに対し、アルファベットのグリフは、ベースライン上に原点を置き、原点と原点との距離にしたがって、アルファベットを並べていく、というものです。かんたんにいえば、点とその距離にしたがって並べていくわけです。
ですから、アルファベットでも矩形の箱(バウンディングボックス)はありますが、それは重なることがありえます。
たとえば、「 f」の文字を見ると、
referという単語を考えてみましょう。e の「次のグリフの原点」が、f の原点と重なります。f の「次のグリフの原点」は、その隣の e の原点と重なるわけです。図にすると、
いくらなんでもこれは接近しすぎじゃないか?と思われるかもしれませんが、このフォントは斜体 (Italic) なのでこんなにバウンディングボックスが重なっているんです。
Mozilla 0.9.7 + RedHatLinux7.2 で 簡単なHTML を書いて Times-Italic を表示してみました。
アルファベットを並べるには、各文字の「原点」と「次の原点までの距離」という2つのパラメータが使用されます。そのため、bdf2bmp version0.6では、その2つのパラメータを図示するようにしました。
timI18.bdf:文字幅を表示した画像について その2
STARTCHAR e
ENCODING 101
SWIDTH 444 0
DWIDTH 8 0
BBX 7 8 1 0
BITMAP
1C ---###--
66 -##--##-
46 -#---##-
CC ##--##--
F0 ####----
C2 ##----#-
E4 ###--#--
78 -####---
ENDCHAR
現在の文字「 f」の原点より左側の領域にはみだしてます。さらに、次の文字の原点より右側にも はみだしてます。
この線でつないだ2つの点は それぞれ重なるわけだから、
こうなるはずです。
バウンディングボックス
が重なってるのがわかるでしょうか。
拡大すると、上の例と一致していることがわかります。
Copyright 1984-1989, 1994 Adobe Systems Incorporated.
Copyright 1988, 1994 Digital Equipment Corporation.
itouh