Ниже перечисляются основные характеристики графического контекста и функции, меняющие их.
Режим рисования (поле Xfunction
в структуре XGCValues
) указывает, каким образом комбинируются при рисовании цвет графики и цвет изображения, на которое накладывается графика. Данное поле задает некоторую логическую функцию. Возможные значения:
GXclear 0x0 0 GXand 0x1 src AND dst GXandReverse 0x2 src AND NOT dst GXcopy 0x3 src GXandInverted 0x4 (NOT src) AND dst GXnoop 0x5 dst GXxor 0x6 src XOR dst GXor 0x7 src OR dst GXnor 0x8 (NOT src) AND (NOT dst) GXequiv 0x9 (NOT src) XOR dst GXinvert 0xa NOT dst GXorReverse 0xb src OR (NOT dst) GXcopyInverted 0xc NOT src GXorInverted 0xd (NOT src) OR dst GXnand 0xe (NOT src) OR (NOT dst) GXset 0xf 1
По умолчанию Xfunction
равно GXcopy
. Устанавливается режим рисования с помощью функции XSetFunction()
.
Изменяемые цветовые плоскости. Каждый пиксель задается с помощью N
бит. Биты с одним номером во всех пикселях образуют как бы плоскости, идущие параллельно экрану. Получить число плоскостей для конкретного дисплея можно с помощью функции XDisplayPlanes()
. Поле plane_mask структуры графического контекста определяет, в каких плоскостях идет рисование при вызове функций X. Если бит поля установлен, то при рисовании соответствующая плоскость изменяется, в противном случае она не затрагивается.
Цвет переднего плана и фона (поля foreground
и background
) задают цвета, используемые при рисовании линий текста и других графических элементов. Устанавливаются значения указанных полей функциями XSetForeground()
и XSetBackground()
соответственно.
Атрибуты, влияющие на рисование линий. Шесть параметров определяют вид прямых, дуг и многоугольников, изображаемых с помощью X Window.
line_width
задает толщину линии в пикселях. Нулевое значение поля соответствует тому, что линия должна быть толщиной в один пиксель и рисоваться с помощью наиболее быстрого алгоритма для данного устройства вывода.
line_style
определяет тип линии. Возможные значения следующие:
LineSolid
- сплошная линия,LineOnOffDash
- пунктирная линия; промежутки между
штрихами не закрашиваются;LineDoubleDash
- пунктирная линия; промежутки между
штрихами закрашиваются цветом фона;cap_style
определяет вид линии в крайних точках, если ее ширина больше 1 пикселя.
На рис. 1.4 приведены значения параметра и соответствующий вид конца линии.
Рис. 1.4. Значения параметра cap_style
графического контекста
join_style
определяет, как соединяются линии друг с другом. На
рис. 1.5 показаны соответствующие возможности. Параметр имеет смысл при толщине линии большей 1.
Рис. 1.5. Значения параметра join_style
графического контекста
dashes
дает длину пунктира и промежутков в пикселях.
dash_offset
указывает, с какого места начинать рисование первой черточки пунктирной линии.
Для установки параметров линии используется функция XSetLineAttributes()
.
Шрифт. Поле font
определяет шрифт, используемый для вывода текста. Задать
этот параметр можно с помощью функции XSetFont()
.
Шаблоны, используемые для заполнения рисуемых фигур. Процесс рисования включает в себя два этапа. На первом определяются пиксели, которые должны быть закрашены. После этого цвет выделенных точек изменяется. Так, для линии входящие в нее пиксели определяются по специальному алгоритму, а потом закрашиваются, например, цветом переднего плана.
Способ закраски определяется полем fill_style
. Он устанавливается функцией XSetFillStyle()
и воздействует на все функции, рисующие линии, текст и фигуры. Исключение составляет случай, когда выводится линия, для которой значение line_width
равно 0. Возможные значения параметра fill_style
перечислены ниже.
FillSolid
- для закраски используются цвета переднего плана и фона.
FillTiled
- для закраски используется карта пикселей, определяемая параметром tile
графического контекста; при этом карта как бы располагается в окне так, что ее левый верхний угол имеет координаты ts_x_origin
и ts_y_origin
; затем определяется ее пересечение с рисуемой графикой, и пиксели, попавшие в пересечение, закрашиваются; значения полей ts_x_origin
, ts_y_origin
устанавливаются функцией XSetTSOrigin()
; карта tile
должна иметь ту же толщину (число бит-на-пиксел), что и окно, в котором производится рисование.
FillStippled
- для закраски используется карта пикселей, задаваемая полем stipple
; данная карта должна иметь толщину в 1 бит; способ закраски такой же, как и в случае FillTiled
с той лишь разницей, что рисуются лишь те пиксели графики, которым соответствует установленный бит в картеstipple
; цвет пикселя задается полем foreground
.
FillOpaqueStippled
- аналогично значению FillStippled
, только пиксели, для которых не установлен бит в карте stipple
, закрашиваются цветом фона.
Для задания полей tile
и stipple
можно использовать карты любого размера. На некоторых устройствах при определенных размерах рисование идет намного быстрее. Для получения таких размеров можно использовать функции
XQueryBestSize()
,
XQueryBestStipple()
,
XQueryBestTile()
.
Режим заполнения многоугольников указывает, как заполнять цветом многоугольники, стороны которых пересекаются. Возможные значения следующие:
EvenOddRule
- заполняются точки фигуры, определяемые по следующему правилу: пусть для
некоторой линии растра n1, n2,
..., nk - стороны многоугольника, которые ее пересекают;
тогда закрашиваются точки между n1 и
n2, n3 и
n4, и т.д.
WindingRule
- заполняется вся внутренность фигуры.
Режим заполнения дуг (поле arc_mode
). Параметр задается функцией XSetArcMode()
и влияет на вид фигур, рисуемых функциями XFillArc()
и XFillArcs()
.
Влияние подокон на рисование графических примитивов определяется полем subwindow_mode
. Оно устанавливается функцией XSetSubwindowMode()
и имеет следующие значения:
ClipByChildren
- часть графики, перекрываемая подокнами, не видна;
IncludeInferiors
- графика рисуется поверх всех подокон.
Генерация запроса на перерисовку при копировании частей окон (поле graphics_exposures
). Когда часть окна копируется куда-либо, то вполне вероятна ситуация, что исходное изображение перекрыто, возможно не полностью, другими окнами или недоступна по другим причинам. В этом случае может быть необходимо сообщить клиенту, в окно которого происходит копирование, что часть нового изображения не может быть получена простым переносом пикселей, а должна быть перерисована. Если поле graphics_exposures
равно True
, то X посылает при копировании следующее:
GraphicsExpose
, если перерисовка необходима;NoExpose
, если исходное окно полностью доступно и дополнительного рисования не требуется.Если поле равно False
, то событие не посылается. Устанавливается параметр функцией XSetGraphicsExposures()
.
Область отсечения (задается полями clip_mask
, clip_x_origin
, clip_y_origin
). Это битовая карта, говорящая о том, какие пиксели выводятся, а какие нет при всех операциях рисования. Если бит карты
установлен, то соответствующий пиксель появится в окне, а если бит сброшен, то пиксель будет пропущен. Положение в окне верхнего левого угла области отсечения определяется параметрами clip_x_origin
и clip_y_origin
.
Эти параметры устанавливаются функцией XSetClipOrigin()
. Сама область отсечения задается с помощью функций XSetClipMask()
, code>XSetClipRectangles() или XSetClipRegion()
.
Небольшой пример example4.c