Palm (Pilot)
Клуб пользователей, Санкт-Петеpбуpг
 ENLiGHT Project. Новости об информационных технологиях, науке, авиации и космонавтике

ENLiGHT Project

оглавление | новости от ib/news | другие проекты | www.palmgear.com | письмо | win koi lat

Шрифты в 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.

bul1.gif (246 bytes) Таблица изображений шрифта (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.

bul1.gif (246 bytes) Таблица указателей (BitMap Location Table).

Эта таблица содержит указатели на изображение каждого символа в BitImageTable. Последнее значение этой таблицы указывает на бит следующий за последним битом картинки от default символа.

Для символов "A", "B" и default предыдущего примера эта таблица будет иметь вид:

     0000 000A 0012 0020

По этой таблице можно узнать ширину символа по разнице его смещения и смещения последующего символа.

bul1.gif (246 bytes) Таблица смещений/ширин символов. (Width/offset table).

В элементах этой таблицы находятся значения для всех символов шрифта. Эти значения содержат: в старшем байте смещение прибавляемое к kernMax и указывющее на керн символа, а в младшем байте ширину символа.

Смещение в шрифтах PalmOS встречалось только равным 0.

Когда символ в шрифте отсутствует то элемент таблицы равен -1 и менеджер шрифтов выводит начертание default символа. Таблица заканчивается значением -1.

bul1.gif (246 bytes) Glyph Width table.

- таблица не используется.

bul1.gif (246 bytes) Image height table.

- эта таблица создается менеджером шрифтов.

На сегодняшний день существуют два редактора шрифтов для PalmOS.

  1. Font Editor by Sergey Menshikov. Этот редактор работает под Windows. Вместе с редактором поставляются примеры использования шрифтов для разработчиков программ.

  2. 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'е.

--

Если вы хотите дополнить FAQ - пожалуйста пишите. Ваши вопросы и ответы по e-mail могут быть помещены в форум или опубликованы в FAQ.

design/collection/some content by Frog,
PALM FAQ (C) Frog 2000-2003,
"PALM FAQ, http://www.enlight.ru/pilot/".