EngAlphaBlend 函数 (winddi.h)

EngAlphaBlend 函数通过 alpha 混合提供位块传输功能。

语法

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

映射由 prclSrcprclDest 定义。 prclDestprclSrc 中指定的点位于对应于像素中心的整数坐标上。 由两个此类点定义的矩形被视为具有两个顶点的几何矩形,其坐标是给定的点,但从每个坐标中减去 0.5。 (POINTL 结构是用于指定这些小数坐标顶点的速记表示法。)

pBlendObj

指向 BLENDOBJ 结构的指针,该结构描述在源图面和目标图面之间执行的混合操作。 此结构是 BLENDFUNCTION 结构的包装器,其中包括 XLATEOBJ 结构中不可用的必要源和目标格式信息。 BLENDFUNCTION 在 Microsoft Windows SDK 文档中声明。 其成员定义如下:

BlendOp 定义要执行的混合操作。 目前此值必须AC_SRC_OVER,这意味着源位图基于源像素的 alpha 值放置在目标位图上。 此混合操作应处理三种可能的情况。 这些内容在此参考页的“备注”部分进行介绍。

BlendFlags 是保留的,当前设置为零。

SourceConstantAlpha 定义要应用于整个源图面的常量混合因子。 此值在 [0,255] 的范围内,其中 0 是完全透明的,255 是完全不透明的。

AlphaFormat 定义表面是否假定具有 alpha 通道。 可以选择将此成员设置为以下值:

AC_SRC_ALPHA

可以假定源图面采用预乘 alpha 32bpp“BGRA”格式;也就是说,图面类型为BMF_32BPP,调色板类型为BI_RGB。 alpha 分量是 [0,255] 范围内的整数,其中 0 是完全透明的,255 是完全不透明的。

返回值

成功后,EngAlphaBlend 返回 TRUE 。 如果发生错误,它将返回 FALSE 并报告错误代码。

注解

支持在以下图面之间使用 alpha 混合的位块传输:

  • 从一个 设备管理的表面 到另一个设备管理的表面。
  • 从一个 GDI 管理的标准格式位图到另一个 GDI 管理的标准格式位图。
  • 从一个设备管理的图面到 GDI 管理的图面,反之亦然。
驱动程序不应在同一图面上使用重叠的源矩形和目标矩形调用 EngAlphaBlend

AC_SRC_OVER blend 函数的三种可能情况是:

  • 源位图没有每像素 alpha (AC_SRC_ALPHA 未设置) ,因此混合将基于 SourceConstantAlpha 中指定的常量源 alpha 值应用于像素的颜色通道,如下所示:
    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);
    
  • 源位图具有每像素 alpha 值, (AC_SRC_ALPHA 设置为) , (设置为 255) ,不使用 SourceConstantAlpha 。 混合的计算方式如下:
    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);
    
  • 源位图具有每像素 alpha 值, (AC_SRC_ALPHA 设置为) , (未设置为 255) ,则使用 SourceConstantAlpha 。 混合的计算方式如下:
    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);
    
如果驱动程序已挂钩 DrvAlphaBlend ,并且调用它来执行它不支持的操作,则驱动程序应调用 EngAlphaBlend

要求

要求
最低受支持的客户端 适用于 Windows 2000 及更高版本的 Windows 操作系统。
目标平台 通用
标头 winddi.h (包括 Winddi.h)
Library Win32k.lib
DLL Win32k.sys

另请参阅

DrvAlphaBlend

DrvBitBlt

DrvPlgBlt

DrvStretchBlt

DrvStretchBltROP

DrvTransparentBlt

EngAssociateSurface

EngBitBlt

EngPlgBlt

EngStretchBlt

EngStretchBltROP

EngTransparentBlt