ICompositionDrawingSurfaceInterop2::CopySurface 方法 (windows.ui.composition.interop.h)
读回合成绘图图面的内容 (或合成虚拟绘图图面) 。
语法
HRESULT CopySurface(
[in] IUnknown *destinationResource,
[in] int destinationOffsetX,
[in] int destinationOffsetY,
[in] const RECT *sourceRectangle
);
参数
[in] destinationResource
类型: IUnknown*
表示将接收副本的 Direct3D 纹理。 必须在与 CompositionGraphicsDevice 关联的 Direct3D 设备上创建此资源,该设备用于创建源合成绘图图面 (或合成虚拟绘图图面) 。
[in] destinationOffsetX
类型: int
偏移量的 x 坐标 (到要执行复制的 destinationResource) 中。 复制操作不会更改此偏移量上方或左侧的像素。 参数不能为负数。
[in] destinationOffsetY
类型: int
偏移量的 y 坐标 (到要执行复制的 destinationResource) 。 复制操作不会更改此偏移量上方或左侧的像素。 参数不能为负数。
[in] sourceRectangle
类型: const RECT*
指向常量 RECT 的可选指针,该常量 RECT 表示要复制的源图面上的矩形。矩形不能超过源图面的边界。 为了有足够的空间接收请求的像素,目标资源必须具有至少与 destinationOffsetX 和 Y 参数以及此矩形的宽度/高度一样多的像素。
如果此参数为 null,则会 (复制整个源图面,并使用源图面大小来验证目标资源) 的大小。
返回值
类型: HRESULT
S_OK 如果成功,则返回 一个 HRESULT 错误代码,指示失败原因。 另请参阅 COM 错误代码 (UI、音频、DirectX、编解码器) 。
注解
若要创建用于 Windows.UI.Composition 的 Direct2D 或 Direct3D 图面,请使用合成绘图图面互操作 接口。 可以使用 CopySurface 方法读回合成绘图图面 (或合成虚拟绘图图面) 的内容。 CopySurface 是从视频内存的一部分到另一部分的同步和即时复制;无需调用 Commit。
对于任何给定的合成绘图图面 (或合成虚拟绘图图面) ,应用程序可以查询 ICompositionDrawingSurfaceInterop2,并在该接口上调用 CopySurface 。
仅当与源图面属于同一 CompositionGraphicsDevice 的任何图面没有挂起的更新时,才能调用 CopySurface, (ICompositionDrawingSurfaceInterop::BeginDraw 具有相同的要求) 。 在从未更新过的非虚拟合成绘图图面上调用 CopySurface 也是非法的,因为它的像素内容未定义。 对于虚拟表面,由于分配稀疏,因此可以指定与图面未初始化区域相交的源矩形。 在这种情况下,调用是合法的,但这些未初始化区域的副本结果未定义。
注意
此接口在 Windows 10 版本 1903 (10.0;内部版本 18362) ,但在Windows 软件开发工具包 (Windows SDK) (SDK) 版本的头文件中未定义windows.ui.composition.interop.h
。 如果首先获取指向 ICompositionDrawingSurfaceInterop 接口的指针,则可以通过 QueryInterface) 查询该 (,以获取指向 ICompositionDrawingSurfaceInterop2 接口的指针。
示例
对于此方案,我们设想了一个框架,该框架使用 CompositionDrawingSurface 授予将自定义内容呈现和撰写到框架管理的可视化树中的能力。 框架实现要使用的低资源模式 (,例如,在应用程序最小化或挂起) 期间。 在此模式下,框架会释放大多数组合对象,包括所有表面。 但是,在释放每个图面之前,框架会提取其像素并将其压缩 (例如,使用 PNG 编解码器) 以便以后可以重新构造它们,而无需重新调用应用程序代码。 此代码示例演示框架可能实现以处理每个图面的帮助程序函数。
HRESULT CompressSurface(_In_ ICompositionDrawingSurface* surface)
{
// Get the interop interface.
ComPtr<ICompositionDrawingSurfaceInterop2> surfaceInterop;
RETURN_IF_FAILED(surface.As(&surfaceInterop));
// Allocate a staging surface of equal size to the surface to compress.
SizeInt32 size;
RETURN_IF_FAILED(surface->get_Size(&size));
// Create a staging texture to receive a copy of the pixels.
ComPtr<ID3D11Texture2D> stagingTexture;
RETURN_IF_FAILED(CreateStagingTexture(size, stagingTexture.GetAddressOf()));
// Copy the pixels out.
RETURN_IF_FAILED(surfaceInterop->CopySurface(stagingTexture.get(), 0, 0, nullptr));
// Compress the retrieved pixels.
RETURN_IF_FAILED(CompressTexturePixels(stagingTexture.get()));
return S_OK;
}
HRESULT CreateStagingTexture(const SizeInt32& size, _Outptr_ ID3D11Texture2D** texture)
{
D3D11_TEXTURE2D_DESC surfaceDesc;
surfaceDesc.Width = size.Width;
surfaceDesc.Height = size.Height;
surfaceDesc.MipLevels = 1;
surfaceDesc.ArraySize = 1;
surfaceDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
surfaceDesc.SampleDesc.Count = 1;
surfaceDesc.SampleDesc.Quality = 0;
surfaceDesc.Usage = D3D11_USAGE_STAGING;
surfaceDesc.BindFlags = 0;
surfaceDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
surfaceDesc.MiscFlags = 0;
RETURN_IF_FAILED(g_d3d11Device->CreateTexture2D(surfaceDesc, false, texture));
return S_OK;
}
HRESULT CompressTexturePixels(_In_ ID3D11Texture2D* texture)
{
// ...
// Map the texture, feed the pixels to WIC...
// ...
}
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 10版本 2004 (10.0;内部版本 19041) |
最低受支持的服务器 | Windows Server 版本 2004 (10.0;内部版本 19041) |
目标平台 | Windows |
标头 | windows.ui.composition.interop.h |