aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2018-12-12 01:02:10 +0800
committercrupest <crupest@outlook.com>2018-12-12 01:02:10 +0800
commit4683f1565b7fdb2e5f9367d5cd365a00cc3a7e1d (patch)
tree945618f88024226219701f924ff010d2210800a8 /src
parentedbdf3d2a166099f5af4dd859258468288919685 (diff)
downloadcru-4683f1565b7fdb2e5f9367d5cd365a00cc3a7e1d.tar.gz
cru-4683f1565b7fdb2e5f9367d5cd365a00cc3a7e1d.tar.bz2
cru-4683f1565b7fdb2e5f9367d5cd365a00cc3a7e1d.zip
...
Diffstat (limited to 'src')
-rw-r--r--src/ui/render/render_object.cpp15
-rw-r--r--src/ui/render/render_object.hpp71
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<Ellipse>;
}
- void RoundedRectangleStrokeRenderObject::Draw(ID2D1RenderTarget* render_target)
+ namespace details
+ {
+ template ShapeStrokeRenderObject<Rect, D2D1_RECT_F, &ID2D1RenderTarget::DrawRectangle>;
+ template ShapeStrokeRenderObject<RoundedRect, D2D1_ROUNDED_RECT, &ID2D1RenderTarget::DrawRoundedRectangle>;
+ template ShapeStrokeRenderObject<Ellipse, D2D1_ELLIPSE, &ID2D1RenderTarget::DrawEllipse>;
+ }
+
+ namespace details
{
- const auto brush = GetBrush();
- if (brush != nullptr)
- render_target->DrawRoundedRectangle(Convert(GetShape()), GetBrush().Get(), GetStrokeWidth());
+ template ShapeFillRenderObject<Rect, D2D1_RECT_F, &ID2D1RenderTarget::FillRectangle>;
+ template ShapeFillRenderObject<RoundedRect, D2D1_ROUNDED_RECT, &ID2D1RenderTarget::FillRoundedRectangle>;
+ template ShapeFillRenderObject<Ellipse, D2D1_ELLIPSE, &ID2D1RenderTarget::FillEllipse>;
}
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<Ellipse>;
- 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<typename TShapeType, typename TD2D1ShapeType, void (ID2D1RenderTarget::*draw_function)(const TD2D1ShapeType&, ID2D1Brush*, float, ID2D1StrokeStyle*)>
+ class ShapeStrokeRenderObject : public ShapeRenderObject<TShapeType>, 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<Rect, D2D1_RECT_F, &ID2D1RenderTarget::DrawRectangle>;
+ extern template ShapeStrokeRenderObject<RoundedRect, D2D1_ROUNDED_RECT, &ID2D1RenderTarget::DrawRoundedRectangle>;
+ extern template ShapeStrokeRenderObject<Ellipse, D2D1_ELLIPSE, &ID2D1RenderTarget::DrawEllipse>;
+ }
+
+ using RectangleStrokeRenderObject = details::ShapeStrokeRenderObject<Rect, D2D1_RECT_F, &ID2D1RenderTarget::DrawRectangle>;
+ using RoundedRectangleStrokeRenderObject = details::ShapeStrokeRenderObject<RoundedRect, D2D1_ROUNDED_RECT, &ID2D1RenderTarget::DrawRoundedRectangle>;
+ using EllipseStrokeRenderObject = details::ShapeStrokeRenderObject<Ellipse, D2D1_ELLIPSE, &ID2D1RenderTarget::DrawEllipse>;
+
+
+ namespace details
+ {
+ template<typename TShapeType, typename TD2D1ShapeType, void (ID2D1RenderTarget::*fill_function)(const TD2D1ShapeType&, ID2D1Brush*)>
+ class ShapeFillRenderObject : public ShapeRenderObject<TShapeType>, 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<Rect, D2D1_RECT_F, &ID2D1RenderTarget::FillRectangle>;
+ extern template ShapeFillRenderObject<RoundedRect, D2D1_ROUNDED_RECT, &ID2D1RenderTarget::FillRoundedRectangle>;
+ extern template ShapeFillRenderObject<Ellipse, D2D1_ELLIPSE, &ID2D1RenderTarget::FillEllipse>;
+ }
+
+ using RectangleFillRenderObject = details::ShapeFillRenderObject<Rect, D2D1_RECT_F, &ID2D1RenderTarget::FillRectangle>;
+ using RoundedRectangleFillRenderObject = details::ShapeFillRenderObject<RoundedRect, D2D1_ROUNDED_RECT, &ID2D1RenderTarget::FillRoundedRectangle>;
+ using EllipseFillRenderObject = details::ShapeFillRenderObject<Ellipse, D2D1_ELLIPSE, &ID2D1RenderTarget::FillEllipse>;
class CustomDrawHandlerRenderObject : public RenderObject