aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/cru/platform/graphics/cairo/CairoGeometry.h30
-rw-r--r--include/cru/platform/graphics/cairo/CairoGraphicsFactory.h8
-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
5 files changed, 96 insertions, 2 deletions
diff --git a/include/cru/platform/graphics/cairo/CairoGeometry.h b/include/cru/platform/graphics/cairo/CairoGeometry.h
new file mode 100644
index 00000000..0ddedba4
--- /dev/null
+++ b/include/cru/platform/graphics/cairo/CairoGeometry.h
@@ -0,0 +1,30 @@
+#pragma once
+#include "CairoResource.h"
+#include "cru/platform/graphics/Geometry.h"
+
+#include <cairo/cairo.h>
+
+namespace cru::platform::graphics::cairo {
+class CRU_PLATFORM_GRAPHICS_CAIRO_API CairoGeometry : public CairoResource,
+ public virtual IGeometry {
+ public:
+ CairoGeometry(CairoGraphicsFactory* factory, cairo_path_t* cairo_path,
+ bool auto_destroy);
+ ~CairoGeometry();
+
+ 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;
+
+ cairo_path_t* GetCairoPath() const { return cairo_path_; }
+
+ private:
+ cairo_path_t* cairo_path_;
+ bool auto_destroy_;
+};
+
+class CRU_PLATFORM_GRAPHICS_CAIRO_API CairoGeometryBuilder
+ : public CairoResource,
+ public virtual IGeometryBuilder {};
+} // namespace cru::platform::graphics::cairo
diff --git a/include/cru/platform/graphics/cairo/CairoGraphicsFactory.h b/include/cru/platform/graphics/cairo/CairoGraphicsFactory.h
index 0c364d5e..130c1c26 100644
--- a/include/cru/platform/graphics/cairo/CairoGraphicsFactory.h
+++ b/include/cru/platform/graphics/cairo/CairoGraphicsFactory.h
@@ -3,6 +3,8 @@
#include "../Factory.h"
#include "CairoResource.h"
+#include <cairo/cairo.h>
+
namespace cru::platform::graphics::cairo {
class CRU_PLATFORM_GRAPHICS_CAIRO_API CairoGraphicsFactory
: public CairoResource,
@@ -12,5 +14,11 @@ class CRU_PLATFORM_GRAPHICS_CAIRO_API CairoGraphicsFactory
~CairoGraphicsFactory() override;
public:
+ cairo_surface_t* GetDefaultCairoSurface() { return default_cairo_surface_; }
+ cairo_t* GetDefaultCairo() { return default_cairo_; }
+
+ private:
+ cairo_surface_t* default_cairo_surface_;
+ cairo_t* default_cairo_;
};
} // namespace cru::platform::graphics::cairo
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