diff options
author | crupest <crupest@outlook.com> | 2023-10-12 21:21:26 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2023-10-12 21:21:26 +0800 |
commit | 3c5aa6583d7ab2533ff721282d1efd52d07281c7 (patch) | |
tree | c545f412e970f96c8314300672dfa3b3217dbd1f /include/cru/platform/graphics/SvgGeometryBuilderMixin.h | |
parent | ab484b2f0a8541cc5c5a172e4f5ea2620d91c8ba (diff) | |
download | cru-3c5aa6583d7ab2533ff721282d1efd52d07281c7.tar.gz cru-3c5aa6583d7ab2533ff721282d1efd52d07281c7.tar.bz2 cru-3c5aa6583d7ab2533ff721282d1efd52d07281c7.zip |
Make svg geometry builder a mixin. Record a lot of notes for geometry.
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 |