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。
映射由 prclSrc 和 prclDest 定义。 prclDest 和 prclSrc 中指定的点位于对应于像素中心的整数坐标上。 由两个此类点定义的矩形被视为具有两个顶点的几何矩形,其坐标是给定的点,但从每个坐标中减去 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 管理的图面,反之亦然。
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);
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 适用于 Windows 2000 及更高版本的 Windows 操作系统。 |
目标平台 | 通用 |
标头 | winddi.h (包括 Winddi.h) |
Library | Win32k.lib |
DLL | Win32k.sys |