aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/cru/osx/graphics/quartz/Geometry.h4
-rw-r--r--include/cru/platform/graphics/Geometry.h3
-rw-r--r--src/osx/graphics/quartz/Geometry.cpp18
3 files changed, 25 insertions, 0 deletions
diff --git a/include/cru/osx/graphics/quartz/Geometry.h b/include/cru/osx/graphics/quartz/Geometry.h
index a6ee7470..e0bdd5b6 100644
--- a/include/cru/osx/graphics/quartz/Geometry.h
+++ b/include/cru/osx/graphics/quartz/Geometry.h
@@ -19,6 +19,10 @@ class QuartzGeometry : public OsxQuartzResource, public virtual IGeometry {
CGPathRef GetCGPath() const { return cg_path_; }
bool FillContains(const Point &point) override;
+ Rect GetBounds() override;
+
+ std::unique_ptr<IGeometry> Transform(const Matrix &matrix) override;
+ std::unique_ptr<IGeometry> CreateStrokeGeometry(float width) override;
private:
CGPathRef cg_path_;
diff --git a/include/cru/platform/graphics/Geometry.h b/include/cru/platform/graphics/Geometry.h
index a4146008..1c2bd1f7 100644
--- a/include/cru/platform/graphics/Geometry.h
+++ b/include/cru/platform/graphics/Geometry.h
@@ -4,6 +4,9 @@
namespace cru::platform::graphics {
struct CRU_PLATFORM_GRAPHICS_API IGeometry : virtual IGraphicsResource {
virtual bool FillContains(const Point& point) = 0;
+ virtual Rect GetBounds() = 0;
+ virtual std::unique_ptr<IGeometry> Transform(const Matrix& matrix) = 0;
+ virtual std::unique_ptr<IGeometry> CreateStrokeGeometry(float width) = 0;
};
struct CRU_PLATFORM_GRAPHICS_API IGeometryBuilder : virtual IGraphicsResource {
diff --git a/src/osx/graphics/quartz/Geometry.cpp b/src/osx/graphics/quartz/Geometry.cpp
index 87ddff3e..c88add87 100644
--- a/src/osx/graphics/quartz/Geometry.cpp
+++ b/src/osx/graphics/quartz/Geometry.cpp
@@ -15,6 +15,24 @@ bool QuartzGeometry::FillContains(const Point &point) {
kCGPathFill);
}
+Rect QuartzGeometry::GetBounds() {
+ auto bounds = CGPathGetPathBoundingBox(cg_path_);
+ if (CGRectIsNull(bounds)) return {};
+ return Convert(bounds);
+}
+
+std::unique_ptr<IGeometry> QuartzGeometry::Transform(const Matrix &matrix) {
+ auto cg_matrix = Convert(matrix);
+ auto cg_path = CGPathCreateCopyByTransformingPath(cg_path_, &cg_matrix);
+ return std::make_unique<QuartzGeometry>(GetGraphicsFactory(), cg_path);
+}
+
+std::unique_ptr<IGeometry> QuartzGeometry::CreateStrokeGeometry(float width) {
+ auto cg_path = CGPathCreateCopyByStrokingPath(
+ cg_path_, nullptr, width, kCGLineCapButt, kCGLineJoinMiter, 10);
+ return std::make_unique<QuartzGeometry>(GetGraphicsFactory(), cg_path);
+}
+
QuartzGeometryBuilder::QuartzGeometryBuilder(IGraphicsFactory *graphics_factory)
: OsxQuartzResource(graphics_factory) {
cg_mutable_path_ = CGPathCreateMutable();