From 60cdc6035d25441fd99a7d341892ee2fb1002741 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Mon, 16 Mar 2015 10:00:29 +0100 Subject: Add support for grabWindow() on eglfs with widgets For real OpenGL content it is still not supported because we have no reliable way to read back the contents at arbitrary times. Applications should rather use QQuickWindow::grabWindow() in that case. [ChangeLog][QtGui] Support for QScreen::grabWindow() is now available on embedded platforms (eglfs, linuxfb). Task-number: QTBUG-44937 Change-Id: I4ad046062782c160f5bb9f8f2a2fe82f2e7394cc Reviewed-by: Andy Nichols --- .../platformcompositor/qopenglcompositor.cpp | 26 +++++++++++++++++++--- .../platformcompositor/qopenglcompositor_p.h | 5 ++++- 2 files changed, 27 insertions(+), 4 deletions(-) (limited to 'src/platformsupport/platformcompositor') diff --git a/src/platformsupport/platformcompositor/qopenglcompositor.cpp b/src/platformsupport/platformcompositor/qopenglcompositor.cpp index 3048b2b777..3fd6c999a2 100644 --- a/src/platformsupport/platformcompositor/qopenglcompositor.cpp +++ b/src/platformsupport/platformcompositor/qopenglcompositor.cpp @@ -32,6 +32,7 @@ ****************************************************************************/ #include +#include #include #include #include @@ -76,7 +77,7 @@ QOpenGLCompositor::QOpenGLCompositor() Q_ASSERT(!compositor); m_updateTimer.setSingleShot(true); m_updateTimer.setInterval(0); - connect(&m_updateTimer, SIGNAL(timeout()), SLOT(renderAll())); + connect(&m_updateTimer, SIGNAL(timeout()), SLOT(handleRenderAllRequest())); } QOpenGLCompositor::~QOpenGLCompositor() @@ -98,10 +99,26 @@ void QOpenGLCompositor::update() m_updateTimer.start(); } -void QOpenGLCompositor::renderAll() +QImage QOpenGLCompositor::grab() { Q_ASSERT(m_context && m_targetWindow); m_context->makeCurrent(m_targetWindow); + QScopedPointer fbo(new QOpenGLFramebufferObject(m_targetWindow->geometry().size())); + renderAll(fbo.data()); + return fbo->toImage(); +} + +void QOpenGLCompositor::handleRenderAllRequest() +{ + Q_ASSERT(m_context && m_targetWindow); + m_context->makeCurrent(m_targetWindow); + renderAll(0); +} + +void QOpenGLCompositor::renderAll(QOpenGLFramebufferObject *fbo) +{ + if (fbo) + fbo->bind(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); @@ -120,7 +137,10 @@ void QOpenGLCompositor::renderAll() render(m_windows.at(i)); m_blitter.release(); - m_context->swapBuffers(m_targetWindow); + if (!fbo) + m_context->swapBuffers(m_targetWindow); + else + fbo->release(); for (int i = 0; i < m_windows.size(); ++i) m_windows.at(i)->endCompositing(); diff --git a/src/platformsupport/platformcompositor/qopenglcompositor_p.h b/src/platformsupport/platformcompositor/qopenglcompositor_p.h index 257bbf2531..2a8257305b 100644 --- a/src/platformsupport/platformcompositor/qopenglcompositor_p.h +++ b/src/platformsupport/platformcompositor/qopenglcompositor_p.h @@ -51,6 +51,7 @@ QT_BEGIN_NAMESPACE class QOpenGLContext; +class QOpenGLFramebufferObject; class QWindow; class QPlatformTextureList; @@ -76,6 +77,7 @@ public: QWindow *targetWindow() const { return m_targetWindow; } void update(); + QImage grab(); QList windows() const { return m_windows; } void addWindow(QOpenGLCompositorWindow *window); @@ -87,12 +89,13 @@ signals: void topWindowChanged(QOpenGLCompositorWindow *window); private slots: - void renderAll(); + void handleRenderAllRequest(); private: QOpenGLCompositor(); ~QOpenGLCompositor(); + void renderAll(QOpenGLFramebufferObject *fbo); void render(QOpenGLCompositorWindow *window); QOpenGLContext *m_context; -- cgit v1.2.3