From 3e11b954a73d4718750b130abd6f511e624ffce7 Mon Sep 17 00:00:00 2001 From: crupest Date: Wed, 2 Mar 2022 19:33:18 +0800 Subject: ... --- include/cru/osx/graphics/quartz/Geometry.h | 4 ++++ include/cru/platform/graphics/Geometry.h | 3 +++ src/osx/graphics/quartz/Geometry.cpp | 18 ++++++++++++++++++ 3 files changed, 25 insertions(+) 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 Transform(const Matrix &matrix) override; + std::unique_ptr 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 Transform(const Matrix& matrix) = 0; + virtual std::unique_ptr 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 QuartzGeometry::Transform(const Matrix &matrix) { + auto cg_matrix = Convert(matrix); + auto cg_path = CGPathCreateCopyByTransformingPath(cg_path_, &cg_matrix); + return std::make_unique(GetGraphicsFactory(), cg_path); +} + +std::unique_ptr QuartzGeometry::CreateStrokeGeometry(float width) { + auto cg_path = CGPathCreateCopyByStrokingPath( + cg_path_, nullptr, width, kCGLineCapButt, kCGLineJoinMiter, 10); + return std::make_unique(GetGraphicsFactory(), cg_path); +} + QuartzGeometryBuilder::QuartzGeometryBuilder(IGraphicsFactory *graphics_factory) : OsxQuartzResource(graphics_factory) { cg_mutable_path_ = CGPathCreateMutable(); -- cgit v1.2.3