diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/platform_win/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/platform_win/win_native_window.cpp | 3 | ||||
-rw-r--r-- | src/platform_win/win_painter.cpp | 56 |
3 files changed, 60 insertions, 0 deletions
diff --git a/src/platform_win/CMakeLists.txt b/src/platform_win/CMakeLists.txt index 40c9d85a..c8a5840e 100644 --- a/src/platform_win/CMakeLists.txt +++ b/src/platform_win/CMakeLists.txt @@ -9,6 +9,7 @@ add_library(cru_platform_win STATIC win_geometry.cpp win_graph_factory.cpp win_native_window.cpp + win_painter.cpp window_class.cpp window_manager.cpp window_render_target.cpp) diff --git a/src/platform_win/win_native_window.cpp b/src/platform_win/win_native_window.cpp index 5c159290..ae740205 100644 --- a/src/platform_win/win_native_window.cpp +++ b/src/platform_win/win_native_window.cpp @@ -2,6 +2,7 @@ #include "cru/platform/win/exception.hpp" #include "cru/platform/win/win_application.hpp" +#include "cru/platform/win/win_painter.hpp" #include "cru/platform/win/window_class.hpp" #include "dpi_util.hpp" #include "window_manager.hpp" @@ -111,6 +112,8 @@ void WinNativeWindow::SetWindowRect(const ui::Rect& rect) { } } +Painter* WinNativeWindow::BeginPaint() { return new WinPainter(this); } + bool WinNativeWindow::HandleNativeWindowMessage(HWND hwnd, UINT msg, WPARAM w_param, LPARAM l_param, LRESULT* result) { diff --git a/src/platform_win/win_painter.cpp b/src/platform_win/win_painter.cpp new file mode 100644 index 00000000..29777669 --- /dev/null +++ b/src/platform_win/win_painter.cpp @@ -0,0 +1,56 @@ +#include "cru/platform/win/win_painter.hpp" + +#include "cru/platform/win/exception.hpp" +#include "cru/platform/win/graph_manager.hpp" +#include "cru/platform/win/win_brush.hpp" +#include "cru/platform/win/win_geometry.hpp" +#include "cru/platform/win/win_native_window.hpp" +#include "cru/platform/win/window_render_target.hpp" + +#include <cassert> + +namespace cru::platform::win { +WinPainter::WinPainter(WinNativeWindow* window) { + assert(window); + window_ = window; + const auto window_render_target = window_->GetWindowRenderTarget(); + render_target_ = + window_render_target->GetGraphManager()->GetD2D1DeviceContext(); + window_render_target->SetAsTarget(); + render_target_->BeginDraw(); +} + +WinPainter::~WinPainter() { + if (!IsDisposed()) { + ThrowIfFailed(render_target_->EndDraw()); + } +} + +void WinPainter::StrokeGeometry(Geometry* geometry, Brush* brush, float width) { + assert(!IsDisposed()); + const auto g = dynamic_cast<WinGeometry*>(geometry); + assert(g); + const auto b = dynamic_cast<WinBrush*>(brush); + assert(b); + + render_target_->DrawGeometry(g->GetNative(), b->GetD2DBrush(), width); +} + +void WinPainter::FillGeometry(Geometry* geometry, Brush* brush) { + assert(!IsDisposed()); + const auto g = dynamic_cast<WinGeometry*>(geometry); + assert(g); + const auto b = dynamic_cast<WinBrush*>(brush); + assert(b); + + render_target_->FillGeometry(g->GetNative(), b->GetD2DBrush()); +} + +void WinPainter::EndDraw() { + if (!IsDisposed()) { + ThrowIfFailed(render_target_->EndDraw()); + render_target_ = nullptr; + is_disposed = true; + } +} +} // namespace cru::platform::win |