Программирование в X-Window средствами Free Pascal

Перейти к содержанию

1.2.3. Вывод текста

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

Для вывода текста используются процедуры XDrawString(), XDrawImageString() и XDrawText(). Каждая из них имеет две версии. Первая используется для шрифтов, имеющих не более 256 символов. Если же символов больше («большие» шрифты), то применяется вторая версия. Функции, работающие с «большими» шрифтами, имеют имена XDrawString16(), XDrawImageString16() и XDrawText16(). Параметры процедур, выводящих текст, задают дисплей, окно, графический контекст, строку, ее положение и т.д. Рисование идет в соответствии с областью отсечения контекста. Буквы или их части, находящиеся за пределами области отсечения, не изображаются. Наиболее часто употребляется процедура XDrawString() (XDrawString16()). Ее параметры дают строку, ее длину и положение в окне. Текст рисуется цветом переднего плана, выбранного в GC.

Функция XDrawImageString() (XDrawImageString16()) похожа на предыдущую процедуру с той лишь разницей, что фон символов при рисовании закрашивается цветом фона, установленного в GC. XDrawString() и XDrawImageString() выводят символы, используя шрифт, установленный в GC.

XDrawText() (XDrawText16()) позволяет рисовать несколько строк сразу, используя при этом разные шрифты. Каждая рисуемая единица задается структурой TXTextItem.

Процедура XDrawText16() использует структуру TXDrawText16.

Поле font в приведенных структурах (TXTextItem и TXDrawText16) задает шрифт, используемый для рисования. Если значение поля font - None, то применяется шрифт, выбранный в GC.

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

В растровых шрифтах каждому символу соответствует некоторый битовый шаблон, определяющий порядок закраски пикселей при рисовании. Если бит шаблона равен 1, то соответствующий элемент изображения закрашивается цветом переднего плана GC, если же он равен 0, то он закрашивается либо цветом фона, либо вообще не рисуется.

В векторных шрифтах каждый символ описывается последовательностью линий, которые, будучи составлены вместе, и дают его изображение. Размеры символов варьируются от шрифта к шрифту. Для их описания используется структура TXCharStruct. Сам шрифт описывается структурой TXFontStruct.

Перед тем, как выводить текст, используя тот или иной шрифт, последний должен быть загружен в 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« или «9×15», доступны всегда.

Получить информацию о загруженном шрифте можно с помощью функции XQueryFont(), которая возвращает заполненную структуру типа XFontInfo(). Одновременно загрузить шрифт и получить информацию о нем можно с помощью процедуры XLoadQueryFont().

Когда информация о шрифте больше не нужна, ее следует освободить с помощью XFreeFontInfo(). Когда становится не нужен и сам шрифт, последний надо «сбросить», обратившись к процедуре XUnloadFont(). Функция XFreeFont() объединяет в себе XFreeFontInfo() и XUnloadFont().

Следующий фрагмент кода загружает шрифт »courier«, создает GC и выводит с его помощью строку «Hello, world!».

var
  prDisplay : PDisplay;
  prGC : TGC;
  nWnd : TWindow;
  prFontInfo : PXFontStruct;
. . . . . . . 
(* Загружаем шрифт *)
prFontInfo := XLoadQueryFont(prDisplay, '*-courier-*' );
if ( prFontInfo = NIL) then
begin
  writeln('Font not found!');
  halt(1);
end;
. . . . . . .
(* Создаем GC и рисуем строку *)
prGC := XCreateGC(prDisplay, nWnd, 0, NIL);
XSetForeground (prDisplay, prGC, XBlackPixel(prDisplay, 0));
XSetFont (prDisplay, prGC, prFontInfo^.fid);
XDrawString (prDisplay, nWnd, prGC, 10, 50, 'Hello, world!',
      strlen ('Hello, world!') );
XFreeGC (prDisplay, prGC);
. . . . . . .
(* "Сбрасываем" шрифт *)
XFreeFont (prDisplay, prFontInfo);
. . . . . . .

Для отображения символов кириллицы необходимо использовать один из локализованных шрифтов в той кодировке, которая поддерживается вашей системой (как правило, это koi8-r (koi8-u)). По умолчанию загружается первый из шрифтов, соответствующий шаблону, поэтому для корректного отображени текста с кириллицей необходимо в шаблоне указывать кодировку.