aboutsummaryrefslogtreecommitdiff
path: root/src/platform
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
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')
-rw-r--r--src/platform/graphics/CMakeLists.txt2
-rw-r--r--src/platform/graphics/Geometry.cpp8
-rw-r--r--src/platform/graphics/SvgGeometry.cpp127
-rw-r--r--src/platform/graphics/SvgGeometryBuilderMixin.cpp121
-rw-r--r--src/platform/graphics/web_canvas/Geometry.cpp8
5 files changed, 135 insertions, 131 deletions
diff --git a/src/platform/graphics/CMakeLists.txt b/src/platform/graphics/CMakeLists.txt
index 1b24c22b..43ef80e0 100644
--- a/src/platform/graphics/CMakeLists.txt
+++ b/src/platform/graphics/CMakeLists.txt
@@ -3,7 +3,7 @@ add_library(CruPlatformGraphics
Geometry.cpp
Image.cpp
NullPainter.cpp
- SvgGeometry.cpp
+ SvgGeometryBuilderMixin.cpp
)
target_compile_definitions(CruPlatformGraphics PRIVATE CRU_PLATFORM_GRAPHICS_EXPORT_API)
target_link_libraries(CruPlatformGraphics PUBLIC CruPlatformBase)
diff --git a/src/platform/graphics/Geometry.cpp b/src/platform/graphics/Geometry.cpp
index b6f2a724..0c98b456 100644
--- a/src/platform/graphics/Geometry.cpp
+++ b/src/platform/graphics/Geometry.cpp
@@ -1,6 +1,7 @@
#include "cru/platform/graphics/Geometry.h"
#include "cru/common/Exception.h"
+#include "cru/platform/Exception.h"
#include "cru/platform/graphics/Factory.h"
#include <cmath>
@@ -12,6 +13,13 @@ bool IGeometry::StrokeContains(float width, const Point& point) {
return geometry->FillContains(point);
}
+std::unique_ptr<IGeometry> IGeometry::CreateStrokeGeometry(
+ [[maybe_unused]] float width) {
+ throw PlatformUnsupportedException(GetPlatformId(), u"CreateStrokeGeometry",
+ u"Create stroke geometry of a geometry is "
+ u"not supported on this platform.");
+}
+
void IGeometryBuilder::RelativeMoveTo(const Point& offset) {
MoveTo(GetCurrentPosition() + offset);
}
diff --git a/src/platform/graphics/SvgGeometry.cpp b/src/platform/graphics/SvgGeometry.cpp
deleted file mode 100644
index 20ef1b56..00000000
--- a/src/platform/graphics/SvgGeometry.cpp
+++ /dev/null
@@ -1,127 +0,0 @@
-#include "cru/platform/graphics/SvgGeometry.h"
-#include "cru/platform/Exception.h"
-#include "cru/platform/graphics/Geometry.h"
-
-namespace cru::platform::graphics {
-SvgGeometryBuilder::SvgGeometryBuilder() {}
-
-SvgGeometryBuilder::~SvgGeometryBuilder() {}
-
-Point SvgGeometryBuilder::GetCurrentPosition() {
- throw PlatformUnsupportedException(
- GetPlatformId(), u"GetCurrentPosition",
- u"Svg geometry does not support get current position.");
-}
-
-void SvgGeometryBuilder::MoveTo(const Point& point) {
- AppendCommand(u"M");
- Append(point);
-}
-
-void SvgGeometryBuilder::RelativeMoveTo(const Point& offset) {
- AppendCommand(u"m");
- Append(offset);
-}
-
-void SvgGeometryBuilder::LineTo(const Point& point) {
- AppendCommand(u"L");
- Append(point);
-}
-
-void SvgGeometryBuilder::RelativeLineTo(const Point& offset) {
- AppendCommand(u"l");
- Append(offset);
-}
-
-void SvgGeometryBuilder::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 SvgGeometryBuilder::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 SvgGeometryBuilder::QuadraticBezierTo(const Point& control_point,
- const Point& end_point) {
- AppendCommand(u"Q");
- Append(control_point);
- Append(end_point);
-}
-
-void SvgGeometryBuilder::RelativeQuadraticBezierTo(const Point& control_offset,
- const Point& end_offset) {
- AppendCommand(u"q");
- Append(control_offset);
- Append(end_offset);
-}
-
-void SvgGeometryBuilder::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 SvgGeometryBuilder::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 SvgGeometryBuilder::CloseFigure(bool close) {
- if (close) AppendCommand(u"z");
-}
-
-std::unique_ptr<IGeometry> SvgGeometryBuilder::Build() {
- throw PlatformUnsupportedException(
- u"SvgGeometryBuilder", u"Build",
- u"SvgGeometryBuilder can't build a Geometry. Use GetPathData instead.");
-}
-
-void SvgGeometryBuilder::ParseAndApplySvgPathData(StringView path_d) {
- AppendCommand(path_d);
-}
-
-void SvgGeometryBuilder::AppendCommand(StringView command) {
- current_ += command;
- current_ += u' ';
-}
-
-void SvgGeometryBuilder::Append(bool flag) {
- current_ += flag ? u'1' : u'0';
- current_ += u' ';
-}
-
-void SvgGeometryBuilder::Append(float number) {
- current_ += ToString(number);
- current_ += u' ';
-}
-
-void SvgGeometryBuilder::Append(const Point& point) {
- current_ += ToString(point.x);
- current_ += u',';
- current_ += ToString(point.y);
- current_ += u' ';
-}
-} // namespace cru::platform::graphics
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
diff --git a/src/platform/graphics/web_canvas/Geometry.cpp b/src/platform/graphics/web_canvas/Geometry.cpp
index eb4ce84e..0f2f5a16 100644
--- a/src/platform/graphics/web_canvas/Geometry.cpp
+++ b/src/platform/graphics/web_canvas/Geometry.cpp
@@ -4,9 +4,11 @@
#include "cru/platform/web/Js.h"
namespace cru::platform::graphics::web_canvas {
+bool WebCanvasGeometry::StrokeContains(float width, const Point& point) {}
+
WebCanvasGeometryBuilder::WebCanvasGeometryBuilder(
WebCanvasGraphicsFactory* factory)
- : WebCanvasResource(factory) {
- path2d_ = web::js::Construct("Path2D");
-}
+ : WebCanvasResource(factory) {}
+
+WebCanvasGeometryBuilder::~WebCanvasGeometryBuilder() {}
} // namespace cru::platform::graphics::web_canvas