diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/cru/platform/graphics/Geometry.h | 46 | ||||
-rw-r--r-- | include/cru/platform/graphics/SvgGeometry.h | 10 | ||||
-rw-r--r-- | include/cru/platform/graphics/web_canvas/WebCanvasGeometry.h | 27 | ||||
-rw-r--r-- | include/cru/platform/graphics/web_canvas/WebCanvasPainter.h | 8 | ||||
-rw-r--r-- | include/cru/platform/web/Js.h | 17 | ||||
-rw-r--r-- | include/cru/platform/web/JsUtility.h | 9 |
6 files changed, 83 insertions, 34 deletions
diff --git a/include/cru/platform/graphics/Geometry.h b/include/cru/platform/graphics/Geometry.h index d1045b59..112c95e6 100644 --- a/include/cru/platform/graphics/Geometry.h +++ b/include/cru/platform/graphics/Geometry.h @@ -17,49 +17,45 @@ struct CRU_PLATFORM_GRAPHICS_API IGeometry : virtual IGraphicsResource { virtual std::unique_ptr<IGeometry> CreateStrokeGeometry(float width) = 0; }; +/** + * \remarks We always run into platform porting problems. When I designed this + * interface, I thought every platform would support GetCurrentPosition. + * However, this is not actually true. + * For web canvas, it turns out that it can't get current position. So I have to + * not implement or use it, which disables every relative actions because they + * depend on it. But luckily, the web canvas path can be constructed from svg + * path (see https://developer.mozilla.org/en-US/docs/Web/API/Path2D/Path2D). So + * I come up with a new idea that first create a geometry describe itself in + * svg, and then construct path from it. And all relative methods should become + * virtual so it can override them. + */ struct CRU_PLATFORM_GRAPHICS_API IGeometryBuilder : virtual IGraphicsResource { virtual Point GetCurrentPosition() = 0; virtual void MoveTo(const Point& point) = 0; - void RelativeMoveTo(const Point& offset) { - MoveTo(GetCurrentPosition() + offset); - } + virtual void RelativeMoveTo(const Point& offset); virtual void LineTo(const Point& point) = 0; void LineTo(float x, float y) { LineTo(Point(x, y)); } - void RelativeLineTo(const Point& offset) { - LineTo(GetCurrentPosition() + offset); - } + virtual void RelativeLineTo(const Point& offset); void RelativeLineTo(float x, float y) { RelativeLineTo(Point(x, y)); } virtual void CubicBezierTo(const Point& start_control_point, const Point& end_control_point, const Point& end_point) = 0; - void RelativeCubicBezierTo(const Point& start_control_offset, - const Point& end_control_offset, - const Point& end_offset) { - auto current_position = GetCurrentPosition(); - CubicBezierTo(current_position + start_control_offset, - current_position + end_control_offset, - current_position + end_offset); - } + virtual void RelativeCubicBezierTo(const Point& start_control_offset, + const Point& end_control_offset, + const Point& end_offset); virtual void QuadraticBezierTo(const Point& control_point, const Point& end_point) = 0; - void RelativeQuadraticBezierTo(const Point& control_offset, - const Point& end_offset) { - auto current_position = GetCurrentPosition(); - QuadraticBezierTo(current_position + control_offset, - current_position + end_offset); - } + virtual void RelativeQuadraticBezierTo(const Point& control_offset, + const Point& end_offset); virtual void ArcTo(const Point& radius, float angle, bool is_large_arc, bool is_clockwise, const Point& end_point); - void RelativeArcTo(const Point& radius, float angle, bool is_large_arc, - bool is_clockwise, const Point& end_offset) { - ArcTo(radius, angle, is_large_arc, is_clockwise, - GetCurrentPosition() + end_offset); - } + virtual void RelativeArcTo(const Point& radius, float angle, bool is_large_arc, + bool is_clockwise, const Point& end_offset); virtual void CloseFigure(bool close) = 0; diff --git a/include/cru/platform/graphics/SvgGeometry.h b/include/cru/platform/graphics/SvgGeometry.h new file mode 100644 index 00000000..281158f0 --- /dev/null +++ b/include/cru/platform/graphics/SvgGeometry.h @@ -0,0 +1,10 @@ +#pragma once + +#include "Geometry.h" + +namespace cru::platform::graphics { +class CRU_PLATFORM_GRAPHICS_API SvgGeometryBuilder : public virtual IGeometryBuilder { + +}; +} + diff --git a/include/cru/platform/graphics/web_canvas/WebCanvasGeometry.h b/include/cru/platform/graphics/web_canvas/WebCanvasGeometry.h new file mode 100644 index 00000000..af4cee91 --- /dev/null +++ b/include/cru/platform/graphics/web_canvas/WebCanvasGeometry.h @@ -0,0 +1,27 @@ +#pragma once + +#include "../Geometry.h" +#include "WebCanvasResource.h" + +#include <emscripten/val.h> + +namespace cru::platform::graphics::web_canvas { +/** + * \remarks See IGeometryBuilder for platform limitation. + */ +class WebCanvasGeometryBuilder : public WebCanvasResource, + public virtual IGeometryBuilder { + public: + WebCanvasGeometryBuilder(WebCanvasGraphicsFactory* factory); + + ~WebCanvasGeometryBuilder() override; + + Point GetCurrentPosition() override; + + void MoveTo(const Point& point) override; + + private: + Point current_postion_; + emscripten::val path2d_; +}; +} // namespace cru::platform::graphics::web_canvas diff --git a/include/cru/platform/graphics/web_canvas/WebCanvasPainter.h b/include/cru/platform/graphics/web_canvas/WebCanvasPainter.h index 0832831c..bb092f2f 100644 --- a/include/cru/platform/graphics/web_canvas/WebCanvasPainter.h +++ b/include/cru/platform/graphics/web_canvas/WebCanvasPainter.h @@ -35,6 +35,14 @@ class WebCanvasPainter : public WebCanvasResource, public virtual IPainter { void DrawLine(const Point& start, const Point& end, IBrush* brush, float width) override; + void StrokeRectangle(const Rect& rectangle, IBrush* brush, + float width) override; + + void FillRectangle(const Rect& rectangle, IBrush* brush) override; + void StrokeEllipse(const Rect& outline_rect, IBrush* brush, + float width) override; + void FillEllipse(const Rect& outline_rect, IBrush* brush) override; + emscripten::val GetCanvas2DContext() const { return context_; } WebCanvasRef GetCanvas(); diff --git a/include/cru/platform/web/Js.h b/include/cru/platform/web/Js.h new file mode 100644 index 00000000..b4c91702 --- /dev/null +++ b/include/cru/platform/web/Js.h @@ -0,0 +1,17 @@ +#pragma once + +#include <emscripten/val.h> +#include <utility> + +namespace cru::platform::web::js { +bool IsNotNullAndInstanceOf(const emscripten::val& value, + const emscripten::val& type); +bool IsNotNullAndInstanceOf(const emscripten::val& value, + const char* global_type); + +template <typename... Args> +emscripten::val Construct(const char* class_name, Args&&... args) { + emscripten::val constructor = emscripten::val::global(class_name); + return constructor.new_(std::forward<Args>(args)...); +} +} // namespace cru::platform::web diff --git a/include/cru/platform/web/JsUtility.h b/include/cru/platform/web/JsUtility.h deleted file mode 100644 index 37c2735d..00000000 --- a/include/cru/platform/web/JsUtility.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include <emscripten/val.h> - -namespace cru::platform::web { - bool IsNotNullAndInstanceOf(const emscripten::val& value, const emscripten::val& type); - bool IsNotNullAndInstanceOf(const emscripten::val& value, const char* global_type); -} - |