PC Screen Font (PSF) — это формат растрового шрифта, который в настоящее время используется ядром Linux для консольных шрифтов. Документацию формата файла PSF можно найти в исходном коде утилит Linux kbd. [1] Формат описан Университетом Эйндховена. [2]
Каждый файл PSF начинается с заголовка. Существует два типа заголовков: PSF1 и PSF2. Все многобайтовые целые числа находятся в порядке младшего байта (little endian).
Длина | Описание | Примечания |
---|---|---|
2 | Волшебные байты | Всегда36 04 |
1 | Режим шрифта PSF | Различные флаги шрифтов, см. режимы шрифтов |
1 | Размер глифа | Размер глифа в байтах, 8-битное беззнаковое целое число. Для psf1 размер символа всегда равен высоте глифа |
Длина | Описание | Примечания |
---|---|---|
4 | Волшебные байты | Всегда72 b5 4a 86 |
4 | Версия | 32-битное целое число без знака, в настоящее время всегда 0 |
4 | Размер заголовка | 32-битное беззнаковое целое число, размер заголовка в байтах (обычно 32) |
4 | Флаги | 32-битное беззнаковое целое число, см. Флаги шрифтов |
4 | Длина | 32-битное беззнаковое целое число, количество глифов |
4 | Размер глифа | 32-битное беззнаковое целое число, количество байтов на глиф |
4 | Высота | 32-битное беззнаковое целое число, высота каждого глифа |
4 | Ширина | 32-битное беззнаковое целое число, ширина каждого глифа |
Все глифы psf1 имеют ширину 8 пикселей.
Режим шрифта в заголовке psf1 — это 8-битное беззнаковое целое число, содержащее различные флаги шрифта.
Значение ( шестнадцатеричное ) | Имя | Значение |
---|---|---|
0x01 | PSF1_MODE512 | Если этот бит установлен, шрифт будет иметь 512 глифов. Если он не установлен, шрифт будет иметь всего 256 глифов. |
0x02 | PSF1_MODEHASTAB | Если этот бит установлен, шрифт будет иметь таблицу Unicode . |
0x04 | PSF1_MODESEQ | Эквивалентно PSF1_MODEHASTAB |
Поле флагов шрифта в заголовке psf2 представляет собой 32-битное беззнаковое целое число, содержащее различные флаги о шрифте. В настоящее время существует только один флаг.
Значение (шестнадцатеричное) | Имя | Значение |
---|---|---|
0x00000001 | PSF2_HAS_UNICODE_TABLE | Если этот бит установлен, шрифт будет иметь таблицу Unicode. |
Фактические данные глифа следуют сразу за заголовком. Каждый бит в каждом глифе представляет один пиксель в шрифте: 0 для ненарисованного, 1 для нарисованного. Каждая строка каждого глифа дополняется целым числом байтов. Например, шрифт 12x12 будет иметь 2 байта на строку. Буква «A» в битовой карте PSF 12x12 может выглядеть следующим образом:
прокладка Данные шрифта |+----------+ +--+000001100000 0000000011110000 0000000110011000 0000001100001100 0000011000000110 0000110000000011 00001111111111111 00001111111111111 0000110000000011 0000110000000011 0000110000000011 0000110000000011 0000
с двенадцатью битами фактических данных и заполнением для заполнения каждой строки до ближайшего байта. Строки сохраняются первыми, начиная с самого левого столбца.
Если файл PSF содержит таблицу Unicode, то каждый глиф имеет запись в таблице Unicode, причем первый глиф соответствует первой записи в таблице, второй глиф — второй записи и т. д. Формат записи в таблице Unicode зависит от типа заголовка PSF.
Записи в таблице unicode файла PSF1 представлены как ряд 16-битных беззнаковых целых чисел с прямым порядком байтов, заканчивающихся на 0xffff. Первые целые числа в записи содержат символ unicode, представленный соответствующим глифом. Эти символы unicode продолжаются до тех пор, пока не встретится целое число 0xFFFE. Затем, начиная со значения 0xfffe, вместо того, чтобы представлять отдельные символы unicode, числа представляют ряд символов unicode, соответствующих глифу, начиная новый ряд с каждым встреченным 0xfffe и останавливаясь, как только встретится 0xffff. Например, следующий ряд 16-битных беззнаковых целых чисел с прямым порядком байтов будет интерпретироваться следующим образом:
0xмертвый0xговядина0xfffe0x31410x59260xfffe0x12340x56780xffff
Всякий раз, когда встречается U+dead, U+beef, последовательность U+3141 U+5926 или последовательность U+1234 U+5678, отображать глиф, соответствующий этой записи таблицы Unicode.
Записи в таблице Unicode файла PSF2 такие же, как и в файле PSF1, за исключением того, что символы Unicode представлены в кодировке UTF-8, последовательности Unicode начинаются с однобайтовой последовательности 0xfe, а не с двухбайтовой последовательности 0xfffe, и записи Unicode заканчиваются однобайтовой последовательностью 0xff, а не двухбайтовой последовательностью 0xffff.