DXGK_GDIARG_TRANSPARENTBLT 结构 (d3dkmddi.h)

DXGK_GDIARG_TRANSPARENTBLT结构描述了 GDI 硬件加速位块传输 (具有透明度的 bitblt) 操作的特征。

语法

typedef struct _DXGK_GDIARG_TRANSPARENTBLT {
  [in] RECT                      SrcRect;
  [in] RECT                      DstRect;
       UINT                      SrcAllocationIndex;
       UINT                      DstAllocationIndex;
       UINT                      Color;
       UINT                      NumSubRects;
       RECT                      *pSubRects;
       D3DKM_TRANSPARENTBLTFLAGS Flags;
       UINT                      SrcPitch;
} DXGK_GDIARG_TRANSPARENTBLT;

成员

[in] SrcRect

定义要复制的矩形区域的 RECT 结构。 此矩形在源图面的坐标系中指定,由两个点定义:左上角和右下角。 定义矩形的两个点始终按顺序排列。

有关详细信息,请参见“备注”部分。

[in] DstRect

定义要修改的矩形区域的 RECT 结构。 此矩形在目标图面的坐标系中指定,由两个点定义:左上角和右下角。 矩形右下角排他;也就是说,其下边缘和右边缘不是位块传输的一部分。 定义矩形的两个点始终按顺序排列。

DstRect 定义的目标矩形可以超出目标图面的边界,但子矩形不能。 此外,保证所有子矩形都适合在目标图面内。 子矩形可以由小于目标矩形的边框进一步约束。

有关详细信息,请参见“备注”部分。

SrcAllocationIndex

[in]分配列表中元素的索引,指定 SrcRect 源矩形所引用的分配。

DstAllocationIndex

[in]分配列表中元素的索引,指定 DstRect 目标矩形所引用的分配。

Color

[in]指定源图面中的物理透明颜色,采用 32 位 ARGB 无符号像素格式 (由 D3DDDIFORMAT 枚举) 的D3DDDIFMT_A8R8G8B8值定义。 不会复制源图面上与 Color 指定的透明颜色匹配的任何像素。

NumSubRects

[in]目标图面空间中由 DstRect 目标矩形绑定的子矩形数。

pSubRects

[in]指向目标图面空间中的子矩形的指针。

Flags

[in] 一种D3DKM_TRANSPARENTBLTFLAGS 结构,用于指定显示适配器的硬件加速透明位块传输功能。

SrcPitch

[in]源图面的间距(以字节为单位)。

注解

由 SrcRectDstRect 成员指定的矩形分别绑定源和目标图面空间中的所有子矩形。 如果源矩形和目标矩形在同一图面上重叠,Microsoft DirectX 图形内核子系统将永远不会请求透明位块传输。

若要完成透明位块传输操作,应使用以下公式计算 DstRect 中每个像素的颜色:

typedef DXGK_GDIARG_TRANSPARENTBLT tblt;
if (tblt.Flags.HonorAlpha)
{
  if (SourceColor != tblt.Color)
 {
  DestinationColor = SourceColor; 
 }
}
else
{
 if ((SourceColor & 0x00FFFFFF) != tblt.Color)
 {
  DestinationColor = SourceColor; 
 }
}

在这种情况下,ARGB 格式的 0x00FFFFFF 值表示 alpha = 0,因此不实现 alpha 混合。

如果需要拉伸位块传输操作,则 x 和 y 拉伸比率将分别计算为 DstRectSrcRect 的 x 和 y 大小的比率。 此外,拉伸操作将像设置 Wingdi.h 中的 COLORONCOLOR 值一样进行。 在收缩位块传输中,应忽略足够的像素,以便不需要合并像素。 在拉伸位块传输中,应复制像素。

有关透明位块传输的详细信息,请参阅 复制位图

将子矩形转换为源图面空间时,保证结果在源图面内。 子矩形在目标图面中的坐标到源图面中的坐标的转换由以下公式定义,其中:

  • (Xd,Yd) 是子矩形内的点
  • (Xs,Ys) 是源矩形内的点
float Ws = SrcRect.right - SrcRect.left;
float Wd = DstRect.right - DstRect.left;
int Xs = round((Xd - DstRect.left + 0.5) * Ws/Wd + SrcRect.left - 0.5)
OR
int Xs = truncate((Xd - DstRect.left + 0.5) * Ws/Wd + SrcRect.left)

float Hs = SrcRect.bottom - SrcRect.top;
float Hd = DstRect.bottom - DstRect.top;
int Ys = round((Yd - DstRect.top + 0.5) * Hs/Hd + SrcRect.top - 0.5)
OR
int Ys = truncate((Yd - DstRect.top + 0.5) * Hs/Hd + SrcRect.top)

要求

要求
最低受支持的客户端 Windows 7
标头 d3dkmddi.h (包括 D3dkmddi.h)

另请参阅

D3DDDIFORMAT

D3DKM_TRANSPARENTBLTFLAGS

DXGK_RENDERKM_COMMAND

矩形