aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-02-27 20:26:17 +0800
committercrupest <crupest@outlook.com>2022-02-27 20:26:17 +0800
commitc0817f5494e6a08c0db9e22a7195daedd1a6b4c3 (patch)
treefe353c2369643c58fd93dca22c6bd4cdf556e75d
parentafcf935a739c60d9141e2d53fb62e30ff4fc1f80 (diff)
downloadcru-c0817f5494e6a08c0db9e22a7195daedd1a6b4c3.tar.gz
cru-c0817f5494e6a08c0db9e22a7195daedd1a6b4c3.tar.bz2
cru-c0817f5494e6a08c0db9e22a7195daedd1a6b4c3.zip
...
-rw-r--r--include/cru/osx/graphics/quartz/Geometry.h11
-rw-r--r--include/cru/platform/graphics/Geometry.h39
-rw-r--r--src/osx/graphics/quartz/Geometry.cpp27
-rw-r--r--src/ui/render/BorderRenderObject.cpp2
-rw-r--r--src/ui/render/ScrollBar.cpp2
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);