Прежде чем начать работу с графикой, программа должна выделить себе специальную структуру данных и получить указатель на нее. Эта структура называется графическим контекстом (Graphic Context (GC)). Указатель на GC используется в качестве одного из параметров при вызове "рисующих" функций X. Графический контекст содержит ряд атрибутов, влияющих на изображение объектов: текста, линий, фигур и др. Выделенный GC должен быть освобожден до завершения работы программы.
Графический контекст создается процедурой XCreateGC( ), имеющей следующий прототип:
GC XCreateGC (Display *prDisplay, Drawable nDrawable, unsigned long nValueMask, XGCValues *prValues); |
Первый аргумент - это указатель на структуру типа 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( ). Эти биты обозначаются символическими константами, определенными в файле "Xlib.h". Если бит установлен, то значение соответствующего атрибута должно быть взято из переданной XCreateGC( ) структуры XGCValues. Если бит сброшен, то атрибут приникает значение по умолчанию. Соответствие полей структуры XGCValues и флагов приведено в таблице 1.2.1. приложения 1.
Следующий пример показывает процесс создания графического контекста, в котором устанавливаются два атрибута: цвет фона и цвет переднего плана.
. . . . . . .
GC prGC;
XGCValues rValues;
Display prDisplay;
int nScreenNum;
. . . . . . . .
rValues.foreground = BlackPixel (prDisplay, nScreenNum);
rValues.background = WhitePixel (prDisplay, nScreenNum);
. . . . . . . .
prGC = XCreateGC (prDisplay, RootWindow (prDisplay, nScreenNum),
(GCForeground | GCBackground), &rValues);
Вызов XCreateGC( ) не единственный способ создания графического контекста. Так, например, новый контекст может быть получен из уже существующего GC с помощью XCopyGC( ).
Когда контекст порожден, его атрибуты могут изменяться процедурой XChangeGC( ). Например:
rValues.line_width = 10;
XChangeGC (prDisplay, prGC, GCLineWidth, &rValues);
Приведенный фрагмент кода меняет ширину линий, рисуемых с помощью графического контекста.
Для того, чтобы получить значение полей GC, используется процедура XGetGCValues( ).