Перед тем, как выводить текст, используя тот или иной шрифт, последний должен быть загружен в X Window и выбран в графическом контексте.
Загрузка шрифта осуществляется процедурой XLoadFont( ). Она берет в качестве аргумента имя шрифта, находит его и возвращает программе соответствующий идентификатор. Этот идентификатор передается затем процедуре XSetFont( ), чтобы выбрать шрифт в GC. Заметим, что реально шрифт с данным именем загружается сервером лишь один раз. После этого при обращениях к XLoadFont( ) с тем же именем шрифта, функция возвращает ссылку на шрифт, уже находящийся в памяти компьютера.
По умолчанию X ищет файл со шрифтом в директории "usr/lib/X11/fonts". Программист может задать дополнительные директории для поиска с помощью процедуры XSetFontPath( ).
Имя шрифта в X начинается с "-" и состоит из двух частей. Между ними стоит "--". В свою очередь, каждая из частей состоит из полей - слов, разделенных "-".
В первой части указывается следующее:
Во второй части указывается следующее:
Ниже приведен пример названия шрифта.
-adobe-courier-bold-o-normal--10-100-75-75-m-60-iso8859-1
Части имени могут заменяться символом "*" или "?". В этом случае X подбирает шрифт, сличая имена имеющихся шрифтов с предоставленным шаблоном, так, как это делается при поиске файлов в UNIX. Например, шаблону
*charter-medium-i-*-240-*
соответствуют имена
-hit-charter-medium-i-normal-25-240-75-75-p-136-iso8859-1
-hit-charter-medium-i-normal-33-240-100-75-p-136-iso8859-1
Названия шрифтов, доступных в системе, хранятся в соответствующей базе данных. Получить список имен шрифтов можно с помощью процедуры XlistFonts( ) или XListFontsWithInfo( ). Список шрифтов, возвращаемый этими функциями, должен быть освобожден вызовом XFreeFontNames( ).
Некоторые шрифты, такие как "fixed" или "9x15", доступны всегда.
Получить информацию о загруженном шрифте можно с помощью функции XQueryFont( ), которая возвращает заполненную структуру типа XFontInfo( ). Одновременно загрузить шрифт и получить информацию о нем можно с помощью процедуры XLoadQueryFont( ).
Когда информация о шрифте больше не нужна, ее следует освободить с помощью XFreeFontInfo( ). Когда становится не нужен и сам шрифт, последний надо "сбросить", обратившись к процедуре XUnloadFont( ). Функция XFreeFont( ) объединяет в себе XFreeFontInfo( ) и XUnloadFont( ).
Следующий фрагмент кода загружает шрифт "Courier", создает GC и выводит с его помощью строку "Hellow, world!".
Display *prDisplay;
GC prGC;
Window nWnd;
XFontStruct *prFontInfo;
. . . . . . .
/* Загружаем шрифт */
if ( (prFontInfo=
XLoadQueryFont(prDisplay, "*-courier-*" )) == NULL){
printf("Font not found!\n");
exit(1);
}
. . . . . . .
/* Создаем GC и рисуем строку */
prGC=XCreateGC(prDisplay, nWnd, 0, NULL);
XSetForeground (prDisplay, prGC, BlackPixel(prDisplay, 0));
XSetFont (prDisplay, prGC, prFontInfo->fid);
XDrawString (prDisplay, nWnd, prGC, 10, 50, "Hello, world!",
strlen ("Hello, world!") );
XFreeGC (prDisplay, prGC);
. . . . . . .
/* "Сбрасываем" шрифт */
XUnloadFont (prDisplay, prFontInfo->fid);
. . . . . . .
|