Содержание Список структур

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;

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

#define   GCFunction           (1L<<0)    /* function           */
#define   GCPlaneMask          (1L<<1)    /* plane_mask         */
#define   GCForeground         (1L<<2)    /* foreground         */
#define   GCBackground         (1L<<3)    /* background         */
#define   GCLineWidth          (1L<<4)    /* line_width         */
#define   GCLineStyle          (1L<<5)    /* line_style         */
#define   GCCapStyle           (1L<<6)    /* cap_style          */
#define   GCJoinStyle          (1L<<7)    /* join_style         */
#define   GCFillStyle          (1L<<8)    /* fill_style         */
#define   GCFillRule           (1L<<9)    /* fill_rule          */
#define   GCTile               (1L<<10)   /* tile               */
#define   GCStipple            (1L<<11)   /* stipple            */
#define   GCTileStipXOrigin    (1L<<12)   /* ts_x_origin        */
#define   GCTileStipYOrigin    (1L<<13)   /* ts_y_origin        */
#define   GCFont               (1L<<14)   /* font               */
#define   GCSubwindowMode      (1L<<15)   /* subwindow_mode     */
#define   GCGraphicsExposures  (1L<<16)   /* graphics_exposures */
#define   GCClipXOrigin        (1L<<17)   /* clip_x_origin      */
#define   GCClipYOrigin        (1L<<18)   /* clip_y_origin      */
#define   GCClipMask           (1L<<19)   /* clip_mask          */
#define   GCDashOffset         (1L<<20)   /* dash_offset        */
#define   GCDashList           (1L<<21)   /* dashes             */
#define   GCArcMode            (1L<<22)   /* arc_mode           */

       Поле function хранит логическую функцию вывода, которая выполняется над данными из видеопамяти и выводимыми данными и результат которой помещается в видеопамять. Для программы это выглядит как поразрядная логическая операция над цветовыми индексами в видеопамяти и цветовыми индексами, которыми производится вывод в видеопамять. Логические функции Определено несколько таких функций:

       Поле plane_mask разрешает операции вывода графики для определенных плоскостей. Один разряд маски обозначает одну плоскость. Можно разрешить использование всех плоскостей сразу, указав значение AllPlanes.

       Поле foreground указывает цвет, используемый как основной цвет при выводе графики.

       Поле background указывает фоновый цвет, используемый при выводе графики.

       Поле line_width указывает ширину линий в точках. Обычно, если указывается это значение, оно больше либо равно единицы. Обычная тонкая линия соответствует нулевому значению ширины. Линия рисуется симметрично относительно оси, указанной в запросе рисования линии. Если не оговорено другое в полях cap_style или join_style, то линия с конечными точками в координатах [x1, y1], [x2, y2] и толщиной w будет ограничена прямоугольником, углы которого будут расположенны в координатах:

    [x1-(w*sn/2), y1+(w*cs/2)], [x1+(w*sn/2), y1-(w*cs/2)],
    [x2-(w*sn/2), y2+(w*cs/2)], [x2+(w*sn/2), y2-(w*cs/2)],

где sn - синус угла наклона линии, а cs - косинус угла наклона линии. Для отрисовки линии на экране отображаются только те точки, которые принадлежат этому прямоугольнику. Точка считается принадлежащей прямоугольнику, если её центр находится полностью внутри прямоугольника (рёбра прямоугольника принимаются бесконечно тонкими). Если точка находится на одном из ребер, то она считается принадлежащей прямоугольнику только в том случае, если внутренняя часть прямоугольника находится непосредственно справа от точки.

       Точки на горизонтальных и вертикальных ребрах являются особым случаем. Они считаются принадлежащими прямоугольнику, если внутренняя часть его находится непосредственно снизу от точки и непосредственно справа от точки соответственно.

       Тонкие линии, для которых указана нулевая ширина, рисуются шириной, равной одной точке, как правило с использованием аппаратных средств, что может привести к разным результатам на разном аппаратном обеспечении. Существуют лишь два ограничения на алгоритмы отрисовки линий:

  1. Допустим рисуется линия, координаты которой обозначены точками [x1,y1] и [x2,y2], причем линия полностью входит в разрешенную область рисования. Также рисуется линия тоже полностью входящая в разрешенную область рисования, координаты которой заданы точками [x1+dx,y1+dy] и [x2+dx,y2+dy]. Тогда точка [x+dx,y+dy] будет принадлежать второй линии тогда и только тогда, когда точка [x,y] будет принадлежать первой линии.

  2. Видимый набор точек линии не может быть искажен ограничениями на область рисования. Это значит, что все точки линии, находящиеся внури разрешенной области рисования находятся именно в тех координатах, в которых они находились бы, если бы не было оганичений на область рисования.

       Толстая линия, начинающаяся в точке [x1,y1] и заканчивающаяся в точке [x2,y2] состоит из тех же точек, что и линия, нарисованная от точки [x2,y2] до точки [x1,y1]. Это правило рекомендуется и для тонких линий, но не является для них обязательным.

       Тонкая линия, толщина которой указана равной нулю и линия, толщина которой указана равной единице могут отличаться по составу точек. Это может быть связано с тем, что тонкие линии рисуются при помощи аппаратного обеспечения графического адаптера, которое позволяет производить отрисовку линий во много раз быстрее, нежели более точный алгоритм отрисовки толстых линий.

       В силу этих различий, тонкие линие могут не совсем вписыватся в картину, нарисованную толстыми линиями. Если необходима точность отрисовки и однородная отрисовка по всему экрану, лучше использовать линии с толщиной равной единице, чем тонкие линии.

       Поле line_style определяет стиль рисования линий на экране:

       Поле cap_style описывает каким образом отрисовывать концы линий:

       В случае рисования линии, у которой конечные точки имеют одинаковые координаты (x1=x2, y1=y2) и когда используется значение cap_style, результат зависит от толщины линии и значения cap_style:

       Поле join_style описывает каким образом производить состыковку широких линий:

       В случае рисования линии, у которой конечные точки имеют одинаковые координаты (x1=x2, y1=y2) и когда используется join-style для одного или обоих концов линии, отрисовка линии не происходит. Однако, если все объединяемые линии вырождаются в одну точку, то эффект аналогичен наложению cap_style на обе конечные точки.

       Поля tile/stipple являются графическими образами, представляющими плоскость, в которых они размножены по всем направлениям. Нулевые координаты в этой плоскости соответствуют левому верхнему углу этих изображений. Положение нулевых координат этой плоскости в системе координат объекта, в котором происходит отображение графической информации указывается в полях ts_x_origin и ts_y_origin для координат x и y соответственно. При выполнении графических операций, работающих с этими полями, графическая информация из этой плоскости по выбранным алгоритмам копируется в соответствующие координаты указанного для рисования обьекта. Графический образ tile должен принадлежать одному и тому же корневому окну, которому принадлежит контекст GC и иметь ту же глубину цветности, иначе возникнет ошибка BadMatch. Графический образ stipple также должен принадлежать тому же корневому окну, но глубина цветности должна быть равна единице. Для графических операций, использующих графический образ stipple и и использующих стиль заполнения FillStippled, stipple используется просто как дополнительная маска, которая логически перемножается с маской clip_mask. Допускается использование графических образов tile и stipple с разными размерами.

       После того, как графический образ начал использоваться в контексте графического вывода, лучше воздержаться от внесения в него каких-либо изменений, поскольку результат получится неопределённым. Возможно, изменения отразятся на графическом контексте, а возможно, что контекст останется без изменений.

       Поле fill_style определяет стиль заполнения для запросов рисования линий, текста и запросов заполнения. Для всех запросов рисования текста и запросов заполнения (XDrawText, XDrawText16, XFillRectangle, XFillPolygon, и XFillArc), для рисования линий со стилем LineSolid (XDrawLine, XDrawSegments, XDrawRectangle, XDrawArc), а также для четных секций линий, рисуемых со стилями LineOnOffDash или LineDoubleDash работают следующие стили заполнения:

       При рисовании линий со стилем LineDoubleDash, для нечетных секций fill_style работает следующим образом:

       Поле dashes является упрощенным и наиболее часто используемым вариантом описания размеров секций линии. Оно указывает размер четных и нечетных секций линии в точках. Более сложное описание размеров секций можно осуществить при помощи функции XSetDashes. Значение этого поля должно быть ненулевым, иначе возникнет ошибка BadValue.

       Поле clip_mask хранит идентификатор графического образа, выполняющего роль маски для ограничения вывода в объект назначения. Если в clip_mask записывается идентификатор графического образа, то он должен иметь глубину цветности, равную единице и он должен принадлежать тому же корневому окну, что и графический контекст, иначе появится ошибка BadMatch. Если в clip_mask записывается значение None, clip_mask не будет влиять на вывод графики. Вывод графической информации может производиться только в тех точках, где соответствующие точки маски имеют значение, равное единице. Графический вывод полностью блокируется за пределами области, покрываемой маской. Маска clip_mask действует на все запросы вывода графики. Положение маски на обьекте назначения указывается в полях clip_x_origin и clip_y_origin, которые являются значениями координат маски в системе координат объекта назначения. Значение clip_mask в графическом контексте может изменяться функциями XSetClipRectangles и XSetRegion.

       Поле subwindow_mode определяет возможность объединения содержимого окна с содержимым дочерних окон при операциях копирования блоков. В это поле можно записать значения ClipByChildren или IncludeInferiors. Режим ClipByChildren будет накладывать на окно-источник и на окно назначения маски, формируемые дочерними InputOutput окнами. Если же в subwindow_mode записывается значение IncludeInferiors, то маска ни на источник, ни на окно назначения не накладывается, а исходный блок копирования формируется из содержимого окна - источника и содержимого попавших в блок дочерних окон. Если при этом дочернее окно будет иметь другую глубину цветности, то это не будет восприниматься за ошибку, однако результат такой операции протоколом не определен.

       Поле fill_rule хранит правило определения принадлежности точки к области заполнения для выполнения запроса XFillPolygon. Определены два таких правила: EvenOddRule и WindingRule. Для правила EvenOddRule считается, что точка находится внутри области заполнения, если прямой луч, исходящий из точки в бесконечность пересекает замкнутую ломаную линию, описанную при вызове функции XFillPolygon нечетное число раз. Для правила WindingRule точка считается в области заполнения, если исходящий из нее в бесконечность прямой луч пересекает разное количество сегментов полигона, направленных по- и против часовой стрелки. Сегмент считается направленным по часовой стрелке, если он идет слева направо, если смотреть на него от точки, а сегмент, направленный против часовой стрелки считается если он идет справа налево.

      Для обоих правил точка рассматривается бесконечно малой, а сегменты полигона бесконечно тонкими. Точка считается находящейся внутри полигона, если ее центр находится внутри полигона. Если центр точки находится на границе полигона, то она считается принадлежащей полигону только в том случае, если внутренняя часть полигона находится непосредственно справа от точки. Точки находящиеся на горизонтальных гранях считаются принадлежащими полигону только в тех случае, если внутренняя часть полигона находится непосредственно снизу.

       Поле arc_mode управляет выбором режима работы функции XFillArcs. Если устанавливается режим ArcPieSlice, то при объединении заполненные дуги будут немного отстоять друг от друга, напоминая разрезанный пирог. Если устанавливается режим ArcChord, то при объединении дуги будут разделены только одной линией.

       Поле graphics_exposure управляет генерацией событий GraphicsExpose для запросов XCopyArea и XCopyPlane.

       Поле font хранит идентификатор шрифта, которым будет выводиться текст через этот графический контекст.

       Для получения максимальной производительности необходимо производить максимум операций на одном графическом контексте без смены его компонентов. Скорость смены компонент контекста по отношению к смене контекста зависит от аппаратного обеспечения и самой реализации X-сервера.

См. также: XCreateGC, XChangeGC, XGetGCValues.


Содержание Список структур