HOME > BDFについて | Time-stamp: "Feb 03 2002" |
BDFフォントファイルについて調べました。
これが最新版なのですが、実際に配布されているBDFファイルは Version 2.1 に準拠しているものが多いです。Version2.2準拠のものは私は見たことがないです。
Web上で簡単に見られるように、画像化したものを置いておきます。図も欠けていないのでこちらを載せておきます。PlamoLinux2.0 + gv3.5.8の表示をキャプチャして、Copyright表示を付けたものです。
BDF Specification version2.1 Page 1 2 3 4 5 6 7
worsitに、テキスト化されたものが置いてあります。 日本語訳は、http://xjman.dsl.gr.jp/status/xjdoc-xc.htmlによれば未訳ですが、http://kappa.allnet.ne.jp/kanou/fonts/bdfspec/に 和訳 (暫定版)があります。
実物の BDFファイル courR18.bdfを元にして BDFファイルを学習します。
実際に BDFフォントがどう表示されているか見てみます。PlamoLinux上で、xtermをフォント指定して起動してみました。
$ xterm -fn -adobe-courier-medium-r-normal--18-180-75-75-m-110-iso8859-1 &
xtermのマニュアルを見て(man xterm)、'f' の文字を検索する( /f )と、こうなりました。
一部分を拡大してみましょう。
文字の大きさは、横 11ピクセル、縦 18ピクセルだと分かります。
Emacs20.6.3(PlamoLinux2.0)で、[Mule - Set Font/FontSet - Font - Courier - 18]と選んでも同じ大きさになります。
このフォントは等幅フォントで、どの文字も横幅が同じです。縦幅は、等幅フォントでなくてもどのフォントも同じですから、このBDFフォントについてはどの文字の大きさも等しく 横 11, 縦 18ピクセルです。
BDFファイルの中身を見てみましょう。ここで見る courR18.bdf ファイルは、X Window System の配布ファイルに収録されています。
Copyright 1984-1989, 1994 Adobe Systems Incorporated. Copyright 1988, 1994 Digital Equipment Corporation.Adobe is a trademark of Adobe Systems Incorporated which may be registered in certain jurisdictions. Permission to use these trademarks is hereby granted only in association with the images described in this file.
Permission to use, copy, modify, distribute and sell this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notices appear in all copies and that both those copyright notices and this permission notice appear in supporting documentation, and that the names of Adobe Systems and Digital Equipment Corporation not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Adobe Systems and Digital Equipment Corporation make no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty.
STARTFONT 2.1 は、このBDFファイルは version2.1に準拠していると宣言しています。
FONT -Adobe-Courier-Medium-R-Normal--18-180-75-75-M-110-ISO8859-1 は、XLFD (X Logical Font Description:X論理フォント名) と呼ばれている一種のフォント名です。
-Adobe-Courier-Medium-R-Normal--18-180-75-75-M-110-ISO8859-1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | fndry fmly wght slant sWdth | ptSz | | | avgWdth| | | | | | | | pxlSz | | | rgstry | | | | | resx | spc encdng | resy
fndry (FOUNDRY) | フォント提供者 |
fmly (FAMILY_NAME) | ファミリ名 (Times, 明朝, ゴシック など) |
wght (WEIGHT_NAME) | 太さ (bold, demibold, medium など) |
slant (SLANT) | 傾き (i :イタリック、r :正体(regular) など) |
sWdth (SET_WIDTH) | 幅 (normal, semi condenced など) |
pxlsz (PIXEL_SIZE) | 大きさ(ピクセルサイズ) |
ptSz (POINT_SIZE) | ポイントサイズ |
resx (RESOLUTION_X) | 水平方向の解像度 |
resy (RESOLUTION_Y) | 垂直方向の解像度 |
spc (SPACING) | 文字間隔 (p:可変, c:一定の枠内, m:一定 など) |
avgWdth (AVERAGE_WIDTH) | 平均文字幅 |
rgstry (CHARSET_REGISTRY) | 登録した組織または標準名 (iso8859, jisx0208.1983 など) |
encdng (CHARSET_ENCODING) | エンコーディング |
SIZE 18 75 75 は、解像度が 横縦 75dpiのときに、このフォントは18ポイントであることを示しています。
FONTBOUNDINGBOX 12 19 -1 -4
は、バウンディングボックスの xの幅、yの高さ が (12,19)、原点から(バウンディングボックス)左下隅までの、xとyのずれ が (-1,-4)であると示しています。
「原点(0,0)から左下隅まで、-1,-4ずれている」 => 「原点(0,0)から-1,-4ずれた地点、すなわち 点(-1,-4)に左下隅がある」ということだから、
具体的に図で示すと
こうなるはずです。フォントのバウンディングボックスについての原点の位置が分かりました。 しかし、このバウンディングボックスが何の役に立つのか最初よく分かりませんでした。このフォントの文字の大きさは、上で見たとおり 横11,縦18ピクセルだから、このバウンディングボックスは文字の大きさを表していないのか、ならば何の役目があるんだろう、など考えました。 このバウンディングボックスの役目をこれから説明します。そのために
実際に 'f' の文字を見てみましょう。 courR18.bdfの 'f' の文字の部分は、こう記述されています。
STARTCHAR f ENCODING 102 SWIDTH 600 0 DWIDTH 11 0 BBX 8 12 2 0 BITMAP 0F 10 20 20 FE 20 20 20 20 20 20 FE ENDCHAR16進数ビットマップを 2進数的に表現すると(■=1, □=0)
0F □□□□■■■■ 10 □□□■□□□□ 20 □□■□□□□□ 20 □□■□□□□□ FE ■■■■■■■□ 20 □□■□□□□□ 20 □□■□□□□□ 20 □□■□□□□□ 20 □□■□□□□□ 20 □□■□□□□□ 20 □□■□□□□□ FE ■■■■■■■□こうなっていますが、実際の上のキャプチャ画面では
0000 □□□□□□□□□□□ 0000 □□□□□□□□□□□ 03c0 □□□□□□■■■■□ 0100 □□□□□■□□□□□ 0800 □□□□■□□□□□□ 0800 □□□□■□□□□□□ 3f80 □□■■■■■■■□□ 0800 □□□□■□□□□□□ 0800 □□□□■□□□□□□ 0800 □□□□■□□□□□□ 0800 □□□□■□□□□□□ 0800 □□□□■□□□□□□ 0800 □□□□■□□□□□□ 3f80 □□■■■■■■■□□ 0000 □□□□□□□□□□□ 0000 □□□□□□□□□□□ 0000 □□□□□□□□□□□ 0000 □□□□□□□□□□□こう表示されています(16進数はわたしが付け足しました)。どうしてこうなるのか、考えてみましょう。
DWIDTH 11 0 となっているので、横幅は先ほど見たとおり 11ピクセルです。縦幅は、PIXEL_SIZEが 18ピクセルなので先ほど見たとおり 18ピクセルです。
BBX 8 12 2 0とあります。最初の2つの数字はどうでもいいんですが、後ろの2つの数字は、ずれ(offset)が(2,0)ということを示してます。図で示すと、
ということですね。これと、実際の表示エリアを重ねてみましょう。上のキャプチャ画面と一致するようにすると、
こうなりました。この実際の表示エリアは、どこで指定されているかというと、バウンディングボックスです。
バウンディングボックスを、原点を一致させて重ねてみると
こうなりました。どうやら、画面表示のときには、バウンディングボックスの上1列と左1列は使われないようですね。
別の文字 '(' で追試してみましょう。 courR18.bdfの '('の文字の部分は、こう記述されています。
STARTCHAR parenleft ENCODING 40 SWIDTH 600 0 DWIDTH 11 0 BBX 3 14 5 -2 BITMAP 20 40 40 80 80 80 80 80 80 80 80 40 40 20 ENDCHARBITMAPを2進数的に表すと
20 □□■□□□□□ 40 □■□□□□□□ 40 □■□□□□□□ 80 ■□□□□□□□ 80 ■□□□□□□□ 80 ■□□□□□□□ 80 ■□□□□□□□ 80 ■□□□□□□□ 80 ■□□□□□□□ 80 ■□□□□□□□ 80 ■□□□□□□□ 40 □■□□□□□□ 40 □■□□□□□□ 20 □□■□□□□□となっていますが、実際の上のキャプチャ画面では
□□□□□□□□□□□ □□□□□□□□□□□ □□□□□□□■□□□ □□□□□□■□□□□ □□□□□□■□□□□ □□□□□■□□□□□ □□□□□■□□□□□ □□□□□■□□□□□ □□□□□■□□□□□ □□□□□■□□□□□ □□□□□■□□□□□ □□□□□■□□□□□ □□□□□■□□□□□ □□□□□□■□□□□ □□□□□□■□□□□ □□□□□□□■□□□ □□□□□□□□□□□ □□□□□□□□□□□こうなってるわけです。
BBX 3 14 5 -2 によれば、ビットマップ左下隅は (5,-2)となるのですから図にすれば
となります。これに、実際の表示エリアと、バウンディングボックスを重ねてみると
確かに、さっきと同じ結果になりました。しかし、「画面表示のときに、バウンディングボックスの上1列と左1列が使われない」という規則はどこかに書いてあるんでしょうか? こういったところが仕様書を読んでもよく分からないです。
Sep 20 2000
横幅だけなら、DWIDTH 11のせいで変わっていると分かるけど、なぜ右ではなくて左が欠けるのか分かりません。縦の高さも、PIXEL_SIZE 18で指定されているからこうなるんでしょうけど、下ではなく上が欠ける理由が不明です。欠けるのが、右、下だったら、次の文字を表示するために前の文字の端を上書きしているのだ〜と言われれば納得できるんですが。
次のキーワードを見ましょう。
COMMENT は、フォントコンパイラには無視されます。BDFファイルを見る人のためだけに書かれたものです。
STARTPROPERTIES 28 は、このあと 28行にわたって このフォントのプロパティが宣言されることを示しています。仕様書には、このプロパティの各キーワードに関して一切説明がありませんが、フォントコンパイラが無視していいのかどうか、は分かりません。説明されていなくても重要なものであるようです。
STARTPROPERTIES 28 FOUNDRY "Adobe" FAMILY_NAME "Courier" WEIGHT_NAME "Medium" SLANT "R" SETWIDTH_NAME "Normal" ADD_STYLE_NAME "" PIXEL_SIZE 18 POINT_SIZE 180 RESOLUTION_X 75 RESOLUTION_Y 75 SPACING "M" AVERAGE_WIDTH 110 CHARSET_REGISTRY "ISO8859" CHARSET_ENCODING "1" CAP_HEIGHT 11 X_HEIGHT 8 FONT_ASCENT 14 FONT_DESCENT 4 FACE_NAME "Courier" COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." NOTICE "No mark" _DEC_DEVICE_FONTNAMES "PS=Courier" _DEC_PRODUCTINFO "DECwindows Fonts V2.2, 07-Nov-1991" DEFAULT_CHAR 32 RELATIVE_SETWIDTH 50 RELATIVE_WEIGHT 50 CHARSET_COLLECTIONS "ASCII ISO8859-1 ADOBE-STANDARD" FULL_NAME "Courier" ENDPROPERTIESプロパティを全部示したものです。(COPYRIGHTの行の改行はほんとは無いです)
ここで気になるのは、PIXEL_SIZE 18という行です。なにしろ説明がないので推測ですが、この行が、このフォントに含まれる文字の本当の高さを示しているようです。文字の本当のピクセル幅は、後で示すDWIDTHが示しているのですが、文字の本当のピクセル高を示すキーワードはほかに無いんです。
SPACING M によって、このフォントはどの文字も横幅が等しい、等幅フォントであると分かります。
CHARSET_REGISTRY "ISO8859" と CHARSET_ENCODING "1" によって、このフォントの文字コードが分かります。ISO-8859-1とひとかたまりで使うことが多いようです。たとえば、NetscapeNavigator4.73enでも [View - Character Set - Western(ISO-8859-1)] という指定があります。
CAP_HEIGHT 11 から以降は、プロパティ欄だけで宣言されている事柄です。この中で、FONT_ASCENT 14 と FONT_DESCENT 4 と DEFAULT_CHAR 32 はあったほうがいいと仕様書に書いてあります。ですが、それぞれのキーワードの意味は書いてないんですね。FONT_ASCENT と FONT_DESCENT はフォントへの知識があれば分かるんですが、DEFAULT_CHAR って何なんでしょう? このプロパティはよく分かりません。 あとは、COPYRIGHTがプロパティの中に入っているということくらい知っておけばいいようです。
CHARS 229 は、このあと 229文字の個々のデータが続くことを示しています。ここまでで、このフォント全般にあてはまるグローバル情報は終わりです。
Oct 16 2001
このページを書いたあと、狩野宏樹 さんが掲示板に書きこんでくださいました。
このコメントは、とても参考になりました。グリフ個々のバウンディングボックスと、フォント全体のバウンディングボックスってちがうんだなぁ、と目が覚める思いでした。いくつかの疑問にお答えしたいと思います。
フォントのバウンディングボックスというのは、同じ位置にフォント内の全ての 文字を重ね打ちしたときに、印字されるすべてのピクセルを含む最小の長方形の ことです。courR18.bdf では、AE の合字がいちばん左の列を使っています。
( の文字単独のバウンディングボックスの幅は、「BBX 3 14 5 -2」とあることか ら分かるとおり、3 ピクセルです。フォントのバウンディングボックスから食み 出す部分は、決して塗りつぶされることはありません。8 桁指定されているのは、 右に 0 を詰めてバイト境界に合わせているからです。
フォントのプロパティの各キーワードは、XLFD の仕様書の方に説明があります。 DEFAULT_CHAR は、値をスペース以外の文字に書き換えて、xfd で表示すれば分か ると思います。
幾つかの参考になるページを紹介します。
http://kappa.allnet.ne.jp/kanou/fonts/bdfspec/ Bitmap Distribution Format 2.1 の拙訳です。
http://www.tsg.ne.jp/GANA/S/pcf2bdf/ PCF フォーマットについて、解析した結果が載っています。
http://cgi.din.or.jp/~mer/Fonts/index.cgi FreeType Glyph Convention の和訳を読むと、包括的な基礎知識が得られます。
FONTBOUNDINGBOX と BBX がどちらも「バウンディングボックス」という言葉を表していることは気がついていましたが、これが同じものなのか違うのか、BDFの仕様書見ても分からななかったんですよね。
あれから知識も多少増えたので、書きたしてみます。
グリフ (glyph) というのは字形、つまり画像です。グラフィックデータのことです。ビットマップだったりベクターグラフィックだったりします。
これと対する概念の「キャラクタ」というのは文字番号、つまり数字です。
BDFファイルには STARTCHAR や ENDCHAR、CHARS というふうに character の略語の CHAR を使われていますが、これは本当は glyph という言葉のほうが適切です。 仕様書 Version2.2では言い訳がしてあって、 「'STARTCHAR'や 'CHARS'など glyphと置き換えたほうが適切なキーワードも、過去との互換性のためにそのままにしておく」と書いてあります。
BDFファイルで FONTBOUNDINGBOX とあるのが フォントのバウンディングボックスです。Kanouさんの説明のとおりです。 しかし等幅フォントって宣言しといて幅のちがう文字があるなんて、普通わからないですよね。
BBX というのが 個々のグリフごとのバウンディングボックスです。これは、上のカッコでは、 BBX 3 14 5 -2 となっていますから 幅3 x 高さ14ですね。
□□■ □■□ □■□ ■□□ ■□□ ■□□ ■□□ ■□□ ■□□ ■□□ ■□□ □■□ □■□ □□■これのことです。黒ピクセルがぎりぎり入る大きさの箱だ、と仕様書 version2.2にも書いてあります。
上の説明ですが、文字の横幅は各グリフごとの DWIDTH によって決まっていて、フォントのバウンディングボックスは関係ないですね。
X上で f の文字が 縦 18ピクセルで表示されてるのは未だによく分かりません。PIXEL_SIZE というのは、TrueTypeFontで ppem(Pixel Per EM) と呼ばれているもので、「18ピクセルのフォント」と指定されたとき呼ばれるフォントであることを宣言しているのだと思います。
文字の縦幅は、フォントのバウンディングボックスの値が使われるはずなのですが..。Xのソースとか pcfフォントフォーマットを調べないとだめかもしれないですね。
続きがあります。
bdf2bmp 説明