aboutsummaryrefslogtreecommitdiff
path: root/include/cru/platform/graphics/direct2d/Geometry.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/cru/platform/graphics/direct2d/Geometry.h')
-rw-r--r--include/cru/platform/graphics/direct2d/Geometry.h71
1 files changed, 71 insertions, 0 deletions
diff --git a/include/cru/platform/graphics/direct2d/Geometry.h b/include/cru/platform/graphics/direct2d/Geometry.h
new file mode 100644
index 00000000..64dbae84
--- /dev/null
+++ b/include/cru/platform/graphics/direct2d/Geometry.h
@@ -0,0 +1,71 @@
+#pragma once
+#include "ComResource.h"
+#include "Resource.h"
+
+#include "cru/platform/graphics/Geometry.h"
+
+namespace cru::platform::graphics::direct2d {
+class CRU_WIN_GRAPHICS_DIRECT_API D2DGeometryBuilder
+ : public DirectGraphicsResource,
+ public virtual IGeometryBuilder {
+ public:
+ explicit D2DGeometryBuilder(DirectGraphicsFactory* factory);
+
+ CRU_DELETE_COPY(D2DGeometryBuilder)
+ CRU_DELETE_MOVE(D2DGeometryBuilder)
+
+ ~D2DGeometryBuilder() override = default;
+
+ public:
+ Point GetCurrentPosition() override;
+
+ void MoveTo(const Point& point) override;
+ void LineTo(const Point& point) override;
+ void CubicBezierTo(const Point& start_control_point,
+ const Point& end_control_point,
+ const Point& end_point) override;
+ void QuadraticBezierTo(const Point& control_point,
+ const Point& end_point) override;
+ void ArcTo(const Point& radius, float angle, bool is_large_arc,
+ bool is_clockwise, const Point& end_point) override;
+ void CloseFigure(bool close) override;
+
+ std::unique_ptr<IGeometry> Build() override;
+
+ private:
+ bool IsValid() { return geometry_ != nullptr; }
+ void CheckValidation();
+
+ private:
+ Microsoft::WRL::ComPtr<ID2D1PathGeometry> geometry_;
+ Microsoft::WRL::ComPtr<ID2D1GeometrySink> geometry_sink_;
+ Point start_point_;
+ Point current_position_;
+};
+
+class CRU_WIN_GRAPHICS_DIRECT_API D2DGeometry
+ : public DirectGraphicsResource,
+ public virtual IGeometry,
+ public IComResource<ID2D1Geometry> {
+ public:
+ D2DGeometry(DirectGraphicsFactory* factory,
+ Microsoft::WRL::ComPtr<ID2D1Geometry> geometry);
+
+ CRU_DELETE_COPY(D2DGeometry)
+ CRU_DELETE_MOVE(D2DGeometry)
+
+ ~D2DGeometry() override = default;
+
+ public:
+ ID2D1Geometry* GetComInterface() const override { return geometry_.Get(); }
+
+ public:
+ bool FillContains(const Point& point) override;
+ Rect GetBounds() override;
+ std::unique_ptr<IGeometry> Transform(const Matrix& matrix) override;
+ std::unique_ptr<IGeometry> CreateStrokeGeometry(float width) override;
+
+ private:
+ Microsoft::WRL::ComPtr<ID2D1Geometry> geometry_;
+};
+} // namespace cru::platform::graphics::direct2d