PC Screen Font

PC Screen Font (kurz: PSF) ist ein einfaches binäres Dateiformat für Bitmap-Zeichensätzen. Es wird vor allem vom Linux-Kernel für die Textkonsole benutzt, ist aber nicht auf diesen Einsatzzweck beschränkt.

Es gibt zwei zueinander inkompatible Formatversionen. Der logische Aufbau ist gleich, aber die Kodierung unterscheidet sich stark.[1]

Version 1

PSF Version 1 hatte seine Ursprünge in dem Dateiformat, das H. Peter Anvin 1989 in seinem Font-Editor für MS-DOS benutzt hatte. Seine Fähigkeiten sind begrenzt, entsprechend den Fähigkeiten der VGA-Grafikkarte im Textmodus:

In dieser Version können nur Zeichensätze mit 8 Pixel breiten Zeichen definiert werden. Es werden Zeichensätze mit 256 oder mit 512 Zeichen unterstützt.

Dateien in diesem Format beginnen mit einem 4 Byte großen Header:

PSF1 Header
OffsetGrößeBedeutung
02Magic Number 36hex, 04hex
21Font Mode: Bitfeld, das die Eigenschaften des Zeichensatzes definiert, wenn das entsprechende Bit gesetzt ist:

Bit 0: Font enthält 512 Zeichen
Bit 1: Font hat Unicode-Codierungstabelle
Bit 2: Die Codierungstabelle enthält Zeichensequenzen

31Höhe eines Zeichens (=Größe eines Zeichens in der PSF-Datei)

Version 2

Dieses Format kann beliebig große Zeichen speichern, auch die Anzahl der Zeichen im Font ist nun frei wählbar.

PSF2 Header
OffsetDatentypBedeutung
0uint8_t[4]Magic Number 72hex, B5hex, 4Ahex, 86hex
4uint32_tVersion. (bisher stets 0)
8uint32_tGröße des Headers (in Byte)
12uint32_tFlags (derzeit ist nur Bit 0 definiert, welches angibt, ob der Font eine Unicode-Tabelle enthält)
16uint32_tAnzahl an Zeichen im Font
20uint32_tGröße eines Zeichens (in Byte)
24uint32_tZeichenhöhe (in Pixel)
24uint32_tZeichenbreite (in Pixel)

Die 32-Bit-Werte sind im Little-Endian-Format gespeichert.

Zeichendaten

Nach dem Header folgen die eigentlichen Zeichendaten. In PSFv1 entspricht jedes Byte genau einer Zeile mit 8 Pixeln. In PSFv2 werden die Zeilen gegebenenfalls von rechts mit Nullbits aufgefüllt, um auf eine ganze Anzahl von Bytes pro Zeile zu kommen.

Beispiel

Die bei vielen Linux-Distributionen mitgelieferte Font-Datei Uni1-Fixed16.psf beginnt (in Hexadezimaldarstellung) wie folgt:

Offset   | Datenbytes—————————+——————————————————————————————————————————————————00000000 | 36 04 03 10 00 00 00 00  3c 42 99 a5 a1 a1 a5 9900000010 | 42 3c 00 00 00 00 00 00  3c 42 b9 a5 a5 b9 a9 a500000020 | 42 3c 00 00 0c 30 00 00  41 41 22 22 14 08 08 0800000030 | 08 08 00 00 00 00 00 00  18 24 24 42 42 7e 42 42…

Die ersten zwei Bytes 36 04 sind der PSF1-Header. Das Font Mode-Byte hat den Wert 03hex, das bedeutet: Der Font enthält eine Unicode-Zeichentabelle und Zeichensequenzen. Das darauf folgende Byte hat den Wert 10hex = 16dez und gibt die Höhe der Zeichen in Pixel und in Byte an.

Es folgen daraufhin jeweils 16 Byte pro Zeichen, die die Pixeldaten enthalten:

Zeile | Byte | Pixel——————+——————+—————————————————   1  |  00  | · · · · · · · ·   2  |  00  | · · · · · · · ·   3  |  00  | · · · · · · · ·   4  |  00  | · · · · · · · ·   5  |  3c  | · · █ █ █ █ · ·   6  |  42  | · █ · · · · █ ·   7  |  99  | █ · · █ █ · · █   8  |  a5  | █ · █ · · █ · █   9  |  a1  | █ · █ · · · · █  10  |  a1  | █ · █ · · · · █  11  |  a5  | █ · █ · · █ · █  12  |  99  | █ · · █ █ · · █  13  |  42  | · █ · · · · █ ·  14  |  3c  | · · █ █ █ █ · ·  15  |  00  | · · · · · · · ·  16  |  00  | · · · · · · · ·

Unicode-Zeichentabelle

Die Unicode-Zeichentabelle gibt für jedes Zeichen im Font an, für welches Unicode-Zeichen oder Zeichenfolge es stehen soll. Das gestattet es, dass identisch aussehende Unicode-Zeichen (z. B. das lateinische A, das kyrillische А und das griechische Alpha) nur einmal im Font kodiert werden müssen.

Außerdem können Zeichen im Font enthalten sein, die in Unicode keinen eigenen Code haben, sondern nur über eine Sequenz von Unicode-Zeichen dargestellt werden können.

Die Unicode-Werte werden im PSFv1-Format als 16-Bit-Werte kodiert, so dass nur Zeichen aus der Basic Multilingual Plane unterstützt werden. PSFv2 kodiert die Werte in UTF-8 und kann so auch Zeichen jenseits von U+FFFF enthalten.

Einzelnachweise