diff options
Diffstat (limited to 'include/cru/platform/graphics/SvgGeometryBuilderMixin.h')
-rw-r--r-- | include/cru/platform/graphics/SvgGeometryBuilderMixin.h | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/include/cru/platform/graphics/SvgGeometryBuilderMixin.h b/include/cru/platform/graphics/SvgGeometryBuilderMixin.h new file mode 100644 index 00000000..d516ce6c --- /dev/null +++ b/include/cru/platform/graphics/SvgGeometryBuilderMixin.h @@ -0,0 +1,68 @@ +#pragma once + +#include "Geometry.h" +#include "cru/common/Format.h" + +#include <utility> + +namespace cru::platform::graphics { +/** + * \remarks This class is a helper mixin for some platforms, especially web + * canvas. It constructs a svg data by recording commands. Use GetPathData to + * get svg path data and use it to build real geometry. + */ +class CRU_PLATFORM_GRAPHICS_API SvgGeometryBuilderMixin + : public virtual IGeometryBuilder { + public: + SvgGeometryBuilderMixin(); + + ~SvgGeometryBuilderMixin() override; + + Point GetCurrentPosition() override; + + void MoveTo(const Point& point) override; + void RelativeMoveTo(const Point& offset) override; + + void LineTo(const Point& point) override; + void RelativeLineTo(const Point& offset) override; + + void CubicBezierTo(const Point& start_control_point, + const Point& end_control_point, + const Point& end_point) override; + void RelativeCubicBezierTo(const Point& start_control_offset, + const Point& end_control_offset, + const Point& end_offset) override; + + void QuadraticBezierTo(const Point& control_point, + const Point& end_point) override; + void RelativeQuadraticBezierTo(const Point& control_offset, + const Point& end_offset) override; + + void ArcTo(const Point& radius, float angle, bool is_large_arc, + bool is_clockwise, const Point& end_point) override; + void RelativeArcTo(const Point& radius, float angle, bool is_large_arc, + bool is_clockwise, const Point& end_offset) override; + + void CloseFigure(bool close) override; + + void ParseAndApplySvgPathData(StringView path_d) override; + + protected: + String GetPathData() const { return current_; } + + private: + template <typename... Args> + void Append(StringView format, Args&&... args) { + current_ += Format(format, std::forward<Args>(args)...); + current_ += u' '; + } + + void AppendCommand(StringView command); + void Append(bool flag); + void Append(float number); + void Append(const Point& point); + + private: + String current_; +}; +} // namespace cru::platform::graphics |