aboutsummaryrefslogtreecommitdiff
path: root/src/win/native
diff options
context:
space:
mode:
Diffstat (limited to 'src/win/native')
-rw-r--r--src/win/native/CMakeLists.txt5
-rw-r--r--src/win/native/DpiUtil.hpp11
-rw-r--r--src/win/native/InputMethod.cpp1
-rw-r--r--src/win/native/Window.cpp22
-rw-r--r--src/win/native/WindowD2DPainter.cpp22
-rw-r--r--src/win/native/WindowD2DPainter.hpp21
-rw-r--r--src/win/native/WindowRenderTarget.cpp83
7 files changed, 16 insertions, 149 deletions
diff --git a/src/win/native/CMakeLists.txt b/src/win/native/CMakeLists.txt
index 0e8ae44f..4b84600b 100644
--- a/src/win/native/CMakeLists.txt
+++ b/src/win/native/CMakeLists.txt
@@ -1,9 +1,7 @@
set(CRU_WIN_NATIVE_INCLUDE_DIR ${CRU_INCLUDE_DIR}/cru/win/native)
add_library(cru_win_native STATIC
- DpiUtil.hpp
TimerManager.hpp
- WindowD2DPainter.hpp
WindowManager.hpp
Cursor.cpp
@@ -14,9 +12,7 @@ add_library(cru_win_native STATIC
UiApplication.cpp
Window.cpp
WindowClass.cpp
- WindowD2DPainter.cpp
WindowManager.cpp
- WindowRenderTarget.cpp
)
target_sources(cru_win_native PUBLIC
${CRU_WIN_NATIVE_INCLUDE_DIR}/Cursor.hpp
@@ -30,7 +26,6 @@ target_sources(cru_win_native PUBLIC
${CRU_WIN_NATIVE_INCLUDE_DIR}/Window.hpp
${CRU_WIN_NATIVE_INCLUDE_DIR}/WindowClass.hpp
${CRU_WIN_NATIVE_INCLUDE_DIR}/WindowNativeMessageEventArgs.hpp
- ${CRU_WIN_NATIVE_INCLUDE_DIR}/WindowRenderTarget.hpp
)
target_link_libraries(cru_win_native PUBLIC imm32)
target_link_libraries(cru_win_native PUBLIC cru_win_graph_direct cru_platform_native)
diff --git a/src/win/native/DpiUtil.hpp b/src/win/native/DpiUtil.hpp
deleted file mode 100644
index 8401b03f..00000000
--- a/src/win/native/DpiUtil.hpp
+++ /dev/null
@@ -1,11 +0,0 @@
-#pragma once
-#include "cru/platform/native/Base.hpp"
-
-// The dpi awareness needs to be implemented in the future. Currently we use 96
-// as default.
-
-namespace cru::platform::native::win {
-inline platform::native::Dpi GetDpi() {
- return platform::native::Dpi{96.0f, 96.0f};
-}
-} // namespace cru::platform::native::win
diff --git a/src/win/native/InputMethod.cpp b/src/win/native/InputMethod.cpp
index 7a46bef4..d976a8ba 100644
--- a/src/win/native/InputMethod.cpp
+++ b/src/win/native/InputMethod.cpp
@@ -1,6 +1,5 @@
#include "cru/win/native/InputMethod.hpp"
-#include "DpiUtil.hpp"
#include "cru/common/Logger.hpp"
#include "cru/common/StringUtil.hpp"
#include "cru/platform/Check.hpp"
diff --git a/src/win/native/Window.cpp b/src/win/native/Window.cpp
index 7efc6160..735221ca 100644
--- a/src/win/native/Window.cpp
+++ b/src/win/native/Window.cpp
@@ -1,16 +1,14 @@
#include "cru/win/native/Window.hpp"
-#include "DpiUtil.hpp"
-#include "WindowD2DPainter.hpp"
#include "WindowManager.hpp"
#include "cru/common/Logger.hpp"
#include "cru/platform/Check.hpp"
+#include "cru/win/graph/direct/WindowPainter.hpp"
#include "cru/win/native/Cursor.hpp"
#include "cru/win/native/Exception.hpp"
#include "cru/win/native/Keyboard.hpp"
#include "cru/win/native/UiApplication.hpp"
#include "cru/win/native/WindowClass.hpp"
-#include "cru/win/native/WindowRenderTarget.hpp"
#include <imm.h>
#include <windowsx.h>
@@ -50,8 +48,10 @@ WinNativeWindow::WinNativeWindow(WinUiApplication* application,
SetCursor(application->GetCursorManager()->GetSystemCursor(
cru::platform::native::SystemCursorType::Arrow));
- window_render_target_ = std::make_unique<WindowRenderTarget>(
- application->GetDirectFactory(), this);
+ window_render_target_ =
+ std::make_unique<graph::win::direct::D2DWindowRenderTarget>(
+ application->GetDirectFactory(), hwnd_);
+ window_render_target_->SetDpi(dpi_, dpi_);
}
WinNativeWindow::~WinNativeWindow() {
@@ -137,7 +137,8 @@ void WinNativeWindow::RequestRepaint() {
}
std::unique_ptr<graph::IPainter> WinNativeWindow::BeginPaint() {
- return std::make_unique<WindowD2DPainter>(window_render_target_.get());
+ return std::make_unique<graph::win::direct::D2DWindowPainter>(
+ window_render_target_.get());
}
void WinNativeWindow::SetCursor(std::shared_ptr<ICursor> cursor) {
@@ -334,6 +335,15 @@ bool WinNativeWindow::HandleNativeWindowMessage(HWND hwnd, UINT msg,
case WM_IME_COMPOSITION:
*result = 0;
return true;
+ case WM_DPICHANGED: {
+ dpi_ = static_cast<float>(LOWORD(w_param));
+ const RECT* suggest_rect = reinterpret_cast<const RECT*>(l_param);
+ window_render_target_->SetDpi(dpi_, dpi_);
+ SetWindowPos(hwnd_, NULL, suggest_rect->left, suggest_rect->top,
+ suggest_rect->right - suggest_rect->left,
+ suggest_rect->bottom - suggest_rect->top,
+ SWP_NOZORDER | SWP_NOACTIVATE);
+ }
default:
return false;
}
diff --git a/src/win/native/WindowD2DPainter.cpp b/src/win/native/WindowD2DPainter.cpp
deleted file mode 100644
index 7a97480b..00000000
--- a/src/win/native/WindowD2DPainter.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-#include "WindowD2DPainter.hpp"
-
-#include "cru/win/graph/direct/Exception.hpp"
-#include "cru/win/graph/direct/Factory.hpp"
-#include "cru/win/native/WindowRenderTarget.hpp"
-
-namespace cru::platform::native::win {
-using namespace cru::platform::graph::win::direct;
-
-WindowD2DPainter::WindowD2DPainter(WindowRenderTarget* render_target)
- : D2DPainter(render_target->GetD2D1DeviceContext()),
- render_target_(render_target) {
- render_target_->GetD2D1DeviceContext()->BeginDraw();
-}
-
-WindowD2DPainter::~WindowD2DPainter() { EndDraw(); }
-
-void WindowD2DPainter::DoEndDraw() {
- ThrowIfFailed(render_target_->GetD2D1DeviceContext()->EndDraw());
- render_target_->Present();
-}
-} // namespace cru::platform::native::win
diff --git a/src/win/native/WindowD2DPainter.hpp b/src/win/native/WindowD2DPainter.hpp
deleted file mode 100644
index a638b77a..00000000
--- a/src/win/native/WindowD2DPainter.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-#pragma once
-#include "cru/win/graph/direct/Painter.hpp"
-#include "cru/win/native/WindowRenderTarget.hpp"
-
-namespace cru::platform::native::win {
-class WindowD2DPainter : public graph::win::direct::D2DPainter {
- public:
- explicit WindowD2DPainter(WindowRenderTarget* window);
-
- CRU_DELETE_COPY(WindowD2DPainter)
- CRU_DELETE_MOVE(WindowD2DPainter)
-
- ~WindowD2DPainter() override;
-
- protected:
- void DoEndDraw() override;
-
- private:
- WindowRenderTarget* render_target_;
-};
-} // namespace cru::platform::native::win
diff --git a/src/win/native/WindowRenderTarget.cpp b/src/win/native/WindowRenderTarget.cpp
deleted file mode 100644
index b1f867b0..00000000
--- a/src/win/native/WindowRenderTarget.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-#include "cru/win/native/WindowRenderTarget.hpp"
-
-#include "DpiUtil.hpp"
-#include "cru/win/graph/direct/Exception.hpp"
-#include "cru/win/graph/direct/Factory.hpp"
-#include "cru/win/native/Window.hpp"
-
-namespace cru::platform::native::win {
-using namespace cru::platform::graph::win::direct;
-WindowRenderTarget::WindowRenderTarget(DirectGraphFactory* factory,
- WinNativeWindow* window)
- : window_(window), factory_(factory) {
- Expects(factory);
-
- const auto d3d11_device = factory->GetD3D11Device();
- const auto dxgi_factory = factory->GetDxgiFactory();
-
- d2d1_device_context_ = factory->CreateD2D1DeviceContext();
- d2d1_device_context_->SetUnitMode(D2D1_UNIT_MODE_DIPS);
- auto dpi = window_->GetDpi();
- d2d1_device_context_->SetDpi(dpi, dpi);
-
- // Allocate a descriptor.
- DXGI_SWAP_CHAIN_DESC1 swap_chain_desc;
- swap_chain_desc.Width = 0; // use automatic sizing
- swap_chain_desc.Height = 0;
- swap_chain_desc.Format =
- DXGI_FORMAT_B8G8R8A8_UNORM; // this is the most common swapchain format
- swap_chain_desc.Stereo = false;
- swap_chain_desc.SampleDesc.Count = 1; // don't use multi-sampling
- swap_chain_desc.SampleDesc.Quality = 0;
- swap_chain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
- swap_chain_desc.BufferCount = 2; // use double buffering to enable flip
- swap_chain_desc.Scaling = DXGI_SCALING_NONE;
- swap_chain_desc.SwapEffect =
- DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; // all apps must use this SwapEffect
- swap_chain_desc.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED;
- swap_chain_desc.Flags = 0;
-
- // Get the final swap chain for this window from the DXGI factory.
- ThrowIfFailed(dxgi_factory->CreateSwapChainForHwnd(
- d3d11_device, window->GetWindowHandle(), &swap_chain_desc, nullptr,
- nullptr, &dxgi_swap_chain_));
-
- CreateTargetBitmap();
-}
-
-void WindowRenderTarget::ResizeBuffer(const int width, const int height) {
- // In order to resize buffer, we need to untarget the buffer first.
- d2d1_device_context_->SetTarget(nullptr);
- target_bitmap_ = nullptr;
- ThrowIfFailed(dxgi_swap_chain_->ResizeBuffers(0, width, height,
- DXGI_FORMAT_UNKNOWN, 0));
- CreateTargetBitmap();
-}
-
-void WindowRenderTarget::Present() {
- ThrowIfFailed(dxgi_swap_chain_->Present(1, 0));
-}
-
-void WindowRenderTarget::CreateTargetBitmap() {
- Expects(target_bitmap_ == nullptr); // target bitmap must not exist.
-
- // Direct2D needs the dxgi version of the backbuffer surface pointer.
- Microsoft::WRL::ComPtr<IDXGISurface> dxgi_back_buffer;
- ThrowIfFailed(
- dxgi_swap_chain_->GetBuffer(0, IID_PPV_ARGS(&dxgi_back_buffer)));
-
- auto dpi = window_->GetDpi();
-
- auto bitmap_properties = D2D1::BitmapProperties1(
- D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW,
- D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE),
- dpi, dpi);
-
- // Get a D2D surface from the DXGI back buffer to use as the D2D render
- // target.
- ThrowIfFailed(d2d1_device_context_->CreateBitmapFromDxgiSurface(
- dxgi_back_buffer.Get(), &bitmap_properties, &target_bitmap_));
-
- d2d1_device_context_->SetTarget(target_bitmap_.Get());
-}
-} // namespace cru::platform::native::win