diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/platform/graphics/cairo/CairoGeometry.cpp | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/platform/graphics/cairo/CairoGeometry.cpp b/src/platform/graphics/cairo/CairoGeometry.cpp index 3b6ca874..2d415884 100644 --- a/src/platform/graphics/cairo/CairoGeometry.cpp +++ b/src/platform/graphics/cairo/CairoGeometry.cpp @@ -2,6 +2,8 @@ #include "cru/platform/graphics/Geometry.h" #include "cru/platform/graphics/cairo/CairoGraphicsFactory.h" +#include <cairo/cairo.h> + namespace cru::platform::graphics::cairo { CairoGeometry::CairoGeometry(CairoGraphicsFactory* factory, cairo_path_t* cairo_path, const Matrix& transform, @@ -72,4 +74,54 @@ std::unique_ptr<IGeometry> CairoGeometry::Transform(const Matrix& matrix) { std::unique_ptr<IGeometry> CairoGeometry::CreateStrokeGeometry(float width) { throw Exception(u"Not implemented"); } + +CairoGeometryBuilder::CairoGeometryBuilder(CairoGraphicsFactory* factory) + : CairoResource(factory) { + surface_ = cairo_recording_surface_create(CAIRO_CONTENT_COLOR_ALPHA, nullptr); + cairo_ = cairo_create(surface_); + cairo_new_path(cairo_); + cairo_move_to(cairo_, 0.0, 0.0); +} + +CairoGeometryBuilder::~CairoGeometryBuilder() { + cairo_destroy(cairo_); + cairo_surface_destroy(surface_); +} + +Point CairoGeometryBuilder::GetCurrentPosition() { + double x, y; + cairo_get_current_point(cairo_, &x, &y); + return Point(x, y); +} + +void CairoGeometryBuilder::MoveTo(const Point& point) { + cairo_move_to(cairo_, point.x, point.y); +} + +void CairoGeometryBuilder::LineTo(const Point& point) { + cairo_line_to(cairo_, point.x, point.y); +} + +void CairoGeometryBuilder::CubicBezierTo(const Point& start_control_point, + const Point& end_control_point, + const Point& end_point) { + cairo_curve_to(cairo_, start_control_point.x, start_control_point.y, + end_control_point.x, end_control_point.y, end_point.x, + end_point.y); +} + +void CairoGeometryBuilder::QuadraticBezierTo(const Point& control_point, + const Point& end_point) { + CubicBezierTo(control_point, control_point, end_point); +} + +void CairoGeometryBuilder::CloseFigure(bool close) { + if (close) cairo_close_path(cairo_); +} + +std::unique_ptr<IGeometry> CairoGeometryBuilder::Build() { + cairo_path_t* path = cairo_copy_path(cairo_); + return std::unique_ptr<IGeometry>(new CairoGeometry( + GetCairoGraphicsFactory(), path, Matrix::Identity(), true)); +} } // namespace cru::platform::graphics::cairo |