Формат PCF-шрифтов

Ответить
Аватара пользователя
blackstrip
Админ
Сообщения: 1176
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Формат PCF-шрифтов

Сообщение blackstrip » Сб май 26, 2012 11:35 am

Вот решил описать и выложить формат PCF-шрифтов, мало ли кому будет полезен.

http://blackstrip.ru/pcffile.txt

Для школьников - его можно использовать в своих программах на QBasic и TurboPascal (и там и там есть команда аля LINE которая при указании спецпараметра ест 16-битные образцы и мгновенно отрисовывает по 16 точек в соответствии с битами образца, вместо чтоб тормозно отрисовывать по одной точке, поэтому использование PCF-шрифтов ускоряет отрисовку текста в таких прогах). Плюс буквы там записываются в DOS-кодировке, поэтому легко выводить тексты русскими символами просто поиском символа в шрифте с соответствующим досовским ascii-кодом.

Для других людей - PCF это достаточно компактный двухцветный формат шрифтов, можно использовать в явовских мобильных прогах или еще где. Кто не любит досовскую кодировку - просто в PCFC (http://blackstrip.ru/pcfc.exe) укажите "Символьный" шрифт, и вы получите PCF в виндовской кодировке для собственных нужд.

Файл формата вскоре будет обновлен, т.к. уже сейчас в PaintCAD 4Windows используется дополнительный символ с нулевым аски-кодом для записи в него доп.информации о том, какой горизонтальный интервал выдерживать в шрифте (чтоб пользователь не подбирал вручную это значение при использовании сгенерированного шрифта), а PCFC записывает это значение автоматически (тот который http://blackstrip.ru/pcfc.exe не записывает, а вот PCFC который встроен в PaintCAD с версии 1.0.4 - будет записывать).

На главную добавлен раздел PCF-шрифты для PaintCAD - пока по клику на нем открывается тот же файл с форматом, но скоро там будет и ссылка на этот формат и база данных по шрифтам, с предпросмотровыми картинками.

p.s. файл формата уже обновлен, добавлена информация о нулевом символе и записанном в него значении горизонтального интервала.

Аватара пользователя
blackstrip
Админ
Сообщения: 1176
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: Формат PCF-шрифтов

Сообщение blackstrip » Сб сен 24, 2016 12:50 am

Восстановил файл pcffile.txt. На всякий случай выкладываю его содержимое здесь:

-=(Русский)=-

PCF - "PaintCad Font" или "Шрифт Паинткада"

Содержит растровые двухцветные изображения каждого символа. Нулевой цвет - полностью прозрачный (цвет заднего фона). Единичный цвет - полностью непрозрачный (или цвет букв, т.е. это и есть рисуемые пиксели).

Обычно содержит набор английских и русских букв, соответствующих DOS-кодировке. Если шрифт "символьный", то вместо букв может содержать картинки. При создании PCF шрифта из шрифтов Windows (с помощью утилиты PaintCAD Font Creator): если включена опция "Символьный", то буквы в PCF-шрифте сохраняют порядок расположения как в Windows шрифте, т.е. в Windows-кодировке, и писать таким символьным шрифтом в программах, использующих PCF-шрифты для текста, уже не получится (только вставлять одиночные символы прямо на картинку через Обзор шрифта).

Первые 2 байта PCF-шрифта - это высота символов в шрифте FH (Font Height, в пикселях). Все символы PCF-шрифта всегда имеют одинаковую высоту.

Наименование Длина Описание
FH 2 байта Высота букв в шрифте

Затем для каждого из символов шрифта записывается блок, имеющий двухбайтовые поля SN (Symbol number, номер символа, обычно это ASCII-код символа в DOS-кодировке), SP (Symbol Pixels, ширина символа в пикселях), SL (Symbol Lines, ширина символа в 16-точечных линиях). После этих трех полей располагается тело символа SB (Symbol Bitmap), которое имеет длину SL*FH*2 байт, состоит из 16 битных полей в количестве SL*FH штук.

Наименование Длина Описание
SN 2 байта Номер символа, обычно это ASCII-код в DOS-кодировке
SP 2 байта Ширина символа в точках
SL 2 байта Ширина символа в 16-точечных линиях
SB SL*FH*2 байт Тело символа, побитово описывающее его изображение (Symbol bitmap)

Eсли пересчитать Ширину символа в 16-точечных линиях SL в точки (т.е. умножить SL на 16), то результат всегда будет больше или равен истинной ширине символа в точках SP (чтоб символ влез полностью в отрисовываемое поле). Т.е. если SP=1..16, то SL=1. А если SP=17, то сразу SL=2, хотя и понятно что в этом случае SL*16 = 2*16 = 32 точки, а ширина символа только 17 точек, и 15 битов для каждой строки лишние, хотя они и будут записаны в PCF файл.

Теоретически, в PCF можно записать 65536 символов (с кодами от 0 до 65535), каждый из которых может иметь ширину от 1 до 65535 точек и высотку от 1 до 65535 точек. Хотя обычно используются только символы с номерами от 32 до 255. Можно придумать свои номера символов (что нибудь выше 255, например, 1000), в теле которых хранить какую либо дополнительную информацию о шрифте или еще о чем либо.

Во многих простых языках программирования типа QBasic или Turbo Pascal присутствует функция рисования линии по 16-битному образцу. Поэтому PCF-шрифты очень легко использовать для быстрой отрисовки текстов в таких программах, т.к. растровые данные в PCF хранятся именно в 2-байтном (16-битном) формате, остается только последовательно скормить их функции рисования линий. Изначально формат шрифта был разработан именно для этого (поэтому в нем используется DOS-кодировка) в начале 2000-ых годов и только затем переехал в PaintCAD.

Некоторые символы в Windows, например, символы наклонным курсивом - имеют ширину, вылезающую за границы, сообщаемые Windows (так специально задумано, чтобы символы могли наезжать элементами букв друг на друга). PaintCAD Font Creator автоматически подбирает границы символов так, чтобы все символы влезли в свои границы. Для этого он увеличивает ширину ВСЕХ символов на некоторое число пикселей. Поэтому при отрисовке символов следует не просто прибавлять к текущей координате ширину предыдущего символа, но и еще прибавлять либо отнимать некоторый коэффициент "Горизонтальный интервал", в PaintCAD при использовании PCF шрифтов для отрисовки текста этот интервал регулируется сочетаниями клавиш Ctrl+3/Ctrl+4, а если вы будете использовать PCF в своих программах - обязательно введите параметр "горизонтальный интервал" в процедуру отрисовку шрифта.

-=(BlackStrip Studios 2012)=-
http://blackstrip.ru

-=(English)=-

PCF - "PaintCad Font"

PCF-file contains raster images for every font symbol. "0" color is fully transparent (background color). "1" color is fully non-transparent (drawable pixels, foreground color).

Usually it contains set of english symbols, set of russian symbols (in old DOS ASCII encoding) and set of digits and special symbols. You can find "symbolic" fonts also - it is picture sets. If you create symbolic fonts in PaintCAD Font Creator - these fonts will have Windows encoding and cannot be used for text drawing in PaintCAD, only for single symbol pasting directly to image (via Font browsing).

First two bytes of PCF-file - is height of chars FH (Font Height, in pixels). All chars have single height.

Name Length Description
FH 2 bytes Height of chars in PCF

Next bytes of PCF contain char-blocks for every symbol in font. First three fields of char-block are SN (Symbol number, usually it is ASCII-code of char in DOS encoding), SP (Symbol Pixels, symbol width in pixels), SL (Symbol Lines, symbol width in 16-pixel lines).And after these three fields - there is SB (Symbol Bitmap) with SL*FH*2 bytes length, contains SL*FH 16-bit fields.

Name Length Description
SN 2 bytes Symbol number, usually it is ASCII-code in DOS encoding
SP 2 bytes Symbol width in pixels
SL 2 bytes Symbol width in 16-bit pixel-lines
SB SL*FH*2 bytes Symbol bitmap

Symbol width in pixels SP is less or equal to symbol length in 16-bit pixel-lines SL. If SP=1..16 then SL=1. If SP=17..32 then SL=2. etc.

PCF-file can contain up to 65536 symbols (from 0 to 65535 index). Each symbol can have 1..65535 pixels width and 1..65535 pixels height. But usually there is used symbols with indexes from 32 to 255 only.

In simple programming languages (such as QBasic or TurboPascal) you can use line-drawing command with 16-bit pattern. It allows to you draw PCF-font symbols quickly - you need to read 16-bit patterns from PCF and to feed line-drawing procedures with it.

Some Windows fonts can have real width greater than its field width (for example, Italic fonts). It allows to place one symbol fragments over another symbols. PaintCAD Font Creator checking it and increasing ALL SYMBOLS width by count of these additional pixels. In PaintCAD Text tool you can tune it via "Horizontal interval" regulator. In your own program codes you need to add this value (Horizontal interval) to PCF-drawing procedure, and draw every next symbol adding previous symbol width and Horizontal interval value to current X drawing coordinate.

-=(BlackStrip Studios 2012)=-
http://blackstrip.ru

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя