diff options
author | crupest <crupest@outlook.com> | 2021-08-31 00:54:12 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2021-08-31 00:54:12 +0800 |
commit | 312bfa625dd02b59ceb5d1a9f9e5c5189446781b (patch) | |
tree | f10e7c00f98d9f4cdd77941642e9a362f17e360c | |
parent | 45ecfd5699e4949952cc71178521d1a238736ac6 (diff) | |
download | cru-312bfa625dd02b59ceb5d1a9f9e5c5189446781b.tar.gz cru-312bfa625dd02b59ceb5d1a9f9e5c5189446781b.tar.bz2 cru-312bfa625dd02b59ceb5d1a9f9e5c5189446781b.zip |
...
-rw-r--r-- | include/cru/osx/graphics/quartz/Geometry.hpp | 61 | ||||
-rw-r--r-- | src/osx/graphics/quartz/Geometry.cpp | 68 |
2 files changed, 42 insertions, 87 deletions
diff --git a/include/cru/osx/graphics/quartz/Geometry.hpp b/include/cru/osx/graphics/quartz/Geometry.hpp index 33a2d8a8..0c8f840f 100644 --- a/include/cru/osx/graphics/quartz/Geometry.hpp +++ b/include/cru/osx/graphics/quartz/Geometry.hpp @@ -9,8 +9,7 @@ namespace cru::platform::graphics::osx::quartz { class QuartzGeometry : public OsxQuartzResource, public virtual IGeometry { public: - QuartzGeometry(IGraphFactory *graphics_factory, CGContextRef cg_context, - CGPathRef cg_path); + QuartzGeometry(IGraphFactory *graphics_factory, CGPathRef cg_path); CRU_DELETE_COPY(QuartzGeometry) CRU_DELETE_MOVE(QuartzGeometry) @@ -22,72 +21,28 @@ class QuartzGeometry : public OsxQuartzResource, public virtual IGeometry { bool FillContains(const Point &point) override; private: - CGContextRef cg_context_; CGPathRef cg_path_; }; -namespace details { -struct GeometryBeginFigureAction : Object { - explicit GeometryBeginFigureAction(Point point) : point(point) {} - - Point point; -}; - -struct GeometryCloseFigureAction : Object { - explicit GeometryCloseFigureAction(bool close) : close(close) {} - - bool close; -}; - -struct GeometryLineToAction : Object { - explicit GeometryLineToAction(Point point) : point(point) {} - - Point point; -}; - -struct GeometryQuadraticBezierToAction : Object { - GeometryQuadraticBezierToAction(Point control_point, Point end_point) - : control_point(control_point), end_point(end_point) {} - - Point control_point; - Point end_point; -}; -} // namespace details - class QuartzGeometryBuilder : public OsxQuartzResource, public virtual IGeometryBuilder { public: - explicit QuartzGeometryBuilder(IGraphFactory *graphics_factory, - CGContextRef cg_context); + explicit QuartzGeometryBuilder(IGraphFactory *graphics_factory); CRU_DELETE_COPY(QuartzGeometryBuilder) CRU_DELETE_MOVE(QuartzGeometryBuilder) - ~QuartzGeometryBuilder() override = default; + ~QuartzGeometryBuilder() override; - void BeginFigure(const Point &point) override { - actions_.push_back( - std::make_unique<details::GeometryBeginFigureAction>(point)); - } - void CloseFigure(bool close) override { - actions_.push_back( - std::make_unique<details::GeometryCloseFigureAction>(close)); - } - void LineTo(const Point &point) override { - actions_.push_back(std::make_unique<details::GeometryLineToAction>(point)); - } + void BeginFigure(const Point &point) override; + void CloseFigure(bool close) override; + void LineTo(const Point &point) override; void QuadraticBezierTo(const Point &control_point, - const Point &end_point) override { - actions_.push_back( - std::make_unique<details::GeometryQuadraticBezierToAction>( - control_point, end_point)); - } + const Point &end_point) override; std::unique_ptr<IGeometry> Build() override; private: - CGContextRef cg_context_; - - std::vector<std::unique_ptr<Object>> actions_; + CGMutablePathRef cg_mutable_path_; }; } // namespace cru::platform::graphics::osx::quartz diff --git a/src/osx/graphics/quartz/Geometry.cpp b/src/osx/graphics/quartz/Geometry.cpp index 428b24ab..79e6fbb1 100644 --- a/src/osx/graphics/quartz/Geometry.cpp +++ b/src/osx/graphics/quartz/Geometry.cpp @@ -3,46 +3,46 @@ #include <memory> namespace cru::platform::graphics::osx::quartz { -QuartzGeometry::QuartzGeometry(IGraphFactory* graphics_factory, - CGContextRef cg_context, CGPathRef cg_path) - : OsxQuartzResource(graphics_factory), - cg_context_(cg_context), - cg_path_(cg_path) {} +QuartzGeometry::QuartzGeometry(IGraphFactory *graphics_factory, + CGPathRef cg_path) + : OsxQuartzResource(graphics_factory), cg_path_(cg_path) {} QuartzGeometry::~QuartzGeometry() { CGPathRelease(cg_path_); } -bool QuartzGeometry::FillContains(const Point& point) { - CGContextBeginPath(cg_context_); - CGContextAddPath(cg_context_, cg_path_); - return CGContextPathContainsPoint(cg_context_, CGPoint{point.x, point.y}, - kCGPathFill); +bool QuartzGeometry::FillContains(const Point &point) { + return CGPathContainsPoint(cg_path_, nullptr, CGPoint{point.x, point.y}, + kCGPathFill); } -QuartzGeometryBuilder::QuartzGeometryBuilder(IGraphFactory* graphics_factory, - CGContextRef cg_context) - : OsxQuartzResource(graphics_factory), cg_context_(cg_context) {} +QuartzGeometryBuilder::QuartzGeometryBuilder(IGraphFactory *graphics_factory) + : OsxQuartzResource(graphics_factory) { + cg_mutable_path_ = CGPathCreateMutable(); +} + +QuartzGeometryBuilder::~QuartzGeometryBuilder() { + CGPathRelease(cg_mutable_path_); +} + +void QuartzGeometryBuilder::BeginFigure(const Point &point) { + CGPathMoveToPoint(cg_mutable_path_, nullptr, point.x, point.y); +} + +void QuartzGeometryBuilder::CloseFigure(bool close) { + if (close) CGPathCloseSubpath(cg_mutable_path_); +} + +void QuartzGeometryBuilder::LineTo(const Point &point) { + CGPathAddLineToPoint(cg_mutable_path_, nullptr, point.x, 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); +} std::unique_ptr<IGeometry> QuartzGeometryBuilder::Build() { - CGContextBeginPath(cg_context_); - - for (const auto& action : actions_) { - Object* o = action.get(); - - if (auto a = dynamic_cast<details::GeometryBeginFigureAction*>(o)) { - CGContextMoveToPoint(cg_context_, a->point.x, a->point.y); - } else if (auto a = dynamic_cast<details::GeometryCloseFigureAction*>(o)) { - if (a->close) CGContextClosePath(cg_context_); - } else if (auto a = dynamic_cast<details::GeometryLineToAction*>(o)) { - CGContextAddLineToPoint(cg_context_, a->point.x, a->point.y); - } else if (auto a = - dynamic_cast<details::GeometryQuadraticBezierToAction*>(o)) { - CGContextAddQuadCurveToPoint(cg_context_, a->control_point.x, - a->control_point.y, a->end_point.x, - a->end_point.y); - } - } - - return std::make_unique<QuartzGeometry>(GetGraphFactory(), cg_context_, - CGContextCopyPath(cg_context_)); + return std::make_unique<QuartzGeometry>(GetGraphFactory(), + CGPathCreateCopy(cg_mutable_path_)); } } // namespace cru::platform::graphics::osx::quartz |