diff options
Diffstat (limited to 'include/cru/platform')
| -rw-r--r-- | include/cru/platform/GraphicsBase.h | 10 | ||||
| -rw-r--r-- | include/cru/platform/graphics/Geometry.h | 16 | ||||
| -rw-r--r-- | include/cru/platform/graphics/cairo/CairoGeometry.h | 7 | ||||
| -rw-r--r-- | include/cru/platform/graphics/quartz/Geometry.h | 7 |
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; |
