ゆるく楽しむプログラミング

BDF FONT ファイルフォーマット

東雲フォントなどのBDF型式で配付されているフォントデータを利用するためにBDFファイルのファイルフォーマットを記載
※東雲フォントの変換を想定しているため、BDFフォーマットの必要項目のみの説明です。

BDF(Bitmap Distribution Format)は、ビットマップフォントを定義するためのテキスト形式のファイルフォーマットです。
 主にX Window Systemで使用されるフォントの形式として広く知られています。
 この形式は、1980年代にAdobeが定義したもので、簡単に人間が読み書きできる仕様となっています。

特徴
  テキスト形式 : BDFはテキスト形式のため、テキストエディタで中身を直接確認したり編集することができます。
  ビットマップフォント: 各文字がピクセル(ビットマップ)として定義されており、フォントのアウトラインではなく、文字ごとのピクセル情報を保持します。

ヘッダ情報
タグ 意味
STARTFONT version フォーマットのバージョン番号を指定します。
現在最も一般的なバージョンは2.1で、拡張された機能を提供(多言語対応や細かいメトリクス定義など)。
ほとんどのBDFファイルはこのバージョン2.1を使用しています。 
COMMENT 任意のコメントを記述するためのフィールドです。
FONT font_name フォントの名前や識別子を指定するために使用されます。このフィールドは、BDFフォントファイルの最初に登場し、フォントを一意に識別するための基本的な情報を提供します。

フォントの識別子:
 フォントを一意に識別するための名前や識別子を指定します。
 この名前はフォントを参照するために使用されます。

フォントの形式情報:
 FONTフィールドに記述された内容によって、フォントのスタイルやフォントセットの種類を示すこともあります。
 例えば、フォントが固定幅か可変幅か、どの文字セットを使っているかなどを示す場合があります。

東雲フォントの場合
 FONT -Shinonome-Gothic-Medium-R-Normal--16-150-75-75-C-160-JISX0208.1990-0

-Shinonome-Gothic:
 フォントの名前そのもので「シノノメゴシック」というフォントファミリーを指している。

Medium-R:
 フォントの太さを表しています。
 ここでは「ミディアム」、つまり中程度の太さのフォントであることを示しています。
 Rは「Regular」(標準、通常)の略で、フォントが標準的なスタイルであることを意味します。

Normal:
 フォントのスタイルが「ノーマル」であり、斜体やボールドなどの特殊なスタイルが適用されていないことを示しています。

--16:
 フォントサイズを表しており、フォントのサイズは16ピクセルであることを示します。
 BDFファイルでは、ピクセル単位でフォントの高さと幅が指定されます。

150-75-75:
 この部分は、フォントの解像度や間隔に関する情報です。
 150: 水平方向の解像度やスケーリングに関連する値
 75: 垂直方向の解像度やスケーリングに関連する値
 75: スケーリングや間隔に関連する値です。

C-160:
 フォントが「CJK」文字セット(中国語、日本語、韓国語のフォント)に関連していることを示すことがあります。
 これは、CJK文字(漢字や仮名など)をサポートしていることを意味します。
 160は、文字セットの識別番号(あるいはコードページ)を示すことが多いです。
 この場合、160は特定のCJKセットを指している可能性があります。

JISX0208.1990:
 日本のJIS規格に基づく文字セットを意味します。
 日本語で使われる漢字、ひらがな、カタカナなどを含む標準的な文字セットです。
 1990は、1990年版のJIS X 0208に基づいていることを意味します。

-0:
 最後の-0は、フォントのバージョンを意味することが多いです。
SIZE point_size resolution_x resolution_y フォントのサイズや解像度に関する情報を指定します。
point_size:
 フォントのポイントサイズを指定します。
 ポイントサイズは、フォントの高さや大きさを指定するために使用されます。
 この値は通常、フォントの縦方向の高さを示します(ピクセルまたはポイント単位で表現されます)。

resolution_x:
 水平方向の解像度を指定します。
 この解像度は、フォントをレンダリングする際に、1インチあたりの水平方向のピクセル数を表します。

resolution_y:
 垂直方向の解像度を指定します。
 この解像度は、フォントをレンダリングする際に、1インチあたりの垂直方向のピクセル数を表します。 
※LCD表示が目的の場合は無視して良いと思う。
FONTBOUNDINGBOX width height x-offset y-offset フォント全体の境界ボックス(Bounding Box)を定義します。
このフィールドは、フォント内のすべてのグリフ(文字)の最大サイズを表し、フォントの描画やレイアウトの基準を決定する重要な役割を持ちます。

width:
 フォントの境界ボックスの幅(ピクセル単位)。
 フォント内のすべての文字の横幅の最大値を表します。

height:
 フォントの境界ボックスの高さ(ピクセル単位)。
 フォント内のすべての文字の縦幅の最大値を表します。

x-offset:
 原点(基準点)から境界ボックスの左端までの水平オフセット(ピクセル単位)。
 負の値の場合、境界ボックスが原点の左側に伸びていることを意味します。

y-offset:
 原点(基準点)から境界ボックスの下端までの垂直オフセット(ピクセル単位)。負の 値の場合、境界ボックスが原点の下側に伸びていることを意味します。

他のグリフとの関係
 FONTBOUNDINGBOXはフォント全体に適用されますが、個別の文字ごとに異なる境界ボックス(BBXフィールド)を指定することもできます。
 この場合、FONTBOUNDINGBOXはフォント全体の最大サイズを定義し、各グリフのサイズは個別にBBXでオーバーライドされます。
STARTPROPERTIES n プロパティセクションの開始 
n:
 このセクション内で定義されているプロパティの数(整数値)

プロパティは
 property_name value の書式で定義する。
property_name value
FONT_ASCENT  フォントのアセント(ベースラインから文字の上端までの高さ)をピクセル単位で指定します。 
FONT_DESCEN フォントのディセント(ベースラインから文字の下端までの深さ)をピクセル単位で指定します。 
DEFAULT_CHAR  フォントに存在しない文字(未定義のグリフ)を表示する際に代わりに使用されるグリフを指定します。
COPYRIGHT  フォントの著作権に関する情報を文字列として記述します。 
FONTNAME_REGISTRY  フォント名の登録機関または命名の範囲を定義する文字列を指定します。
この値は、フォント名の一部として利用され、特定の規格や命名規則に基づくフォントであることを示すために使用されます。 
FOUNDRY  フォントが作成された場所や、フォントを提供した組織やフォントの発行元を指定するためのフィールドです。
フォントがどのフォントメーカー、デザインスタジオ、企業、または組織によって作成されたかを示します。 
FAMILY_NAME  フォントファミリー名を指定するためのフィールドです。
このフィールドは、複数のフォントスタイルが同じファミリーに属している場合、そのフォントが属する「ファミリー」の名前を記述するために使用されます。
これにより、異なるスタイル(太字、斜体、ライトなど)のフォントが同じグループとして識別されます。 
WEIGHT_NAME  フォントのウェイト(太さ)を指定します(例:Medium、Boldなど)。 
SLANT  フォントの傾き(スラント)を指定します。値は次のいずれかです:
 R: Regular(標準)
 I: Italic(イタリック)
 O: Oblique(オブリーク) 
SETWIDTH_NAME  フォントの幅の設定に関連する値を指定します。
このプロパティは、フォントが持つ特定の幅のスタイルを識別するために使われ、主に同じファミリー内で幅が異なるバリエーションのフォントを区別するために利用されます。 
例えば、標準的な幅や、狭い、広い幅を持つフォントが同じファミリーに属している場合、それらを区別するために「Arial Narrow」「Arial Bold Wide」などバリエーションを指定することができます。
ADD_STYLE_NAME  フォントのスタイル名を追加で指定するためのプロパティです。
特定のフォントに、標準的なスタイルセットに含まれないカスタムスタイルを指定するために使われます。
PIXEL_SIZE  フォントのピクセルサイズを指定するために使用されます。
この値は、フォントの各文字が表示される際の高さ(および場合によっては幅)を、ピクセル単位で指定します。
特にビットマップフォントでは、文字のビットマップ画像がどれくらいの解像度で描画されるかを示します。 
POINT_SIZE  フォントのポイントサイズを指定するために使用されます。ポイントサイズは、フォントの表示サイズの尺度で、主に印刷物や画面上での表示における文字の大きさを指定します。
フォントのポイントサイズを指定する数値で、通常は正の整数です。
1ポイントは1/72インチに相当し、文字がどれくらい大きく表示されるかを示します。 
RESOLUTION_X  フォントの水平解像度(DPI)を指定します。 
RESOLUTION_Y  フォントの垂直解像度(DPI)を指定します。 
SPACING  フォントの文字間隔の種類を指定します。値は次のいずれかになります:
 P: プロポーショナル(文字ごとに異なる幅)
 M: 等幅(モノスペース)
 C: 固定間隔(キャラクタセル) 
AVERAGE_WIDTH   
CHARSET_REGISTRY registry_name 文字セットの識別:
 フォントがどの規格に基づいた文字セットを使用しているのかを定義します。
 これにより、フォントの文字エンコーディングや文字コードがどの基準に従うかがわかります。

互換性の確保:
フォントを異なるシステムやアプリケーションで利用する際に、文字セットが正しく解釈されるようにするための情報を提供します。

他のフィールドとの連携:
このフィールドはCHARSET_ENCODINGと併せて使用され、具体的な文字セットとエンコーディングを指定します。

CHARSET_REGISTRYの典型的な値
ISO8859
 ISO 8859規格(多言語対応文字セットの国際標準)に基づく文字セット。
 例: ISO8859-1(Latin-1)、ISO8859-5(Cyrillic)など。
JISX0208
 日本語の文字セットJIS X 0208に基づいています。
 主に漢字やひらがな、カタカナを含む。
UNICODE
 Unicode文字セットに基づいています。
 現代の多言語対応フォントで一般的。
KOI8-R
 ロシア語を含むスラブ系文字をサポートするKOI8-R文字セット。
GB2312
 中国語(簡体字)用のGB 2312文字セット。 
CHARSET_ENCODING encoding_number 文字セットのエンコーディングの種類を指定するものです。
CHARSET_REGISTRYと組み合わせて使用され、どの文字セット規格のどのエンコーディング(具体的な文字コードのマッピング)を使用しているかを示します。

文字セットのバリエーションを指定:
 CHARSET_ENCODINGは、CHARSET_REGISTRYで指定した文字セットの中で、さらに細かいエンコーディング(文字コードの種類)を指定するために使用されます。
 これにより、同じ文字セット内で異なるエンコーディングを使い分けることができます。

多様な文字コードの対応:
 異なる文字コード規格(例えば、ISO 8859シリーズ、Unicode、JISなど)を同じフォントファイル内で管理し、用途に応じた適切なエンコーディングを選択できるようにします。 

CHARSET_ENCODINGは、BDFファイル内で使用される文字セットのエンコーディングを指定するフィールドであり、CHARSET_REGISTRYと組み合わせて使用されます。
_XMBDFED_INFO  X11のフォントエディタ(xmbdfed)によって生成されたBDFファイルに関連する情報を格納します。
このフィールドは、xmbdfedなどのツールによって自動的に追加されることが一般的で、フォントデータやその作成に関するメタデータを記録するために使用されます。 
ENDPROPERTIES  プロパティセクションの終了
CHARS n フォントファイルで使用されるフィールドの一つで、フォント内に定義されているグリフ(文字)の総数を指定します。
この情報は、BDFファイルの中で定義されるSTARTCHARセクションの数を示し、フォントに含まれる文字の量を明確にするために使用されます。

n:
 フォント内に定義されている文字の数(グリフ数)を表す整数値です。
 この値は、後続のSTARTCHARセクションの数と一致する必要があります。 

文字情報
タグ 意味
STARTCHAR charcterCode 特定の文字(グリフ)の定義を開始するキーワードです。
これに続く一連のフィールドで、その文字の詳細なプロパティやビットマップデータが記述されます。
※東雲フォントの場合は区点コードが入っている気がするが、このフィールドは本来はエイリアスでしかないので、漢字コードはENCODINGに示されるコードを使用するのが正しいと思う。
ENCODING encodeCode フォントファイルで使用されるフィールドの一つで、特定のグリフ(文字)に割り当てられた符号化値(コードポイント)を指定します。
この値は、文字を識別するための数値であり、通常、文字セットやエンコーディングに基づいて決定されます。
※CHARSET_REGISTRY "JISX0208.1983"が指定されている場合、句点コードになるようです。
SWIDTH x y 各グリフ(文字)の論理的な幅を指定し、文字がレンダリングされる際の間隔を決定します。
これはフォントの解像度やスケーリングに影響を与える値です。
SWIDTHの値はPostScriptポイント単位で記載されており、デバイス非依存のメトリックとして利用されます。
1PostScriptポイントは、1/72インチ(約0.3528mm)に相当します。 

SWIDTHはデバイス非依存のPostScript単位での幅を表します。
 x: 文字の幅(横方向)のスケール値。
 y: 文字の高さ(縦方向)のスケール値(通常は0が設定される)。
※Postscript用なのでLCD表示が目的の場合は無視して良いと思う。
DWIDTH x y 文字のデフォルタ幅(default width)を指定するために使用されます。
このプロパティは、各文字の水平方向の幅を設定します。

DWIDTHはデバイス依存のピクセル単位での幅を表します。
 x: 文字の幅(横方向)のスケール値。
 y: 文字の高さ(縦方向)のスケール値(通常は0が設定される)。
DWIDTH v  文字の縦方向の幅を指定するために使用されます。
このプロパティは、文字が占める垂直方向のサイズを示します。
文字が占める縦方向の領域をピクセル単位で表します。
VWIDTHは通常、文字のビットマップ画像の縦のサイズを決定するために使用されます。 
※東雲フォントでは指定がない。あまり使われない値なのかも。
BBX width height xoffset yoffset 各文字(グリフ)のビットマップを定義する際の重要なメタ情報で、特定の文字がどれだけの領域を占有するかを指定します。
BBXはビットマップフォントの寸法や位置合わせに関する情報を提供します。

width(横幅)
 グリフの横方向のピクセル数(ビットマップの幅)。
 文字のビットマップが横方向にどれだけ広がるかを指定します。
height(縦幅)
 グリフの縦方向のピクセル数(ビットマップの高さ)。
 文字のビットマップが縦方向にどれだけ広がるかを指定します。
xoffset(X軸オフセット)
 グリフの原点(通常、左下の基準点)からビットマップの左端までの水平距離。
 プラスの値の場合、ビットマップが右方向にずれます。
 マイナスの値の場合、左方向にずれます。
yoffset(Y軸オフセット)
 グリフのベースライン(通常、文字が並ぶ基準線)からビットマップの下端までの垂直距離。
 プラスの値の場合、ビットマップが上方向にずれます。
 マイナスの値の場合、下方向にずれます。
BITMAP ビットマップパターンの定義 
ENDCHAR 特定の文字(グリフ)の定義を終了するキーワードです。