diff options
author | Mikolaj Boc <mikolaj.boc@qt.io> | 2023-02-01 13:19:33 +0100 |
---|---|---|
committer | Mikolaj Boc <mikolaj.boc@qt.io> | 2023-02-03 09:46:05 +0100 |
commit | 7c33f4be022d87c5a83d728cceb5673cd55ed346 (patch) | |
tree | d7d86c523775c5206506313bb5fcc6650c5cde8d /src | |
parent | f54fab6125d79903ebabae1b52423ac984800d26 (diff) |
Support window masks on WASM
QWasmWindow is now implementing the setMask method, which translates the received QRegion to a css clip path Fixes: QTBUG-73260 Change-Id: Ie934c1e6ab650426bfc32154bf9e49a4a2aeb45b Reviewed-by: Aleksandr Reviakin <aleksandr.reviakin@qt.io> Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/platforms/wasm/qwasmwindow.cpp | 24 | ||||
-rw-r--r-- | src/plugins/platforms/wasm/qwasmwindow.h | 1 |
2 files changed, 23 insertions, 2 deletions
diff --git a/src/plugins/platforms/wasm/qwasmwindow.cpp b/src/plugins/platforms/wasm/qwasmwindow.cpp index be0dd74797a..1dc43b61bb4 100644 --- a/src/plugins/platforms/wasm/qwasmwindow.cpp +++ b/src/plugins/platforms/wasm/qwasmwindow.cpp @@ -20,9 +20,9 @@ #include "qwasmaccessibility.h" #include <iostream> -#include <emscripten/val.h> +#include <sstream> -#include <GL/gl.h> +#include <emscripten/val.h> #include <QtCore/private/qstdweb_p.h> @@ -544,6 +544,26 @@ bool QWasmWindow::windowEvent(QEvent *event) } } +void QWasmWindow::setMask(const QRegion ®ion) +{ + if (region.isEmpty()) { + m_qtWindow["style"].set("clipPath", emscripten::val("")); + return; + } + + std::ostringstream cssClipPath; + cssClipPath << "path('"; + for (const auto &rect : region) { + const auto cssRect = rect.adjusted(0, 0, 1, 1); + cssClipPath << "M " << cssRect.left() << " " << cssRect.top() << " "; + cssClipPath << "L " << cssRect.right() << " " << cssRect.top() << " "; + cssClipPath << "L " << cssRect.right() << " " << cssRect.bottom() << " "; + cssClipPath << "L " << cssRect.left() << " " << cssRect.bottom() << " z "; + } + cssClipPath << "')"; + m_qtWindow["style"].set("clipPath", emscripten::val(cssClipPath.str())); +} + std::string QWasmWindow::canvasSelector() const { return "!qtwindow" + std::to_string(m_winId); diff --git a/src/plugins/platforms/wasm/qwasmwindow.h b/src/plugins/platforms/wasm/qwasmwindow.h index d90e828283c..7f4047b758b 100644 --- a/src/plugins/platforms/wasm/qwasmwindow.h +++ b/src/plugins/platforms/wasm/qwasmwindow.h @@ -75,6 +75,7 @@ public: bool setKeyboardGrabEnabled(bool) override { return false; } bool setMouseGrabEnabled(bool grab) final; bool windowEvent(QEvent *event) final; + void setMask(const QRegion ®ion) final; QWasmScreen *platformScreen() const; void setBackingStore(QWasmBackingStore *store) { m_backingStore = store; } |