From 4683f1565b7fdb2e5f9367d5cd365a00cc3a7e1d Mon Sep 17 00:00:00 2001 From: crupest Date: Wed, 12 Dec 2018 01:02:10 +0800 Subject: ... --- src/ui/render/render_object.hpp | 71 ++++++++++++++++++++++++++++++++++------- 1 file changed, 60 insertions(+), 11 deletions(-) (limited to 'src/ui/render/render_object.hpp') diff --git a/src/ui/render/render_object.hpp b/src/ui/render/render_object.hpp index 0fbeb8c7..31745be5 100644 --- a/src/ui/render/render_object.hpp +++ b/src/ui/render/render_object.hpp @@ -165,19 +165,68 @@ namespace cru::ui::render using EllipseRenderObject = details::ShapeRenderObject; - class RoundedRectangleStrokeRenderObject final : public StrokeRenderObject, public RoundedRectangleRenderObject + namespace details { - public: - RoundedRectangleStrokeRenderObject() = default; - RoundedRectangleStrokeRenderObject(const RoundedRectangleStrokeRenderObject& other) = delete; - RoundedRectangleStrokeRenderObject(RoundedRectangleStrokeRenderObject&& other) = delete; - RoundedRectangleStrokeRenderObject& operator=(const RoundedRectangleStrokeRenderObject& other) = delete; - RoundedRectangleStrokeRenderObject& operator=(RoundedRectangleStrokeRenderObject&& other) = delete; - ~RoundedRectangleStrokeRenderObject() override = default; + template + class ShapeStrokeRenderObject : public ShapeRenderObject, public StrokeRenderObject + { + public: + ShapeStrokeRenderObject() = default; + ShapeStrokeRenderObject(const ShapeStrokeRenderObject& other) = delete; + ShapeStrokeRenderObject& operator=(const ShapeStrokeRenderObject& other) = delete; + ShapeStrokeRenderObject(ShapeStrokeRenderObject&& other) = delete; + ShapeStrokeRenderObject& operator=(ShapeStrokeRenderObject&& other) = delete; + ~ShapeStrokeRenderObject() = default; - protected: - void Draw(ID2D1RenderTarget* render_target) override; - }; + protected: + void Draw(ID2D1RenderTarget* render_target) override + { + const auto brush = GetBrush(); + if (brush != nullptr) + (render_target->*draw_function)(Convert(GetShape()), brush.Get(), GetStrokeWidth(), GetStrokeStyle().Get()); + } + }; + + extern template ShapeStrokeRenderObject; + extern template ShapeStrokeRenderObject; + extern template ShapeStrokeRenderObject; + } + + using RectangleStrokeRenderObject = details::ShapeStrokeRenderObject; + using RoundedRectangleStrokeRenderObject = details::ShapeStrokeRenderObject; + using EllipseStrokeRenderObject = details::ShapeStrokeRenderObject; + + + namespace details + { + template + class ShapeFillRenderObject : public ShapeRenderObject, public StrokeRenderObject + { + public: + ShapeFillRenderObject() = default; + ShapeFillRenderObject(const ShapeFillRenderObject& other) = delete; + ShapeFillRenderObject& operator=(const ShapeFillRenderObject& other) = delete; + ShapeFillRenderObject(ShapeFillRenderObject&& other) = delete; + ShapeFillRenderObject& operator=(ShapeFillRenderObject&& other) = delete; + ~ShapeFillRenderObject() = default; + + protected: + void Draw(ID2D1RenderTarget* render_target) override + { + const auto brush = GetBrush(); + if (brush != nullptr) + (render_target->*fill_function)(Convert(GetShape()), brush.Get()); + } + }; + + extern template ShapeFillRenderObject; + extern template ShapeFillRenderObject; + extern template ShapeFillRenderObject; + } + + using RectangleFillRenderObject = details::ShapeFillRenderObject; + using RoundedRectangleFillRenderObject = details::ShapeFillRenderObject; + using EllipseFillRenderObject = details::ShapeFillRenderObject; class CustomDrawHandlerRenderObject : public RenderObject -- cgit v1.2.3