Окт 16

Функции блиттинга

Для поддержки блиттинга GDI использует функции BitBlt и StretchBlt. Рассмотрим подробнее первую из них.
Название функции BitBlt происходит от слов «bit block transfer», означающих «перенос битового блока». На самом деле функция BitBlt позволяет делать намного больше, чем просто перенос блока пикселов. Эта функция может выполнить одну из 256 логических растровых операций над тремя наборами пикселов. Прототип функции имеет следующий вид:
BOOL BitBlt(HDC hdcDest, int nXDest, int nYDest. int nWidth. int nHeight. HDC hdcSrc, int nXSrc, int nYSrc. DWORD dwRop);
Функция BitBlt передает прямоугольный блок пикселов с поверхности устройства-источника hdcSrc на поверхность устройства-приемника hdcDest Исходный прямоугольник определяется параметрами nXSrc, nYSrc, nWidth, nHeight в логической системе координат контекста устройства-источника. Приемный прямоугольник определяется параметрами nXDest, nYDest, nWidth, nHeight в логической системе координат контекста устройства-приемника. Оба контекста устройства должны поддерживать растровые операции RC_BITBLT.
Из списка параметров функции видно, что ширина и высота исходного и приемного прямоугольников задаются одними и теми же параметрами — nWidth и nHeight. Поэтому если в устройстве-приемнике и в устройстве-источнике установлен режим отображения по умолчанию ММ_ТЕХТ, в котором логические единицы совпадают с физическими единицами, то перенос блока пикселов происходит без масштабирования.
В других режимах отображения исходный и приемный прямоугольники могут иметь разные размеры в системах координат устройства. В таком случае исходное изображение масштабируется по размерам приемного прямоугольника.
Контексты устройства-источника и устройства-приемника не обязательно должны быть разными. Функцию BitBlt можно применять и для переноса блока пикселов в пределах той же поверхности, на которой находится исходный прямоугольник.
Последний параметр dwRop задает тернарную растровую операцию, то есть способ объединения исходного пиксела, приемного пиксела и кисти для формирования нового значения приемного пиксела. Эти операции будут рассмотрены позже, а пока что будет использоваться простейшая растровая операция SRCC0PY, которая просто заменяет пикселы приемника значениями пикселов источника.
Вторая функция блиттинга Stretch Bit имеет следующий прототип:
BOOL StretchBlKHDC hdcDest. int nXDest, int nYDest. int nWidthDest. int nHeightDest. HDC hdcSrc, int nXSrc. int nYSrc. int nWidthSrc, int nHeightSrc. DWORD dwRop):
Она делает практически то же самое, что и функция BitBlt, но в списке параметров размеры исходного и приемного прямоугольников определяются независимо друг от друга. Это позволяет задавать масштабирование при переносе блока пикселов, когда исходный и приемный прямоугольники имеют разные размеры в логических координатах.