В процессе выполнения растровой операции три исходных изображения (битовых последовательности p, d, s) комбинируются и получается результирующее изображение. Код выполняемой операции задается параметром dwROP — индексом тернарной растровой операции.
С реального устройства на другое устройство.
С реального устройства в битмап;
Между двумя битмапами;
Между битмапом, выбранным в совместимый контекст устройства и реальным устройством на котором необходимо изображение показать;
Операции передачи образов
Приложение вызвало одну из функций работы с полосами прокрутки.
Клиентская область была полностью или частично закрыта другим окном или выпадающим меню, а теперь закрывающий объект исчез;
Изменились размеры или местоположение окна;
Использование сообщения WM_PAINT
Сообщение WM_PAINT система посылает окну во всех случаях, требующих перерисовки клиентской области окна, например при наступлении следующих событий:
Кроме того, приложение может само инициировать посылку сообщения WM_PAINT посредством вызова одной из функций InvalidateRect, InvalidateRgn или UpdateWindow.
Функция UpdateWindow посылает сообщение WM_PAINT непосредственно в оконную процедуру, минуя очередь сообщений приложения.
Операции по обмену блоками бит (b it b l ock t ransfer, BLT) или тернарные растровые операции (ternary raster operation) – механизм, осуществляющий передачу растровых изображений между различными контекстами устройств.
Основная идея растровых операций заключается в организации обмена данными между двумя контекстами устройств. В Windows-приложении можно осуществить передачу изображения:
GDI содержит 3 функции, осуществляющих такую передачу изображений — PatBlt, BitBlt и StretchBlt:
BOOL PatBlt(hDC, nX, nY, nWidth, nHeight, dwROP);
BOOL BitBlt(hDestDC, nDestX, nDestY, nDestWidth, nDestHeight, hSrcDC, nSrcX, nSrcY, dwROP);
BOOL StretchBlt(hDestDC, nDestX, nDestY, nDestWidth, nDestHeight, hSrcDC, nSrcX, nSrcY, nSrcWidth, nSrcHeight, dwROP);
Все три функции строят результирующее изображение на контексте–приемнике, используя в качестве исходных данных:
1. изображение, создаваемое на приемнике при закраске фона текущей кистью, выбранной в контекст–приемник (это называется образцом, pattern).
2. изображение, существующее на контексте–источнике (исходное изображение, source).
3. изображение, существующее в данный момент на контексте–приемнике (имеющееся изображение, destination).
Предположим, что биты, определяющие битмап совместимого контекста обозначают буквой S (source – источник, ресурс), биты заливки – буквой Р (pattern - образец), а биты, на которых будет прорисовываться изображение – буквой D (destination – назначение, место назначения). Операции, которые выполняются с битами S, P, D: а – побитовое И, n – побитовое НЕТ, о – побитовое ИЛИ, х – побитовое исключающее ИЛИ.
Х1 Х2 И Х1 НЕТ Х1 Х2 ИЛИ Х1 Х2 Исключающее ИЛИ
0 0 0 0 1 0 0 0 0 0 0
0 1 0 1 0 0 1 1 0 1 1
1 0 0 1 0 1 1 0 1
1 1 1 1 1 1 1 1 0
Обозначив знак операции как Ор, то действия с битами можно записать таким образом: PSОр. То есть необходимо взять пиксель паттерны и прорисовываемого битмапа и произвести над ними операцию (бинарная растровая операция). Если в операции участвует три операнда, то получим DPSОр1Ор2 (тернарная растровая операция).
Определить индекс операции PSx и DPSxx.
P 1 1 1 1 0 0 0 0
S 1 1 0 0 1 1 0 0
D 1 0 1 0 1 0 1 0
PSx 0 0 1 1 1 1 0 0 = 0x3c????
DPSxx 1 0 0 1 0 1 1 0 = 0x96????
DPx 0 1 0 1 1 0 1 0 = 5A????
В документации по SDK имеется таблица, перечисляющая индексы 256 возможных растровых операций, их имена и короткое пояснение к каждой операции. Имена присвоены только 15 наиболее употребляемым операциям. Таблица, представленная в документации имеет следующий вид:
Number | Hex ROP | Boolean function | Common Name |
BLACKNESS | |||
... | |||
0D | 000D0B25 | PDSnaon | |
... | |||
Поле «Hex ROP» – индекс тернарной растровой операции (используется в качестве параметра dwROP).
Поле «Boolean function» содержит пояснение к выполняемой операции;
Поле «Common name» — имя растровой операции, если оно назначено.
Основные коды растровых операций приведены в таблице.
Скопировать bitmap с совместимого на основной контекст с масштабированием можно с помощью функции StretchBlt(). Эта функция описана следующим образом:
StretchBlt(HDC, int, int, int, int, HDC, int, int, int, int, DWORD);
Устройством приёмником должно быть окно, в которое необходимо вывести изображение и которое представляется своим контекстом. В качестве устройства источника (псевдоустройства) необходимо создать в памяти область, которая по своим возможностям должна быть совместима с экраном и в которую сначала необходимо поместить изображение, а затем скопировать это изображение в окно приёмник. Поэтому функция StretchBlt() должна получать через свои параметры дескрипторы обоих контекстов.
Первый и шестой аргументы функции – хэндлы окна (hDC) и совместимого контекста (hCompatibleDC) соответственно. Одиннадцатый аргумент функции StretchBlt() – это код растровой операции.
Первые пять аргументов описывают тот прямоугольник на экране, в который будет вписан битмап. Ту часть битмапа, которая будет вписана в прямоугольник на экране, описывают следующие пят аргументов.
При масштабировании, используя функцию StretchBlt возможно два случая:
– изображение увеличивается, то некоторые строки (столбцы) будут дублироваться;
– изображение уменьшается, то некоторые строки (столбцы) будут комбинироваться в одну строку (столбец).
Объединение строк (столбцов) при сжатии может осуществляться различными способами, которые выбираются с помощью функции:
UINT SetStretchBltMode(hDC, nMode);
параметр nMode задает режим объединения строк:
BLACKONWHITE | выполняется операция И (AND). В результате получается, что черный цвет имеет "приоритет" над белым — сочетание черного с белым рассматривается как черный |
WHITEONBLACK | выполняется операция ИЛИ (OR). При этом "приоритет" принадлежит белому над черным — сочетание черного с белым дает белый |
COLORONCOLOR | при этом происходит простое исключение строк (столбцов). |
HALFTONE 1 | только в Win32 API; происходит усреднение цвета объединяемых точек. |