aboutsummaryrefslogtreecommitdiff
path: root/src/platform/graphics/cairo/CairoGeometry.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform/graphics/cairo/CairoGeometry.cpp')
-rw-r--r--src/platform/graphics/cairo/CairoGeometry.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/platform/graphics/cairo/CairoGeometry.cpp b/src/platform/graphics/cairo/CairoGeometry.cpp
index 1f680c34..0b46b4eb 100644
--- a/src/platform/graphics/cairo/CairoGeometry.cpp
+++ b/src/platform/graphics/cairo/CairoGeometry.cpp
@@ -1,8 +1,10 @@
#include "cru/platform/graphics/cairo/CairoGeometry.h"
+#include "cru/base/log/Logger.h"
#include "cru/platform/graphics/Geometry.h"
#include "cru/platform/graphics/cairo/CairoGraphicsFactory.h"
#include <cairo/cairo.h>
+#include <numbers>
namespace cru::platform::graphics::cairo {
CairoGeometry::CairoGeometry(CairoGraphicsFactory* factory,
@@ -115,6 +117,36 @@ void CairoGeometryBuilder::QuadraticBezierTo(const Point& control_point,
CubicBezierTo(control_point, control_point, end_point);
}
+namespace {
+bool Near(const Point& p1, const Point& p2) {
+ return std::abs(p1.x - p2.x) < 0.0001 && std::abs(p1.y - p2.y) < 0.0001;
+}
+} // namespace
+
+void CairoGeometryBuilder::ArcTo(const Point& radius, float angle,
+ bool is_large_arc, bool is_clockwise,
+ const Point& end_point) {
+ auto pos = GetCurrentPosition();
+ auto info = CalculateArcInfo(pos, radius, angle, is_large_arc, is_clockwise,
+ end_point);
+
+ CruLogDebug(
+ kLogTag,
+ "Arc to {}, radius {}, angle {}, is_large_arc {}, is_clockwise {}, "
+ "end_point {}. Calculated, center {}, start_angle {}, end_angle {}.",
+ pos, radius, angle, is_large_arc, is_clockwise, end_point, info.center,
+ info.start_angle, info.end_angle);
+
+ cairo_new_sub_path(cairo_);
+ cairo_save(cairo_);
+ cairo_translate(cairo_, info.center.x, info.center.y);
+ cairo_scale(cairo_, radius.x, radius.y);
+ cairo_rotate(cairo_, angle * std::numbers::pi / 180.0);
+ cairo_arc(cairo_, 0, 0, 1, info.start_angle, info.end_angle);
+ cairo_restore(cairo_);
+ cairo_move_to(cairo_, end_point.x, end_point.y);
+}
+
void CairoGeometryBuilder::CloseFigure(bool close) {
if (close) cairo_close_path(cairo_);
}