From 1cef30e7f5d025455e2478d0aabb4ad15132479e Mon Sep 17 00:00:00 2001 From: Nomango Date: Tue, 14 Apr 2020 17:08:15 +0800 Subject: [PATCH] fix window resize exception --- src/kiwano/platform/win32/WindowImpl.cpp | 4 ++-- src/kiwano/render/DirectX/D2DDeviceResources.cpp | 14 ++++++++++++-- src/kiwano/render/DirectX/D2DDeviceResources.h | 2 ++ src/kiwano/render/DirectX/RendererImpl.cpp | 6 ++++++ 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/kiwano/platform/win32/WindowImpl.cpp b/src/kiwano/platform/win32/WindowImpl.cpp index 2499945b..72fdf790 100644 --- a/src/kiwano/platform/win32/WindowImpl.cpp +++ b/src/kiwano/platform/win32/WindowImpl.cpp @@ -193,11 +193,11 @@ WindowWin32Impl::WindowWin32Impl() key_map_['A' + i] = KeyCode(size_t(KeyCode::A) + i); // Num 0 - 9 - for (size_t i = 0; i < 9; ++i) + for (size_t i = 0; i < 10; ++i) key_map_['0' + i] = KeyCode(size_t(KeyCode::Num0) + i); // Numpad 0 - 9 - for (size_t i = 0; i < 9; ++i) + for (size_t i = 0; i < 10; ++i) key_map_[VK_NUMPAD0 + i] = KeyCode(size_t(KeyCode::Numpad0) + i); // F1 - F12 diff --git a/src/kiwano/render/DirectX/D2DDeviceResources.cpp b/src/kiwano/render/DirectX/D2DDeviceResources.cpp index 47281c76..3f522162 100644 --- a/src/kiwano/render/DirectX/D2DDeviceResources.cpp +++ b/src/kiwano/render/DirectX/D2DDeviceResources.cpp @@ -69,6 +69,8 @@ public: void DiscardResources() override; + void SetTargetBitmap(_In_ ComPtr target) override; + public: unsigned long STDMETHODCALLTYPE AddRef(); @@ -276,8 +278,7 @@ HRESULT D2DDeviceResources::CreateWindowSizeDependentResources() if (SUCCEEDED(hr)) { - target_bitmap_ = target; - device_context_->SetTarget(target_bitmap_.Get()); + SetTargetBitmap(target); } } return hr; @@ -311,6 +312,15 @@ HRESULT D2DDeviceResources::HandleDeviceLost(_In_ ComPtr dxgi_devic return hr; } +void D2DDeviceResources::SetTargetBitmap(ComPtr target) +{ + target_bitmap_ = target; + if (device_context_) + { + device_context_->SetTarget(target_bitmap_.Get()); + } +} + HRESULT D2DDeviceResources::CreateBitmapConverter(_Out_ ComPtr& converter, _In_opt_ ComPtr source, _In_ REFWICPixelFormatGUID format, WICBitmapDitherType dither, diff --git a/src/kiwano/render/DirectX/D2DDeviceResources.h b/src/kiwano/render/DirectX/D2DDeviceResources.h index e8768f79..a61e3f24 100644 --- a/src/kiwano/render/DirectX/D2DDeviceResources.h +++ b/src/kiwano/render/DirectX/D2DDeviceResources.h @@ -63,6 +63,8 @@ public: virtual void DiscardResources() = 0; + virtual void SetTargetBitmap(_In_ ComPtr target) = 0; + inline ID2D1Factory1* GetFactory() { KGE_ASSERT(factory_); diff --git a/src/kiwano/render/DirectX/RendererImpl.cpp b/src/kiwano/render/DirectX/RendererImpl.cpp index 927820e9..fe48773c 100644 --- a/src/kiwano/render/DirectX/RendererImpl.cpp +++ b/src/kiwano/render/DirectX/RendererImpl.cpp @@ -954,6 +954,12 @@ void RendererImpl::Resize(uint32_t width, uint32_t height) if (!d3d_res_) hr = E_UNEXPECTED; + if (SUCCEEDED(hr)) + { + // Clear resources + d2d_res_->SetTargetBitmap(nullptr); + } + if (SUCCEEDED(hr)) { output_size_.x = static_cast(width);