Окт 13

Режим рисования. Бинарные растровые операции

Любую операцию рисования можно разложить на элементарные акты рисования отдельных пикселов. В предыдущем разделе упоминалась функция SetPixel(hDC, x, у, color), которая изменяет текущий цвет пиксела с координатами х и у на цвет color. Но такое определение функции SetPixel не является абсолютно корректным. Точнее говоря, оно корректно, если приложение не изменяет режим рисования, установленный по умолчанию в контексте устройства.
На самом деле в Windows реализована более гибкая технология установки цвета пиксела при рисовании. Эту технологию можно представить как процесс передачи цвета из источника S (инструмента рисования) в приемник D («холст» или поверхность устройства). Независимо от разновидности инструмента рисования (перо, кисть или функция SetPixel) результат такой передачи определяется как функция f(D, S), то есть представляет собой некоторую комбинацию цвета источника и цвета приемника:
D=f(D,S).
Теоретически, число таких функций является бесконечным, но в GDI реализованы только поразрядные логические операции. Слово «поразрядные» означает, что к битам двух аргументов, находящимся в одинаковой позиции, применяется одна и та же логическая операция. В Windows поразрядная логическая операция, применяемая к пикселам, носит название растровой операции (raster operation (ROP)). А поскольку эта операция применяется к двум аргументам, то ее называют бинарной растровой операцией (binary raster operation (ROP2)).
В MSDN при описании бинарных растровых операций в качестве источника рассматривается только один инструмент рисования — перо Р, поэтому приведенная выше формула имеет следующий вид:
D=f(D,P).
По умолчанию в контексте устройства установлен режим R2_C0PYPEN, при котором пикселу приемника просто присваивается цвет пера.
При использовании бинарных растровых операций следует помнить о том, что если в устройстве используется цветовое пространство RGB, то операции применяются к каждой из трех составляющих RGB-модели. Поэтому результат всегда предсказуем, но не всегда может быть оправдан с точки зрения логики цветового восприятия. Например, если в контексте устройства выбрано перо красного цвета (RGB(0xFF, 0, 0)) и установлен режим рисования R2_X0RPEN, то при рисовании на белом фоне (RGB(0xFF, OxFF, OxFF)) результирующая линия будет иметь цвет морской волны(суап), поскольку операция «Исключающее ИЛИ» для приемника и пера даст результат RGB(0, OxFF, OxFF). Интересно, что при повторном выводе линии на том же месте будет нарисована линия белого цвета, то есть восстановится первоначальное состояние приемника. На этом полезном свойстве режима рисования R2_X0RPEN основан вывод «эластичных прямоугольников».
Для устройств с палитрой растровые операции применяются к цветовым индексам, поэтому результат зависит от упорядочения цветов в палитре.
Бинарные растровые операции играют важную роль в компьютерной графике. Режим R2_BLACK используется для закраски пикселов черным цветом, а режим R2_WHITE — белым цветом. Режим R2_N0TC0PYPEN меняет цвет пера на противоположный. Режим R2_N0P полностью подавляет вывод линий и кривых — это удобно, если вы не хотите обводить прямоугольник рамкой.
Режимы R2_X0RPEN и R2_N0TX0RPEN часто используются в интерактивной компьютерной графике для вывода эластичных контуров или движущихся изображений. Эластичные прямоугольники, например, используются для выделения с помощью мыши некоторых областей на изображении. В процессе перемещения мыши построение фигуры считается не законченным, поэтому приложение должно быстро стереть прежнюю версию контура и нарисовать его в новой позиции. Бинарные операции R2_X0RPEN и R2_N0TX0RPEN позволяют легко реализовать эту функциональность, поскольку при повторном выводе линии восстанавливается