#pragma once #include #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(), 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(); 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(); 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(); 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; }