diff options
author | Tomi Korpipää <tomi.korpipaa@digia.com> | 2014-03-13 11:33:07 +0200 |
---|---|---|
committer | Tomi Korpipää <tomi.korpipaa@digia.com> | 2014-03-24 09:23:42 +0200 |
commit | 6058ad34c490f505c4acffc30719c8abca165984 (patch) | |
tree | fcedc574fecbda9e6dc3e274183aede4ec4d6fdb /src/datavisualization/engine/qabstract3dgraph.cpp | |
parent | d8a79abf2f30ff44a895532ad98676a2dbbf19c1 (diff) |
Support for rendering to image
Task-number: QTRD-2869
Change-Id: I5182c182f15893e70129a95c3cfdd590ed4f0853
Note: Not to be merged until v1.0 is out
Change-Id: I5182c182f15893e70129a95c3cfdd590ed4f0853
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Reviewed-by: Mika Salmela <mika.salmela@digia.com>
Diffstat (limited to 'src/datavisualization/engine/qabstract3dgraph.cpp')
-rw-r--r-- | src/datavisualization/engine/qabstract3dgraph.cpp | 63 |
1 files changed, 62 insertions, 1 deletions
diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index bde5b585..5afc1417 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -27,6 +27,8 @@ #include <QtGui/QOpenGLContext> #include <QtGui/QOpenGLPaintDevice> #include <QtGui/QPainter> +#include <QtGui/QOpenGLFramebufferObject> +#include <QtGui/QOffscreenSurface> QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -358,6 +360,22 @@ void QAbstract3DGraph::clearSelection() } /*! + * Renders current frame to an image of \a imageSize. Default size is the window size. Image is + * rendered with antialiasing level given in \a msaaSamples. Default level is \c{0}. + * + * \since Qt Data Visualization 1.1 + * + * \return rendered image. + */ +QImage QAbstract3DGraph::renderToImage(int msaaSamples, const QSize &imageSize) +{ + QSize renderSize = imageSize; + if (renderSize.isEmpty()) + renderSize = size(); + return d_ptr->renderToImage(msaaSamples, renderSize); +} + +/*! * \internal */ bool QAbstract3DGraph::event(QEvent *event) @@ -453,12 +471,17 @@ QAbstract3DGraphPrivate::QAbstract3DGraphPrivate(QAbstract3DGraph *q) q_ptr(q), m_updatePending(false), m_visualController(0), - m_devicePixelRatio(1.f) + m_devicePixelRatio(1.f), + m_offscreenSurface(0) { } QAbstract3DGraphPrivate::~QAbstract3DGraphPrivate() { + if (m_offscreenSurface) { + m_offscreenSurface->destroy(); + delete m_offscreenSurface; + } if (m_context) m_context->makeCurrent(q_ptr); @@ -526,4 +549,42 @@ void QAbstract3DGraphPrivate::renderNow() m_context->swapBuffers(q_ptr); } +QImage QAbstract3DGraphPrivate::renderToImage(int msaaSamples, const QSize &imageSize) +{ + QImage image; + QOpenGLFramebufferObject *fbo; + QOpenGLFramebufferObjectFormat fboFormat; + if (!m_offscreenSurface) { + // Create an offscreen surface for rendering to images without rendering on screen + m_offscreenSurface = new QOffscreenSurface(q_ptr->screen()); + m_offscreenSurface->setFormat(q_ptr->requestedFormat()); + m_offscreenSurface->create(); + } + // Render the wanted frame offscreen + m_context->makeCurrent(m_offscreenSurface); + fboFormat.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil); + fboFormat.setInternalTextureFormat(GL_RGB); + fboFormat.setSamples(msaaSamples); + fbo = new QOpenGLFramebufferObject(imageSize, fboFormat); + if (fbo->isValid()) { + QRect originalViewport = m_visualController->m_scene->viewport(); + m_visualController->m_scene->d_ptr->setWindowSize(imageSize); + m_visualController->m_scene->d_ptr->setViewport(QRect(0, 0, + imageSize.width(), + imageSize.height())); + m_visualController->synchDataToRenderer(); + fbo->bind(); + m_context->swapBuffers(m_offscreenSurface); + m_visualController->requestRender(fbo); + image = fbo->toImage(); + fbo->release(); + m_visualController->m_scene->d_ptr->setWindowSize(originalViewport.size()); + m_visualController->m_scene->d_ptr->setViewport(originalViewport); + } + delete fbo; + m_context->makeCurrent(q_ptr); + + return image; +} + QT_END_NAMESPACE_DATAVISUALIZATION |