PFND3DDDI_COMPOSERECTS回调函数 (d3dumddi.h)

ComposeRects 函数将二维区域从源图面组合到目标图面。

语法

PFND3DDDI_COMPOSERECTS Pfnd3dddiComposerects;

HRESULT Pfnd3dddiComposerects(
  HANDLE hDevice,
  const D3DDDIARG_COMPOSERECTS *unnamedParam2
)
{...}

参数

hDevice

显示设备的句柄 (图形上下文) 。

unnamedParam2

pData [in]

指向 D3DDDIARG_COMPOSERECTS 结构的指针,该结构指定用于组合矩形区域的参数。

返回值

ComposeRects 返回以下值之一:

返回代码 说明
S_OK 已成功组合矩形区域。
E_OUTOFMEMORY ComposeRects 无法分配完成所需的内存。

注解

以下约束和验证适用于 ComposeRects 函数:

  • 驱动程序应忽略未完全位于源图面内的源矩形区域。
  • 在应用偏移后,目标矩形区域可以部分或完全位于目标图面之外。 如果部分位于外部,则对目标矩形区域进行剪裁,如果完全在外部,则已拒绝或完全剪裁。
  • 无法为源和目标指定相同的图面。
  • 不应锁定与 ComposeRects 一起使用的图面和顶点缓冲区。
  • 创建源图面和目标图面时, (D3DDDIFMT_A1) 每像素格式化为 1 位。
  • 在调试版本中,Microsoft Direct3D 运行时验证目标矩形区域说明中每个索引是否存在源矩形区域说明。 在零售版本中,如果存在无效索引, ComposeRects 将返回错误。
  • 矩形区域的数量应小于 0xFFFF,以防止在数学运算期间发生内部溢出。
  • 应使用相同的显示设备 (图形上下文) 创建图面和顶点缓冲区。
  • 应为目标图面指定本地显示内存。
以下示例代码演示 ComposeRects 执行的操作:
for (UINT i=0; i < COMPOSERECTS.NumDstRects; i++) {
   if (i >= Size(VertexBuffer(hDstRectDescsVB)) / sizeof(D3DCOMPOSERECTDSTDESC))
      Ignore the rectangle;
   if (VertexBuffer(hDstRectDescsVB)[i].RectDescIndex >= Size(VertexBuffer(hSrcRectDescsVB)) / sizeof(D3DCOMPOSERECTSRCDESC))
      Ignore the rectangle;
   SourceRectangle = VertexBuffer(hSrcResource)[VertexBuffer(hDstRectDescsVB)[i].RectDescIndex];
   DestinationRectangle.X = {VertexBuffer(hDstRectDescsVB)[i].X + COMPOSERECTS.Xoffset;
   DestinationRectangle.Y = {VertexBuffer(hDstRectDescsVB)[i].Y + COMPOSERECTS.Yoffset;
   DestinationRectangle.Width = SourceRectangle.Width;
   DestinationRectangle.Height = SourceRectangle.Height;
   Perform COMPOSERECTS.Operation for each pixel;
}

要求

要求
最低受支持的客户端 在 Windows Vista 和更高版本的 Windows 操作系统中可用。
目标平台 桌面
标头 d3dumddi.h (包括 D3dumddi.h)

另请参阅

D3DDDIARG_COMPOSERECTS

D3DDDI_DEVICEFUNCS