显示驱动程序中的特效

Windows 2000 及更高版本的操作系统支持以下特殊效果:

  • 如果显示硬件支持 alpha 混合,则显示驱动程序可以实现 DrvAlphaBlend

  • 如果显示硬件支持渐变填充,则显示驱动程序应实现 DrvGradientFill

Alpha 混合

Microsoft Windows 2000 (及更高版本) Shell 广泛使用 alpha 混合来执行诸如混合和混合动画以及 alpha 光标等操作。 由于 alpha 混合操作需要从源图面和目标图面读取数据,因此当源或目标位于视频内存中时,将内容指向 GDI 的速度非常慢。 因此,驱动程序中的硬件加速将产生明显更流畅的动画,并提高整体系统性能。

驱动程序应实现 DrvAlphaBlend ,以便从使用常量 alpha 的兼容位图进行 位块传输 ,以及从具有每像素 alpha 值的 32 bpp BGRA 系统内存图面进行位块传输。 可以使用三角形纹理填充实现 DrvAlphaBlend,前提是不可见接缝。

DrvAlphaBlend 生成的最差情况错误不应超过每个颜色通道 1 (1) 。 涉及拉伸时,源应采用 COLORONCOLOR 拉伸 (在混合之前参阅 Windows SDK 文档) ;对于每个颜色通道,最差情况误差不应超过 1 (1) ,同时出现最差情况拉伸错误。

在 alpha 混合与拉伸相结合的情况下,WDK 中有一些测试可以通过以下方式评估显示驱动程序对 DrvAlphaBlend 的实现:

  1. 该测试调用显示驱动程序的 DrvAlphaBlend,生成 alpha 混合和拉伸矩形。

  2. 测试使用与 调用 DrvAlphaBlend 时所用的相同源矩形生成目标矩形。

  3. 对于步骤 2 的目标矩形中的每个像素 P,测试在拉伸之前模拟反向拉伸以确定源矩形中的相应像素。 测试将容差值应用于反向拉伸,以适应驱动程序的不同拉伸实现。 然后,测试计算应应用于该像素的 alpha 混合。

    由于 4 个可能像素 (源矩形中以像素 P) 为中心的 3 X 3 像素正方形的角的任何一个都可以拉伸以在目标矩形中生成像素 P,因此测试必须将每个角像素的颜色值与 DrvAlphaBlend 生成的矩形中相应位置的像素的颜色值进行比较。

最差情况拉伸误差是任意一对相应角像素之间的颜色值差异最大的一个像素,其中一个像素位于 DrvAlphaBlend 生成的矩形上,另一个位于测试生成的源矩形上。

渐变填充

Windows 2000 (及更高版本) Shell 对所有描述文字条使用渐变填充

DrvGradientFill 生成的结果取决于每像素的位数,并且必须满足以下准则:

24 bpp 或 32 bpp 表面

  • 值必须以单调方式在所有分级方向上增加或减少。

  • 对于矩形渐变:当 ulMode == GRADIENT_FILL_RECT_H时,每个垂直条必须是单一颜色。 当 ulMode == GRADIENT_FILL_RECT_V时,每个水平条必须是单一颜色。

  • 任何通道中的最差情况错误都不能超过 â±1。

  • 区域的终结点必须完全匹配。

15 bpp 或 16 bpp 表面

任何通道中的最差情况错误不能超过 15±。

1-bpp 到 8-bpp 表面

任何这些表面的渐变填充都不允许出错。 对于 8 bpp 图面,GDI 不调用驱动程序的 DrvGradientFill 函数。

请注意,在所有图面中,剪裁不会影响结果。