Прежде чем начать работу с графикой, программа должна выделить себе специальную структуру данных и получить указатель на нее. Эта структура называется графическим контекстом (Graphic Context (GC)). Указатель на GC используется в качестве одного из параметров при вызове «рисующих» функций X. Графический контекст содержит ряд атрибутов, влияющих на отображение объектов: текста, линий, фигур и др. Выделенный GC должен быть освобожден до завершения работы программы.
Графический контекст создается процедурой XCreateGC()
, имеющей следующий прототип:
Function XCreateGC(prDisplay : PDisplay; nDrawable : TDrawable; nValueMask : cardinal; prValues : PXGCValues) : TGC; cdecl;external;
Первый аргумент - это указатель на структуру типа TDisplay
, который программа получает после вызова XOpenDisplay()
; второй - идентификатор окна (или карты пикселей), в котором программа будет рисовать; третий - битовая маска, определяющая, какие атрибуты GC задаются; последний аргумент - структура типа TXGCValues
, определяемая следующим образом:
TXGCValues = record Xfunction : longint; { Renamed function to Xfunction } plane_mask : cardinal; foreground : cardinal; background : cardinal; line_width : longint; line_style : longint; cap_style : longint; join_style : longint; fill_style : longint; fill_rule : longint; arc_mode : longint; tile : TPixmap; stipple : TPixmap; ts_x_origin : longint; ts_y_origin : longint; font : TFont; subwindow_mode : longint; graphics_exposures : TBool; clip_x_origin : longint; clip_y_origin : longint; clip_mask : TPixmap; dash_offset : longint; dashes : char; end; PXGCValues = ^TXGCValues;
Значения полей данной структуры будут объяснены ниже. Каждому из них соответствует бит в маске, которая передается в качестве третьего параметра при вызове процедуры XCreateGC()
. Эти биты обозначаются символическими константами, определенными в модуле x
. Если бит установлен, то значение соответствующего атрибута должно быть взято из переданной XCreateGC()
структуры TXGCValues
. Если бит сброшен, то атрибут приникает значение по умолчанию.
Следующий пример показывает процесс создания графического контекста, в котором устанавливаются два атрибута: цвет фона и цвет переднего плана.
. . . . . . . var prGC : TGC; rValues : TXGCValues; prDisplay : PDisplay; nScreenNum : integer; . . . . . . . . rValues.foreground := XBlackPixel (prDisplay, nScreenNum); rValues.background := XWhitePixel (prDisplay, nScreenNum); . . . . . . . . prGC := XCreateGC (prDisplay, XRootWindow (prDisplay, nScreenNum), (GCForeground OE GCBackground), @rValues);
Вызов XCreateGC()
- не единственный способ создания графического контекста. Так, например, новый контекст может быть получен из уже существующего GC с помощью XCopyGC()
.
Когда контекст порожден, его атрибуты могут изменяться процедурой XChangeGC()
. Например:
rValues.line_width := 10; XChangeGC (prDisplay, prGC, GCLineWidth, @rValues);
Приведенный фрагмент кода меняет ширину линий, рисуемых с помощью графического контекста.
Для того, чтобы получить значение полей GC, используется процедура XGetGCValues()
.