Partager via


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

Lit le contenu d’une surface de dessin de composition (ou d’une surface de dessin virtuelle de composition).

Syntaxe

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

Paramètres

[in] destinationResource

Type : IUnknown*

Représente la texture Direct3D qui recevra la copie. Vous devez avoir créé cette ressource sur le même appareil Direct3D que celui associé à CompositionGraphicsDevice qui a été utilisé pour créer la surface de dessin de composition source (ou la surface de dessin virtuelle de composition).

[in] destinationOffsetX

Type : int

Coordonnée x d’un décalage (dans destinationResource) où la copie sera effectuée. Aucun pixel au-dessus ou à gauche de ce décalage n’est modifié par l’opération de copie. L’argument ne peut pas être négatif.

[in] destinationOffsetY

Type : int

Coordonnée y d’un décalage (dans destinationResource) où la copie sera effectuée. Aucun pixel au-dessus ou à gauche de ce décalage n’est modifié par l’opération de copie. L’argument ne peut pas être négatif.

[in] sourceRectangle

Type : const RECT*

Pointeur facultatif vers une constante RECT représentant le rectangle sur la surface source à copier. Le rectangle ne peut pas dépasser les limites de la surface source. Pour disposer de suffisamment d’espace pour recevoir les pixels demandés, la ressource de destination doit avoir au moins autant de pixels que les paramètres destinationOffsetX et Y , plus la largeur/hauteur de ce rectangle.

Si ce paramètre est null, la surface source entière est copiée (et la taille de la surface source est utilisée pour valider la taille de la ressource de destination).

Valeur retournée

Type : HRESULT

S_OK en cas de réussite, retourne sinon un code d’erreur HRESULT indiquant la raison de l’échec. Consultez également Codes d’erreur COM (interface utilisateur, audio, DirectX, codec).

Remarques

Pour créer une surface Direct2D ou Direct3D à utiliser avec Windows.UI.Composition, vous utilisez les interfaces d’interopérabilité de la surface de dessin de composition . Vous pouvez utiliser la méthode CopySurface pour lire le contenu d’une surface de dessin de composition (ou d’une surface de dessin virtuelle de composition). CopySurface est une copie synchrone et instantanée d’une partie de la mémoire vidéo vers une autre ; vous n’avez pas besoin d’appeler Commit.

Pour une surface de dessin de composition donnée (ou une surface de dessin virtuelle de composition), votre application peut interroger ICompositionDrawingSurfaceInterop2 et appeler CopySurface sur cette interface.

Vous pouvez appeler CopySurface uniquement lorsqu’il n’y a aucune mise à jour en attente pour les surfaces appartenant à la même CompositionGraphicsDevice que la surface source (ICompositionDrawingSurfaceInterop ::BeginDraw a la même exigence). Il est également interdit d’appeler CopySurface sur une surface de dessin de composition non virtuelle qui n’a jamais été mise à jour, car son contenu en pixels n’est pas défini. Pour les surfaces virtuelles, étant donné qu’elles sont allouées de manière éparse, il est possible de spécifier un rectangle source qui croise des régions non initialisées de la surface. Dans ce cas, l’appel est légal, mais le résultat de la copie pour ces régions non initialisées n’est pas défini.

Notes

Cette interface est disponible sur Windows 10, version 1903 (10.0 ; Build 18362), mais elle n’est pas définie dans le windows.ui.composition.interop.h fichier d’en-tête pour cette version du Kit de développement logiciel Windows (Kit SDK Windows) (SDK). Si vous obtenez d’abord un pointeur vers une interface ICompositionDrawingSurfaceInterop , vous pouvez l’interroger (via QueryInterface) pour obtenir un pointeur vers une interface ICompositionDrawingSurfaceInterop2 .

Exemples

Pour ce scénario, nous envisageons une infrastructure qui utilise CompositionDrawingSurface pour accorder la possibilité de restituer et de composer du contenu personnalisé dans une arborescence visuelle gérée par l’infrastructure. L’infrastructure implémente un mode de ressources faible (à utiliser, par exemple, pendant la réduction ou la suspension de l’application). Dans ce mode, l’infrastructure libère la plupart des objets de composition, y compris toutes les surfaces. Toutefois, avant de libérer chaque surface, l’infrastructure extrait ses pixels et les compresse (par exemple, à l’aide du codec PNG) afin de pouvoir les reconstituer ultérieurement sans avoir à les rappeler dans le code de l’application. Cet exemple de code montre une fonction d’assistance que l’infrastructure peut implémenter pour traiter chaque surface.

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... 
    // ... 
} 

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows 10, version 2004 (10.0 ; Build 19041)
Serveur minimal pris en charge Windows Server, version 2004 (10.0 ; Build 19041)
Plateforme cible Windows
En-tête windows.ui.composition.interop.h

Voir aussi