aboutsummaryrefslogtreecommitdiff
path: root/include/cru/platform/graphics/SvgGeometryBuilderMixin.h
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2023-10-12 21:21:26 +0800
committercrupest <crupest@outlook.com>2023-10-12 21:21:26 +0800
commit3c5aa6583d7ab2533ff721282d1efd52d07281c7 (patch)
treec545f412e970f96c8314300672dfa3b3217dbd1f /include/cru/platform/graphics/SvgGeometryBuilderMixin.h
parentab484b2f0a8541cc5c5a172e4f5ea2620d91c8ba (diff)
downloadcru-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.h68
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