summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/engine/qabstract3dgraph.cpp
diff options
context:
space:
mode:
authorTomi Korpipää <tomi.korpipaa@digia.com>2014-03-13 11:33:07 +0200
committerTomi Korpipää <tomi.korpipaa@digia.com>2014-03-24 09:23:42 +0200
commit6058ad34c490f505c4acffc30719c8abca165984 (patch)
treefcedc574fecbda9e6dc3e274183aede4ec4d6fdb /src/datavisualization/engine/qabstract3dgraph.cpp
parentd8a79abf2f30ff44a895532ad98676a2dbbf19c1 (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.cpp63
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