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.cpp | 15 ++++++--- src/ui/render/render_object.hpp | 71 ++++++++++++++++++++++++++++++++++------- 2 files changed, 71 insertions(+), 15 deletions(-) diff --git a/src/ui/render/render_object.cpp b/src/ui/render/render_object.cpp index bfa250d6..0828fc9c 100644 --- a/src/ui/render/render_object.cpp +++ b/src/ui/render/render_object.cpp @@ -67,11 +67,18 @@ namespace cru::ui::render template class ShapeRenderObject; } - void RoundedRectangleStrokeRenderObject::Draw(ID2D1RenderTarget* render_target) + namespace details + { + template ShapeStrokeRenderObject; + template ShapeStrokeRenderObject; + template ShapeStrokeRenderObject; + } + + namespace details { - const auto brush = GetBrush(); - if (brush != nullptr) - render_target->DrawRoundedRectangle(Convert(GetShape()), GetBrush().Get(), GetStrokeWidth()); + template ShapeFillRenderObject; + template ShapeFillRenderObject; + template ShapeFillRenderObject; } void CustomDrawHandlerRenderObject::SetDrawHandler(DrawHandler new_draw_handler) 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