From 2d56154fe823ae9243dd53efc4910fa0e5e4c7a3 Mon Sep 17 00:00:00 2001 From: Kai Uwe Broulik Date: Wed, 16 Feb 2022 13:04:23 +0100 Subject: [PATCH] kwineffects: Support setting opacity on OffscreenQuickView Signed-off-by: Eike Hein --- src/libkwineffects/kwinoffscreenquickview.cpp | 10 ++++++++++ src/libkwineffects/kwinoffscreenquickview.h | 3 +++ src/scenes/opengl/scene_opengl.cpp | 16 +++++++++++++--- src/scenes/qpainter/scene_qpainter.cpp | 3 +++ 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/libkwineffects/kwinoffscreenquickview.cpp b/src/libkwineffects/kwinoffscreenquickview.cpp index 0fb32305f5..5804a9289d 100644 --- a/src/libkwineffects/kwinoffscreenquickview.cpp +++ b/src/libkwineffects/kwinoffscreenquickview.cpp @@ -383,6 +383,16 @@ QRect OffscreenQuickView::geometry() const return d->m_view->geometry(); } +void OffscreenQuickView::setOpacity(qreal opacity) +{ + d->m_view->setOpacity(opacity); +} + +qreal OffscreenQuickView::opacity() const +{ + return d->m_view->opacity(); +} + QQuickItem *OffscreenQuickView::contentItem() const { return d->m_view->contentItem(); diff --git a/src/libkwineffects/kwinoffscreenquickview.h b/src/libkwineffects/kwinoffscreenquickview.h index ea3a549af2..85cdfaff6e 100644 --- a/src/libkwineffects/kwinoffscreenquickview.h +++ b/src/libkwineffects/kwinoffscreenquickview.h @@ -94,6 +94,9 @@ public: void setGeometry(const QRect &rect); QRect geometry() const; + void setOpacity(qreal opacity); + qreal opacity() const; + /** * Render the current scene graph into the FBO. * This is typically done automatically when the scene changes diff --git a/src/scenes/opengl/scene_opengl.cpp b/src/scenes/opengl/scene_opengl.cpp index 998c2d4296..2e6f394179 100644 --- a/src/scenes/opengl/scene_opengl.cpp +++ b/src/scenes/opengl/scene_opengl.cpp @@ -337,18 +337,28 @@ void SceneOpenGL::paintDesktop(int desktop, int mask, const QRegion ®ion, Scr void SceneOpenGL::paintOffscreenQuickView(OffscreenQuickView *w) { - GLShader *shader = ShaderManager::instance()->pushShader(ShaderTrait::MapTexture); - const QRect rect = w->geometry(); - GLTexture *t = w->bufferAsTexture(); if (!t) { return; } + ShaderTraits traits = ShaderTrait::MapTexture; + const qreal a = w->opacity(); + if (a != 1.0) { + traits |= ShaderTrait::Modulate; + } + + GLShader *shader = ShaderManager::instance()->pushShader(traits); + const QRect rect = w->geometry(); + QMatrix4x4 mvp(renderTargetProjectionMatrix()); mvp.translate(rect.x(), rect.y()); shader->setUniform(GLShader::ModelViewProjectionMatrix, mvp); + if (a != 1.0) { + shader->setUniform(GLShader::ModulationConstant, QVector4D(a, a, a, a)); + } + glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); t->bind(); diff --git a/src/scenes/qpainter/scene_qpainter.cpp b/src/scenes/qpainter/scene_qpainter.cpp index 3751b7a56a..847305f2e4 100644 --- a/src/scenes/qpainter/scene_qpainter.cpp +++ b/src/scenes/qpainter/scene_qpainter.cpp @@ -130,7 +130,10 @@ void SceneQPainter::paintOffscreenQuickView(OffscreenQuickView *w) if (buffer.isNull()) { return; } + painter->save(); + painter->setOpacity(w->opacity()); painter->drawImage(w->geometry(), buffer); + painter->restore(); } Scene::Window *SceneQPainter::createWindow(Toplevel *toplevel)