aboutsummaryrefslogtreecommitdiff
path: root/include/cru/platform/graphics/Geometry.h
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2023-10-12 17:10:18 +0800
committercrupest <crupest@outlook.com>2023-10-12 17:10:18 +0800
commit9a077caa6d3f7eb8255ae68916dccac9b50a4333 (patch)
tree486f5f01d5de8ff1b236029e1b955df1d70728a8 /include/cru/platform/graphics/Geometry.h
parent6fc14693d01f2be98b45d70405b16883607d4666 (diff)
downloadcru-9a077caa6d3f7eb8255ae68916dccac9b50a4333.tar.gz
cru-9a077caa6d3f7eb8255ae68916dccac9b50a4333.tar.bz2
cru-9a077caa6d3f7eb8255ae68916dccac9b50a4333.zip
...
Diffstat (limited to 'include/cru/platform/graphics/Geometry.h')
-rw-r--r--include/cru/platform/graphics/Geometry.h46
1 files changed, 21 insertions, 25 deletions
diff --git a/include/cru/platform/graphics/Geometry.h b/include/cru/platform/graphics/Geometry.h
index d1045b59..112c95e6 100644
--- a/include/cru/platform/graphics/Geometry.h
+++ b/include/cru/platform/graphics/Geometry.h
@@ -17,49 +17,45 @@ struct CRU_PLATFORM_GRAPHICS_API IGeometry : virtual IGraphicsResource {
virtual std::unique_ptr<IGeometry> CreateStrokeGeometry(float width) = 0;
};
+/**
+ * \remarks We always run into platform porting problems. When I designed this
+ * interface, I thought every platform would support GetCurrentPosition.
+ * However, this is not actually true.
+ * For web canvas, it turns out that it can't get current position. So I have to
+ * not implement or use it, which disables every relative actions because they
+ * depend on it. But luckily, the web canvas path can be constructed from svg
+ * path (see https://developer.mozilla.org/en-US/docs/Web/API/Path2D/Path2D). So
+ * I come up with a new idea that first create a geometry describe itself in
+ * svg, and then construct path from it. And all relative methods should become
+ * virtual so it can override them.
+ */
struct CRU_PLATFORM_GRAPHICS_API IGeometryBuilder : virtual IGraphicsResource {
virtual Point GetCurrentPosition() = 0;
virtual void MoveTo(const Point& point) = 0;
- void RelativeMoveTo(const Point& offset) {
- MoveTo(GetCurrentPosition() + offset);
- }
+ virtual void RelativeMoveTo(const Point& offset);
virtual void LineTo(const Point& point) = 0;
void LineTo(float x, float y) { LineTo(Point(x, y)); }
- void RelativeLineTo(const Point& offset) {
- LineTo(GetCurrentPosition() + offset);
- }
+ virtual void RelativeLineTo(const Point& offset);
void RelativeLineTo(float x, float y) { RelativeLineTo(Point(x, y)); }
virtual void CubicBezierTo(const Point& start_control_point,
const Point& end_control_point,
const Point& end_point) = 0;
- void RelativeCubicBezierTo(const Point& start_control_offset,
- const Point& end_control_offset,
- const Point& end_offset) {
- auto current_position = GetCurrentPosition();
- CubicBezierTo(current_position + start_control_offset,
- current_position + end_control_offset,
- current_position + end_offset);
- }
+ virtual void RelativeCubicBezierTo(const Point& start_control_offset,
+ const Point& end_control_offset,
+ const Point& end_offset);
virtual void QuadraticBezierTo(const Point& control_point,
const Point& end_point) = 0;
- void RelativeQuadraticBezierTo(const Point& control_offset,
- const Point& end_offset) {
- auto current_position = GetCurrentPosition();
- QuadraticBezierTo(current_position + control_offset,
- current_position + end_offset);
- }
+ virtual void RelativeQuadraticBezierTo(const Point& control_offset,
+ const Point& end_offset);
virtual void ArcTo(const Point& radius, float angle, bool is_large_arc,
bool is_clockwise, const Point& end_point);
- void RelativeArcTo(const Point& radius, float angle, bool is_large_arc,
- bool is_clockwise, const Point& end_offset) {
- ArcTo(radius, angle, is_large_arc, is_clockwise,
- GetCurrentPosition() + end_offset);
- }
+ virtual void RelativeArcTo(const Point& radius, float angle, bool is_large_arc,
+ bool is_clockwise, const Point& end_offset);
virtual void CloseFigure(bool close) = 0;