diff options
Diffstat (limited to 'src/platform')
-rw-r--r-- | src/platform/graphics/cairo/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/platform/graphics/cairo/CairoImage.cpp | 52 |
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 |