// // Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // SwapChainPanelNativeWindow.h: NativeWindow for managing ISwapChainPanel native window types. #ifndef LIBANGLE_RENDERER_D3D_D3D11_WINRT_SWAPCHAINPANELNATIVEWINDOW_H_ #define LIBANGLE_RENDERER_D3D_D3D11_WINRT_SWAPCHAINPANELNATIVEWINDOW_H_ #include "libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.h" namespace rx { class SwapChainPanelNativeWindow : public InspectableNativeWindow, public std::enable_shared_from_this { public: ~SwapChainPanelNativeWindow(); bool initialize(EGLNativeWindowType window, IPropertySet *propertySet); bool registerForSizeChangeEvents(); void unregisterForSizeChangeEvents(); HRESULT createSwapChain(ID3D11Device *device, DXGIFactory *factory, DXGI_FORMAT format, unsigned int width, unsigned int height, DXGISwapChain **swapChain); HRESULT scaleSwapChain(const SIZE &newSize); private: ComPtr mSwapChainPanel; ComPtr> mPropertyMap; ComPtr mSwapChain; }; [uuid(8ACBD974-8187-4508-AD80-AEC77F93CF36)] class SwapChainPanelSizeChangedHandler : public Microsoft::WRL::RuntimeClass, ABI::Windows::UI::Xaml::ISizeChangedEventHandler> { public: SwapChainPanelSizeChangedHandler() { } HRESULT RuntimeClassInitialize(std::shared_ptr host) { if (!host) { return E_INVALIDARG; } mHost = host; return S_OK; } // ISizeChangedEventHandler IFACEMETHOD(Invoke)(IInspectable *sender, ABI::Windows::UI::Xaml::ISizeChangedEventArgs *sizeChangedEventArgs) { std::shared_ptr host = mHost.lock(); if (host) { // The size of the ISwapChainPanel control is returned in DIPs. // We are keeping these in dips because the swapchain created for composition // also uses dip units. This keeps dimensions, viewports, etc in the same unit. // XAML Clients of the ISwapChainPanel are required to use dips to define their // layout sizes as well. ABI::Windows::Foundation::Size newSize; HRESULT result = sizeChangedEventArgs->get_NewSize(&newSize); if (SUCCEEDED(result)) { SIZE windowSize = { lround(newSize.Width), lround(newSize.Height) }; host->setNewClientSize(windowSize); } } return S_OK; } private: std::weak_ptr mHost; }; HRESULT GetSwapChainPanelSize(const ComPtr &swapChainPanel, RECT *windowSize); } #endif // LIBANGLE_RENDERER_D3D_D3D11_WINRT_SWAPCHAINPANELNATIVEWINDOW_H_