diff options
-rw-r--r-- | include/cru/platform/graphics/cairo/CairoPainter.h | 51 | ||||
-rw-r--r-- | src/platform/graphics/cairo/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/platform/graphics/cairo/CairoPainter.cpp | 37 |
3 files changed, 89 insertions, 0 deletions
diff --git a/include/cru/platform/graphics/cairo/CairoPainter.h b/include/cru/platform/graphics/cairo/CairoPainter.h new file mode 100644 index 00000000..3f6e6e24 --- /dev/null +++ b/include/cru/platform/graphics/cairo/CairoPainter.h @@ -0,0 +1,51 @@ +#pragma once +#include "../Painter.h" +#include "CairoResource.h" + +namespace cru::platform::graphics::cairo { +class CairoPainter : public CairoResource, public virtual IPainter { + public: + CairoPainter(CairoGraphicsFactory* factory, cairo_t* cairo, + bool auto_release); + ~CairoPainter(); + + public: + Matrix GetTransform() override; + void SetTransform(const Matrix& matrix) override; + + void ConcatTransform(const Matrix& matrix) override; + + void Clear(const Color& color) override; + + void DrawLine(const Point& start, const Point& end, IBrush* brush, + float width) override; + void StrokeRectangle(const Rect& rectangle, IBrush* brush, + float width) override; + void FillRectangle(const Rect& rectangle, IBrush* brush) override; + void StrokeEllipse(const Rect& outline_rect, IBrush* brush, + float width) override; + void FillEllipse(const Rect& outline_rect, IBrush* brush) override; + + void StrokeGeometry(IGeometry* geometry, IBrush* brush, float width) override; + void FillGeometry(IGeometry* geometry, IBrush* brush) override; + + void DrawText(const Point& offset, ITextLayout* text_layout, + IBrush* brush) override; + + void DrawImage(const Point& offset, IImage* image) override; + + void PushLayer(const Rect& bounds) override; + + void PopLayer() override; + + void PushState() override; + + void PopState() override; + + void EndDraw() override; + + private: + cairo_t* cairo_; + bool auto_release_; +}; +} // namespace cru::platform::graphics::cairo diff --git a/src/platform/graphics/cairo/CMakeLists.txt b/src/platform/graphics/cairo/CMakeLists.txt index 606b0075..c1a2a4b5 100644 --- a/src/platform/graphics/cairo/CMakeLists.txt +++ b/src/platform/graphics/cairo/CMakeLists.txt @@ -16,6 +16,7 @@ if (UNIX) CairoBrush.cpp CairoGeometry.cpp CairoGraphicsFactory.cpp + CairoPainter.cpp CairoResource.cpp PangoFont.cpp PangoTextLayout.cpp diff --git a/src/platform/graphics/cairo/CairoPainter.cpp b/src/platform/graphics/cairo/CairoPainter.cpp new file mode 100644 index 00000000..c899fc28 --- /dev/null +++ b/src/platform/graphics/cairo/CairoPainter.cpp @@ -0,0 +1,37 @@ +#include "cru/platform/graphics/cairo/CairoPainter.h" +#include "cru/platform/graphics/cairo/Base.h" +#include "cru/platform/graphics/cairo/CairoResource.h" + +namespace cru::platform::graphics::cairo { +CairoPainter::CairoPainter(CairoGraphicsFactory* factory, cairo_t* cairo, + bool auto_release) + : CairoResource(factory), cairo_(cairo), auto_release_(auto_release) {} + +CairoPainter::~CairoPainter() { + if (auto_release_) { + cairo_destroy(cairo_); + } +} + +Matrix CairoPainter::GetTransform() { + cairo_matrix_t matrix; + cairo_get_matrix(cairo_, &matrix); + return Convert(matrix); +} + +void CairoPainter::SetTransform(const Matrix& matrix) { + auto m = Convert(matrix); + cairo_set_matrix(cairo_, &m); +} + +void CairoPainter::ConcatTransform(const Matrix& matrix) { + auto m = Convert(matrix); + cairo_transform(cairo_, &m); +} + +void CairoPainter::Clear(const Color& color) { + cairo_set_source_rgba(cairo_, color.GetFloatRed(), color.GetFloatGreen(), + color.GetFloatBlue(), color.GetFloatAlpha()); + cairo_paint(cairo_); +} +} // namespace cru::platform::graphics::cairo |