diff options
Diffstat (limited to 'src/platform_win/win_painter.cpp')
-rw-r--r-- | src/platform_win/win_painter.cpp | 56 |
1 files changed, 56 insertions, 0 deletions
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 |