Поделиться через


Метод 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, которая получит копию. Этот ресурс должен быть создан на том же устройстве Direct3D, что и связанный с CompositionGraphicsDevice , который использовался для создания поверхности рисования исходной композиции (или виртуальной поверхности рисования композиции).

[in] destinationOffsetX

Тип: int

Координата X смещения (в destinationResource), где будет выполнено копирование. Операция копирования не изменяет пиксели выше или слева от этого смещения. Аргумент не может быть отрицательным.

[in] destinationOffsetY

Тип: int

Координата Y смещения (в destinationResource), где будет выполнено копирование. Операция копирования не изменяет пиксели выше или слева от этого смещения. Аргумент не может быть отрицательным.

[in] sourceRectangle

Тип: const RECT*

Необязательный указатель на константу RECT , представляющую прямоугольник на исходной поверхности для копирования. Прямоугольник не может превышать границы исходной поверхности. Чтобы иметь достаточно места для получения запрошенных пикселей, целевой ресурс должен иметь по крайней мере столько же пикселей, сколько и параметры destinationOffsetX и Y , а также ширину и высоту этого прямоугольника.

Если этот параметр имеет значение NULL, копируется вся исходная поверхность (а размер исходной поверхности используется для проверки размера целевого ресурса).

Возвращаемое значение

Тип: HRESULT

S_OK в случае успешного выполнения, в противном случае возвращает код ошибки HRESULT , указывающий причину сбоя. См. также коды ошибок COM (ui, audio, DirectX, Codec).

Комментарии

Чтобы создать поверхность Direct2D или Direct3D для использования с Windows.UI.Composition, используйте интерфейсы взаимодействия поверхности рисования композиции . Метод CopySurface можно использовать для чтения содержимого поверхности рисования композиции (или виртуальной поверхности рисования композиции). CopySurface — это синхронное и мгновенное копирование из одной части видеопамять в другую; Вам не нужно вызывать Commit.

Для любой конкретной поверхности рисования композиции (или виртуальной поверхности рисования композиции) приложение может запрашивать ICompositionDrawingSurfaceInterop2 и вызывать CopySurface в этом интерфейсе.

CopySurface можно вызывать, только если нет ожидающих обновлений для каких-либо поверхностей, принадлежащих той же области CompositionGraphicsDevice, что и исходная поверхность (ICompositionDrawingSurfaceInterop::BeginDraw имеет то же требование). Кроме того, нельзя вызывать CopySurface для поверхности рисования не виртуальной композиции, которая никогда не обновлялась, так как ее содержимое пикселей не определено. Для виртуальных поверхностей, так как они выделены редко, можно указать исходный прямоугольник, который пересекается с неинициализированными областями поверхности. В этом случае вызов является законным, но результат копирования для этих неинициализированных регионов не определен.

Примечание

Этот интерфейс доступен в Windows 10 версии 1903 (10.0; Сборка 18362), но она не определена windows.ui.composition.interop.h в файле заголовка для этой версии пакет средств разработки программного обеспечения для Windows (SDK). Если сначала получить указатель на интерфейс 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
Header windows.ui.composition.interop.h

См. также раздел