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,以防止在数学运算过程中出现内部溢出。
- 应使用相同的显示设备(图形上下文)创建图面和顶点缓冲区。
- 应为目标图面指定本地显示内存。
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) |