2.2.1. Графический контекст.

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