diff options
author | crupest <crupest@outlook.com> | 2023-10-09 22:25:54 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2023-10-09 22:25:54 +0800 |
commit | 78760fd8a5b310ca4e8de502e510b95c9b4c880c (patch) | |
tree | d53da9e28decf583d027cc8eb023c591e02ee73f | |
parent | 1907d4fffd24e6d6bd1b7db7d903da60e53888dc (diff) | |
download | cru-78760fd8a5b310ca4e8de502e510b95c9b4c880c.tar.gz cru-78760fd8a5b310ca4e8de502e510b95c9b4c880c.tar.bz2 cru-78760fd8a5b310ca4e8de502e510b95c9b4c880c.zip |
...
-rw-r--r-- | include/cru/platform/graphics/web_canvas/WebCanvasPainter.h | 16 | ||||
-rw-r--r-- | include/cru/platform/graphics/web_canvas/WebCanvasRef.h | 24 | ||||
-rw-r--r-- | include/cru/platform/web/JsUtility.h | 9 | ||||
-rw-r--r-- | src/platform/graphics/web_canvas/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/platform/graphics/web_canvas/Factory.cpp | 7 | ||||
-rw-r--r-- | src/platform/graphics/web_canvas/Painter.cpp | 23 | ||||
-rw-r--r-- | src/platform/graphics/web_canvas/WebCanvasRef.cpp | 16 | ||||
-rw-r--r-- | src/platform/web/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/platform/web/JsUtility.cpp | 11 |
9 files changed, 103 insertions, 5 deletions
diff --git a/include/cru/platform/graphics/web_canvas/WebCanvasPainter.h b/include/cru/platform/graphics/web_canvas/WebCanvasPainter.h index cd885aa4..1f7d21b6 100644 --- a/include/cru/platform/graphics/web_canvas/WebCanvasPainter.h +++ b/include/cru/platform/graphics/web_canvas/WebCanvasPainter.h @@ -1,11 +1,20 @@ #pragma once #include "../Painter.h" +#include "WebCanvasRef.h" #include "WebCanvasResource.h" #include <emscripten/val.h> #include <optional> namespace cru::platform::graphics::web_canvas { +/** + * Notes about Transform: + * Although there is a Matrix object now supported by browsers, it is not + * generally available in old browsers. However, now that we are using + * WebAssembly, the browsers should be quite up to date, but there is still a + * window between the two things. And it is common for a platform to not support + * getting transform and only allow you to do transformation. + */ class WebCanvasPainter : public WebCanvasResource, public virtual IPainter { public: WebCanvasPainter(WebCanvasGraphicsFactory* factory, emscripten::val context, @@ -17,6 +26,13 @@ class WebCanvasPainter : public WebCanvasResource, public virtual IPainter { Matrix GetTransform() override; void SetTransform(const Matrix& transform) override; + void ConcatTransform(const Matrix& matrix) override; + + void Clear(const Color& color) override; + + emscripten::val GetCanvas2DContext() const { return context_; } + WebCanvasRef GetCanvas(); + private: Matrix current_transform_; emscripten::val context_; diff --git a/include/cru/platform/graphics/web_canvas/WebCanvasRef.h b/include/cru/platform/graphics/web_canvas/WebCanvasRef.h new file mode 100644 index 00000000..4cb960bd --- /dev/null +++ b/include/cru/platform/graphics/web_canvas/WebCanvasRef.h @@ -0,0 +1,24 @@ +#pragma once + +#include "cru/common/Base.h" + +#include <emscripten/val.h> + +namespace cru::platform::graphics::web_canvas { + class WebCanvasRef { + public: + explicit WebCanvasRef(emscripten::val canvas_val); + + CRU_DEFAULT_COPY(WebCanvasRef) + CRU_DEFAULT_MOVE(WebCanvasRef) + + CRU_DEFAULT_DESTRUCTOR(WebCanvasRef) + + public: + int GetWidth() const; + int GetHeight() const; + + private: + emscripten::val val_; + }; +} diff --git a/include/cru/platform/web/JsUtility.h b/include/cru/platform/web/JsUtility.h new file mode 100644 index 00000000..37c2735d --- /dev/null +++ b/include/cru/platform/web/JsUtility.h @@ -0,0 +1,9 @@ +#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); +} + diff --git a/src/platform/graphics/web_canvas/CMakeLists.txt b/src/platform/graphics/web_canvas/CMakeLists.txt index 6edc2edb..bbf736e0 100644 --- a/src/platform/graphics/web_canvas/CMakeLists.txt +++ b/src/platform/graphics/web_canvas/CMakeLists.txt @@ -3,6 +3,7 @@ add_library(CruPlatformGraphicsWebCanvas Factory.cpp Painter.cpp Resource.cpp + WebCanvasRef.cpp ) target_link_libraries(CruPlatformGraphicsWebCanvas PUBLIC CruPlatformBaseWeb CruPlatformGraphics) diff --git a/src/platform/graphics/web_canvas/Factory.cpp b/src/platform/graphics/web_canvas/Factory.cpp index e69de29b..be14ae18 100644 --- a/src/platform/graphics/web_canvas/Factory.cpp +++ b/src/platform/graphics/web_canvas/Factory.cpp @@ -0,0 +1,7 @@ +#include "cru/platform/graphics/web_canvas/WebCanvasGraphicsFactory.h" + +namespace cru::platform::graphics::web_canvas { +WebCanvasGraphicsFactory::WebCanvasGraphicsFactory() { } + +WebCanvasGraphicsFactory::~WebCanvasGraphicsFactory() { } +} diff --git a/src/platform/graphics/web_canvas/Painter.cpp b/src/platform/graphics/web_canvas/Painter.cpp index cd04a725..31c4a53d 100644 --- a/src/platform/graphics/web_canvas/Painter.cpp +++ b/src/platform/graphics/web_canvas/Painter.cpp @@ -1,5 +1,6 @@ #include "cru/platform/graphics/web_canvas/WebCanvasGraphicsFactory.h" #include "cru/platform/graphics/web_canvas/WebCanvasPainter.h" +#include "cru/platform/graphics/web_canvas/WebCanvasRef.h" #include "cru/platform/graphics/web_canvas/WebCanvasResource.h" #include <optional> @@ -7,9 +8,10 @@ namespace cru::platform::graphics::web_canvas { namespace { -void contextSetTransform(emscripten::val context, const Matrix& matrix) { - context.call<void>("setTransform", matrix.m11, matrix.m12, matrix.m21, - matrix.m22, matrix.m31, matrix.m32); +void contextDoTransform(emscripten::val context, const char* method, + const Matrix& matrix) { + context.call<void>(method, matrix.m11, matrix.m12, matrix.m21, matrix.m22, + matrix.m31, matrix.m32); } } // namespace @@ -19,7 +21,7 @@ WebCanvasPainter::WebCanvasPainter(WebCanvasGraphicsFactory* factory, : WebCanvasResource(factory), context_(context), current_transform_(current_transform.value_or(Matrix::Identity())) { - contextSetTransform(context_, current_transform_); + contextDoTransform(context_, "setTransform", current_transform_); } WebCanvasPainter::~WebCanvasPainter() {} @@ -28,6 +30,17 @@ Matrix WebCanvasPainter::GetTransform() { return current_transform_; } void WebCanvasPainter::SetTransform(const Matrix& transform) { current_transform_ = transform; - contextSetTransform(context_, transform); + contextDoTransform(context_, "setTransform", current_transform_); +} + +void WebCanvasPainter::ConcatTransform(const Matrix& transform) { + current_transform_ *= transform; + contextDoTransform(context_, "transform", transform); +} + +void WebCanvasPainter::Clear(const Color& color) {} + +WebCanvasRef WebCanvasPainter::GetCanvas() { + return WebCanvasRef(context_["canvas"]); } } // namespace cru::platform::graphics::web_canvas diff --git a/src/platform/graphics/web_canvas/WebCanvasRef.cpp b/src/platform/graphics/web_canvas/WebCanvasRef.cpp new file mode 100644 index 00000000..c4f75626 --- /dev/null +++ b/src/platform/graphics/web_canvas/WebCanvasRef.cpp @@ -0,0 +1,16 @@ +#include "cru/platform/graphics/web_canvas/WebCanvasRef.h" +#include "cru/platform/web/JsUtility.h" + +#include <cassert> +#include <utility> + +namespace cru::platform::graphics::web_canvas { +WebCanvasRef::WebCanvasRef(emscripten::val canvas_val) + : val_(std::move(canvas_val)) { + assert(web::IsNotNullAndInstanceOf(val_, "HTMLCanvasElement")); +} + +int WebCanvasRef::GetWidth() const { return val_["width"].as<int>(); } + +int WebCanvasRef::GetHeight() const { return val_["height"].as<int>(); } +} // namespace cru::platform::graphics::web_canvas diff --git a/src/platform/web/CMakeLists.txt b/src/platform/web/CMakeLists.txt index 1287f85a..0a9bd6dd 100644 --- a/src/platform/web/CMakeLists.txt +++ b/src/platform/web/CMakeLists.txt @@ -1,4 +1,5 @@ add_library(CruPlatformBaseWeb + JsUtility.cpp Resource.cpp ) diff --git a/src/platform/web/JsUtility.cpp b/src/platform/web/JsUtility.cpp new file mode 100644 index 00000000..b426bbda --- /dev/null +++ b/src/platform/web/JsUtility.cpp @@ -0,0 +1,11 @@ +#include "cru/platform/web/JsUtility.h" + +namespace cru::platform::web { +bool IsNotNullAndInstanceOf(const emscripten::val& value, const emscripten::val& type) { + return !value.isNull() && !type.isNull() && value.instanceof(type); +} + +bool IsNotNullAndInstanceOf(const emscripten::val& value, const char* global_type) { + return IsNotNullAndInstanceOf(value, emscripten::val::global(global_type)); +} +} |