2.2.3.3. Загрузка шрифтов.

    Перед тем, как выводить текст, используя тот или иной шрифт, последний должен быть загружен в X Window и выбран в графическом контексте.

    Загрузка шрифта осуществляется процедурой XLoadFont( ). Она берет в качестве аргумента имя шрифта, находит его и возвращает программе соответствующий идентификатор. Этот идентификатор передается затем процедуре XSetFont( ), чтобы выбрать шрифт в GC. Заметим, что реально шрифт с данным именем загружается сервером лишь один раз. После этого при обращениях к XLoadFont( ) с тем же именем шрифта, функция возвращает ссылку на шрифт, уже находящийся в памяти компьютера.

    По умолчанию X ищет файл со шрифтом в директории "usr/lib/X11/fonts". Программист может задать дополнительные директории для поиска с помощью процедуры XSetFontPath( ).

    Имя шрифта в X начинается с "-" и состоит из двух частей. Между ними стоит "--". В свою очередь, каждая из частей состоит из полей - слов, разделенных "-".

    В первой части указывается следующее:

  1. изготовитель шрифтам (foundry), например adobe;
  2. семейство шрифта (font family), например courier, helvetica;
  3. жирность шрифта (weight), например bold;
  4. наклон шрифта (slant);
  5. ширина букв шрифта (width).

    Во второй части указывается следующее:

  1. размер шрифта в пикселах (pixels);
  2. размер шрифта в десятых долях "точки" ("точка" равна 1/72 дюйма );
  3. горизонтальное разрешение устройства, для которого разработан шрифт (horizontal resolution in dpi); величина измеряется в числе "точек" на дюйм;
  4. вертикальное разрешение устройства, для которого разработан шрифт (vertical resolution in dpi); величина измеряется в числе "точек" на дюйм;
  5. тип шрифта (spacing); возможные значения параметра следующие:
    m - шрифт с фиксированной шириной символов;
    p - пропорциональный шрифт с переменной шириной символов;
  6. средняя ширина символов шрифта, изморенная в десятых долях пиксела (average width);
  7. множество символов шрифта в кодировке ISO (International Standards Organisation) (character set).

    Ниже приведен пример названия шрифта.

-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);
. . . . . . .