June 28, 2005

Шрифты и PalmOS

Дали тут заданице - сделать в приложении шрифты в два раза меньше на некоторых контролах, ибо машинки HiRes-ные. Фигли, сделаем =)

Во-первых, полез в PalmOS API докумментацию - там нашел себе пару ф-ций:

FntDefineFont(fontID MyFontID, struct FontTag* hResourceHandle);
Определяет шрифт в системе, грузя его из памяти по hResourceHandle так, что к нему по MyFontID обращаться можно.

FontID FntSetFont(FontID MyFontID);
Устанавливает шрифт для отрисовки, возвращая старый шрифт.

Ладно, теперь шрифт надо прикрутить к ресурсам - лезем в доки PilRC и... обламываемся. Там нет описания прикручивания LoDensity и HiDensity хрифтов, только обыкновенных. Ну ладно, полез на сайт этого компилера, скачал там последнюю версию 3 с чем-то. Появилось. Описывается так вот в .rcp файле:

// FontID-а должен быть строго
// 128 <= ID <= 255. Остальные цифры оставить так.
FONTFAMILY ID MY_FONT FONTID 130
BEGIN
 FONT "MyLRFont.txt" DENSITY 72  // Lo-Res font
 FONT "MyHRFont.txt" DENSITY 144 // Hi-Res font
END
Причем, формат файлов тоже описан с горем пополам. Но, он есть в мануале. Каждая буква там представляется как

----
----
----
----
-##-
#-#-
-##-
#-#-
#-#-
----
----

Для HD-шрифтов буквы должны быть ровно в два раза больше, чем для LD. Вот в этом и возник один баг. Баг в том, что если кол-во пикселей в букве по горизонтали нечетное в HD -шрифте, то LoDensity для него не сделать - PilRc вылетает с такими шрифтами и "просит кому-то отправить какой-то отчет" =) Пропалился я вобщем весь день с этими шрифтами, перерисовал каждую букву.
В результате - заработало =) Привожу нужный кусок кода, мне на будущее ;)

FontPtr g_hFont;
// ...
MemHandle hMem = DmGetResource('nfnt', MY_FONT);
g_hFont = (FontPtr)MemHandleLock(hMem);
FntDefineFont((fontID)130, g_hFont);

Теперь буду знать.