aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/cru/osx/graphics/quartz/Geometry.hpp61
-rw-r--r--src/osx/graphics/quartz/Geometry.cpp68
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