From 99d0f997aa84e210178fc1f6dfc6321be8b33cf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Wed, 2 Aug 2023 16:32:15 +0200 Subject: [PATCH] iOS: Implement QPlatformWindow::setMask() for masking rendering and input Same implementation as for macOS. [ChangeLog][iOS] QWindow::setMask() is now supported for masking the rendering and touch input of child windows. Change-Id: I2f9429f0f8fa278fdd8edc15c7b242c7c6bc0ff0 Reviewed-by: Richard Moe Gustavsen Reviewed-by: Timur Pocheptsov (cherry picked from commit ed7c7a1458a0d903cea250e8b7272c6b5bf9c624) Reviewed-by: Qt Cherry-pick Bot --- src/plugins/platforms/ios/qioswindow.h | 2 ++ src/plugins/platforms/ios/qioswindow.mm | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/plugins/platforms/ios/qioswindow.h b/src/plugins/platforms/ios/qioswindow.h index 90380e4bb06..6a50ccfbcec 100644 --- a/src/plugins/platforms/ios/qioswindow.h +++ b/src/plugins/platforms/ios/qioswindow.h @@ -56,6 +56,8 @@ public: void requestUpdate() override; + void setMask(const QRegion ®ion) override; + #if QT_CONFIG(opengl) CAEAGLLayer *eaglLayer() const; #endif diff --git a/src/plugins/platforms/ios/qioswindow.mm b/src/plugins/platforms/ios/qioswindow.mm index 8de094533bf..908ead2e5d2 100644 --- a/src/plugins/platforms/ios/qioswindow.mm +++ b/src/plugins/platforms/ios/qioswindow.mm @@ -11,7 +11,10 @@ #include "quiview.h" #include "qiosinputcontext.h" +#include + #include +#include #include #if QT_CONFIG(opengl) @@ -54,6 +57,7 @@ QIOSWindow::QIOSWindow(QWindow *window) setWindowState(window->windowStates()); setOpacity(window->opacity()); + setMask(QHighDpi::toNativeLocalRegion(window->mask(), window)); Qt::ScreenOrientation initialOrientation = window->contentOrientation(); if (initialOrientation != Qt::PrimaryOrientation) { @@ -355,6 +359,20 @@ void QIOSWindow::requestUpdate() static_cast(screen())->setUpdatesPaused(false); } +void QIOSWindow::setMask(const QRegion ®ion) +{ + if (!region.isEmpty()) { + QCFType maskPath = CGPathCreateMutable(); + for (const QRect &r : region) + CGPathAddRect(maskPath, nullptr, r.toCGRect()); + CAShapeLayer *maskLayer = [CAShapeLayer layer]; + maskLayer.path = maskPath; + m_view.layer.mask = maskLayer; + } else { + m_view.layer.mask = nil; + } +} + #if QT_CONFIG(opengl) CAEAGLLayer *QIOSWindow::eaglLayer() const {