diff --git a/autotests/integration/scene_qpainter_test.cpp b/autotests/integration/scene_qpainter_test.cpp
index 1456320c31..a928cc5356 100644
--- a/autotests/integration/scene_qpainter_test.cpp
+++ b/autotests/integration/scene_qpainter_test.cpp
@@ -22,8 +22,8 @@ along with this program. If not, see .
#include "effectloader.h"
#include "client.h"
#include "cursor.h"
+#include "effects.h"
#include "platform.h"
-#include "scene_qpainter.h"
#include "shell_client.h"
#include "wayland_server.h"
#include "effect_builtins.h"
@@ -101,7 +101,7 @@ void SceneQPainterTest::testStartFrame()
{
// this test verifies that the initial rendering is correct
Compositor::self()->addRepaintFull();
- auto scene = qobject_cast(Compositor::self()->scene());
+ auto scene = Compositor::self()->scene();
QVERIFY(scene);
QSignalSpy frameRenderedSpy(scene, &Scene::frameRendered);
QVERIFY(frameRenderedSpy.isValid());
@@ -113,13 +113,13 @@ void SceneQPainterTest::testStartFrame()
const QImage cursorImage = kwinApp()->platform()->softwareCursor();
QVERIFY(!cursorImage.isNull());
p.drawImage(KWin::Cursor::pos() - kwinApp()->platform()->softwareCursorHotspot(), cursorImage);
- QCOMPARE(referenceImage, *scene->backend()->buffer());
+ QCOMPARE(referenceImage, *scene->qpainterRenderBuffer());
}
void SceneQPainterTest::testCursorMoving()
{
// this test verifies that rendering is correct also after moving the cursor a few times
- auto scene = qobject_cast(Compositor::self()->scene());
+ auto scene = Compositor::self()->scene();
QVERIFY(scene);
QSignalSpy frameRenderedSpy(scene, &Scene::frameRendered);
QVERIFY(frameRenderedSpy.isValid());
@@ -142,7 +142,7 @@ void SceneQPainterTest::testCursorMoving()
const QImage cursorImage = kwinApp()->platform()->softwareCursor();
QVERIFY(!cursorImage.isNull());
p.drawImage(QPoint(45, 45) - kwinApp()->platform()->softwareCursorHotspot(), cursorImage);
- QCOMPARE(referenceImage, *scene->backend()->buffer());
+ QCOMPARE(referenceImage, *scene->qpainterRenderBuffer());
}
void SceneQPainterTest::testWindow_data()
@@ -165,7 +165,7 @@ void SceneQPainterTest::testWindow()
QScopedPointer ss(Test::createShellSurface(type, s.data()));
QScopedPointer p(Test::waylandSeat()->createPointer());
- auto scene = qobject_cast(KWin::Compositor::self()->scene());
+ auto scene = KWin::Compositor::self()->scene();
QVERIFY(scene);
QSignalSpy frameRenderedSpy(scene, &Scene::frameRendered);
QVERIFY(frameRenderedSpy.isValid());
@@ -181,7 +181,7 @@ void SceneQPainterTest::testWindow()
referenceImage.fill(Qt::black);
QPainter painter(&referenceImage);
painter.fillRect(0, 0, 200, 300, Qt::blue);
- QCOMPARE(referenceImage, *scene->backend()->buffer());
+ QCOMPARE(referenceImage, *scene->qpainterRenderBuffer());
// now let's set a cursor image
QScopedPointer cs(Test::createSurface());
@@ -190,13 +190,13 @@ void SceneQPainterTest::testWindow()
p->setCursor(cs.data(), QPoint(5, 5));
QVERIFY(frameRenderedSpy.wait());
painter.fillRect(KWin::Cursor::pos().x() - 5, KWin::Cursor::pos().y() - 5, 10, 10, Qt::red);
- QCOMPARE(referenceImage, *scene->backend()->buffer());
+ QCOMPARE(referenceImage, *scene->qpainterRenderBuffer());
// let's move the cursor again
KWin::Cursor::setPos(10, 10);
QVERIFY(frameRenderedSpy.wait());
painter.fillRect(0, 0, 200, 300, Qt::blue);
painter.fillRect(5, 5, 10, 10, Qt::red);
- QCOMPARE(referenceImage, *scene->backend()->buffer());
+ QCOMPARE(referenceImage, *scene->qpainterRenderBuffer());
}
void SceneQPainterTest::testWindowScaled()
@@ -210,7 +210,7 @@ void SceneQPainterTest::testWindowScaled()
QScopedPointer ss(Test::createShellSurface(s.data()));
QScopedPointer p(Test::waylandSeat()->createPointer());
- auto scene = qobject_cast(KWin::Compositor::self()->scene());
+ auto scene = KWin::Compositor::self()->scene();
QVERIFY(scene);
QSignalSpy frameRenderedSpy(scene, &Scene::frameRendered);
QVERIFY(frameRenderedSpy.isValid());
@@ -246,7 +246,7 @@ void SceneQPainterTest::testWindowScaled()
painter.fillRect(100, 150, 100, 100, Qt::red);
painter.fillRect(5, 5, 10, 10, Qt::red); //cursor
- QCOMPARE(referenceImage, *scene->backend()->buffer());
+ QCOMPARE(referenceImage, *scene->qpainterRenderBuffer());
}
void SceneQPainterTest::testCompositorRestart_data()
@@ -280,7 +280,7 @@ void SceneQPainterTest::testCompositorRestart()
QVERIFY(sceneCreatedSpy.wait());
}
QCOMPARE(sceneCreatedSpy.count(), 1);
- auto scene = qobject_cast(KWin::Compositor::self()->scene());
+ auto scene = KWin::Compositor::self()->scene();
QVERIFY(scene);
// this should directly trigger a frame
@@ -297,7 +297,7 @@ void SceneQPainterTest::testCompositorRestart()
const QImage cursorImage = kwinApp()->platform()->softwareCursor();
QVERIFY(!cursorImage.isNull());
painter.drawImage(QPoint(400, 400) - kwinApp()->platform()->softwareCursorHotspot(), cursorImage);
- QCOMPARE(referenceImage, *scene->backend()->buffer());
+ QCOMPARE(referenceImage, *scene->qpainterRenderBuffer());
}
struct XcbConnectionDeleter
@@ -361,7 +361,7 @@ void SceneQPainterTest::testX11Window()
// enough time for rendering the window
QTest::qWait(100);
- auto scene = qobject_cast(KWin::Compositor::self()->scene());
+ auto scene = KWin::Compositor::self()->scene();
QVERIFY(scene);
// this should directly trigger a frame
@@ -371,7 +371,7 @@ void SceneQPainterTest::testX11Window()
QVERIFY(frameRenderedSpy.wait());
const QPoint startPos = client->pos() + client->clientPos();
- auto image = scene->backend()->buffer();
+ auto image = scene->qpainterRenderBuffer();
QCOMPARE(image->copy(QRect(startPos, client->clientSize())), compareImage);
// and destroy the window again
diff --git a/scene.cpp b/scene.cpp
index bf5b7778d0..1c68864e37 100644
--- a/scene.cpp
+++ b/scene.cpp
@@ -666,6 +666,11 @@ QPainter *Scene::scenePainter() const
return nullptr;
}
+QImage *Scene::qpainterRenderBuffer() const
+{
+ return nullptr;
+}
+
//****************************************
// Scene::Window
//****************************************
diff --git a/scene.h b/scene.h
index 5d9865ecac..616e9b12bb 100644
--- a/scene.h
+++ b/scene.h
@@ -169,6 +169,12 @@ public:
**/
virtual QPainter *scenePainter() const;
+ /**
+ * The render buffer used by a QPainter based compositor.
+ * Default implementation returns @c nullptr.
+ **/
+ virtual QImage *qpainterRenderBuffer() const;
+
Q_SIGNALS:
void frameRendered();
diff --git a/scene_qpainter.cpp b/scene_qpainter.cpp
index 5f73a7c504..51525ac456 100644
--- a/scene_qpainter.cpp
+++ b/scene_qpainter.cpp
@@ -233,6 +233,11 @@ void SceneQPainter::screenGeometryChanged(const QSize &size)
m_backend->screenGeometryChanged(size);
}
+QImage *SceneQPainter::qpainterRenderBuffer() const
+{
+ return m_backend->buffer();
+}
+
//****************************************
// SceneQPainter::Window
//****************************************
diff --git a/scene_qpainter.h b/scene_qpainter.h
index 866d433cd6..20050da76c 100644
--- a/scene_qpainter.h
+++ b/scene_qpainter.h
@@ -124,6 +124,7 @@ public:
}
QPainter *scenePainter() const override;
+ QImage *qpainterRenderBuffer() const override;
QPainterBackend *backend() const {
return m_backend.data();