Share to: share facebook share twitter share wa share telegram print page

PC Screen Font

PC Screen Font(PSF)は、現在Linuxカーネルによってコンソールフォントに使用されているビットマップフォント形式である。PSFファイル形式のドキュメントは、Linuxのkbdユーティリティのソースコード内に含まれている[1]

ファイルフォーマット

ファイルヘッダー

すべてのPSFファイルはヘッダーで始まる。ヘッダーにはPSF1とPSF2の2種類が存在する。すべてのマルチバイト整数はリトルエンディアン(下位バイトが先)である。

psf1 ヘッダー
長さ 説明 備考
2 マジックバイト 常に 36 04
1 PSFフォントモード 様々なフォントフラグ。フォントモードを参照。
1 グリフサイズ グリフのサイズ(バイト数)、8ビット符号なし整数。psf1では文字サイズは常にグリフの高さに等しい。
psf2 ヘッダー
長さ 説明 備考
4 マジックバイト 常に 72 b5 4a 86
4 バージョン 32ビット符号なし整数、現在は常に0
4 ヘッダーサイズ 32ビット符号なし整数、ヘッダーのバイトサイズ(通常は32)
4 フラグ 32ビット符号なし整数、フォントフラグを参照
4 グリフ数 32ビット符号なし整数、グリフの総数
4 グリフサイズ 32ビット符号なし整数、1グリフあたりのバイト数
4 高さ 32ビット符号なし整数、各グリフの高さ
4 32ビット符号なし整数、各グリフの幅

すべてのpsf1グリフは幅8ピクセルである。

フォントモード

psf1ヘッダーにおけるフォントモードは、8ビット符号なし整数で、フォントに関する様々なフラグを含んでいる。

フォントモードのビット
値(16進数 名称 意味
0x01 PSF1_MODE512 このビットがセットされている場合、フォントフェイスは512個のグリフを持つ。セットされていない場合、256個のグリフのみとなる
0x02 PSF1_MODEHASTAB このビットがセットされている場合、フォントフェイスはUnicodeテーブルを持つ
0x04 PSF1_MODESEQ PSF1_MODEHASTABと同義

フォントフラグ

psf2ヘッダーにおけるフォントフラグは、32ビット符号なし整数で、フォントに関する様々なフラグを含んでいる。現在は1つのフラグのみが存在する。

フォントフラグのビット
値(16進数) 名称 意味
0x00000001 PSF2_HAS_UNICODE_TABLE このビットがセットされている場合、フォントフェイスはunicodeテーブルを持つ

ファイルビットマップ

実際のグリフデータはヘッダーの直後に続く。各グリフ内の各ビットはフォント内の1ピクセルを表しており、0は未描画、1は描画を示す。各グリフの各行は、バイト単位で揃えられるようにパディングされている。たとえば、12x12フォントでは1行あたり2バイトとなる。12x12のPSFビットマップにおける文字「A」は以下のように表現されることがある。

                         パディング
フォントデータ   |
+----------------+  +--+
000001100000 0000
000011110000 0000
000110011000 0000
001100001100 0000
011000000110 0000
110000000011 0000
111111111111 0000
111111111111 0000
110000000011 0000
110000000011 0000
110000000011 0000
110000000011 0000

12ビット分の実データと、それぞれの行を最も近いバイト単位まで埋めるパディングが含まれている。行は最左列から順に格納される。

Unicodeテーブル

PSFファイルがUnicodeテーブルを含む場合、各グリフはUnicodeテーブル内にエントリを持ち、最初のグリフはテーブルの最初のエントリに、2番目のグリフは2番目のエントリに対応する。Unicodeテーブル内のエントリの形式は、PSFヘッダーの種類によって異なる。

PSF1Unicodeテーブル

PSF1ファイルのUnicodeテーブル内のエントリは、0xffffで終わる16ビットリトルエンディアンの符号なし整数の連続として表される。エントリ内の最初の整数群は、対応するグリフで表現されるUnicode文字を含む。これらのUnicode文字は、整数0xfffeに達するまで続く。その後は、0xfffeから始まり、個別のUnicode文字ではなく、グリフに対応するUnicode文字列を表す整数の連続が記述される。新たな0xfffeが現れるたびに新しい文字列の列が始まり、0xffffに到達するまで続く。たとえば、以下のような16ビットリトルエンディアンの符号なし整数の連続は、次のように解釈される。

0xdead
0xbeef

0xfffe
0x3141
0x5926

0xfffe
0x1234
0x5678

0xffff

U+DEAD、U+BEEF、U+3141 U+5926の列、またはU+1234 U+5678の列が現れた場合には、該当するUnicodeテーブルのエントリに対応するグリフを表示する。

PSF2Unicodeテーブル

PSF2ファイルのUnicodeテーブル内のエントリは、PSF1ファイルとほぼ同様である。ただし、Unicode文字はUTF-8で表され、Unicode文字列の開始は2バイトの0xfffeではなく1バイトの0xfeで示され、Unicodeエントリの終了も2バイトの0xffffではなく1バイトの0xffで示される。

脚注

  1. ^ the Linux Kernel Organization (2007年1月28日). “psf.h”. 2025年4月13日閲覧。
Kembali kehalaman sebelumnya