Compartilhar via


Método ICompositionDrawingSurfaceInterop2::CopySurface (windows.ui.composition.interop.h)

Lê o conteúdo de uma superfície de desenho de composição (ou uma superfície de desenho virtual de composição).

Sintaxe

HRESULT CopySurface(
  [in] IUnknown   *destinationResource,
  [in] int        destinationOffsetX,
  [in] int        destinationOffsetY,
  [in] const RECT *sourceRectangle
);

Parâmetros

[in] destinationResource

Tipo: IUnknown*

Representa a textura Direct3D que receberá a cópia. Você deve ter criado esse recurso no mesmo dispositivo Direct3D que aquele associado ao CompositionGraphicsDevice que foi usado para criar a superfície de desenho de composição de origem (ou a superfície de desenho virtual de composição).

[in] destinationOffsetX

Tipo: int

A coordenada x de um deslocamento (em destinationResource) em que a cópia será executada. Nenhum pixel acima ou à esquerda desse deslocamento é alterado pela operação de cópia. O argumento não pode ser negativo.

[in] destinationOffsetY

Tipo: int

A coordenada y de um deslocamento (em destinationResource) em que a cópia será executada. Nenhum pixel acima ou à esquerda desse deslocamento é alterado pela operação de cópia. O argumento não pode ser negativo.

[in] sourceRectangle

Tipo: const RECT*

Um ponteiro opcional para um RECT constante que representa o retângulo na superfície de origem a ser copiado. O retângulo não pode exceder os limites da superfície de origem. Para ter espaço suficiente para receber os pixels solicitados, o recurso de destino deve ter pelo menos tantos pixels quanto os parâmetros destinationOffsetX e Y mais a largura/altura desse retângulo.

Se esse parâmetro for nulo, toda a superfície de origem será copiada (e o tamanho da superfície de origem será usado para validar o tamanho do recurso de destino).

Retornar valor

Tipo: HRESULT

S_OK se tiver êxito, caso contrário, retornará um código de erro HRESULT indicando o motivo da falha. Consulte também Códigos de erro COM (interface do usuário, áudio, DirectX, Codec).

Comentários

Para criar um Direct2D ou uma superfície Direct3D para uso com Windows.UI.Composition, use as interfaces de interoperação da superfície de desenho de composição. Você pode usar o método CopySurface para ler de volta o conteúdo de uma superfície de desenho de composição (ou uma superfície de desenho virtual de composição). CopySurface é uma cópia síncrona e instantânea de uma parte da memória de vídeo para outra; você não precisa chamar Commit.

Para qualquer superfície de desenho de composição específica (ou superfície de desenho virtual de composição), seu aplicativo pode consultar ICompositionDrawingSurfaceInterop2 e chamar CopySurface nessa interface.

Você pode chamar CopySurface somente quando não houver atualizações pendentes para nenhuma superfície que pertença ao mesmo CompositionGraphicsDevice que a superfície de origem (ICompositionDrawingSurfaceInterop::BeginDraw tem o mesmo requisito). Também é ilegal chamar CopySurface em uma superfície de desenho de composição não virtual que nunca foi atualizada, pois seu conteúdo de pixel é indefinido. Para superfícies virtuais, como elas são alocadas de forma pouco alocada, é possível especificar um retângulo de origem que intersecione regiões não inicializadas da superfície. Nesse caso, a chamada é legal, mas o resultado da cópia para essas regiões não inicializadas é indefinido.

Observação

Essa interface está disponível no Windows 10, versão 1903 (10.0; Build 18362), mas não está definido no windows.ui.composition.interop.h arquivo de cabeçalho para essa versão do SDK (Software Development Kit do Windows (SDK do Windows)). Se você primeiro obter um ponteiro para uma interface ICompositionDrawingSurfaceInterop , poderá consultar isso (por meio de QueryInterface) para obter um ponteiro para uma interface ICompositionDrawingSurfaceInterop2 .

Exemplos

Para esse cenário, prevemos uma estrutura que usa CompositionDrawingSurface para conceder a capacidade de renderizar e compor conteúdo personalizado em uma árvore visual gerenciada pela estrutura. A estrutura implementa um modo de recurso baixo (a ser usado, por exemplo, durante a minimização ou suspensão do aplicativo). Quando nesse modo, a estrutura libera a maioria dos objetos de composição, incluindo todas as superfícies. No entanto, antes de liberar cada superfície, a estrutura extrai seus pixels e os compacta (por exemplo, usando o codec PNG) para que possa reconstituí-los posteriormente sem precisar chamar de volta no código do aplicativo. Este exemplo de código mostra uma função auxiliar que a estrutura pode implementar para processar cada superfície.

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 Valor
Cliente mínimo com suporte Windows 10, versão 2004 (10.0; Build 19041)
Servidor mínimo com suporte Windows Server, versão 2004 (10.0; Build 19041)
Plataforma de Destino Windows
Cabeçalho windows.ui.composition.interop.h

Confira também