diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/platform/graphics/Geometry.cpp | 5 | ||||
-rw-r--r-- | src/platform/graphics/cairo/CairoGeometry.cpp | 27 |
2 files changed, 31 insertions, 1 deletions
diff --git a/src/platform/graphics/Geometry.cpp b/src/platform/graphics/Geometry.cpp index c215ad30..20197153 100644 --- a/src/platform/graphics/Geometry.cpp +++ b/src/platform/graphics/Geometry.cpp @@ -7,6 +7,11 @@ #include <unordered_set> namespace cru::platform::graphics { +bool IGeometry::StrokeContains(float width, const Point& point) { + auto geometry = CreateStrokeGeometry(width); + return geometry->FillContains(point); +} + constexpr float PI = 3.14159265358979323846f; using std::abs; diff --git a/src/platform/graphics/cairo/CairoGeometry.cpp b/src/platform/graphics/cairo/CairoGeometry.cpp index 43ba08d8..3b6ca874 100644 --- a/src/platform/graphics/cairo/CairoGeometry.cpp +++ b/src/platform/graphics/cairo/CairoGeometry.cpp @@ -1,4 +1,5 @@ #include "cru/platform/graphics/cairo/CairoGeometry.h" +#include "cru/platform/graphics/Geometry.h" #include "cru/platform/graphics/cairo/CairoGraphicsFactory.h" namespace cru::platform::graphics::cairo { @@ -19,9 +20,24 @@ CairoGeometry::~CairoGeometry() { } } +bool CairoGeometry::StrokeContains(float width, const Point& point) { + auto cairo = GetCairoGraphicsFactory()->GetDefaultCairo(); + cairo_save(cairo); + auto matrix = Convert(transform_); + cairo_transform(cairo, &matrix); + cairo_new_path(cairo); + cairo_append_path(cairo, cairo_path_); + cairo_set_line_width(cairo, width); + auto result = cairo_in_stroke(cairo, point.x, point.y); + cairo_restore(cairo); + return result; +} + bool CairoGeometry::FillContains(const Point& point) { auto cairo = GetCairoGraphicsFactory()->GetDefaultCairo(); cairo_save(cairo); + auto matrix = Convert(transform_); + cairo_transform(cairo, &matrix); cairo_new_path(cairo); cairo_append_path(cairo, cairo_path_); auto result = cairo_in_fill(cairo, point.x, point.y); @@ -32,6 +48,8 @@ bool CairoGeometry::FillContains(const Point& point) { Rect CairoGeometry::GetBounds() { auto cairo = GetCairoGraphicsFactory()->GetDefaultCairo(); cairo_save(cairo); + auto matrix = Convert(transform_); + cairo_transform(cairo, &matrix); cairo_new_path(cairo); cairo_append_path(cairo, cairo_path_); double l, t, r, b; @@ -41,7 +59,14 @@ Rect CairoGeometry::GetBounds() { } std::unique_ptr<IGeometry> CairoGeometry::Transform(const Matrix& matrix) { - + auto cairo = GetCairoGraphicsFactory()->GetDefaultCairo(); + cairo_save(cairo); + cairo_new_path(cairo); + cairo_append_path(cairo, cairo_path_); + auto path = cairo_copy_path(cairo); + cairo_restore(cairo); + return std::unique_ptr<IGeometry>(new CairoGeometry( + GetCairoGraphicsFactory(), path, transform_ * matrix, true)); } std::unique_ptr<IGeometry> CairoGeometry::CreateStrokeGeometry(float width) { |