aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/cru/platform/graphics/cairo/CairoImage.h29
-rw-r--r--include/cru/platform/graphics/cairo/CairoPainter.h3
-rw-r--r--include/cru/platform/graphics/cairo/PangoFont.h3
-rw-r--r--include/cru/platform/graphics/cairo/PangoTextLayout.h4
-rw-r--r--src/platform/graphics/cairo/CMakeLists.txt1
-rw-r--r--src/platform/graphics/cairo/CairoImage.cpp52
6 files changed, 89 insertions, 3 deletions
diff --git a/include/cru/platform/graphics/cairo/CairoImage.h b/include/cru/platform/graphics/cairo/CairoImage.h
new file mode 100644
index 00000000..61a2e65b
--- /dev/null
+++ b/include/cru/platform/graphics/cairo/CairoImage.h
@@ -0,0 +1,29 @@
+#pragma once
+#include "../Image.h"
+#include "CairoResource.h"
+
+namespace cru::platform::graphics::cairo {
+class CRU_PLATFORM_GRAPHICS_CAIRO_API CairoImage : public CairoResource,
+ public virtual IImage {
+ public:
+ CairoImage(CairoGraphicsFactory* factory, int width, int height);
+ CairoImage(CairoGraphicsFactory* factory,
+ cairo_surface_t* cairo_image_surface, bool auto_release);
+
+ ~CairoImage() override;
+
+ public:
+ float GetWidth() override;
+ float GetHeight() override;
+
+ std::unique_ptr<IImage> CreateWithRect(const Rect& rect) override;
+
+ std::unique_ptr<IPainter> CreatePainter() override;
+
+ cairo_surface_t* GetCairoSurface() { return cairo_surface_; }
+
+ private:
+ cairo_surface_t* cairo_surface_;
+ bool auto_release_;
+};
+} // namespace cru::platform::graphics::cairo
diff --git a/include/cru/platform/graphics/cairo/CairoPainter.h b/include/cru/platform/graphics/cairo/CairoPainter.h
index 1b965cb4..83f0329b 100644
--- a/include/cru/platform/graphics/cairo/CairoPainter.h
+++ b/include/cru/platform/graphics/cairo/CairoPainter.h
@@ -5,7 +5,8 @@
#include <vector>
namespace cru::platform::graphics::cairo {
-class CairoPainter : public CairoResource, public virtual IPainter {
+class CRU_PLATFORM_GRAPHICS_CAIRO_API CairoPainter : public CairoResource,
+ public virtual IPainter {
public:
CairoPainter(CairoGraphicsFactory* factory, cairo_t* cairo,
bool auto_release);
diff --git a/include/cru/platform/graphics/cairo/PangoFont.h b/include/cru/platform/graphics/cairo/PangoFont.h
index 0e080c18..3014739d 100644
--- a/include/cru/platform/graphics/cairo/PangoFont.h
+++ b/include/cru/platform/graphics/cairo/PangoFont.h
@@ -6,7 +6,8 @@
#include <pango/pango.h>
namespace cru::platform::graphics::cairo {
-class PangoFont : public CairoResource, public virtual IFont {
+class CRU_PLATFORM_GRAPHICS_CAIRO_API PangoFont : public CairoResource,
+ public virtual IFont {
public:
PangoFont(CairoGraphicsFactory* factory, String font_family, float font_size);
diff --git a/include/cru/platform/graphics/cairo/PangoTextLayout.h b/include/cru/platform/graphics/cairo/PangoTextLayout.h
index 9b6d4791..cdc54e8d 100644
--- a/include/cru/platform/graphics/cairo/PangoTextLayout.h
+++ b/include/cru/platform/graphics/cairo/PangoTextLayout.h
@@ -6,7 +6,9 @@
#include <pango/pango.h>
namespace cru::platform::graphics::cairo {
-class PangoTextLayout : public CairoResource, public virtual ITextLayout {
+class CRU_PLATFORM_GRAPHICS_CAIRO_API PangoTextLayout
+ : public CairoResource,
+ public virtual ITextLayout {
public:
PangoTextLayout(CairoGraphicsFactory* factory, std::shared_ptr<IFont> font);
diff --git a/src/platform/graphics/cairo/CMakeLists.txt b/src/platform/graphics/cairo/CMakeLists.txt
index 2cd75329..ec8005d3 100644
--- a/src/platform/graphics/cairo/CMakeLists.txt
+++ b/src/platform/graphics/cairo/CMakeLists.txt
@@ -19,6 +19,7 @@ if (UNIX)
CairoBrush.cpp
CairoGeometry.cpp
CairoGraphicsFactory.cpp
+ CairoImage.cpp
CairoPainter.cpp
CairoResource.cpp
PangoFont.cpp
diff --git a/src/platform/graphics/cairo/CairoImage.cpp b/src/platform/graphics/cairo/CairoImage.cpp
new file mode 100644
index 00000000..30e1016f
--- /dev/null
+++ b/src/platform/graphics/cairo/CairoImage.cpp
@@ -0,0 +1,52 @@
+#include "cru/platform/graphics/cairo/CairoImage.h"
+#include "cru/platform/graphics/cairo/CairoPainter.h"
+
+#include <memory>
+
+namespace cru::platform::graphics::cairo {
+CairoImage::CairoImage(CairoGraphicsFactory* factory, int width, int height)
+ : CairoResource(factory) {
+ cairo_surface_ =
+ cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
+ auto_release_ = true;
+}
+
+CairoImage::CairoImage(CairoGraphicsFactory* factory,
+ cairo_surface_t* cairo_image_surface, bool auto_release)
+ : CairoResource(factory) {
+ Expects(cairo_surface_get_type(cairo_image_surface) ==
+ CAIRO_SURFACE_TYPE_IMAGE);
+ cairo_surface_ = cairo_image_surface;
+ auto_release_ = auto_release;
+}
+
+CairoImage::~CairoImage() {
+ if (auto_release_) {
+ cairo_surface_destroy(cairo_surface_);
+ }
+}
+
+float CairoImage::GetWidth() {
+ return cairo_image_surface_get_width(cairo_surface_);
+}
+
+float CairoImage::GetHeight() {
+ return cairo_image_surface_get_height(cairo_surface_);
+}
+
+std::unique_ptr<IImage> CairoImage::CreateWithRect(const Rect& rect) {
+ auto surface =
+ cairo_image_surface_create(CAIRO_FORMAT_ARGB32, rect.width, rect.height);
+ auto cairo = cairo_create(surface);
+ cairo_set_source_surface(cairo, cairo_surface_, rect.left, rect.top);
+ cairo_paint(cairo);
+ cairo_destroy(cairo);
+ return std::make_unique<CairoImage>(GetCairoGraphicsFactory(), surface, true);
+}
+
+std::unique_ptr<IPainter> CairoImage::CreatePainter() {
+ auto cairo = cairo_create(cairo_surface_);
+ return std::make_unique<CairoPainter>(GetCairoGraphicsFactory(), cairo, true);
+}
+
+} // namespace cru::platform::graphics::cairo