Поделиться через


Функция 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 поверхности и наоборот.
Драйвер никогда не должен вызывать EngAlphaBlend с перекрывающимися прямоугольниками источника и назначения на одной поверхности.

Ниже приведены три возможных варианта для функции 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);
    
Драйвер должен вызвать EngAlphaBlend , если он подключил DrvAlphaBlend и вызывается для выполнения действий, которые он не поддерживает.

Требования

Требование Значение
Минимальная версия клиента Доступно в Windows 2000 и более поздних версиях операционных систем Windows.
Целевая платформа Универсальное
Верхняя часть winddi.h (включая Winddi.h)
Библиотека Win32k.lib
DLL Win32k.sys

См. также раздел

DrvAlphaBlend

DrvBitBlt

DrvPlgBlt

DrvStretchBlt

DrvStretchBltROP

DrvTransparentBlt

EngAssociateSurface

EngBitBlt

EngPlgBlt

EngStretchBlt

EngStretchBltROP

EngTransparentBlt