aboutsummaryrefslogtreecommitdiff
path: root/src/win/graph/direct/geometry.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/win/graph/direct/geometry.cpp')
-rw-r--r--src/win/graph/direct/geometry.cpp65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/win/graph/direct/geometry.cpp b/src/win/graph/direct/geometry.cpp
new file mode 100644
index 00000000..a725eff6
--- /dev/null
+++ b/src/win/graph/direct/geometry.cpp
@@ -0,0 +1,65 @@
+#include "cru/win/graph/win_geometry.hpp"
+
+#include "cru/win/exception.hpp"
+#include "cru/win/graph/util/convert_util.hpp"
+#include "cru/win/graph/win_native_factory.hpp"
+
+#include <cassert>
+
+namespace cru::win::graph {
+WinGeometryBuilder::WinGeometryBuilder(IWinNativeFactory* factory) {
+ assert(factory);
+ ThrowIfFailed(factory->GetD2D1Factory()->CreatePathGeometry(&geometry_));
+ ThrowIfFailed(geometry_->Open(&geometry_sink_));
+}
+
+WinGeometryBuilder::~WinGeometryBuilder() {
+ if (geometry_sink_) {
+ ThrowIfFailed(geometry_sink_->Close());
+ }
+}
+
+void WinGeometryBuilder::BeginFigure(const ui::Point& point) {
+ assert(IsEnded());
+ geometry_sink_->BeginFigure(util::Convert(point), D2D1_FIGURE_BEGIN_FILLED);
+}
+
+void WinGeometryBuilder::LineTo(const ui::Point& point) {
+ assert(IsEnded());
+ geometry_sink_->AddLine(util::Convert(point));
+}
+
+void WinGeometryBuilder::QuadraticBezierTo(const ui::Point& control_point,
+ const ui::Point& end_point) {
+ assert(IsEnded());
+ geometry_sink_->AddQuadraticBezier(D2D1::QuadraticBezierSegment(
+ util::Convert(control_point), util::Convert(end_point)));
+}
+
+void WinGeometryBuilder::CloseFigure(bool close) {
+ assert(IsEnded());
+ geometry_sink_->EndFigure(close ? D2D1_FIGURE_END_CLOSED
+ : D2D1_FIGURE_END_OPEN);
+}
+
+platform::graph::IGeometry* WinGeometryBuilder::End() {
+ assert(IsEnded());
+ ThrowIfFailed(geometry_sink_->Close());
+ geometry_sink_ = nullptr;
+ const auto geometry = new WinGeometry(std::move(geometry_));
+ geometry_ = nullptr;
+ return geometry;
+}
+
+WinGeometry::WinGeometry(Microsoft::WRL::ComPtr<ID2D1PathGeometry> geometry) {
+ assert(geometry);
+ geometry_ = std::move(geometry);
+}
+
+bool WinGeometry::FillContains(const ui::Point& point) {
+ BOOL result;
+ ThrowIfFailed(geometry_->FillContainsPoint(
+ util::Convert(point), D2D1::Matrix3x2F::Identity(), &result));
+ return result != 0;
+}
+} // namespace cru::win::graph