Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

Функция PatBlt

PatBlt (pattern block transfer) — это простейшая из трех blt-функций. Она существенно отличается от функций BitBlt и StretchBlt тем, что использует только один контекст устройства.

Функция PatBlt похожа на функции рисования линий с тем исключением, что она изменяет содержимое прямоугольной области приемного контекста устройства, а не только линии. Она выполняет логическую операцию с пикселями в этом прямоугольнике и в шаблоне (pattern). Шаблон — это просто другое название кисти (brush). Поэтому функция PatBlt использует кисть, выбранную в данный момент в контексте устройства.

Синтаксис вызова функции PatBlt таков:

PatBlt (hdc, xDest, yDest, xWidth, yHeight, dwROP);

Параметры xDest, yDest, xWidth, yHeight задаются в логических координатах. Логическая точка (xDest, yDest) задает левый верхний угол прямоугольника. Он имеет ширину xWidth и высоту yHeight единиц. Это и есть та прямоугольная область, которую изменяет функция PatBlt. Логическая операция, которую выполняет функция PatBlt над кистью и приемным контекстом устройства, определяется параметром dwROP, представляющим собой двойное слово (32-битное целое) ROP кода. Этот код не имеет отношения ни к одному из кодов ROP2, используемых в режиме рисования.

В Windows существует 256 ROP2 кодов. Они определяют всевозможные логические комбинации исходной (source) области отображения, приемной (destination) области отображения и шаблона (или кисти). Драйвер устройства для видеомонитора поддерживает все 256 растровых операций, посредством использования "компилятора" (compiler) типов. Этот компилятор использует 32-разрядный ROP код для генерации последовательности машинных инструкций, реализующих эту логическую операцию над пикселями дисплея, а затем выполняет эти инструкции. Старшее слово 32-разрядного ROP кода — число от 0 до 255. Младшее слово — число, которое помогает компилятору драйвера устройства в генерации машинных кодов для этой логической операции. Пятнадцать из этих 256 кодов имеют имена.

НЕ нашли? Не то? Что вы ищете?

Поскольку функция PatBlt использует только приемный контекст устройства и шаблон (и не использует исходный контекст устройства), она может реализовать только подмножество этих 256 ROP кодов — 16 ROP кодов, использующих только приемный контекст устройства и шаблон. Поддерживаемые функцией PatBlt растровые операции приведены ниже в таблице.

Шаблон (Pattern (P)) Приемник
(Destination (D))

1

1

1

0

0

1

0

0

Булева операция
(Boolean operation)

ROP код

Имя

Результаты: (Results)

0

0

0

0

0

0x000042

BLACKNESS

0

0

0

1

~(P | D)

0x0500A9

0

0

1

0

~P & D

0x0A0329

0

0

1

1

~P

0x0F0001

0

1

0

0

P & ~D

0x500325

0

1

0

1

~D

0x550009

DSTINVERT

0

1

1

0

P ^ D

0x5A0049

PATINVERT

0

1

1

1

~(P & D)

0x5F00E9

1

0

0

0

P & D

0xA000C9

1

0

0

1

~(P ^ D)

0xA50065

1

0

1

0

D

0xAA0029

1

0

1

1

~P | D

0xAF0229

1

1

0

0

P

0xF00021

PATCOPY

1

1

0

1

P | ~D

0xF50225

1

1

1

0

P | D

0xFA0089

1

1

1

1

1

0xFF0062

WHITENESS

Для монохромного контекста устройства бит равный 1 соответствует белому пикселю, а бит равный 0 — черному пикселю. Целиком черный или целиком белый приемник и шаблон — наиболее простой пример для начала рассмотрения работы функции PatBlt. Например, если вы вызываете:

PatBlt (hdc, xDest, yDest, xWidth, yHeight, 0x5F00E9L);

то прямоугольная область с вершиной в логической точке (xDest, yDest) и имеющая ширину xWidth пикселей и высоту yHeight пикселей, будет закрашена черным цветом, только если приемник был белым и в контекст устройства была выбрана кисть WHITE_BRUSH. В противном случае приемник будет закрашен белым. Конечно, даже в монохромном контексте устройства приемник и кисть могут быть полутоновыми комбинациями черных и белых пикселей. В этом случае Windows выполняет логическую операцию по принципу "pixel by pixel", что может привести к некоторым странным результатам. Например, если приемник был закрашен кистью GRAY_BRUSH, и она является текущей выбранной в контексте устройства, то:

PatBlt (hdc, xDest, yDest, xWidth, yHeight, PATINVERT);

установит приемник в чисто белый или в чисто черный цвет, в зависимости от того, как пиксели приемника совпадут с пикселями полутоновой кисти.

Цвет добавляет больше сложностей. Windows осуществляет отдельную логическую операцию для каждой цветовой плоскости или для каждого набора битов цвета, в зависимости от того, как организована память устройства.

Некоторые из часто употребляемых случаев использования функции PatBlt приведены ниже. Если необходимо нарисовать черный прямоугольник, то вызывается:

PatBlt (hdc, xDest, yDest, xWidth, yHeight, BLACKNESS);

Если необходимо нарисовать белый прямоугольник, то:

PatBlt (hdc, xDest, yDest, xWidth, yHeight, WHITENESS);

Функция:

PatBlt (hdc, xDest, yDest, xWidth, yHeight, DSTINVERT);

всегда инвертирует цвет прямоугольника. Если кисть WHITE_BRUSH выбрана в контексте устройства, то функция:

PatBlt (hdc, xDest, yDest, xWidth, yHeight, PATINVERT);

также инвертирует прямоугольник.

Функция FillRect, закрашивающую кистью прямоугольную область:

FillRect (hdc, &rect, hBrush);

Следующий код является эквивалентным функции FillRect :

hBrush = SelectObject (hdc, hBrush);

PatBlt (hdc, rect, left, rect. top,

rect. right — rect. left,

rect. bottom — rect. top, PATCOPY);

SelectObject (hdc, hBrush);

Фактически, это код, используемый Windows для реализации функции FillRect. Когда вызывается функция:

InvertRect (hdc, &rect);

Windows транслирует ее в функцию:

PatBlt (hdc, rect, left, rect. top,

rect. right — rect. left,

rect. bottom — rect. top, DSTINVERT);

Координаты Blt

Когда описывался синтаксис функции PatBlt, упомянулось, что точка (xDest, yDest) задает верхний левый угол прямоугольника, и этот прямоугольник имеет ширину xWidth и высоту yHeight единиц. Это не совсем корректно. Только в функциях GDI BitBlt, PatBlt и StretchBlt логические координаты прямоугольника задаются в терминах логической ширины и высоты относительно одной вершины. Все другие функции GDI для рисования, использующие ограничивающий прямоугольник, требуют задания координат в терминах левого верхнего и правого нижнего углов. В режиме отображения MM_TEXT указанное описание параметров функции PatBlt верно. Однако, для метрических режимов отображения — не верно. Если используется положительные значения xWidth и yHeight, то точка с координатами (xDest, yDest) должна быть левым нижним углом прямоугольника. Если необходимо, чтобы точка (xDest, yDest) была левым верхним углом прямоугольника, то параметр yHeight должен быть установлен равным высоте прямоугольника, взятой со знаком минус.

Более точно, прямоугольник, с которым работает функция PatBlt, имеет логическую ширину, задаваемую абсолютным значением xWidth и логическую высоту, задаваемую абсолютным значением yHeight. Эти два параметра могут быть отрицательными. Прямоугольник определяется двумя углами, имеющими логические координаты (xDest, yDest) и (xDest + xWidth, yDest + yHeight). Верхний левый угол прямоугольника всегда включается в область, изменяемую функцией PatBlt. Правый нижний угол — всегда за ее пределами. В зависимости от режима отображения и знаков параметров xWidth и yHeight левым верхним углом прямоугольника может быть точка:

(xDest, yDest)

или

(xDest, yDest + yHeight)

или

(xDest + xWidth, yDest)

или

(xDest + xWidth, yDest + yHeight)

Если установить режим отображения MM_LOENGLISH и использовать функцию PatBlt, изменяющую зону квадратного дюйма в левом верхнем углу рабочей области, можно использовать:

PatBlt (hdc, 0, 0, 100, -100, dwROP);

или

PatBlt (hdc, 0, -100, 100, 100, dwROP);

или

PatBlt (hdc, 100, 0, -100, -100, dwROP);

или

PatBlt (hdc, 100, -100, -100, 100, dwROP);

Простейший путь задать правильные параметры функции PatBlt — это установить xDest и yDest в левый верхний угол прямоугольника. Если режим отображения определяет координату y так, что она возрастает при движении вверх, то использовать отрицательную величину параметра yHeight. Если режим отображения определяет координату x так, что она возрастает при движении влево (что почти не встречается), то использовать отрицательную величину параметра xWidth.

Перенос битов с помощью функции BitBlt

В некотором смысле функция BitBlt — это расширенная функция PatBlt. Она делает все то же, что и PatBlt, а также вовлекает второй контекст устройства в логическую операцию. Ниже приведен синтаксис функции:

BitBlt (hdcDest, xDest, yDest, xWidth, yHeight,

hdcSrc, xSrc, ySrc, dwROP);

Вызов функции BitBlt модифицирует приемный контекст устройства (его описатель hdcDst) в рамках прямоугольника, заданного логической точкой (xDesr, yDest) и параметрами xWidth и yHeight, заданными в логических единицах. Эти параметры определяют прямоугольник в соответствии с тем, как описано в предыдущем разделе. Функция BitBlt также использует прямоугольник из контекста устройства источника (описатель контекста hdcSrc). Этот прямоугольник начинается в логической точке (xSrc, ySrc) и имеет ширину xWidth логических единиц и высоту yHeight логических единиц.

Функция BitBlt осуществляет логическую операцию над тремя элементами: кистью, выбранной в контексте устройства приемника, пикселями прямоугольника в контексте устройства источника и пикселями прямоугольника в контексте устройства приемника. Результат заносится в прямоугольник приемного контекста устройства. Можно использовать любой из 256 ROP кодов в качестве параметра dwROP функции BitBlt. Пятнадцать ROP кодов, имеющих имена, приведены в следующей таблице.

Шаблон: (Pattern) (P) Источник: (Source) (S) Приемник: (Destination) (D)

Булева

операция

ROP код

Имя

Результат: (Result)

0

0x000042

BLACKNESS

~(S|D)

0x1100A6

NOTSRCERASE

~S

0x330008

NOTSRCCOPY

S&~D

0x440328

SRCERASE

~D

0x550009

DSTINVERT

P^D

0x5A0049

PATINVERT

S^D

0x660046

SRCINVERT

S&D

0x8800C6

SRCAND

~S|D

0xBB0226

MERGEPAINT

P&S

0xC000CA

MERGECOPY

S

0xCC0020

SRCCOPY

S|D

0xEE0086

SRCPAINT

P

0xF00021

PATCOPY

P|~S|D

0xFB0A09

PATPAINT

1

0xFF0062

WHITENESS

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

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8