[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kwin] /: Provide a virtual Scene::qpainterRenderBuffer() -> QImage* method
From:       Martin_Flöser <null () kde ! org>
Date:       2017-09-01 16:06:13
Message-ID: E1dnoST-0008Ko-Pv () code ! kde ! org
[Download RAW message or body]

Git commit c398db3c459101fa8f2927912766a71501f6aca3 by Martin Flöser.
Committed on 01/09/2017 at 15:44.
Pushed by graesslin into branch 'master'.

Provide a virtual Scene::qpainterRenderBuffer() -> QImage* method

Needed by testing of QPainter scene to access the back buffer. Exposed
as a virtual method in Scene, so that the test does not have to cast to
SceneQPainter.

M  +15   -15   autotests/integration/scene_qpainter_test.cpp
M  +5    -0    scene.cpp
M  +6    -0    scene.h
M  +5    -0    scene_qpainter.cpp
M  +1    -0    scene_qpainter.h

https://commits.kde.org/kwin/c398db3c459101fa8f2927912766a71501f6aca3

diff --git a/autotests/integration/scene_qpainter_test.cpp \
b/autotests/integration/scene_qpainter_test.cpp index 1456320c3..a928cc535 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 \
<http://www.gnu.org/licenses/>.  #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<SceneQPainter*>(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<SceneQPainter*>(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<QObject> ss(Test::createShellSurface(type, s.data()));
     QScopedPointer<Pointer> p(Test::waylandSeat()->createPointer());
 
-    auto scene = qobject_cast<SceneQPainter*>(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<Surface> 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<ShellSurface> ss(Test::createShellSurface(s.data()));
     QScopedPointer<Pointer> p(Test::waylandSeat()->createPointer());
 
-    auto scene = qobject_cast<SceneQPainter*>(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<SceneQPainter*>(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<SceneQPainter*>(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 bf5b7778d..1c68864e3 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 5d9865eca..616e9b12b 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 5f73a7c50..51525ac45 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 866d433cd..20050da76 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();


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic