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)的格式为一位。
  • 在调试版本中,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