diff options
Diffstat (limited to 'include/cru/platform/graphics/Geometry.h')
-rw-r--r-- | include/cru/platform/graphics/Geometry.h | 46 |
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; |