次の方法で共有


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

コピーが実行されるオフセット ( destinationResource への) の x 座標。 このオフセットの上または左側のピクセルは、コピー操作によって変更されません。 引数を負にすることはできません。

[in] destinationOffsetY

型: int

コピーが実行されるオフセット ( destinationResource への) の y 座標。 このオフセットの上または左側のピクセルは、コピー操作によって変更されません。 引数を負にすることはできません。

[in] sourceRectangle

型: const RECT*

コピーアウトするソースサーフェイス上の四角形を表す定数 RECT への省略可能なポインター。四角形は、ソース サーフェスの境界を超えることはできません。 要求されたピクセルを受け取るのに十分な領域を確保するには、変換先リソースには、 destinationOffsetX パラメーターと Y パラメーターと、この四角形の幅/高さを加えたピクセル数以上が必要です。

このパラメーターが null の場合は、ソース サーフェス全体がコピーされます (ソース サーフェスのサイズを使用して、ターゲット リソースのサイズを検証します)。

戻り値

種類: HRESULT

S_OK 成功した場合は、失敗の理由を示す HRESULT エラー コードを返します。 COM エラー コード (UI、オーディオ、DirectX、コーデック) も参照してください。

注釈

Windows.UI.Composition で使用する Direct2D または Direct3D サーフェスを作成するには、コンポジション描画サーフェス相互運用インターフェイスを使用します。 CopySurface メソッドを使用すると、コンポジション描画サーフェス (またはコンポジション仮想描画サーフェス) の内容を読み戻すことができます。 CopySurface は、ビデオ メモリの一部から別の部分への同期および瞬時コピーです。 Commit を呼び出す必要はありません。

任意のコンポジション描画サーフェス (またはコンポジション仮想描画サーフェス) に対して、アプリケーションで ICompositionDrawingSurfaceInterop2 を照会し、そのインターフェイスで CopySurface を呼び出すことができます。

CopySurface は、ソース サーフェスと同じ CompositionGraphicsDevice に属するサーフェスに保留中の更新がない場合にのみ呼び出すことができます (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

こちらもご覧ください