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( ).