Функция EngAlphaBlend (winddi.h)
Функция EngAlphaBlend предоставляет возможности передачи битовых блоков с помощью альфа-смешивания.
Синтаксис
ENGAPI BOOL EngAlphaBlend(
SURFOBJ *psoDest,
SURFOBJ *psoSrc,
CLIPOBJ *pco,
XLATEOBJ *pxlo,
RECTL *prclDest,
RECTL *prclSrc,
BLENDOBJ *pBlendObj
);
Параметры
psoDest
Указатель на структуру SURFOBJ , которая идентифицирует поверхность, на которой выполняется рисование.
psoSrc
Указатель на структуру SURFOBJ, которая идентифицирует исходную поверхность.
pco
Указатель на структуру CLIPOBJ . Подпрограммы службы CLIPOBJ_Xxx предоставляются для перечисления области клипа в виде набора прямоугольников. Это перечисление ограничивает область назначения, которая изменяется. По возможности GDI упрощает обрезку. Однако, в отличие от EngBitBlt, EngAlphaBlend может вызываться с одним прямоугольником, чтобы предотвратить ошибки округления при обрезке выходных данных.
pxlo
Указатель на структуру XLATEOBJ , указывающую способ преобразования цветовых индексов между исходной и целевой поверхностями.
Если исходная поверхность управляется палитрой, ее цвета представлены индексами в таблице подстановки значений цветов RGB. В этом случае GDI может запрашивать структуру XLATEOBJ для вектора преобразования, чтобы быстро преобразовать любой исходный индекс в цветовый индекс для назначения.
Ситуация сложнее, когда, например, источником является RGB, но назначение управляется палитрой. В этом случае наиболее близкое соответствие каждому исходному значению RGB должно находиться в конечной палитре. GDI вызывает подпрограмму службы XLATEOBJ_iXlate для выполнения этой операции сопоставления.
prclDest
Указатель на структуру RECTL , которая определяет прямоугольную область для изменения. Этот прямоугольник задается в системе координат целевой поверхности и определяется двумя точками: верхней левой и нижней правой. Две точки, определяющие прямоугольник, всегда хорошо упорядочены.
Прямоугольник является эксклюзивным в нижнем правом углу; то есть его нижний и правый края не являются частью смеси.
Указанный прямоугольник может нависать над целевой поверхностью; GDI выполняет правильную обрезку, когда это делает.
EngAlphaBlend никогда не следует вызывать с пустым прямоугольником назначения.
prclSrc
Указатель на структуру RECTL, которая определяет копируемые области. Этот прямоугольник задается в системе координат исходной поверхности и определяется двумя точками: верхней левой и нижней правой. Две точки, определяющие прямоугольник, всегда хорошо упорядочены.
Прямоугольник является эксклюзивным в нижнем правом углу; то есть его нижний и правый края не являются частью смеси.
Исходный прямоугольник никогда не должен превышать границы исходной поверхности и, следовательно, никогда не нависать над исходной поверхностью.
EngAlphaBlend никогда не следует вызывать с пустым исходным прямоугольником.
Сопоставление определяется с помощью prclSrc и prclDest. Точки, указанные в prclDest и prclSrc , находятся на целочисленных координатах, которые соответствуют пиксельным центрам. Прямоугольник, определенный двумя такими точками, считается геометрическим прямоугольником с двумя вершинами, координаты которых являются заданными точками, но с 0,5, вычитаемыми из каждой координаты. (Структуры POINTL представляют собой сокращенную нотацию для указания этих дробных вершин координат.)
pBlendObj
Указатель на структуру BLENDOBJ , которая описывает операцию смешивания, выполняемую между исходной и целевой поверхностями. Эта структура является оболочкой для структуры BLENDFUNCTION, которая включает необходимые исходные и целевые сведения о формате, недоступные в структуре XLATEOBJ . BLENDFUNCTION объявляется в документации по Microsoft Windows SDK. Его члены определяются следующим образом:
BlendOp определяет выполняемую операцию смешения. В настоящее время это значение должно быть AC_SRC_OVER. Это означает, что исходное растровое изображение размещается над растровым изображением назначения на основе альфа-значений исходных пикселей. Существует три возможных случая, которые должна обрабатывать эта операция смешения. Они описаны в разделе Примечания этой справочной страницы.
BlendFlags зарезервирована и в настоящее время имеет нулевое значение.
SourceConstantAlpha определяет коэффициент смешения констант, применяемый ко всей исходной поверхности. Это значение находится в диапазоне [0,255], где 0 является полностью прозрачным, а 255 — полностью непрозрачным.
AlphaFormat определяет, имеет ли поверхность альфа-канал. При необходимости для этого элемента можно задать следующее значение:
AC_SRC_ALPHA
Исходная поверхность может быть в предварительном формате альфа-32bpp "BGRA"; то есть тип поверхности — BMF_32BPP, а тип палитры — BI_RGB. Альфа-компонент — это целое число в диапазоне [0,255], где 0 является полностью прозрачным, а 255 — полностью непрозрачным.
Возвращаемое значение
EngAlphaBlend возвращает true при успешном выполнении. При возникновении ошибки возвращается значение FALSE и выводится код ошибки.
Комментарии
Передача битовых блоков с альфа-наложением поддерживается между следующими поверхностями:
- Из одной управляемой устройством поверхности в другую поверхность, управляемую устройством.
- От одного битового изображения стандартного формата, управляемого GDI, к другому растрового изображения стандартного формата, управляемого GDI.
- От одной управляемой устройством поверхности к управляемой GDI поверхности и наоборот.
Ниже приведены три возможных варианта для функции AC_SRC_OVER blend.
- Исходное растровое изображение не имеет альфа-канала для каждого пикселя (AC_SRC_ALPHA не задано), поэтому смесь применяется к цветовым каналам пикселя на основе постоянного исходного альфа-значения, указанного в SourceConstantAlpha , следующим образом:
Dst.Red = Round(((Src.Red * SourceConstantAlpha) + ((255 − SourceConstantAlpha) * Dst.Red)) / 255); Dst.Green = Round(((Src.Green * SourceConstantAlpha) + ((255 − SourceConstantAlpha) * Dst.Green)) / 255); Dst.Blue = Round(((Src.Blue * SourceConstantAlpha) + ((255 − SourceConstantAlpha) * Dst.Blue)) / 255); /* Do the next computation only if the destination bitmap has an alpha channel. */ Dst.Alpha = Round(((Src.Alpha * SourceConstantAlpha) + ((255 − SourceConstantAlpha) * Dst.Alpha)) / 255);
- Исходное растровое изображение имеет альфа-значения по пикселям (AC_SRC_ALPHA задано), а SourceConstantAlpha не используется (для него задано значение 255). Смесь вычисляется следующим образом:
Dst.Red = Src.Red + Round(((255 − Src.Alpha) * Dst.Red) / 255); Dst.Green = Src.Green + Round(((255 − Src.Alpha) * Dst.Green) / 255); Dst.Blue = Src.Blue + Round(((255 − Src.Alpha) * Dst.Blue) / 255); /* Do the next computation only if the destination bitmap has an alpha channel. */ Dst.Alpha = Src.Alpha + Round(((255 − Src.Alpha) * Dst.Alpha) / 255);
- Исходное растровое изображение имеет альфа-значения в пикселях (AC_SRC_ALPHA задано), и используется SourceConstantAlpha (не задано значение 255). Смесь вычисляется следующим образом:
Temp.Red = Round((Src.Red * SourceConstantAlpha) / 255); Temp.Green = Round((Src.Green * SourceConstantAlpha) / 255); Temp.Blue = Round((Src.Blue * SourceConstantAlpha) / 255); /* The next computation must be done even if the destination bitmap does not have an alpha channel. */ Temp.Alpha = Round((Src.Alpha * SourceConstantAlpha) / 255); /* Note that the following equations use the just-computed Temp.Alpha value: */ Dst.Red = Temp.Red + Round(((255 − Temp.Alpha) * Dst.Red) / 255); Dst.Green = Temp.Green + Round(((255 − Temp.Alpha) * Dst.Green) / 255); Dst.Blue = Temp.Blue + Round(((255 − Temp.Alpha) * Dst.Blue) / 255); /* Do the next computation only if the destination bitmap has an alpha channel. */ Dst.Alpha = Temp.Alpha + Round(((255 − Temp.Alpha) * Dst.Alpha) / 255);
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Доступно в Windows 2000 и более поздних версиях операционных систем Windows. |
Целевая платформа | Универсальное |
Верхняя часть | winddi.h (включая Winddi.h) |
Библиотека | Win32k.lib |
DLL | Win32k.sys |