aboutsummaryrefslogtreecommitdiff
path: root/include/cru/platform
diff options
context:
space:
mode:
Diffstat (limited to 'include/cru/platform')
-rw-r--r--include/cru/platform/GraphicsBase.h10
-rw-r--r--include/cru/platform/graphics/Geometry.h16
-rw-r--r--include/cru/platform/graphics/cairo/CairoGeometry.h7
-rw-r--r--include/cru/platform/graphics/quartz/Geometry.h7
4 files changed, 39 insertions, 1 deletions
diff --git a/include/cru/platform/GraphicsBase.h b/include/cru/platform/GraphicsBase.h
index 0c391b11..4e88ca26 100644
--- a/include/cru/platform/GraphicsBase.h
+++ b/include/cru/platform/GraphicsBase.h
@@ -2,6 +2,7 @@
#include <cru/base/Range.h>
#include <cru/base/StringUtil.h>
+#include <cmath>
#include <format>
#include <limits>
@@ -21,6 +22,11 @@ struct Point final {
constexpr Point Negate() const { return Point(-x, -y); }
+ constexpr float Distance(const Point& other) {
+ auto dx = x - other.x, dy = y - other.y;
+ return std::sqrt(dx * dx + dy * dy);
+ }
+
std::string ToString() const {
return std::format("Point(x: {}, y: {})", x, y);
}
@@ -39,6 +45,10 @@ constexpr Point operator-(const Point& left, const Point& right) {
return Point(left.x - right.x, left.y - right.y);
}
+constexpr Point operator/(const Point& point, float scale) {
+ return Point(point.x / scale, point.y / scale);
+}
+
struct Size final {
constexpr Size() = default;
constexpr Size(const float width, const float height)
diff --git a/include/cru/platform/graphics/Geometry.h b/include/cru/platform/graphics/Geometry.h
index ef661f2a..92338750 100644
--- a/include/cru/platform/graphics/Geometry.h
+++ b/include/cru/platform/graphics/Geometry.h
@@ -63,6 +63,22 @@ struct CRU_PLATFORM_GRAPHICS_API IGeometry : virtual IGraphicsResource {
* virtual so it can override them.
*/
struct CRU_PLATFORM_GRAPHICS_API IGeometryBuilder : virtual IGraphicsResource {
+ private:
+ constexpr static auto kLogTag = "cru::platform::graphics::IGeometryBuilder";
+
+ public:
+ struct ArcInfo {
+ Point center;
+ // In radian.
+ float start_angle;
+ // In radian.
+ float end_angle;
+ };
+
+ static ArcInfo CalculateArcInfo(const Point& start_point, const Point& radius,
+ float angle, bool is_large_arc,
+ bool is_clockwise, const Point& end_point);
+
virtual Point GetCurrentPosition() = 0;
virtual void MoveTo(const Point& point) = 0;
diff --git a/include/cru/platform/graphics/cairo/CairoGeometry.h b/include/cru/platform/graphics/cairo/CairoGeometry.h
index 1d69ebf2..7d2b1bcd 100644
--- a/include/cru/platform/graphics/cairo/CairoGeometry.h
+++ b/include/cru/platform/graphics/cairo/CairoGeometry.h
@@ -31,6 +31,10 @@ class CRU_PLATFORM_GRAPHICS_CAIRO_API CairoGeometry : public CairoResource,
class CRU_PLATFORM_GRAPHICS_CAIRO_API CairoGeometryBuilder
: public CairoResource,
public virtual IGeometryBuilder {
+ private:
+ constexpr static auto kLogTag =
+ "cru::platform::graphics::cairo::CairoGeometryBuilder";
+
public:
explicit CairoGeometryBuilder(CairoGraphicsFactory* factory);
~CairoGeometryBuilder() override;
@@ -45,7 +49,8 @@ class CRU_PLATFORM_GRAPHICS_CAIRO_API CairoGeometryBuilder
const Point& end_point) override;
void QuadraticBezierTo(const Point& control_point,
const Point& end_point) override;
-
+ void ArcTo(const Point& radius, float angle, bool is_large_arc,
+ bool is_clockwise, const Point& end_point) override;
void CloseFigure(bool close) override;
std::unique_ptr<IGeometry> Build() override;
diff --git a/include/cru/platform/graphics/quartz/Geometry.h b/include/cru/platform/graphics/quartz/Geometry.h
index e13d268e..631aa56f 100644
--- a/include/cru/platform/graphics/quartz/Geometry.h
+++ b/include/cru/platform/graphics/quartz/Geometry.h
@@ -26,6 +26,10 @@ class QuartzGeometry : public OsxQuartzResource, public virtual IGeometry {
class QuartzGeometryBuilder : public OsxQuartzResource,
public virtual IGeometryBuilder {
+ private:
+ constexpr static auto kLogTag =
+ "cru::platform::graphics::quartz::QuartzGeometryBuilder";
+
public:
explicit QuartzGeometryBuilder(IGraphicsFactory* graphics_factory);
@@ -43,6 +47,9 @@ class QuartzGeometryBuilder : public OsxQuartzResource,
const Point& end_point) override;
void QuadraticBezierTo(const Point& control_point,
const Point& end_point) override;
+ void ArcTo(const Point& radius, float angle, bool is_large_arc,
+ bool is_clockwise, const Point& end_point) override;
+
void CloseFigure(bool close) override;
std::unique_ptr<IGeometry> Build() override;