aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2020-10-28 20:36:47 +0800
committercrupest <crupest@outlook.com>2020-10-28 20:36:47 +0800
commitcf07d193b97168048a72793c59f096504acf78a5 (patch)
tree8d14f6eba4140265931efc877d6371e8cf5cbf96
parenta09a9645d3c823e3559659dc1ddd213510755820 (diff)
downloadcru-cf07d193b97168048a72793c59f096504acf78a5.tar.gz
cru-cf07d193b97168048a72793c59f096504acf78a5.tar.bz2
cru-cf07d193b97168048a72793c59f096504acf78a5.zip
...
-rw-r--r--include/cru/win/graph/direct/WindowPainter.hpp21
-rw-r--r--include/cru/win/graph/direct/WindowRenderTarget.hpp (renamed from include/cru/win/native/WindowRenderTarget.hpp)28
-rw-r--r--include/cru/win/native/Base.hpp1
-rw-r--r--include/cru/win/native/Window.hpp6
-rw-r--r--src/win/graph/direct/CMakeLists.txt4
-rw-r--r--src/win/graph/direct/WindowPainter.cpp20
-rw-r--r--src/win/graph/direct/WindowRenderTarget.cpp (renamed from src/win/native/WindowRenderTarget.cpp)38
-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
13 files changed, 94 insertions, 106 deletions
diff --git a/include/cru/win/graph/direct/WindowPainter.hpp b/include/cru/win/graph/direct/WindowPainter.hpp
new file mode 100644
index 00000000..53961586
--- /dev/null
+++ b/include/cru/win/graph/direct/WindowPainter.hpp
@@ -0,0 +1,21 @@
+#pragma once
+#include "Painter.hpp"
+#include "WindowRenderTarget.hpp"
+
+namespace cru::platform::graph::win::direct {
+class D2DWindowPainter : public graph::win::direct::D2DPainter {
+ public:
+ explicit D2DWindowPainter(D2DWindowRenderTarget* window);
+
+ CRU_DELETE_COPY(D2DWindowPainter)
+ CRU_DELETE_MOVE(D2DWindowPainter)
+
+ ~D2DWindowPainter() override;
+
+ protected:
+ void DoEndDraw() override;
+
+ private:
+ D2DWindowRenderTarget* render_target_;
+};
+} // namespace cru::platform::graph::win::direct
diff --git a/include/cru/win/native/WindowRenderTarget.hpp b/include/cru/win/graph/direct/WindowRenderTarget.hpp
index 786a90a6..c9ee098f 100644
--- a/include/cru/win/native/WindowRenderTarget.hpp
+++ b/include/cru/win/graph/direct/WindowRenderTarget.hpp
@@ -1,21 +1,16 @@
#pragma once
-#include "Base.hpp"
+#include "Factory.hpp"
namespace cru::platform::graph::win::direct {
-class DirectGraphFactory;
-}
-
-namespace cru::platform::native::win {
// Represents a window render target.
-class WindowRenderTarget : public Object {
+class D2DWindowRenderTarget : public Object {
public:
- WindowRenderTarget(graph::win::direct::DirectGraphFactory* factory,
- WinNativeWindow* window);
+ D2DWindowRenderTarget(gsl::not_null<DirectGraphFactory*> factory, HWND hwnd);
- CRU_DELETE_COPY(WindowRenderTarget)
- CRU_DELETE_MOVE(WindowRenderTarget)
+ CRU_DELETE_COPY(D2DWindowRenderTarget)
+ CRU_DELETE_MOVE(D2DWindowRenderTarget)
- ~WindowRenderTarget() override = default;
+ ~D2DWindowRenderTarget() override = default;
public:
graph::win::direct::DirectGraphFactory* GetDirectFactory() const {
@@ -26,12 +21,11 @@ class WindowRenderTarget : public Object {
return d2d1_device_context_.Get();
}
+ void SetDpi(float x, float y);
+
// Resize the underlying buffer.
void ResizeBuffer(int width, int height);
- // Set this render target as the d2d device context's target.
- void SetAsTarget();
-
// Present the data of the underlying buffer to the window.
void Present();
@@ -39,10 +33,10 @@ class WindowRenderTarget : public Object {
void CreateTargetBitmap();
private:
- WinNativeWindow* window_;
- graph::win::direct::DirectGraphFactory* factory_;
+ DirectGraphFactory* factory_;
+ HWND hwnd_;
Microsoft::WRL::ComPtr<ID2D1DeviceContext> d2d1_device_context_;
Microsoft::WRL::ComPtr<IDXGISwapChain1> dxgi_swap_chain_;
Microsoft::WRL::ComPtr<ID2D1Bitmap1> target_bitmap_;
};
-} // namespace cru::platform::native::win
+} // namespace cru::platform::graph::win::direct
diff --git a/include/cru/win/native/Base.hpp b/include/cru/win/native/Base.hpp
index a50c6dd1..7ddc6b54 100644
--- a/include/cru/win/native/Base.hpp
+++ b/include/cru/win/native/Base.hpp
@@ -10,7 +10,6 @@ class WinCursor;
class WinCursorManager;
class WindowClass;
class WindowManager;
-class WindowRenderTarget;
class WinNativeWindow;
class WinNativeWindowResolver;
class WinUiApplication;
diff --git a/include/cru/win/native/Window.hpp b/include/cru/win/native/Window.hpp
index 37df0768..ecc0dd04 100644
--- a/include/cru/win/native/Window.hpp
+++ b/include/cru/win/native/Window.hpp
@@ -4,6 +4,7 @@
#include "WindowNativeMessageEventArgs.hpp"
#include "cru/platform/GraphBase.hpp"
#include "cru/platform/native/Window.hpp"
+#include "cru/win/graph/direct/WindowRenderTarget.hpp"
#include <memory>
@@ -86,7 +87,7 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow {
bool HandleNativeWindowMessage(HWND hwnd, UINT msg, WPARAM w_param,
LPARAM l_param, LRESULT* result);
- WindowRenderTarget* GetWindowRenderTarget() const {
+ graph::win::direct::D2DWindowRenderTarget* GetWindowRenderTarget() const {
return window_render_target_.get();
}
@@ -157,7 +158,8 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow {
bool has_focus_ = false;
bool is_mouse_in_ = false;
- std::unique_ptr<WindowRenderTarget> window_render_target_;
+ std::unique_ptr<graph::win::direct::D2DWindowRenderTarget>
+ window_render_target_;
std::shared_ptr<WinCursor> cursor_;
diff --git a/src/win/graph/direct/CMakeLists.txt b/src/win/graph/direct/CMakeLists.txt
index 5505b0b5..070b7b51 100644
--- a/src/win/graph/direct/CMakeLists.txt
+++ b/src/win/graph/direct/CMakeLists.txt
@@ -8,6 +8,8 @@ add_library(cru_win_graph_direct STATIC
Painter.cpp
Resource.cpp
TextLayout.cpp
+ WindowPainter.cpp
+ WindowRenderTarget.cpp
)
target_sources(cru_win_graph_direct PUBLIC
${CRU_WIN_GRAPH_DIRECT_INCLUDE_DIR}/Brush.hpp
@@ -20,6 +22,8 @@ target_sources(cru_win_graph_direct PUBLIC
${CRU_WIN_GRAPH_DIRECT_INCLUDE_DIR}/Painter.hpp
${CRU_WIN_GRAPH_DIRECT_INCLUDE_DIR}/Resource.hpp
${CRU_WIN_GRAPH_DIRECT_INCLUDE_DIR}/TextLayout.hpp
+ ${CRU_WIN_GRAPH_DIRECT_INCLUDE_DIR}/WindowPainter.hpp
+ ${CRU_WIN_GRAPH_DIRECT_INCLUDE_DIR}/WindowRenderTarget.hpp
)
target_link_libraries(cru_win_graph_direct PUBLIC D3D11 D2d1 DWrite)
target_link_libraries(cru_win_graph_direct PUBLIC cru_win_base cru_platform_graph)
diff --git a/src/win/graph/direct/WindowPainter.cpp b/src/win/graph/direct/WindowPainter.cpp
new file mode 100644
index 00000000..74f7da7a
--- /dev/null
+++ b/src/win/graph/direct/WindowPainter.cpp
@@ -0,0 +1,20 @@
+#include "cru/win/graph/direct/WindowPainter.hpp"
+
+#include "cru/win/graph/direct/Exception.hpp"
+#include "cru/win/graph/direct/Factory.hpp"
+#include "cru/win/graph/direct/WindowRenderTarget.hpp"
+
+namespace cru::platform::graph::win::direct {
+D2DWindowPainter::D2DWindowPainter(D2DWindowRenderTarget* render_target)
+ : D2DPainter(render_target->GetD2D1DeviceContext()),
+ render_target_(render_target) {
+ render_target_->GetD2D1DeviceContext()->BeginDraw();
+}
+
+D2DWindowPainter::~D2DWindowPainter() { EndDraw(); }
+
+void D2DWindowPainter::DoEndDraw() {
+ ThrowIfFailed(render_target_->GetD2D1DeviceContext()->EndDraw());
+ render_target_->Present();
+}
+} // namespace cru::platform::graph::win::direct
diff --git a/src/win/native/WindowRenderTarget.cpp b/src/win/graph/direct/WindowRenderTarget.cpp
index b1f867b0..d26fccf6 100644
--- a/src/win/native/WindowRenderTarget.cpp
+++ b/src/win/graph/direct/WindowRenderTarget.cpp
@@ -1,24 +1,17 @@
-#include "cru/win/native/WindowRenderTarget.hpp"
+#include "cru/win/graph/direct/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);
+namespace cru::platform::graph::win::direct {
+D2DWindowRenderTarget::D2DWindowRenderTarget(
+ gsl::not_null<DirectGraphFactory*> factory, HWND hwnd)
+ : factory_(factory), hwnd_(hwnd) {
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;
@@ -39,13 +32,17 @@ WindowRenderTarget::WindowRenderTarget(DirectGraphFactory* factory,
// 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_));
+ d3d11_device, hwnd, &swap_chain_desc, nullptr, nullptr,
+ &dxgi_swap_chain_));
CreateTargetBitmap();
}
-void WindowRenderTarget::ResizeBuffer(const int width, const int height) {
+void D2DWindowRenderTarget::SetDpi(float x, float y) {
+ d2d1_device_context_->SetDpi(x, y);
+}
+
+void D2DWindowRenderTarget::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;
@@ -54,11 +51,11 @@ void WindowRenderTarget::ResizeBuffer(const int width, const int height) {
CreateTargetBitmap();
}
-void WindowRenderTarget::Present() {
+void D2DWindowRenderTarget::Present() {
ThrowIfFailed(dxgi_swap_chain_->Present(1, 0));
}
-void WindowRenderTarget::CreateTargetBitmap() {
+void D2DWindowRenderTarget::CreateTargetBitmap() {
Expects(target_bitmap_ == nullptr); // target bitmap must not exist.
// Direct2D needs the dxgi version of the backbuffer surface pointer.
@@ -66,12 +63,13 @@ void WindowRenderTarget::CreateTargetBitmap() {
ThrowIfFailed(
dxgi_swap_chain_->GetBuffer(0, IID_PPV_ARGS(&dxgi_back_buffer)));
- auto dpi = window_->GetDpi();
+ float dpi_x, dpi_y;
+ d2d1_device_context_->GetDpi(&dpi_x, &dpi_y);
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);
+ dpi_x, dpi_y);
// Get a D2D surface from the DXGI back buffer to use as the D2D render
// target.
@@ -80,4 +78,4 @@ void WindowRenderTarget::CreateTargetBitmap() {
d2d1_device_context_->SetTarget(target_bitmap_.Get());
}
-} // namespace cru::platform::native::win
+} // namespace cru::platform::graph::win::direct
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