#pragma once #include #include #include inline auto CreateCompositionGraphicsDevice( winrt::Windows::UI::Composition::Compositor const &compositor, ::IUnknown *device) { winrt::Windows::UI::Composition::CompositionGraphicsDevice graphicsDevice{ nullptr}; auto compositorInterop = compositor.as(); winrt::com_ptr graphicsInterop; winrt::check_hresult( compositorInterop->CreateGraphicsDevice(device, graphicsInterop.put())); winrt::check_hresult(graphicsInterop->QueryInterface( winrt::guid_of< winrt::Windows::UI::Composition::CompositionGraphicsDevice>(), reinterpret_cast(winrt::put_abi(graphicsDevice)))); return graphicsDevice; } inline void ResizeSurface( winrt::Windows::UI::Composition::CompositionDrawingSurface const &surface, winrt::Windows::Foundation::Size const &size) { auto surfaceInterop = surface.as< ABI::Windows::UI::Composition::ICompositionDrawingSurfaceInterop>(); SIZE newSize = {}; newSize.cx = static_cast(std::round(size.Width)); newSize.cy = static_cast(std::round(size.Height)); winrt::check_hresult(surfaceInterop->Resize(newSize)); } inline auto SurfaceBeginDraw( winrt::Windows::UI::Composition::CompositionDrawingSurface const &surface) { auto surfaceInterop = surface.as< ABI::Windows::UI::Composition::ICompositionDrawingSurfaceInterop>(); winrt::com_ptr context; POINT offset = {}; winrt::check_hresult(surfaceInterop->BeginDraw( nullptr, __uuidof(ID2D1DeviceContext), context.put_void(), &offset)); context->SetTransform( D2D1::Matrix3x2F::Translation((FLOAT)offset.x, (FLOAT)offset.y)); return context; } inline void SurfaceEndDraw( winrt::Windows::UI::Composition::CompositionDrawingSurface const &surface) { auto surfaceInterop = surface.as< ABI::Windows::UI::Composition::ICompositionDrawingSurfaceInterop>(); winrt::check_hresult(surfaceInterop->EndDraw()); } inline auto CreateCompositionSurfaceForSwapChain( winrt::Windows::UI::Composition::Compositor const &compositor, ::IUnknown *swapChain) { winrt::Windows::UI::Composition::ICompositionSurface surface{nullptr}; auto compositorInterop = compositor.as(); winrt::com_ptr surfaceInterop; winrt::check_hresult(compositorInterop->CreateCompositionSurfaceForSwapChain( swapChain, surfaceInterop.put())); winrt::check_hresult(surfaceInterop->QueryInterface( winrt::guid_of(), reinterpret_cast(winrt::put_abi(surface)))); return surface; }