diff options
author | Gunnar Sletta <gunnar.sletta@digia.com> | 2013-04-18 17:02:24 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-04-26 19:05:45 +0200 |
commit | 0bcf549647082e3a80768e2ea5336abf420d042d (patch) | |
tree | 5de4aa277c7abe63589cf33286a81339a3a2d1de | |
parent | 5673fc8b9c0785537d64b1356e47a4574b6b8852 (diff) |
Implement QQuickWindow::grabWindow() for isVisible=false
Webkit uses this for testing.
Change-Id: I4539e169a02592fb6c0062903917d4dd23a4303c
Reviewed-by: Jocelyn Turcotte <jocelyn.turcotte@digia.com>
-rw-r--r-- | src/quick/items/qquickwindow.cpp | 37 | ||||
-rw-r--r-- | tests/auto/quick/qquickwindow/tst_qquickwindow.cpp | 18 |
2 files changed, 52 insertions, 3 deletions
diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index 6b82f3f213..a4dff969f4 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -72,6 +72,8 @@ QT_BEGIN_NAMESPACE +extern Q_GUI_EXPORT QImage qt_gl_read_framebuffer(const QSize &size, bool alpha_format, bool include_alpha); + void QQuickWindowPrivate::updateFocusItemTransform() { Q_Q(QQuickWindow); @@ -2653,7 +2655,10 @@ QOpenGLFramebufferObject *QQuickWindow::renderTarget() const /*! Grabs the contents of the window and returns it as an image. - This function might not work if the window is not visible. + It is possible to call the grabWindow() function when the window is not + visible. This requires that the window is \l{QWindow::create} {created} + and has a valid size and that no other QQuickWindow instances are rendering + in the same process. \warning Calling this function will cause performance problems. @@ -2662,6 +2667,36 @@ QOpenGLFramebufferObject *QQuickWindow::renderTarget() const QImage QQuickWindow::grabWindow() { Q_D(QQuickWindow); + if (!isVisible()) { + + if (d->context->isReady()) { + qWarning("QQuickWindow::grabWindow: scene graph already in use"); + return QImage(); + } + + if (!handle() || !size().isValid()) { + qWarning("QQuickWindow::grabWindow: window must be created and have a valid size"); + return QImage(); + } + + QOpenGLContext context; + context.setFormat(requestedFormat()); + context.create(); + context.makeCurrent(this); + d->context->initialize(&context); + + d->polishItems(); + d->syncSceneGraph(); + d->renderSceneGraph(size()); + + QImage image = qt_gl_read_framebuffer(size(), false, false); + d->cleanupNodesOnShutdown(); + d->context->invalidate(); + context.doneCurrent(); + + return image; + } + return d->windowManager->grab(this); } diff --git a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp index 2d3c8f7ca7..dbf0086a3e 100644 --- a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp +++ b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp @@ -304,6 +304,7 @@ private slots: void qmlCreation(); void clearColor(); + void grab_data(); void grab(); void multipleWindows(); @@ -929,15 +930,28 @@ void tst_qquickwindow::clearColor() QCOMPARE(window->color(), QColor(Qt::blue)); } +void tst_qquickwindow::grab_data() +{ + QTest::addColumn<bool>("visible"); + QTest::newRow("visible") << true; + QTest::newRow("invisible") << false; +} + void tst_qquickwindow::grab() { + QFETCH(bool, visible); + QQuickWindow window; window.setColor(Qt::red); window.resize(250, 250); - window.show(); - QVERIFY(QTest::qWaitForWindowExposed(&window)); + if (visible) { + window.show(); + QVERIFY(QTest::qWaitForWindowExposed(&window)); + } else { + window.create(); + } QImage content = window.grabWindow(); QCOMPARE(content.width(), window.width()); |