aboutsummaryrefslogtreecommitdiff
path: root/src/platform/graphics
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform/graphics')
-rw-r--r--src/platform/graphics/Geometry.cpp5
-rw-r--r--src/platform/graphics/cairo/CairoGeometry.cpp27
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) {