aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/platform_win/CMakeLists.txt1
-rw-r--r--src/platform_win/win_native_window.cpp3
-rw-r--r--src/platform_win/win_painter.cpp56
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