HOME > BDFについて Time-stamp: "Feb 03 2002"

BDFについて

BDFフォントファイルについて調べました。


BDF Specification

仕様書のありか
Version 2.2
Adobeのサイトにあります。 http://partners.adobe.com/asn/developer/technotes.html
Adobe Technical Note 5005, Glyph Bitmap Distribution Format (BDF), Version 2.2 です。 PDFファイルなので、読むためには Acrobat Readerが必要です。

これが最新版なのですが、実際に配布されているBDFファイルは Version 2.1 に準拠しているものが多いです。Version2.2準拠のものは私は見たことがないです。

Version 2.1
X.Org にあります。ftp://ftp.x.org/pub/R6.4/xc/doc/hardcopy/BDF/bdf.PS.gz (ただし、このファイルは図がなぜか欠けています)。
PostScriptファイルなので、Windowsの場合、読むためのソフトが必要です。LinuxなどPC-Unixであれば最初から gvなどPSファイルを表示するソフトが付属していますけど。

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のフォーマット

実物の 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 )と、こうなりました。
xterm

一部分を拡大してみましょう。
xterm zoomed

文字の大きさは、横 11ピクセル、縦 18ピクセルだと分かります。 Emacs20.6.3(PlamoLinux2.0)で、[Mule - Set Font/FontSet - Font - Courier - 18]と選んでも同じ大きさになります。
Emacs zoomed

このフォントは等幅フォントで、どの文字も横幅が同じです。縦幅は、等幅フォントでなくてもどのフォントも同じですから、この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) エンコーディング
という意味があります。(参考にしたもの: LinuxMagazine No.3 p185-p192 )

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)に左下隅がある」ということだから、 具体的に図で示すと
font bounding box
on the grid

こうなるはずです。フォントのバウンディングボックスについての原点の位置が分かりました。 しかし、このバウンディングボックスが何の役に立つのか最初よく分かりませんでした。このフォントの文字の大きさは、上で見たとおり 横11,縦18ピクセルだから、このバウンディングボックスは文字の大きさを表していないのか、ならば何の役目があるんだろう、など考えました。 このバウンディングボックスの役目をこれから説明します。そのために

実際に 'f' の文字を見てみましょう。 courR18.bdfの 'f' の文字の部分は、こう記述されています。

16進数ビットマップを 2進数的に表現すると(■=1, □=0) こうなっていますが、実際の上のキャプチャ画面では こう表示されています(16進数はわたしが付け足しました)。どうしてこうなるのか、考えてみましょう。

DWIDTH 11 0 となっているので、横幅は先ほど見たとおり 11ピクセルです。縦幅は、PIXEL_SIZEが 18ピクセルなので先ほど見たとおり 18ピクセルです。

BBX 8 12 2 0とあります。最初の2つの数字はどうでもいいんですが、後ろの2つの数字は、ずれ(offset)が(2,0)ということを示してます。図で示すと、
'f' zoomed

ということですね。これと、実際の表示エリアを重ねてみましょう。上のキャプチャ画面と一致するようにすると、
printed 'f' zoomed

こうなりました。この実際の表示エリアは、どこで指定されているかというと、バウンディングボックスです。

バウンディングボックスを、原点を一致させて重ねてみると
'f' with bbx zoomed

こうなりました。どうやら、画面表示のときには、バウンディングボックスの上1列と左1列は使われないようですね。

別の文字 '(' で追試してみましょう。 courR18.bdfの '('の文字の部分は、こう記述されています。

BITMAPを2進数的に表すと となっていますが、実際の上のキャプチャ画面では こうなってるわけです。

BBX 3 14 5 -2 によれば、ビットマップ左下隅は (5,-2)となるのですから図にすれば
'(' zoomed

となります。これに、実際の表示エリアと、バウンディングボックスを重ねてみると
printed '(' zoomed

確かに、さっきと同じ結果になりました。しかし、「画面表示のときに、バウンディングボックスの上1列と左1列が使われない」という規則はどこかに書いてあるんでしょうか? こういったところが仕様書を読んでもよく分からないです。

Sep 20 2000
横幅だけなら、DWIDTH 11のせいで変わっていると分かるけど、なぜ右ではなくて左が欠けるのか分かりません。縦の高さも、PIXEL_SIZE 18で指定されているからこうなるんでしょうけど、下ではなく上が欠ける理由が不明です。欠けるのが、右、下だったら、次の文字を表示するために前の文字の端を上書きしているのだ〜と言われれば納得できるんですが。 次のキーワードを見ましょう。

COMMENT は、フォントコンパイラには無視されます。BDFファイルを見る人のためだけに書かれたものです。

STARTPROPERTIES 28 は、このあと 28行にわたって このフォントのプロパティが宣言されることを示しています。仕様書には、このプロパティの各キーワードに関して一切説明がありませんが、フォントコンパイラが無視していいのかどうか、は分かりません。説明されていなくても重要なものであるようです。

プロパティを全部示したものです。(COPYRIGHTの行の改行はほんとは無いです)
プロパティ前半は、FONT の行で既に宣言したことを繰り返してるだけです。

ここで気になるのは、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 14FONT_DESCENT 4DEFAULT_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ファイルには STARTCHARENDCHARCHARS というふうに 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 説明


itouh