В данном разделе описываются возможности, которые имеет программист для вывода текста и произвольных графических изображений.
Особенностью X Window является то, что рисовать можно не только в окне, но и в специально подготовленной области памяти. Данная область называется картой пикселей и идентифицируется целым числом, имеющим тип Pixmap
. Карта толщиной в один бит имеет
специальное название - битовая.
Графический контекст -- один из уникальных атрибутов X Window, связанный одновременно со скромными базовыми графическими возможностями системы и с ее клиент-серверными особенностями. Набор поддерживаемых X Window операций вывода графики можно считать более чем скромным -- в него входит рисование точки (пиксела), линии, текста, растрового изображения и ограниченного контуром или закрашенного многоугольника. Но каждая такая операция требует для передачи по сети слишком много дополнительной информации -- о цвете, стиле линии, короче говоря, обо всех возможных атрибутах. Именно это множество атрибутов и называется "графическим контекстом" (GC). Использование модели "ресурс-идентификатор" в данном случае также позволяет добиться существенного уменьшения трафика - перед началом выполнения множества операций "рисования" программа-клиент регистрирует необходимые GC, а затем выполняет операции с указанием коротких идентификаторов вместо множества дублирующих друг друга данных.
Прежде чем начать работу с графикой, программа должна выделить себе специальную структуру данных и получить указатель на нее. Эта структура называется графическим контекстом (Graphic Context (GC)). Указатель на GC используется в качестве одного из параметров при вызове "рисующих" функций X. Графический контекст содержит ряд атрибутов, влияющих на отображение объектов: текста, линий, фигур и др. Выделенный GC должен быть освобожден до завершения работы программы.
Графический контекст создается функцией XCreateGC()
, имеющей следующий прототип:
GC XCreateGC (Display *display, Drawable drawable, unsigned long valueMask, XGCValues *gcValues);
Первый аргумент - это указатель на структуру типа Display
, который программа получает после вызова XOpenDisplay()
; второй - идентификатор окна (или карты пикселей), в котором программа будет рисовать; третий - битовая маска, определяющая, какие атрибуты GC задаются; последний аргумент - структура типа XGCValues
, определяемая следующим образом:
typedef struct { int function; unsigned long plane_mask; unsigned long foreground; unsigned long background; int line_width; int line_style; int cap_style; int join_style; int fill_style; int fill_rule; int arc_mode; Pixmap tile; Pixmap stipple; int ts_x_origin; int ts_y_origin; Font font; int subwindow_mode; Bool graphics_exposures; int clip_x_origin; int clip_y_origin; Pixmap clip_mask; int dash_offset; char dashes; } XGCValues;
Значения полей данной структуры будут объяснены ниже. Каждому из них соответствует бит в маске, которая передается в качестве третьего параметра при вызове функции XCreateGC()
. Эти биты обозначаются символическими константами, определенными в файле <X11/Xlib.h>
. Если бит установлен, то значение соответствующего атрибута должно быть взято из переданной XCreateGC()
структуры XGCValues
. Если бит сброшен, то атрибут приникает значение по умолчанию.
Следующий пример показывает процесс создания графического контекста, в котором устанавливаются два атрибута: цвет фона и цвет переднего плана.
. . . . . . . GC gc; XGCValues values; Display display; int screenNumber; . . . . . . . . values.foreground = BlackPixel (display, screenNumber); values.background = WhitePixel (display, screenNumber); . . . . . . . . gc = XCreateGC (display, RootWindow (display, screenNumber), (GCForeground | GCBackground), &values);
Вызов XCreateGC()
- не единственный способ создания графического контекста. Так, например, новый контекст может быть получен из уже существующего GC с помощью XCopyGC()
.
Когда контекст порожден, его атрибуты могут изменяться функцией
XChangeGC()
. Например:
values.line_width = 10; XChangeGC (display, gc, GCLineWidth, &values);
Приведенный фрагмент кода меняет ширину линий, рисуемых с помощью графического контекста.
Для того, чтобы получить значение полей GC, используется функция XGetGCValues()
.