aboutsummaryrefslogtreecommitdiff
path: root/src/platform/graphics/cairo
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-05-15 22:46:05 +0800
committercrupest <crupest@outlook.com>2022-05-15 22:46:05 +0800
commitae0694c91602fa1cd278394132bc1320c00deba8 (patch)
tree5c0cec4d15d4299839237fcf135cc45e29ac90e4 /src/platform/graphics/cairo
parent576b19c2aee9314371f2f905a66eeac9cab800c0 (diff)
downloadcru-ae0694c91602fa1cd278394132bc1320c00deba8.tar.gz
cru-ae0694c91602fa1cd278394132bc1320c00deba8.tar.bz2
cru-ae0694c91602fa1cd278394132bc1320c00deba8.zip
...
Diffstat (limited to 'src/platform/graphics/cairo')
-rw-r--r--src/platform/graphics/cairo/CMakeLists.txt1
-rw-r--r--src/platform/graphics/cairo/CairoGeometry.cpp48
-rw-r--r--src/platform/graphics/cairo/CairoGraphicsFactory.cpp11
3 files changed, 58 insertions, 2 deletions
diff --git a/src/platform/graphics/cairo/CMakeLists.txt b/src/platform/graphics/cairo/CMakeLists.txt
index e9107120..0fa618a0 100644
--- a/src/platform/graphics/cairo/CMakeLists.txt
+++ b/src/platform/graphics/cairo/CMakeLists.txt
@@ -4,6 +4,7 @@ if (UNIX)
add_library(CruPlatformGraphicsCairo SHARED
CairoBrush.cpp
+ CairoGeometry.cpp
CairoGraphicsFactory.cpp
CairoResource.cpp
)
diff --git a/src/platform/graphics/cairo/CairoGeometry.cpp b/src/platform/graphics/cairo/CairoGeometry.cpp
new file mode 100644
index 00000000..7abe273c
--- /dev/null
+++ b/src/platform/graphics/cairo/CairoGeometry.cpp
@@ -0,0 +1,48 @@
+#include "cru/platform/graphics/cairo/CairoGeometry.h"
+#include "cru/platform/graphics/cairo/CairoGraphicsFactory.h"
+
+namespace cru::platform::graphics::cairo {
+CairoGeometry::CairoGeometry(CairoGraphicsFactory* factory,
+ cairo_path_t* cairo_path, bool auto_destroy)
+ : CairoResource(factory),
+ cairo_path_(cairo_path),
+ auto_destroy_(auto_destroy) {
+ Expects(cairo_path);
+}
+
+CairoGeometry::~CairoGeometry() {
+ if (auto_destroy_) {
+ cairo_path_destroy(cairo_path_);
+ cairo_path_ = nullptr;
+ }
+}
+
+bool CairoGeometry::FillContains(const Point& point) {
+ auto cairo = GetCairoGraphicsFactory()->GetDefaultCairo();
+ cairo_save(cairo);
+ cairo_new_path(cairo);
+ cairo_append_path(cairo, cairo_path_);
+ auto result = cairo_in_fill(cairo, point.x, point.y);
+ cairo_restore(cairo);
+ return result;
+}
+
+Rect CairoGeometry::GetBounds() {
+ auto cairo = GetCairoGraphicsFactory()->GetDefaultCairo();
+ cairo_save(cairo);
+ cairo_new_path(cairo);
+ cairo_append_path(cairo, cairo_path_);
+ double l, t, r, b;
+ cairo_path_extents(cairo, &l, &t, &r, &b);
+ cairo_restore(cairo);
+ return Rect::FromVertices(l, t, r, b);
+}
+
+std::unique_ptr<IGeometry> CairoGeometry::Transform(const Matrix& matrix) {
+ throw Exception(u"Not implemented");
+}
+
+std::unique_ptr<IGeometry> CairoGeometry::CreateStrokeGeometry(float width) {
+ throw Exception(u"Not implemented");
+}
+} // namespace cru::platform::graphics::cairo
diff --git a/src/platform/graphics/cairo/CairoGraphicsFactory.cpp b/src/platform/graphics/cairo/CairoGraphicsFactory.cpp
index 8ff72065..f27ca2c4 100644
--- a/src/platform/graphics/cairo/CairoGraphicsFactory.cpp
+++ b/src/platform/graphics/cairo/CairoGraphicsFactory.cpp
@@ -2,7 +2,14 @@
#include "cru/platform/graphics/cairo/CairoResource.h"
namespace cru::platform::graphics::cairo {
-CairoGraphicsFactory::CairoGraphicsFactory() : CairoResource(this) {}
+CairoGraphicsFactory::CairoGraphicsFactory() : CairoResource(this) {
+ default_cairo_surface_ =
+ cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 100, 100);
+ default_cairo_ = cairo_create(default_cairo_surface_);
+}
-CairoGraphicsFactory::~CairoGraphicsFactory() {}
+CairoGraphicsFactory::~CairoGraphicsFactory() {
+ cairo_destroy(default_cairo_);
+ cairo_surface_destroy(default_cairo_surface_);
+}
} // namespace cru::platform::graphics::cairo