/*! \fn QImage QGLFramebufferObject::toImage() const Returns the contents of this framebuffer object as a QImage. */ QImage QGLFramebufferObject::toImage() const { Q_D(const QGLFramebufferObject); if (!d->valid) return QImage(); // qt_gl_read_framebuffer doesn't work on a multisample FBO if (format().samples() != 0) { QGLFramebufferObject temp(size(), QGLFramebufferObjectFormat()); QRect rect(QPoint(0, 0), size()); blitFramebuffer(&temp, rect, const_cast<QGLFramebufferObject *>(this), rect); return temp.toImage(); } bool wasBound = isBound(); if (!wasBound) const_cast<QGLFramebufferObject *>(this)->bind(); QImage image = qt_gl_read_framebuffer(d->size, format().internalTextureFormat() != GL_RGB, true); if (!wasBound) const_cast<QGLFramebufferObject *>(this)->release(); return image; }
void checkSourceDestReset() { // GIVEN TestArbiter arbiter; QScopedPointer<Qt3DRender::QBlitFramebuffer> blitFramebuffer(new Qt3DRender::QBlitFramebuffer()); arbiter.setArbiterOnNode(blitFramebuffer.data()); Qt3DRender::QRenderTarget *sourceRenderTarget = new Qt3DRender::QRenderTarget; // no parent Qt3DRender::QRenderTarget *destinationRenderTarget = new Qt3DRender::QRenderTarget(sourceRenderTarget); // have a parent // WHEN blitFramebuffer->setSource(sourceRenderTarget); blitFramebuffer->setDestination(destinationRenderTarget); QCoreApplication::processEvents(); // THEN QCOMPARE(sourceRenderTarget->parent(), blitFramebuffer.data()); QCOMPARE(destinationRenderTarget->parent(), sourceRenderTarget); // already set parent must not change // WHEN delete sourceRenderTarget; // THEN QVERIFY(!blitFramebuffer->source()); QVERIFY(!blitFramebuffer->destination()); // gone too since destinationRenderTarget was parented to sourceRenderTarget }
/*! \overload Convenience overload to blit between two framebuffer objects. */ void QOpenGLFramebufferObject::blitFramebuffer(QOpenGLFramebufferObject *target, QOpenGLFramebufferObject *source, GLbitfield buffers, GLenum filter) { if (!target && !source) return; QSize targetSize; QSize sourceSize; if (target) targetSize = target->size(); if (source) sourceSize = source->size(); if (targetSize.isEmpty()) targetSize = sourceSize; else if (sourceSize.isEmpty()) sourceSize = targetSize; blitFramebuffer(target, QRect(QPoint(0, 0), targetSize), source, QRect(QPoint(0, 0), sourceSize), buffers, filter); }
void checkPropertyUpdate() { // GIVEN TestArbiter arbiter; QScopedPointer<Qt3DRender::QBlitFramebuffer> blitFramebuffer(new Qt3DRender::QBlitFramebuffer()); arbiter.setArbiterOnNode(blitFramebuffer.data()); Qt3DRender::QRenderTarget *sourceRenderTarget = new Qt3DRender::QRenderTarget; Qt3DRender::QRenderTarget *destinationRenderTarget = new Qt3DRender::QRenderTarget; // sourceRenderTarget // WHEN blitFramebuffer->setSource(sourceRenderTarget); QCoreApplication::processEvents(); // THEN QCOMPARE(arbiter.events.size(), 1); Qt3DCore::QPropertyUpdatedChangePtr change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); QCOMPARE(change->propertyName(), "source"); QCOMPARE(change->subjectId(), blitFramebuffer->id()); QCOMPARE(change->value().value<Qt3DCore::QNodeId>(), sourceRenderTarget->id()); QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); arbiter.events.clear(); // WHEN blitFramebuffer->setSource(sourceRenderTarget); QCoreApplication::processEvents(); // THEN QCOMPARE(arbiter.events.size(), 0); // WHEN blitFramebuffer->setSource(nullptr); QCoreApplication::processEvents(); // THEN QCOMPARE(arbiter.events.size(), 1); change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); QCOMPARE(change->propertyName(), "source"); QCOMPARE(change->subjectId(), blitFramebuffer->id()); QCOMPARE(change->value().value<Qt3DCore::QNodeId>(), Qt3DCore::QNodeId()); QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); arbiter.events.clear(); // destinationRenderTarget // WHEN blitFramebuffer->setDestination(destinationRenderTarget); QCoreApplication::processEvents(); // THEN QCOMPARE(arbiter.events.size(), 1); change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); QCOMPARE(change->propertyName(), "destination"); QCOMPARE(change->subjectId(), blitFramebuffer->id()); QCOMPARE(change->value().value<Qt3DCore::QNodeId>(), destinationRenderTarget->id()); QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); arbiter.events.clear(); // WHEN blitFramebuffer->setDestination(destinationRenderTarget); QCoreApplication::processEvents(); // THEN QCOMPARE(arbiter.events.size(), 0); // WHEN blitFramebuffer->setDestination(nullptr); QCoreApplication::processEvents(); // THEN QCOMPARE(arbiter.events.size(), 1); change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); QCOMPARE(change->propertyName(), "destination"); QCOMPARE(change->subjectId(), blitFramebuffer->id()); QCOMPARE(change->value().value<Qt3DCore::QNodeId>(), Qt3DCore::QNodeId()); QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); arbiter.events.clear(); // sourceRect // WHEN blitFramebuffer->setSourceRect(QRect(0,0,1,1)); QCoreApplication::processEvents(); // THEN QCOMPARE(arbiter.events.size(), 1); change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); QCOMPARE(change->propertyName(), "sourceRect"); QCOMPARE(change->subjectId(), blitFramebuffer->id()); QCOMPARE(change->value().value<QRect>(), QRect(0,0,1,1)) ; QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); arbiter.events.clear(); // WHEN blitFramebuffer->setSourceRect(QRect(0,0,1,1)); QCoreApplication::processEvents(); // THEN QCOMPARE(arbiter.events.size(), 0); // WHEN blitFramebuffer->setSourceRect(QRect()); QCoreApplication::processEvents(); // THEN QCOMPARE(arbiter.events.size(), 1); change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); QCOMPARE(change->propertyName(), "sourceRect"); QCOMPARE(change->subjectId(), blitFramebuffer->id()); QCOMPARE(change->value().value<QRect>(), QRect()); QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); arbiter.events.clear(); // destinationRect blitFramebuffer->setDestinationRect(QRect(0,0,1,1)); QCoreApplication::processEvents(); // THEN QCOMPARE(arbiter.events.size(), 1); change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); QCOMPARE(change->propertyName(), "destinationRect"); QCOMPARE(change->subjectId(), blitFramebuffer->id()); QCOMPARE(change->value().value<QRect>(), QRect(0,0,1,1)) ; QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); arbiter.events.clear(); // WHEN blitFramebuffer->setDestinationRect(QRect(0,0,1,1)); QCoreApplication::processEvents(); // THEN QCOMPARE(arbiter.events.size(), 0); // WHEN blitFramebuffer->setDestinationRect(QRect()); QCoreApplication::processEvents(); // THEN QCOMPARE(arbiter.events.size(), 1); change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); QCOMPARE(change->propertyName(), "destinationRect"); QCOMPARE(change->subjectId(), blitFramebuffer->id()); QCOMPARE(change->value().value<QRect>(), QRect()); QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); arbiter.events.clear(); // sourceAttachmentPoint // WHEN blitFramebuffer->setSourceAttachmentPoint(Qt3DRender::QRenderTargetOutput::Color1); QCoreApplication::processEvents(); // THEN QCOMPARE(arbiter.events.size(), 1); change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); QCOMPARE(change->propertyName(), "sourceAttachmentPoint"); QCOMPARE(change->subjectId(), blitFramebuffer->id()); QCOMPARE(change->value().value<Qt3DRender::QRenderTargetOutput::AttachmentPoint>(), Qt3DRender::QRenderTargetOutput::Color1); QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); arbiter.events.clear(); // WHEN blitFramebuffer->setSourceAttachmentPoint(Qt3DRender::QRenderTargetOutput::Color1); QCoreApplication::processEvents(); // THEN QCOMPARE(arbiter.events.size(), 0); // WHEN blitFramebuffer->setSourceAttachmentPoint(Qt3DRender::QRenderTargetOutput::Color0); QCoreApplication::processEvents(); // THEN QCOMPARE(arbiter.events.size(), 1); change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); QCOMPARE(change->propertyName(), "sourceAttachmentPoint"); QCOMPARE(change->subjectId(), blitFramebuffer->id()); QCOMPARE(change->value().value<Qt3DRender::QRenderTargetOutput::AttachmentPoint>(), Qt3DRender::QRenderTargetOutput::Color0); QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); arbiter.events.clear(); // destinationAttachmentPoint // WHEN blitFramebuffer->setDestinationAttachmentPoint(Qt3DRender::QRenderTargetOutput::Color1); QCoreApplication::processEvents(); // THEN QCOMPARE(arbiter.events.size(), 1); change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); QCOMPARE(change->propertyName(), "destinationAttachmentPoint"); QCOMPARE(change->subjectId(), blitFramebuffer->id()); QCOMPARE(change->value().value<Qt3DRender::QRenderTargetOutput::AttachmentPoint>(), Qt3DRender::QRenderTargetOutput::Color1); QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); arbiter.events.clear(); // WHEN blitFramebuffer->setDestinationAttachmentPoint(Qt3DRender::QRenderTargetOutput::Color1); QCoreApplication::processEvents(); // THEN QCOMPARE(arbiter.events.size(), 0); // WHEN blitFramebuffer->setDestinationAttachmentPoint(Qt3DRender::QRenderTargetOutput::Color0); QCoreApplication::processEvents(); // THEN QCOMPARE(arbiter.events.size(), 1); change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); QCOMPARE(change->propertyName(), "destinationAttachmentPoint"); QCOMPARE(change->subjectId(), blitFramebuffer->id()); QCOMPARE(change->value().value<Qt3DRender::QRenderTargetOutput::AttachmentPoint>(), Qt3DRender::QRenderTargetOutput::Color0); QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); arbiter.events.clear(); }