"Программирование в X Window средствами Free Pascal" - читать интересную книгу автора (Полищук А. П., Семериков С. А.)

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

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

Вызов XCreateGC() - не единственный способ создания графического контекста. Так, например, новый контекст может быть получен из уже существующего GC с помощью XCopyGC().

Когда контекст порожден, его атрибуты могут изменяться процедурой XChangeGC(). Например:

rValues.line_width:= 10;

XChangeGC (prDisplay, prGC, GCLineWidth, @rValues);

Приведенный фрагмент кода меняет ширину линий, рисуемых с помощью графического контекста.

Для того, чтобы получить значение полей GC, используется процедура XGetGCValues().