Шрифты в PalmOS
Александр Овчаренко
FIDO: 2:5065/1, E-mail: sandy@mail.sochi.ru
(публикуется с разрешения автора)
В этой статье я опишу внутреннее устройство
шрифтов используемых в PalmOS. Это описание
построено на результатах полученных опытным
путем и из косвенных источников поэтому не
гарантирует всю полноту информации как и ее
безошибочность. Со временем это описание будет
более детализированно.
Шрифты PalmOS почти полностью соответствуют bitmap NFNT
шрифтам используемым на компьютерах фирмы apple.
Шрифт представляет собой следующую структуру
данных:
+-----------------------------------------------------------------+
| Заголовок шрифта (Font Header) - 26 байт. |
+-----------------------------------------------------------------+
| Таблица изображений шрифта (BitImage Table). |
+-----------------------------------------------------------------+
| Таблица указателей (BitMap Location Table). |
+-----------------------------------------------------------------+
| Таблица смещений/ширин символов. (Width/offset table). |
+-----------------------------------------------------------------+
. Glyph Width table. .
...................................................................
. Image height table. .
...................................................................
Заголовок шрифта это таблица размером 26 байт и
ее можно представить в виде струкутры данных
языка Си:
--- [begin part of .../m68k-palmos-coff/include/PalmOS3/UI/Font.h: ---
typedef struct {
SWord fontType; // font type
SWord firstChar; // ASCII code of first character
SWord lastChar; // ASCII code of last character
SWord maxWidth; // maximum character width
SWord kernMax; // negative of maximum character kern
SWord nDescent; // negative of descent
SWord fRectWidth; // width of font rectangle
SWord fRectHeight; // height of font rectangle
SWord owTLoc; // offset to offset/width table
SWord ascent; // ascent
SWord descent; // descent
SWord leading; // leading
SWord rowWords; // row width of bit image / 2
} FontType;
--- [end part of .../m68k-palmos-coff/include/PalmOS3/UI/Font.h: ----
fontType |
- Значение определяющее тип шрифта. Из описания
NFTN шрифтов сдесь может быть указано что этот
шрифт содержит символы различной ширины либо
высоты, а так же характеристики многоцветности. В
шрифтах от PalmOS это значение равно 0x9000. |
firstChar |
- Содержит ASCII код первого символа
используемого в шрифте. |
lastChar |
- ASCII код последнего символа в шрифте. |
maxWidth |
- Максимальная ширина символа в шрифте. |
kernMax |
- Растояние в пикселах от начала до левого края
знакоместа. Если кернинг символа влево то
значение отрицательно. В шрифтах PalmOS это
значение обычно равно 0. |
nDescent |
- Если размеры таблиц шрифта слишком большы то
значение этого поле является старшим словом
смещения до начала Width/offset table (Таблицы
смещений/ширин символов). См. owTLoc. В ином случае в
этом поле содержится отрицательное значение
descent. |
fRectWidth |
- Содержит ширину знакоместа символа. Поле
fRectWidth обычно равно maxWidth. |
fRectHeight |
- Высота шрифта. В PalmOS высота всех символов
шрифта одинакова. |
owTLoc |
- Смещение до начала Width/offset table (Таблицы
смещений/ширин символов).
owTloc=rowWords*fRectHeight+(lastChar-firstChar)+8; Если в шрифте
слишком большие таблицы, то owTloc содержит младшее
слово смещения, а в nDescent старшее. nDescent=owTloc >> 16;
owTLoc=owTloc & 0xFFFF; |
ascent |
- Расстояние в пикселах от начала знакоместа по
направлению вверх. |
descent |
- Дистанция в пикселах от верха знакоместа по
направлению вниз. Обычно ascent+descent=fRectHeight. |
leading |
- Это дистанция в пикселах от descent линии строки
текста до ascent линии другой строки текста. В
шрифтах PalmOS это значение обычно равно 0. |
rowWords |
- Значение после деления длинны битовой линии в
bitimage на 16. Тобишь, длину линии в пикселах можно
определить: rowpixels = rowWords * 16. |
Таблица изображений шрифта (BitImage Table).
Размер этой таблицы равен BitImageTableSize =
rowWords * fRectHeight. Распределение данных идет с верхней
битовой строки изображения шрифта до нижней
строкой.
Пример BitImageTable шрифта высотой в 8 пикселов для
двух изображений символов "A", "B" и default
символа в бинарном представлении:
+--------+-------+------+.......
00000000000000000000000000000000
00111111011111100111111110000000
01000010001000010100000010000000
01000010001111100100000010000000
01111110001000010100000010000000
01000010001000010100000010000000
11100111011111100111111110000000
00000000000000000000000000000000
+--------+-------+------+.......
То же самое в шестнадцатеричном представлении:
0000 0000 3F7D EF80 4221 4080 423D 4080
7E21 4080 4221 4080 E77D 4F80 0000 0000
Битовая строка дополнена нулевыми битами до
кратности 16.
Таблица указателей (BitMap Location
Table).
Эта таблица содержит указатели на
изображение каждого символа в BitImageTable. Последнее
значение этой таблицы указывает на бит следующий
за последним битом картинки от default символа.
Для символов "A", "B" и default предыдущего
примера эта таблица будет иметь вид:
0000 000A 0012 0020
По этой таблице можно узнать ширину
символа по разнице его смещения и смещения
последующего символа.
Таблица
смещений/ширин символов. (Width/offset table).
В элементах этой таблицы находятся
значения для всех символов шрифта. Эти значения
содержат: в старшем байте смещение прибавляемое
к kernMax и указывющее на керн символа, а в младшем
байте ширину символа.
Смещение в шрифтах PalmOS встречалось только равным
0.
Когда символ в шрифте отсутствует то элемент
таблицы равен -1 и менеджер шрифтов выводит
начертание default символа. Таблица заканчивается
значением -1.
Glyph Width table.
- таблица не используется.
Image height table.
- эта таблица создается менеджером
шрифтов.
На сегодняшний день существуют два редактора
шрифтов для PalmOS.
Font Editor by Sergey Menshikov. Этот редактор
работает под Windows. Вместе с редактором
поставляются примеры использования шрифтов для
разработчиков программ.
Handy Pilot Font Editor by Alexander Ovcharenko. Этот
редактор работает на пилоте.
Эти программы можно взять с www.pilotgear.com.
Для дополнений и замечаний присылайте письма: Alexander
Ovcharenko,
FIDO: 2:5065/1, E-mail: sandy@mail.sochi.ru
Благодарности: Timothy Lyangouzov - за
уточнения в FontHeader'е.
--
|