composition.interop.h 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #pragma once
  2. #include <guiddef.h>
  3. #include <winrt/Windows.UI.Composition.h>
  4. #include <windows.ui.composition.interop.h>
  5. #include <d2d1_1.h>
  6. inline auto CreateCompositionGraphicsDevice(
  7. winrt::Windows::UI::Composition::Compositor const& compositor,
  8. ::IUnknown* device)
  9. {
  10. winrt::Windows::UI::Composition::CompositionGraphicsDevice graphicsDevice{ nullptr };
  11. auto compositorInterop = compositor.as<ABI::Windows::UI::Composition::ICompositorInterop>();
  12. winrt::com_ptr<ABI::Windows::UI::Composition::ICompositionGraphicsDevice> graphicsInterop;
  13. winrt::check_hresult(compositorInterop->CreateGraphicsDevice(device, graphicsInterop.put()));
  14. winrt::check_hresult(graphicsInterop->QueryInterface(winrt::guid_of<winrt::Windows::UI::Composition::CompositionGraphicsDevice>(),
  15. reinterpret_cast<void**>(winrt::put_abi(graphicsDevice))));
  16. return graphicsDevice;
  17. }
  18. inline void ResizeSurface(
  19. winrt::Windows::UI::Composition::CompositionDrawingSurface const& surface,
  20. winrt::Windows::Foundation::Size const& size)
  21. {
  22. auto surfaceInterop = surface.as<ABI::Windows::UI::Composition::ICompositionDrawingSurfaceInterop>();
  23. SIZE newSize = {};
  24. newSize.cx = static_cast<LONG>(std::round(size.Width));
  25. newSize.cy = static_cast<LONG>(std::round(size.Height));
  26. winrt::check_hresult(surfaceInterop->Resize(newSize));
  27. }
  28. inline auto SurfaceBeginDraw(
  29. winrt::Windows::UI::Composition::CompositionDrawingSurface const& surface)
  30. {
  31. auto surfaceInterop = surface.as<ABI::Windows::UI::Composition::ICompositionDrawingSurfaceInterop>();
  32. winrt::com_ptr<ID2D1DeviceContext> context;
  33. POINT offset = {};
  34. winrt::check_hresult(surfaceInterop->BeginDraw(nullptr, __uuidof(ID2D1DeviceContext), context.put_void(), &offset));
  35. context->SetTransform(D2D1::Matrix3x2F::Translation((FLOAT)offset.x,(FLOAT) offset.y));
  36. return context;
  37. }
  38. inline void SurfaceEndDraw(
  39. winrt::Windows::UI::Composition::CompositionDrawingSurface const& surface)
  40. {
  41. auto surfaceInterop = surface.as<ABI::Windows::UI::Composition::ICompositionDrawingSurfaceInterop>();
  42. winrt::check_hresult(surfaceInterop->EndDraw());
  43. }
  44. inline auto CreateCompositionSurfaceForSwapChain(
  45. winrt::Windows::UI::Composition::Compositor const& compositor,
  46. ::IUnknown* swapChain)
  47. {
  48. winrt::Windows::UI::Composition::ICompositionSurface surface{ nullptr };
  49. auto compositorInterop = compositor.as<ABI::Windows::UI::Composition::ICompositorInterop>();
  50. winrt::com_ptr<ABI::Windows::UI::Composition::ICompositionSurface> surfaceInterop;
  51. winrt::check_hresult(compositorInterop->CreateCompositionSurfaceForSwapChain(swapChain, surfaceInterop.put()));
  52. winrt::check_hresult(surfaceInterop->QueryInterface(winrt::guid_of<winrt::Windows::UI::Composition::ICompositionSurface>(),
  53. reinterpret_cast<void**>(winrt::put_abi(surface))));
  54. return surface;
  55. }