Método ICompositionDrawingSurfaceInterop2::CopySurface (windows.ui.composition.interop.h)
Lee el contenido de una superficie de dibujo de composición (o una superficie de dibujo virtual de composición).
Sintaxis
HRESULT CopySurface(
[in] IUnknown *destinationResource,
[in] int destinationOffsetX,
[in] int destinationOffsetY,
[in] const RECT *sourceRectangle
);
Parámetros
[in] destinationResource
Tipo: IUnknown*
Representa la textura de Direct3D que recibirá la copia. Debe haber creado este recurso en el mismo dispositivo Direct3D que el asociado con compositionGraphicsDevice que se usó para crear la superficie de dibujo de composición de origen (o la superficie de dibujo virtual de composición).
[in] destinationOffsetX
Tipo: int
Coordenada x de un desplazamiento (en destinationResource) donde se realizará la copia. La operación de copia no cambia ningún píxel por encima o a la izquierda de este desplazamiento. El argumento no puede ser negativo.
[in] destinationOffsetY
Tipo: int
Coordenada y de un desplazamiento (en destinationResource) donde se realizará la copia. La operación de copia no cambia ningún píxel por encima o a la izquierda de este desplazamiento. El argumento no puede ser negativo.
[in] sourceRectangle
Tipo: const RECT*
Puntero opcional a una constante RECT que representa el rectángulo en la superficie de origen que se va a copiar. El rectángulo no puede superar los límites de la superficie de origen. Para tener suficiente espacio para recibir los píxeles solicitados, el recurso de destino debe tener al menos tantos píxeles como los parámetros destinationOffsetX e Y más el ancho o alto de este rectángulo.
Si este parámetro es null, se copia toda la superficie de origen (y el tamaño de la superficie de origen se usa para validar el tamaño del recurso de destino).
Valor devuelto
Tipo: HRESULT
S_OK si se ejecuta correctamente; de lo contrario, devuelve un código de error HRESULT que indica el motivo del error. Consulte también Códigos de error COM (UI, Audio, DirectX, Codec).
Comentarios
Para crear una superficie de Direct2D o Direct3D para usarla con Windows.UI.Composition, usa las interfaces de interoperación de superficie de dibujo de composición . Puede usar el método CopySurface para volver a leer el contenido de una superficie de dibujo de composición (o una superficie de dibujo virtual de composición). CopySurface es una copia sincrónica e instantánea de una parte de la memoria de vídeo a otra; no es necesario llamar a Commit.
Para cualquier superficie de dibujo de composición determinada (o superficie de dibujo virtual de composición), la aplicación puede consultar ICompositionDrawingSurfaceInterop2 y llamar a CopySurface en esa interfaz.
Puede llamar a CopySurface solo cuando no haya actualizaciones pendientes en ninguna superficie que pertenezca a la misma CompositionGraphicsDevice que la superficie de origen (ICompositionDrawingSurfaceInterop::BeginDraw tiene el mismo requisito). También es ilegal llamar a CopySurface en una superficie de dibujo de composición no virtual que nunca se ha actualizado, ya que su contenido de píxeles no está definido. En el caso de las superficies virtuales, ya que se asignan dispersamente, es posible especificar un rectángulo de origen que intersece las regiones no inicializadas de la superficie. En ese caso, la llamada es legal, pero el resultado de la copia de esas regiones no inicializadas no está definida.
Nota
Esta interfaz está disponible en Windows 10, versión 1903 (10.0; Compilación 18362), pero no se define en el windows.ui.composition.interop.h
archivo de encabezado para esa versión del Kit de desarrollo de software de Windows (SDK). Si primero obtiene un puntero a una interfaz ICompositionDrawingSurfaceInterop , puede consultarlo (a través de QueryInterface) para un puntero a una interfaz ICompositionDrawingSurfaceInterop2 .
Ejemplos
En este escenario, se prevé un marco que usa CompositionDrawingSurface para conceder la capacidad de representar y componer contenido personalizado en un árbol visual administrado por el marco. El marco implementa un modo de recurso bajo (que se usará, por ejemplo, durante la minimización o suspensión de la aplicación). Cuando está en este modo, el marco libera la mayoría de los objetos de composición, incluidas todas las superficies. Sin embargo, antes de liberar cada superficie, el marco extrae sus píxeles y los comprime (por ejemplo, mediante el códec PNG) para que pueda reconstituirlos más adelante sin tener que volver a llamar al código de la aplicación. En este ejemplo de código se muestra una función auxiliar que el marco podría implementar para procesar cada superficie.
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...
// ...
}
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows 10, versión 2004 (10.0; Compilación 19041) |
Servidor mínimo compatible | Windows Server, versión 2004 (10.0; Compilación 19041) |
Plataforma de destino | Windows |
Encabezado | windows.ui.composition.interop.h |