aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-06-09 20:26:42 +0800
committercrupest <crupest@outlook.com>2022-06-09 20:26:42 +0800
commitbe5df0d92a49ea332fef06c024c4f779c82ec258 (patch)
tree9d42b810b4b8b3b88c8fcbd1785b07f1a302d92a
parente076c0316b2c501fd1745a4c6bac909d3b2c9b1c (diff)
downloadcru-be5df0d92a49ea332fef06c024c4f779c82ec258.tar.gz
cru-be5df0d92a49ea332fef06c024c4f779c82ec258.tar.bz2
cru-be5df0d92a49ea332fef06c024c4f779c82ec258.zip
...
-rw-r--r--include/cru/platform/graphics/cairo/CairoPainter.h6
-rw-r--r--src/platform/graphics/cairo/CairoImage.cpp3
-rw-r--r--src/platform/graphics/cairo/CairoPainter.cpp14
3 files changed, 17 insertions, 6 deletions
diff --git a/include/cru/platform/graphics/cairo/CairoPainter.h b/include/cru/platform/graphics/cairo/CairoPainter.h
index 83f0329b..477bd289 100644
--- a/include/cru/platform/graphics/cairo/CairoPainter.h
+++ b/include/cru/platform/graphics/cairo/CairoPainter.h
@@ -8,8 +8,8 @@ namespace cru::platform::graphics::cairo {
class CRU_PLATFORM_GRAPHICS_CAIRO_API CairoPainter : public CairoResource,
public virtual IPainter {
public:
- CairoPainter(CairoGraphicsFactory* factory, cairo_t* cairo,
- bool auto_release);
+ CairoPainter(CairoGraphicsFactory* factory, cairo_t* cairo, bool auto_release,
+ cairo_surface_t* cairo_surface = nullptr);
~CairoPainter();
public:
@@ -53,6 +53,8 @@ class CRU_PLATFORM_GRAPHICS_CAIRO_API CairoPainter : public CairoResource,
cairo_t* cairo_;
bool auto_release_;
+ cairo_surface_t* cairo_surface_;
+
std::vector<Rect> layer_stack_;
};
} // namespace cru::platform::graphics::cairo
diff --git a/src/platform/graphics/cairo/CairoImage.cpp b/src/platform/graphics/cairo/CairoImage.cpp
index 30e1016f..55b1c4d0 100644
--- a/src/platform/graphics/cairo/CairoImage.cpp
+++ b/src/platform/graphics/cairo/CairoImage.cpp
@@ -46,7 +46,8 @@ std::unique_ptr<IImage> CairoImage::CreateWithRect(const Rect& rect) {
std::unique_ptr<IPainter> CairoImage::CreatePainter() {
auto cairo = cairo_create(cairo_surface_);
- return std::make_unique<CairoPainter>(GetCairoGraphicsFactory(), cairo, true);
+ return std::make_unique<CairoPainter>(GetCairoGraphicsFactory(), cairo, true,
+ cairo_surface_);
}
} // namespace cru::platform::graphics::cairo
diff --git a/src/platform/graphics/cairo/CairoPainter.cpp b/src/platform/graphics/cairo/CairoPainter.cpp
index fb5e0046..00c8187c 100644
--- a/src/platform/graphics/cairo/CairoPainter.cpp
+++ b/src/platform/graphics/cairo/CairoPainter.cpp
@@ -13,8 +13,11 @@
namespace cru::platform::graphics::cairo {
CairoPainter::CairoPainter(CairoGraphicsFactory* factory, cairo_t* cairo,
- bool auto_release)
- : CairoResource(factory), cairo_(cairo), auto_release_(auto_release) {}
+ bool auto_release, cairo_surface_t* cairo_surface)
+ : CairoResource(factory),
+ cairo_(cairo),
+ auto_release_(auto_release),
+ cairo_surface_(cairo_surface) {}
CairoPainter::~CairoPainter() {
if (auto_release_) {
@@ -230,7 +233,12 @@ void CairoPainter::PopState() {
cairo_restore(cairo_);
}
-void CairoPainter::EndDraw() { valid_ = false; }
+void CairoPainter::EndDraw() {
+ if (cairo_surface_ != nullptr) {
+ cairo_surface_flush(cairo_surface_);
+ }
+ valid_ = false;
+}
void CairoPainter::CheckValidation() {
if (!valid_) {