aboutsummaryrefslogtreecommitdiff
path: root/src/platform
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-06-08 22:30:50 +0800
committercrupest <crupest@outlook.com>2022-06-08 22:30:50 +0800
commitccf67fcbd182d739ac73c0beb5380c6862811d22 (patch)
treea6ac77a8c16e34e802d2e51e11411da700be3a31 /src/platform
parenta61a9c8cad237c9e46ad80dae54bd210bb2692b8 (diff)
downloadcru-ccf67fcbd182d739ac73c0beb5380c6862811d22.tar.gz
cru-ccf67fcbd182d739ac73c0beb5380c6862811d22.tar.bz2
cru-ccf67fcbd182d739ac73c0beb5380c6862811d22.zip
...
Diffstat (limited to 'src/platform')
-rw-r--r--src/platform/graphics/cairo/CMakeLists.txt1
-rw-r--r--src/platform/graphics/cairo/CairoImage.cpp52
2 files changed, 53 insertions, 0 deletions
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