aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2023-10-09 22:58:06 +0800
committercrupest <crupest@outlook.com>2023-10-09 22:58:06 +0800
commit6fc14693d01f2be98b45d70405b16883607d4666 (patch)
treed2c540e4188abbdb3cf0c28f93942272a7bcbed7
parent78760fd8a5b310ca4e8de502e510b95c9b4c880c (diff)
downloadcru-6fc14693d01f2be98b45d70405b16883607d4666.tar.gz
cru-6fc14693d01f2be98b45d70405b16883607d4666.tar.bz2
cru-6fc14693d01f2be98b45d70405b16883607d4666.zip
...
-rw-r--r--include/cru/platform/graphics/web_canvas/WebCanvasBrush.h6
-rw-r--r--include/cru/platform/graphics/web_canvas/WebCanvasPainter.h11
-rw-r--r--src/platform/graphics/web_canvas/Brush.cpp4
-rw-r--r--src/platform/graphics/web_canvas/Painter.cpp36
4 files changed, 56 insertions, 1 deletions
diff --git a/include/cru/platform/graphics/web_canvas/WebCanvasBrush.h b/include/cru/platform/graphics/web_canvas/WebCanvasBrush.h
index 2f278fa6..72dd0723 100644
--- a/include/cru/platform/graphics/web_canvas/WebCanvasBrush.h
+++ b/include/cru/platform/graphics/web_canvas/WebCanvasBrush.h
@@ -2,12 +2,16 @@
#include "../Brush.h"
#include "WebCanvasResource.h"
+#include <emscripten/val.h>
+
namespace cru::platform::graphics::web_canvas {
class WebCanvasBrush : public WebCanvasResource, public virtual IBrush {
public:
explicit WebCanvasBrush(WebCanvasGraphicsFactory* factory);
~WebCanvasBrush() override;
+
+ virtual emscripten::val GetStyle() = 0;
};
class WebCanvasSolidColorBrush : public WebCanvasBrush,
@@ -24,6 +28,8 @@ class WebCanvasSolidColorBrush : public WebCanvasBrush,
String GetCssColor() const;
+ emscripten::val GetStyle() override;
+
private:
Color color_;
};
diff --git a/include/cru/platform/graphics/web_canvas/WebCanvasPainter.h b/include/cru/platform/graphics/web_canvas/WebCanvasPainter.h
index 1f7d21b6..0832831c 100644
--- a/include/cru/platform/graphics/web_canvas/WebCanvasPainter.h
+++ b/include/cru/platform/graphics/web_canvas/WebCanvasPainter.h
@@ -1,5 +1,7 @@
#pragma once
+#include "../Brush.h"
#include "../Painter.h"
+#include "WebCanvasBrush.h"
#include "WebCanvasRef.h"
#include "WebCanvasResource.h"
@@ -30,9 +32,18 @@ class WebCanvasPainter : public WebCanvasResource, public virtual IPainter {
void Clear(const Color& color) override;
+ void DrawLine(const Point& start, const Point& end, IBrush* brush,
+ float width) override;
+
emscripten::val GetCanvas2DContext() const { return context_; }
WebCanvasRef GetCanvas();
+ void SetStrokeStyle(IBrush* brush, float width = 0.0f);
+ void SetFillStyle(IBrush* brush);
+
+ private:
+ WebCanvasBrush* ConvertBrush(IBrush* brush) const;
+
private:
Matrix current_transform_;
emscripten::val context_;
diff --git a/src/platform/graphics/web_canvas/Brush.cpp b/src/platform/graphics/web_canvas/Brush.cpp
index 1c192b75..b86eb6a5 100644
--- a/src/platform/graphics/web_canvas/Brush.cpp
+++ b/src/platform/graphics/web_canvas/Brush.cpp
@@ -20,4 +20,8 @@ String WebCanvasSolidColorBrush::GetCssColor() const {
return color_.ToString();
}
+emscripten::val WebCanvasSolidColorBrush::GetStyle() {
+ return emscripten::val::u16string(color_.ToString().c_str());
+}
+
} // namespace cru::platform::graphics::web_canvas
diff --git a/src/platform/graphics/web_canvas/Painter.cpp b/src/platform/graphics/web_canvas/Painter.cpp
index 31c4a53d..a78ab9f1 100644
--- a/src/platform/graphics/web_canvas/Painter.cpp
+++ b/src/platform/graphics/web_canvas/Painter.cpp
@@ -1,3 +1,6 @@
+#include "cru/platform/Check.h"
+#include "cru/platform/graphics/Brush.h"
+#include "cru/platform/graphics/web_canvas/WebCanvasBrush.h"
#include "cru/platform/graphics/web_canvas/WebCanvasGraphicsFactory.h"
#include "cru/platform/graphics/web_canvas/WebCanvasPainter.h"
#include "cru/platform/graphics/web_canvas/WebCanvasRef.h"
@@ -38,7 +41,38 @@ void WebCanvasPainter::ConcatTransform(const Matrix& transform) {
contextDoTransform(context_, "transform", transform);
}
-void WebCanvasPainter::Clear(const Color& color) {}
+void WebCanvasPainter::Clear(const Color& color) {
+ auto canvas = GetCanvas();
+ auto canvas_width = canvas.GetWidth();
+ auto canvas_height = canvas.GetHeight();
+
+ context_.set("fillStyle", color.ToString());
+ context_.call<void>("fillRect", 0, 0, canvas_width, canvas_height);
+}
+
+void WebCanvasPainter::DrawLine(const Point& start, const Point& end,
+ IBrush* brush, float width) {
+ SetStrokeStyle(brush, width);
+ context_.call<void>("beginPath");
+ context_.call<void>("moveTo", start.x, start.y);
+ context_.call<void>("lineTo", end.x, end.y);
+ context_.call<void>("stroke");
+}
+
+void WebCanvasPainter::SetStrokeStyle(IBrush* brush, float width) {
+ context_.set("strokeStyle", ConvertBrush(brush)->GetStyle());
+ if (width > 0) {
+ context_.set("lineWidth", width);
+ }
+}
+
+void WebCanvasPainter::SetFillStyle(IBrush* brush) {
+ context_.set("fillStyle", ConvertBrush(brush)->GetStyle());
+}
+
+WebCanvasBrush* WebCanvasPainter::ConvertBrush(IBrush* brush) const {
+ return CheckPlatform<WebCanvasBrush>(brush, GetPlatformId());
+}
WebCanvasRef WebCanvasPainter::GetCanvas() {
return WebCanvasRef(context_["canvas"]);