diff options
-rw-r--r-- | include/cru/osx/graphics/quartz/Geometry.h | 11 | ||||
-rw-r--r-- | include/cru/platform/graphics/Geometry.h | 39 | ||||
-rw-r--r-- | src/osx/graphics/quartz/Geometry.cpp | 27 | ||||
-rw-r--r-- | src/ui/render/BorderRenderObject.cpp | 2 | ||||
-rw-r--r-- | src/ui/render/ScrollBar.cpp | 2 |
5 files changed, 72 insertions, 9 deletions
diff --git a/include/cru/osx/graphics/quartz/Geometry.h b/include/cru/osx/graphics/quartz/Geometry.h index 8e42491b..70db8ee2 100644 --- a/include/cru/osx/graphics/quartz/Geometry.h +++ b/include/cru/osx/graphics/quartz/Geometry.h @@ -34,11 +34,18 @@ class QuartzGeometryBuilder : public OsxQuartzResource, ~QuartzGeometryBuilder() override; - void BeginFigure(const Point &point) override; - void CloseFigure(bool close) override; + 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; diff --git a/include/cru/platform/graphics/Geometry.h b/include/cru/platform/graphics/Geometry.h index 732fc547..d1ebd186 100644 --- a/include/cru/platform/graphics/Geometry.h +++ b/include/cru/platform/graphics/Geometry.h @@ -9,10 +9,47 @@ struct CRU_PLATFORM_GRAPHICS_API IGeometry : virtual IGraphicsResource { // After called Build, calling every method will throw a struct CRU_PLATFORM_GRAPHICS_API IGeometryBuilder : virtual IGraphicsResource { - virtual void BeginFigure(const Point& point) = 0; + virtual Point GetCurrentPosition() = 0; + + virtual void MoveTo(const Point& point) = 0; + void RelativeMoveTo(const Point& offset) { + MoveTo(GetCurrentPosition() + offset); + } + virtual void LineTo(const Point& point) = 0; + void RelativeLineTo(const Point& offset) { + LineTo(GetCurrentPosition() + offset); + } + + virtual void CubicBezierTo(const Point& start_control_point, + const Point& end_control_point, + const Point& end_point) = 0; + void RelativeCubicBezierTo(const Point& start_control_offset, + const Point& end_control_offset, + const Point& end_offset) { + auto current_position = GetCurrentPosition(); + CubicBezierTo(current_position + start_control_offset, + current_position + end_control_offset, + current_position + end_offset); + } + virtual void QuadraticBezierTo(const Point& control_point, const Point& end_point) = 0; + void RelativeQuadraticBezierTo(const Point& control_offset, + const Point& end_offset) { + auto current_position = GetCurrentPosition(); + QuadraticBezierTo(current_position + control_offset, + current_position + end_offset); + } + + virtual void ArcTo(const Point& radius, float angle, bool is_large_arc, + bool is_clockwise, const Point& end_point) = 0; + void RelativeArcTo(const Point& radius, float angle, bool is_large_arc, + bool is_clockwise, const Point& end_offset) { + ArcTo(radius, angle, is_large_arc, is_clockwise, + GetCurrentPosition() + end_offset); + } + virtual void CloseFigure(bool close) = 0; virtual std::unique_ptr<IGeometry> Build() = 0; diff --git a/src/osx/graphics/quartz/Geometry.cpp b/src/osx/graphics/quartz/Geometry.cpp index 284f5c4d..37e4645b 100644 --- a/src/osx/graphics/quartz/Geometry.cpp +++ b/src/osx/graphics/quartz/Geometry.cpp @@ -1,4 +1,5 @@ #include "cru/osx/graphics/quartz/Geometry.h" +#include "cru/osx/graphics/quartz/Convert.h" #include <memory> @@ -23,24 +24,42 @@ QuartzGeometryBuilder::~QuartzGeometryBuilder() { CGPathRelease(cg_mutable_path_); } -void QuartzGeometryBuilder::BeginFigure(const Point &point) { - CGPathMoveToPoint(cg_mutable_path_, nullptr, point.x, point.y); +Point QuartzGeometryBuilder::GetCurrentPosition() { + return Convert(CGPathGetCurrentPoint(cg_mutable_path_)); } -void QuartzGeometryBuilder::CloseFigure(bool close) { - if (close) CGPathCloseSubpath(cg_mutable_path_); +void QuartzGeometryBuilder::MoveTo(const Point &point) { + CGPathMoveToPoint(cg_mutable_path_, nullptr, point.x, point.y); } void QuartzGeometryBuilder::LineTo(const Point &point) { CGPathAddLineToPoint(cg_mutable_path_, nullptr, point.x, point.y); } +void QuartzGeometryBuilder::CubicBezierTo(const Point &start_control_point, + const Point &end_control_point, + const Point &end_point) { + CGPathAddCurveToPoint(cg_mutable_path_, nullptr, start_control_point.x, + start_control_point.y, end_control_point.x, + end_control_point.y, end_point.x, end_point.y); +} + void QuartzGeometryBuilder::QuadraticBezierTo(const Point &control_point, const Point &end_point) { CGPathAddQuadCurveToPoint(cg_mutable_path_, nullptr, control_point.x, control_point.y, end_point.x, end_point.y); } +void QuartzGeometryBuilder::ArcTo(const Point &radius, float angle, + bool is_large_arc, bool is_clockwise, + const Point &end_point) { + // TODO: Implement this! +} + +void QuartzGeometryBuilder::CloseFigure(bool close) { + if (close) CGPathCloseSubpath(cg_mutable_path_); +} + std::unique_ptr<IGeometry> QuartzGeometryBuilder::Build() { return std::make_unique<QuartzGeometry>(GetGraphicsFactory(), CGPathCreateCopy(cg_mutable_path_)); diff --git a/src/ui/render/BorderRenderObject.cpp b/src/ui/render/BorderRenderObject.cpp index abba47e9..40ab506a 100644 --- a/src/ui/render/BorderRenderObject.cpp +++ b/src/ui/render/BorderRenderObject.cpp @@ -184,7 +184,7 @@ void BorderRenderObject::RecreateGeometry() { auto f = [](platform::graphics::IGeometryBuilder* builder, const Rect& rect, const CornerRadius& corner) { - builder->BeginFigure(Point(rect.left + corner.left_top.x, rect.top)); + builder->MoveTo(Point(rect.left + corner.left_top.x, rect.top)); builder->LineTo(Point(rect.GetRight() - corner.right_top.x, rect.top)); builder->QuadraticBezierTo( Point(rect.GetRight(), rect.top), diff --git a/src/ui/render/ScrollBar.cpp b/src/ui/render/ScrollBar.cpp index 695caa03..710ca832 100644 --- a/src/ui/render/ScrollBar.cpp +++ b/src/ui/render/ScrollBar.cpp @@ -77,7 +77,7 @@ String GenerateScrollBarThemeColorKey(ScrollBarBrushUsageKind usage, namespace { std::unique_ptr<platform::graphics::IGeometry> CreateScrollBarArrowGeometry() { auto geometry_builder = GetGraphicsFactory()->CreateGeometryBuilder(); - geometry_builder->BeginFigure({-kScrollBarArrowHeight / 2, 0}); + geometry_builder->MoveTo({-kScrollBarArrowHeight / 2, 0}); geometry_builder->LineTo({kScrollBarArrowHeight / 2, kScrollBarArrowHeight}); geometry_builder->LineTo({kScrollBarArrowHeight / 2, -kScrollBarArrowHeight}); geometry_builder->CloseFigure(true); |