Чтение онлайн

ЖАНРЫ

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

Семериков С. А.

Шрифт:

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

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

его помощью строку "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)). По умолчанию загружается первый из шрифтов, соответствующий шаблону, поэтому для корректного отображения текста с кириллицей необходимо в шаблоне указывать кодировку.

1.2.4 Использование цвета

Во времена не столь отдаленные экранные контроллеры могли поддерживать одновременно ограниченное количество цветов (вначале 16, позже 256). В связи с этим приложение не могло просто запросить рисование ярко-красным цветом, и ожидать, что этот цвет будет доступным. Каждое приложение распределяло цвета, которые ему были нужны, и когда все 16 или 256 цветовых элементов использовались, следующее распределение цвета заканчивалось неудачей.

В связи с этим появилось понятие "цветовой карты" - палитры. Палитра является таблицей того же размера, что и количество одновременно отображаемых данным экранным контроллером цветов. Каждый элемент палитры содержит RGB (Красные, Зеленые и Синие) величины различных цветов (все цвета могут быть нарисованы, используя некоторую комбинацию красного, зеленого и синего).

Для того, чтобы сделать использование цветов близким к тому, которое предполагал программист, были введены функции выделения палитры. Вы можете попросить, выделить вас элемент палитры для цвета, заданного набором RGB-значений. Если он уже существовал, вы получите индекс в таблице. Если цвет не существовал, и таблица не заполнена, должна быть выделена новая ячейка палитры, содержащая данные значения RGB, и возвращен ее индекс. Если таблица была заполнена, процедура должна была закончиться неудачей. Вы могли затем запросить получение элемента палитры с цветом, ближайшим к требуемому. Это означает, что фактически рисование на экране будет произведено с использованием цвета, близкого к желаемому, но не того же самого.

Поделиться с друзьями: