aboutsummaryrefslogtreecommitdiff
path: root/src/platform/graphics/SvgGeometryBuilderMixin.cpp
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 /src/platform/graphics/SvgGeometryBuilderMixin.cpp
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 'src/platform/graphics/SvgGeometryBuilderMixin.cpp')
-rw-r--r--src/platform/graphics/SvgGeometryBuilderMixin.cpp121
1 files changed, 121 insertions, 0 deletions
diff --git a/src/platform/graphics/SvgGeometryBuilderMixin.cpp b/src/platform/graphics/SvgGeometryBuilderMixin.cpp
new file mode 100644
index 00000000..1f868f44
--- /dev/null
+++ b/src/platform/graphics/SvgGeometryBuilderMixin.cpp
@@ -0,0 +1,121 @@
+#include "cru/platform/graphics/SvgGeometryBuilderMixin.h"
+#include "cru/platform/Exception.h"
+
+namespace cru::platform::graphics {
+SvgGeometryBuilderMixin::SvgGeometryBuilderMixin() {}
+
+SvgGeometryBuilderMixin::~SvgGeometryBuilderMixin() {}
+
+Point SvgGeometryBuilderMixin::GetCurrentPosition() {
+ throw PlatformUnsupportedException(
+ GetPlatformId(), u"GetCurrentPosition",
+ u"Svg-based geometry does not support get current position.");
+}
+
+void SvgGeometryBuilderMixin::MoveTo(const Point& point) {
+ AppendCommand(u"M");
+ Append(point);
+}
+
+void SvgGeometryBuilderMixin::RelativeMoveTo(const Point& offset) {
+ AppendCommand(u"m");
+ Append(offset);
+}
+
+void SvgGeometryBuilderMixin::LineTo(const Point& point) {
+ AppendCommand(u"L");
+ Append(point);
+}
+
+void SvgGeometryBuilderMixin::RelativeLineTo(const Point& offset) {
+ AppendCommand(u"l");
+ Append(offset);
+}
+
+void SvgGeometryBuilderMixin::CubicBezierTo(const Point& start_control_point,
+ const Point& end_control_point,
+ const Point& end_point) {
+ AppendCommand(u"C");
+ Append(start_control_point);
+ Append(end_control_point);
+ Append(end_point);
+}
+
+void SvgGeometryBuilderMixin::RelativeCubicBezierTo(
+ const Point& start_control_offset, const Point& end_control_offset,
+ const Point& end_offset) {
+ AppendCommand(u"c");
+ Append(start_control_offset);
+ Append(end_control_offset);
+ Append(end_offset);
+}
+
+void SvgGeometryBuilderMixin::QuadraticBezierTo(const Point& control_point,
+ const Point& end_point) {
+ AppendCommand(u"Q");
+ Append(control_point);
+ Append(end_point);
+}
+
+void SvgGeometryBuilderMixin::RelativeQuadraticBezierTo(
+ const Point& control_offset, const Point& end_offset) {
+ AppendCommand(u"q");
+ Append(control_offset);
+ Append(end_offset);
+}
+
+void SvgGeometryBuilderMixin::ArcTo(const Point& radius, float angle,
+ bool is_large_arc, bool is_clockwise,
+ const Point& end_point) {
+ AppendCommand(u"A");
+ Append(radius.x);
+ Append(radius.y);
+ Append(angle);
+ Append(is_large_arc);
+ Append(is_clockwise);
+ Append(end_point);
+}
+
+void SvgGeometryBuilderMixin::RelativeArcTo(const Point& radius, float angle,
+ bool is_large_arc,
+ bool is_clockwise,
+ const Point& end_offset) {
+ AppendCommand(u"a");
+ Append(radius.x);
+ Append(radius.y);
+ Append(angle);
+ Append(is_large_arc);
+ Append(is_clockwise);
+ Append(end_offset);
+}
+
+void SvgGeometryBuilderMixin::CloseFigure(bool close) {
+ if (close) AppendCommand(u"z");
+}
+
+void SvgGeometryBuilderMixin::ParseAndApplySvgPathData(StringView path_d) {
+ AppendCommand(path_d);
+}
+
+void SvgGeometryBuilderMixin::AppendCommand(StringView command) {
+ current_ += command;
+ current_ += u' ';
+}
+
+void SvgGeometryBuilderMixin::Append(bool flag) {
+ current_ += flag ? u'1' : u'0';
+ current_ += u' ';
+}
+
+void SvgGeometryBuilderMixin::Append(float number) {
+ current_ += ToString(number);
+ current_ += u' ';
+}
+
+void SvgGeometryBuilderMixin::Append(const Point& point) {
+ current_ += ToString(point.x);
+ current_ += u',';
+ current_ += ToString(point.y);
+ current_ += u' ';
+}
+} // namespace cru::platform::graphics