复制位图

位块传输 (BitBlt) 函数由驱动程序实现,将位块从一个图面复制到另一个图面。 这些函数包括:

还有一个名为 DrvSaveScreenBits 的特定于显示驱动程序的 BitBlt 函数。

如果正在绘制的图面是 设备管理的表面 或位图,则驱动程序必须支持最低级别的位块传输函数。 如果图面是 GDI 管理的标准格式位图,则 GDI 仅处理驱动程序未挂钩的操作。

DrvBitBlt

DrvBitBlt 函数提供一般位块传输功能。 如果使用源, DrvBitBlt 会将源矩形的内容复制到目标矩形上。 (此函数的 pptlSrc 参数标识矩形的左上角。) 如果没有源矩形, DrvBitBlt 将忽略 pptlSrc 参数。 目标矩形(要修改的表面)由两个整数点(左上角和右下角)定义。 矩形右 下角排他:矩形的下边缘和右边缘不是块传输的一部分。 不能使用空目标矩形调用 DrvBitBlt。 矩形的两个点始终井然有序:也就是说,右下点的两个坐标都大于其左上点的对应坐标。

DrvBitBlt 处理不同的 RP,并根据设备执行优化。 在某些情况下,如果 ROP 是纯色,则可以执行填充而不是 BitBlt。 对于不支持 RP 的设备或驱动程序(例如 Pscript 驱动程序),显示的图像和打印的图像之间可能存在差异。

(可选)可以屏蔽 由 DrvBitBlt 处理的块传输,并涉及颜色索引转换。 转换向量有助于调色板的颜色索引转换。 传输可能需要由显示驱动程序使用一系列剪辑矩形任意剪裁。 所需的区域和信息由 GDI 提供。

实现 DrvBitBlt 表示为没有标准格式 帧缓冲区的光栅显示驱动程序编写驱动程序所涉及的工作的重要部分。 附带 Windows 驱动程序工具包 (WDK) 的 Microsoft VGA 驱动程序提供了支持平面设备的基本功能的示例代码。 为其他设备实现 DrvBitBlt 可能不太复杂。

DrvCopyBits

GDI 通过其模拟操作调用 DrvCopyBits 函数,以在设备管理的光栅图面和 GDI 标准格式位图之间转换。 DrvCopyBits 为 SRCCOPY (0xCCCC) ROP 位块传输提供了快速路径。

对于具有设备管理的位图或光栅图面的图形驱动程序,此函数必须将驱动程序图转换为任何标准格式位图或从任何标准格式位图转换。 永远不会使用空目标矩形调用 DrvCopyBits,并且目标矩形的两个点始终井然有序。 此调用的要求与 DrvBitBlt 相同。

如果驱动程序支持设备管理的表面或位图,则驱动程序必须实现 DrvCopyBits 函数。 调用 DrvCopyBits 时,驱动程序至少必须执行以下操作:

  • 以设备的首选格式与位图、设备图面执行块传输。
  • 使用 SRCCOPY (0xCCCC) 光栅操作 (ROP) 执行传输。
  • 允许任意剪辑。

驱动程序可以使用 GDI CLIPOBJ 枚举服务将剪辑减少到一系列剪辑矩形。 GDI 向下传递转换向量 XLATEOBJ 结构,以帮助在源图面和目标图面之间进行颜色索引转换。

如果设备表面组织为与 设备无关的标准格式位图 (DIB) ,驱动程序只能支持简单传输。 如果调用与复杂的 ROP 一起传入,驱动程序可以通过调用 EngCopyBits 函数将块传输请求打回 GDI。 这允许 GDI 将调用分解为驱动程序可以执行的更简单的函数。

DrvCopyBits 也与 RLE 位图一起调用, (请参阅Microsoft Windows SDK文档) 和设备相关的位图 (DDB) 。 由于应用程序调用多个 Win32 GDI 例程,位图会提供给此函数。 可选的 DDB 仅受少数专用驱动程序支持。

DrvStretchBlt

驱动程序可以选择提供 DrvStretchBlt 函数,甚至可以提供支持设备管理图面的驱动程序。 此函数提供在设备管理的图面和 GDI 托管图面之间拉伸块传输的功能。 DrvStretchBlt 仅支持某些类型的拉伸,例如按整数倍数进行拉伸。

DrvStretchBlt 还允许驱动程序在 GDI 位图上写入,尤其是在驱动程序可以执行半调时。 函数还允许将相同的半调算法应用于 GDI 位图和设备表面。

DrvStretchBlt 将几何源矩形精确映射到几何目标矩形。 源是一个矩形,其角与给定整数坐标) (-0.5,-0.5。 函数参数中指定的点位于对应于像素中心的整数坐标上。 由两个此类点定义的矩形被视为几何图形,其两个顶点的坐标为给定点,但从每个坐标中减去 0.5。 (GDI POINTL 结构使用速记表示法指定这些小数坐标顶点。) 请注意,任何此类矩形的边缘从不与像素相交,而是绕行一组像素。 矩形内的像素是右下角矩形的普通像素。

定义源矩形角的点是有序的;不能为 DrvStretchBlt 指定一个空的源矩形。 与 DrvBitBlt 不同,可以使用单个剪切矩形调用 DrvStretchBlt ,以防止在剪切输出时出现舍入错误。

目标矩形由两个整数点定义。 这些点顺序不明确,这意味着第二个点的坐标不一定大于第一个点的坐标。 这些点描述的源矩形不包括下边缘和右边缘。 由于矩形顺序不良好, DrvStretchBlt 有时必须在两个 x 坐标和/或两个 y 坐标中执行反转。 (驱动程序不得尝试读取不在源图面上的像素) 。 不能使用空目标矩形调用 DrvStretchBlt

对于颜色转换,DrvStretchBlt 提供了指向 XLATEOBJ 结构的指针 pxlo,该结构用于在源图面和目标图面之间进行转换。 可以查询 XLATEOBJ 结构以查找任何源索引的目标索引。 对于高质量的拉伸块传输,在某些情况下, 需要 DrvStretchBlt 来内插颜色。 DrvStretchBlt 还使用 COLORADJUSTMENT 结构定义在拉伸位之前要应用于源位图的颜色调整值。

DrvStretchBlt 使用 iMode 参数定义如何组合源像素以用于输出。 特别是, iMode 提供了 HALFTONE 选项,该选项允许驱动程序使用输出图面中的像素组来近似输出的颜色或灰色级别。 对 COLORADJUSTMENT 结构的更改会在下一次使用 HALFTONE 的 iMode 调用 DrvStretchBlt 之后传递给驱动程序。 此外,如果驱动程序要求 GDI 处理 GDI 位图的半调,驱动程序会挂出 DrvStretchBlt,将 iMode 参数设置为 HALFTONE,并在 EngStretchBlt 中返回它。

如果 DrvStretchBlt 已挂接 对 EngStretchBlt 函数的调用,并要求执行它不支持的某个操作,则会将请求返回到 GDI,以便相应的函数可以处理它。

DrvTransparentBlt

DrvTransparentBlt 函数会导致源位图复制到目标位图上,以便在复制后目标位图的某些部分保持可见。 此函数的 iTransColor 参数指定要设为透明的颜色。

下图描绘了透明 blt 的示例。

说明具有源位图和目标位图的透明 blt 过程的关系图。

从左到右,上图显示了源位图、透明 blt 之前的目标位图和透明 blt 之后的目标位图。 请注意, iTransColor 中的颜色与以上、下方和源位图中中心区域任一侧的颜色相同。

发生 blt 操作时,不会复制这四个区域,这会导致这些区域下的目标位图中的任何像素图案保持可见。 其他区域下的任何像素图案 (四个角,中心) 在透明 blt 中被覆盖。

这在最右边的图像中得到了说明:四个角中字母“M”的部分和中心被源位图中的颜色覆盖。 四个区域下字母“M”的部分颜色与 iTransColor 中的颜色相同,仍可见。