2.2.2. Характеристики графического контекста.

    В предыдущем разделе мы говорили, что GC имеет ряд атрибутов, воздействующих на вывод изображений. Для текста это цвет и шрифт, для линий - цвет и толщина и т.д. Как уже упоминалось выше, атрибуты контекста задаются в момент его создания. Потом они могут меняться с помощью функции XChangeGC( ). Кроме того, X поддерживает специальные функции для изменения параметров GC.

    Ниже перечисляются основные характеристики графического контекста и процедуры, меняющие их.

    Режим рисования (поле function в структуре XGCValues) указывает, каким образом комбинируются при рисовании цвет графики и цвет изображения, на которое накладывается графика. Данное поле задает некоторую логическую функцию. Возможные значения приведены в таблице 1.2.7. приложения 1.

    По умолчанию function равно GXcopy. Устанавливается режим рисования с помощью процедуры XSetFunction( ).

    Изменяемые цветовые плоскости. Каждый пиксел задается с помощью N бит. Биты с одним номером во всех пикселах образуют как-бы плоскости, идущие параллельно экрану. Получить число плоскостей для конкретного дисплея можно с помощью макроса DisplayPlanes( ). Поле plane_mask структуры графического контекста определяет, в каких плоскостях идет рисование при вызове функций X. Если бит поля установлен, то при рисовании соответствующая плоскость изменяется, в противном случае она не затрагивается.

    Цвет переднего плана и фона (поля foreground и background) задают цвета, используемые при рисовании линий текста и других графических элементов. Устанавливаются значения указанных полей функциями XSetForeground( ) и XSetBackground( ) соответственно.

    Атрибуты, влияющие на рисование линий. Шесть параметров определяют вид прямых, дуг и многоугольников, изображаемых с помощью X Window.

  1. Поле line_width задает толщину линии в пикселах. Нулевое значение поля соответствует тому, что линия должна быть толщиной в один пиксел и рисоваться с помощью наиболее быстрого алгоритма для данного устройства вывода.
  2. Поле line_style определяет тип линии. Возможные значения следующие:

    LineSolid - сплошная линия,

    LineOnOffDash - пунктирная линия; промежутки между штрихами не закрашиваются;

    LineDoubleDash - пунктирная линия; промежутки между штрихами закрашиваются цветом фона;

  1. Параметр cap_style определяет вид линии в крайних точках, если ее ширина больше 1 пиксела. На рисунке 2.3 приведены значения параметра и соответствующий вид конца линии.

pict2-3.gif (3920 bytes)

Рис. 2.3. Значения параметра cap_style графического контекста.

  1. Поле join_style определяет, как соединяются линии друг с другом. На рисунке 2.4 показаны соответствующие возможности. Параметр имеет смысл при толщине линии большей 1.

pict2-4.gif (3083 bytes)

Рис. 2.4. Значения параметра join_style графического контекста.

  1. Если линия пунктирная, то поле dashes дает длину пунктира и промежутков в пикселах.
  1. Параметр dash_offset указывает, с какого места начинать рисование 1-й черточки пунктирной линии. Рисунок 2.5 демонстрирует, как значения полей dashes и dash_offset влияют на вид линии.

Рис. 2.5. Вид линии при различных значениях параметров dashes и dash_offset графического контекста.

 

    Для установки параметров линии используется процедура XSetLineAttributes( ).

    Шрифт. Поле font определяет шрифт, используемый для вывода текста. Задать этот параметр можно с помощью процедуры XSetFont( ). Более подробно о шрифтах и работе с ними будет рассказано в 2.2.3.

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

    Способ закраски определяется полем 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( ). Возможные значения параметра и соответствующие способы заливки приведены на рисунке 2.6.

Рис. 2.6. Заполнение дуг при различных значениях параметра arc_mode графического контекста.

    Влияние подокон на рисование графических примитивов определяется полем subwindow_mode. Оно устанавливается процедурой XSetSubwindowMode( ) и имеет следующие значения:

ClipByChildren - часть графики, перекрываемая подокнами, не видна;

IncludeInferiors - графика рисуется поверх всех подокон

    Генерация запроса на перерисовку при копировании частей окон (поле graphics_exposures). Когда часть окна копируется куда-либо, то вполне вероятна ситуация, что исходное изображение перекрыто, возможно не полностью, другими окнами или недоступна по другим причинам. В этом случае может быть необходимо сообщить клиенту, в окно которого происходит копирование, что часть нового изображения не может быть получена простым переносом пикселов, а должна быть перерисована. Если поле graphics_exposures равно True, то X посылает при копировании следующее:

    Если поле равно False, то событие не посылается. Устанавливается параметр процедурой XSetGraphicsExposures( ).

    Область отсечения (задается полями clip_mask, clip_x_origin, clip_y_origin). Это битовая карта, "говорящая" о том, какие пикселы выводятся, а какие нет при всех операциях рисования. Если бит карты установлен, то соответствующий пиксел появится в окне, а если бит сброшен, то пиксел будет пропущен. Положение в окне верхнего левого угла области отсечения определяется параметрами clip_x_origin и clip_y_origin (см. рис. 2.7).

 

Рис. 2.7. Параметры области отсечения и ее влияние на рисование графических примитивов.

    Эти параметры устанавливаются процедурой XSetClipOrigin( ). Сама область отсечения задается с помощью процедур XSetClipMask( ), XSetClipRectangles( ) или XSetClipRegion( ).