aboutsummaryrefslogtreecommitdiff
path: root/include/cru/platform
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-09-21 23:40:30 +0800
committerYuqian Yang <crupest@crupest.life>2025-09-21 23:43:31 +0800
commit6b78788d049c90dab3aec01d7bb7193f3927dc75 (patch)
tree977cfe754ccafb94e3e6743937d9132d2184df2f /include/cru/platform
parente31b0b8b37ae52e9402dc351e5fb0f361d30d0e0 (diff)
downloadcru-geo-arc.tar.gz
cru-geo-arc.tar.bz2
cru-geo-arc.zip
HALF WORK!geo-arc
Diffstat (limited to 'include/cru/platform')
-rw-r--r--include/cru/platform/GraphicsBase.h10
-rw-r--r--include/cru/platform/graphics/Geometry.h12
-rw-r--r--include/cru/platform/graphics/quartz/Geometry.h2
3 files changed, 24 insertions, 0 deletions
diff --git a/include/cru/platform/GraphicsBase.h b/include/cru/platform/GraphicsBase.h
index b0f653ef..d9057beb 100644
--- a/include/cru/platform/GraphicsBase.h
+++ b/include/cru/platform/GraphicsBase.h
@@ -5,6 +5,7 @@
#include "cru/base/Range.h"
#include "cru/base/String.h"
+#include <cmath>
#include <format>
#include <limits>
@@ -24,6 +25,11 @@ struct Point final {
constexpr Point Negate() const { return Point(-x, -y); }
+ static constexpr float Distance(const Point& p1, const Point& p2) {
+ auto dx = p1.x - p2.x, dy = p1.y - p2.y;
+ return std::sqrt(dx * dx + dy * dy);
+ }
+
float x = 0;
float y = 0;
};
@@ -36,6 +42,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);
+}
+
constexpr bool operator==(const Point& left, const Point& right) {
return left.x == right.x && left.y == right.y;
}
diff --git a/include/cru/platform/graphics/Geometry.h b/include/cru/platform/graphics/Geometry.h
index b4b05194..6550a8ce 100644
--- a/include/cru/platform/graphics/Geometry.h
+++ b/include/cru/platform/graphics/Geometry.h
@@ -63,6 +63,18 @@ struct CRU_PLATFORM_GRAPHICS_API IGeometry : virtual IGraphicsResource {
* virtual so it can override them.
*/
struct CRU_PLATFORM_GRAPHICS_API IGeometryBuilder : virtual IGraphicsResource {
+ 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/quartz/Geometry.h b/include/cru/platform/graphics/quartz/Geometry.h
index 18e2e25e..14d06deb 100644
--- a/include/cru/platform/graphics/quartz/Geometry.h
+++ b/include/cru/platform/graphics/quartz/Geometry.h
@@ -47,6 +47,8 @@ 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;