다음을 통해 공유


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 에 대한 선택적 포인터입니다. 사각형은 원본 표면의 범위를 초과할 수 없습니다. 요청된 픽셀을 받을 수 있는 충분한 공간을 확보하려면 대상 리소스에 destinationOffsetXY 매개 변수와 이 사각형의 너비/높이만큼 많은 픽셀이 있어야 합니다.

이 매개 변수가 null이면 전체 원본 표면이 복사되고 원본 표면 크기가 대상 리소스의 크기를 확인하는 데 사용됩니다.

반환 값

형식: HRESULT

S_OK 성공하면 실패 이유를 나타내는 HRESULT 오류 코드를 반환합니다. 또한 COM 오류 코드(UI, 오디오, DirectX, 코덱)를 참조하세요.

설명

Windows.UI.Composition와 함께 사용할 Direct2D 또는 Direct3D 표면을 만들려면 컴퍼지션 그리기 표면 상호 운용 인터페이스를 사용합니다. CopySurface 메서드를 사용하여 컴퍼지션 그리기 표면(또는 컴퍼지션 가상 그리기 표면)의 내용을 다시 읽을 수 있습니다. CopySurface 는 비디오 메모리의 한 부분에서 다른 부분으로의 동기 및 즉각적인 복사본입니다. 커밋을 호출할 필요가 없습니다.

지정된 컴퍼지션 드로잉 표면(또는 컴퍼지션 가상 그리기 표면)의 경우 애플리케이션 에서 ICompositionDrawingSurfaceInterop2를 쿼리하고 해당 인터페이스에서 CopySurface 를 호출할 수 있습니다.

원본 표면과 동일한 CompositionGraphicsDevice에 속하는 모든 표면에 보류 중인 업데이트가 없는 경우에만 CopySurface를 호출할 수 있습니다(ICompositionDrawingSurfaceInterop::BeginDraw에는 동일한 요구 사항이 있음). 픽셀 내용이 정의되지 않았기 때문에 업데이트되지 않은 가상 컴퍼지션 그리기 표면에서 CopySurface 를 호출하는 것도 불법입니다. 가상 표면의 경우 거의 할당되지 않으므로 표면의 초기화되지 않은 영역과 교차하는 원본 사각형을 지정할 수 있습니다. 이 경우 호출은 합법적이지만 초기화되지 않은 지역에 대한 복사본의 결과는 정의되지 않습니다.

참고

이 인터페이스는 Windows 10 버전 1903(10.0; 빌드 18362)이지만 해당 버전의 Windows SDK(소프트웨어 개발 키트)(SDK)에 대한 헤더 파일에 정의 windows.ui.composition.interop.h 되어 있지 않습니다. 먼저 ICompositionDrawingSurfaceInterop 인터페이스에 대한 포인터를 가져오는 경우 ICompositionDrawingSurfaceInterop2 인터페이스에 대한 포인터를 쿼리할 수 있습니다(QueryInterface를 통해).

예제

이 시나리오에서는 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

추가 정보