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>
This commit is contained in:
Mikolaj Boc 2023-02-01 13:19:33 +01:00
parent f54fab6125
commit 7c33f4be02
2 changed files with 23 additions and 2 deletions

View File

@ -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 &region)
{
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);

View File

@ -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 &region) final;
QWasmScreen *platformScreen() const;
void setBackingStore(QWasmBackingStore *store) { m_backingStore = store; }