diff options
author | crupest <crupest@outlook.com> | 2022-06-08 22:30:50 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-06-08 22:30:50 +0800 |
commit | ccf67fcbd182d739ac73c0beb5380c6862811d22 (patch) | |
tree | a6ac77a8c16e34e802d2e51e11411da700be3a31 /src/platform/graphics/cairo/CairoImage.cpp | |
parent | a61a9c8cad237c9e46ad80dae54bd210bb2692b8 (diff) | |
download | cru-ccf67fcbd182d739ac73c0beb5380c6862811d22.tar.gz cru-ccf67fcbd182d739ac73c0beb5380c6862811d22.tar.bz2 cru-ccf67fcbd182d739ac73c0beb5380c6862811d22.zip |
...
Diffstat (limited to 'src/platform/graphics/cairo/CairoImage.cpp')
-rw-r--r-- | src/platform/graphics/cairo/CairoImage.cpp | 52 |
1 files changed, 52 insertions, 0 deletions
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 |