| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  | /****************************************************************************
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Copyright (C) 2020 The Qt Company Ltd. | 
					
						
							|  |  |  | ** Contact: https://www.qt.io/licensing/
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** This file is part of Qt Creator. | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Commercial License Usage | 
					
						
							|  |  |  | ** Licensees holding valid commercial Qt licenses may use this file in | 
					
						
							|  |  |  | ** accordance with the commercial license agreement provided with the | 
					
						
							|  |  |  | ** Software or, alternatively, in accordance with the terms contained in | 
					
						
							|  |  |  | ** a written agreement between you and The Qt Company. For licensing terms | 
					
						
							|  |  |  | ** and conditions see https://www.qt.io/terms-conditions. For further
 | 
					
						
							|  |  |  | ** information use the contact form at https://www.qt.io/contact-us.
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** GNU General Public License Usage | 
					
						
							|  |  |  | ** Alternatively, this file may be used under the terms of the GNU | 
					
						
							|  |  |  | ** General Public License version 3 as published by the Free Software | 
					
						
							|  |  |  | ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT | 
					
						
							|  |  |  | ** included in the packaging of this file. Please review the following | 
					
						
							|  |  |  | ** information to ensure the GNU General Public License requirements will | 
					
						
							|  |  |  | ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ****************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "iconrenderer.h"
 | 
					
						
							|  |  |  | #include "../editor3d/selectionboxgeometry.h"
 | 
					
						
							|  |  |  | #include "../editor3d/generalhelper.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QtQml/qqmlcomponent.h>
 | 
					
						
							|  |  |  | #include <QtQml/qqmlengine.h>
 | 
					
						
							|  |  |  | #include <QtQml/qqmlproperty.h>
 | 
					
						
							|  |  |  | #include <QtQml/qqmlcontext.h>
 | 
					
						
							|  |  |  | #include <QtQuick/qquickview.h>
 | 
					
						
							|  |  |  | #include <QtQuick/qquickitem.h>
 | 
					
						
							|  |  |  | #include <QtGui/qsurfaceformat.h>
 | 
					
						
							|  |  |  | #include <QtGui/qimage.h>
 | 
					
						
							|  |  |  | #include <QtGui/qguiapplication.h>
 | 
					
						
							|  |  |  | #include <QtCore/qtimer.h>
 | 
					
						
							|  |  |  | #include <QtCore/qfileinfo.h>
 | 
					
						
							|  |  |  | #include <QtCore/qdir.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef QUICK3D_MODULE
 | 
					
						
							|  |  |  | #include <QtQuick3D/private/qquick3dnode_p.h>
 | 
					
						
							|  |  |  | #include <QtQuick3D/private/qquick3dviewport_p.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-17 17:56:45 +02:00
										 |  |  | #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
 | 
					
						
							|  |  |  | #include <QtGui/private/qrhi_p.h>
 | 
					
						
							|  |  |  | #include <QtQuick/private/qquickrendercontrol_p.h>
 | 
					
						
							|  |  |  | #include <QtQuick/private/qquickrendertarget_p.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  | #include <private/qquickdesignersupportitems_p.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | IconRenderer::IconRenderer(int size, const QString &filePath, const QString &source) | 
					
						
							|  |  |  |     : QObject(nullptr) | 
					
						
							|  |  |  |     , m_size(size) | 
					
						
							|  |  |  |     , m_filePath(filePath) | 
					
						
							|  |  |  |     , m_source(source) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void IconRenderer::setupRender() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     DesignerSupport::activateDesignerMode(); | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  | #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
 | 
					
						
							| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  |     DesignerSupport::activateDesignerWindowManager(); | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-17 17:56:45 +02:00
										 |  |  |     QQmlEngine *engine = nullptr; | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  | #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
 | 
					
						
							| 
									
										
										
										
											2020-11-17 17:56:45 +02:00
										 |  |  |     auto view = new QQuickView; | 
					
						
							|  |  |  |     engine = view->engine(); | 
					
						
							|  |  |  |     m_window = view; | 
					
						
							|  |  |  |     QSurfaceFormat surfaceFormat = view->requestedFormat(); | 
					
						
							| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  |     surfaceFormat.setVersion(4, 1); | 
					
						
							|  |  |  |     surfaceFormat.setProfile(QSurfaceFormat::CoreProfile); | 
					
						
							| 
									
										
										
										
											2020-11-17 17:56:45 +02:00
										 |  |  |     view->setFormat(surfaceFormat); | 
					
						
							|  |  |  |     DesignerSupport::createOpenGLContext(view); | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2020-11-17 17:56:45 +02:00
										 |  |  |     engine = new QQmlEngine; | 
					
						
							|  |  |  |     m_renderControl = new QQuickRenderControl; | 
					
						
							|  |  |  |     m_window = new QQuickWindow(m_renderControl); | 
					
						
							|  |  |  |     m_window->setDefaultAlphaBuffer(true); | 
					
						
							|  |  |  |     m_window->setColor(Qt::transparent); | 
					
						
							|  |  |  |     m_renderControl->initialize(); | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-17 17:56:45 +02:00
										 |  |  |     QQmlComponent component(engine); | 
					
						
							| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  |     component.loadUrl(QUrl::fromLocalFile(m_source)); | 
					
						
							|  |  |  |     QObject *iconItem = component.create(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (iconItem) { | 
					
						
							|  |  |  | #ifdef QUICK3D_MODULE
 | 
					
						
							|  |  |  |         if (auto scene = qobject_cast<QQuick3DNode *>(iconItem)) { | 
					
						
							|  |  |  |             qmlRegisterType<QmlDesigner::Internal::SelectionBoxGeometry>("SelectionBoxGeometry", 1, 0, "SelectionBoxGeometry"); | 
					
						
							| 
									
										
										
										
											2020-11-17 17:56:45 +02:00
										 |  |  |             QQmlComponent component(engine); | 
					
						
							| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  |             component.loadUrl(QUrl("qrc:/qtquickplugin/mockfiles/IconRenderer3D.qml")); | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  |             m_containerItem = qobject_cast<QQuickItem *>(component.create()); | 
					
						
							| 
									
										
										
										
											2020-11-17 17:56:45 +02:00
										 |  |  | #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
 | 
					
						
							|  |  |  |             DesignerSupport::setRootItem(view, m_containerItem); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |             m_window->contentItem()->setSize(m_containerItem->size()); | 
					
						
							|  |  |  |             m_window->setGeometry(0, 0, m_containerItem->width(), m_containerItem->height()); | 
					
						
							|  |  |  |             m_containerItem->setParentItem(m_window->contentItem()); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             auto helper = new QmlDesigner::Internal::GeneralHelper(); | 
					
						
							| 
									
										
										
										
											2020-11-17 17:56:45 +02:00
										 |  |  |             engine->rootContext()->setContextProperty("_generalHelper", helper); | 
					
						
							| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  |             m_contentItem = QQmlProperty::read(m_containerItem, "view3D").value<QQuickItem *>(); | 
					
						
							| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  |             auto view3D = qobject_cast<QQuick3DViewport *>(m_contentItem); | 
					
						
							|  |  |  |             view3D->setImportScene(scene); | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  |             m_is3D = true; | 
					
						
							| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  |         } else | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |         if (auto scene = qobject_cast<QQuickItem *>(iconItem)) { | 
					
						
							|  |  |  |             m_contentItem = scene; | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  |             m_containerItem = new QQuickItem(); | 
					
						
							|  |  |  |             m_containerItem->setSize(QSizeF(1024, 1024)); | 
					
						
							| 
									
										
										
										
											2020-11-17 17:56:45 +02:00
										 |  |  | #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
 | 
					
						
							|  |  |  |             DesignerSupport::setRootItem(view, m_containerItem); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |             m_window->contentItem()->setSize(m_containerItem->size()); | 
					
						
							|  |  |  |             m_window->setGeometry(0, 0, m_containerItem->width(), m_containerItem->height()); | 
					
						
							|  |  |  |             m_containerItem->setParentItem(m_window->contentItem()); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  |             m_contentItem->setParentItem(m_containerItem); | 
					
						
							| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  |         if (m_containerItem && m_contentItem) { | 
					
						
							|  |  |  |             resizeContent(m_size); | 
					
						
							| 
									
										
										
										
											2020-11-17 17:56:45 +02:00
										 |  |  |             if (!initRhi()) | 
					
						
							|  |  |  |                 QTimer::singleShot(0, qGuiApp, &QGuiApplication::quit); | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  |             QTimer::singleShot(0, this, &IconRenderer::createIcon); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             QTimer::singleShot(0, qGuiApp, &QGuiApplication::quit); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         QTimer::singleShot(0, qGuiApp, &QGuiApplication::quit); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void IconRenderer::createIcon() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
 | 
					
						
							| 
									
										
										
										
											2020-11-17 17:56:45 +02:00
										 |  |  |     m_designerSupport.refFromEffectItem(m_containerItem, false); | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-11-17 17:56:45 +02:00
										 |  |  |     QQuickDesignerSupportItems::disableNativeTextRendering(m_containerItem); | 
					
						
							| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  | #ifdef QUICK3D_MODULE
 | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  |     if (m_is3D) { | 
					
						
							|  |  |  |         // Render once to make sure scene is up to date before we set up the selection box
 | 
					
						
							|  |  |  |         render({}); | 
					
						
							|  |  |  |         QMetaObject::invokeMethod(m_containerItem, "setSceneToBox"); | 
					
						
							|  |  |  |         int tries = 0; | 
					
						
							|  |  |  |         while (tries < 10) { | 
					
						
							|  |  |  |             ++tries; | 
					
						
							|  |  |  |             render({}); | 
					
						
							|  |  |  |             QMetaObject::invokeMethod(m_containerItem, "fitAndHideBox"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  |     QFileInfo fi(m_filePath); | 
					
						
							| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  |     // Render regular size image
 | 
					
						
							|  |  |  |     render(fi.absoluteFilePath()); | 
					
						
							| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  |     // Render @2x image
 | 
					
						
							|  |  |  |     resizeContent(m_size * 2); | 
					
						
							| 
									
										
										
										
											2020-11-17 17:56:45 +02:00
										 |  |  |     if (!initRhi()) | 
					
						
							|  |  |  |         QTimer::singleShot(1000, qGuiApp, &QGuiApplication::quit); | 
					
						
							| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  |     QString saveFile; | 
					
						
							|  |  |  |     saveFile = fi.absolutePath() + '/' + fi.completeBaseName() + "@2x"; | 
					
						
							|  |  |  |     if (!fi.suffix().isEmpty()) | 
					
						
							|  |  |  |         saveFile += '.' + fi.suffix(); | 
					
						
							| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  |     fi.absoluteDir().mkpath("."); | 
					
						
							| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  |     render(saveFile); | 
					
						
							| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  |     // Allow little time for file operations to finish
 | 
					
						
							|  |  |  |     QTimer::singleShot(1000, qGuiApp, &QGuiApplication::quit); | 
					
						
							| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void IconRenderer::render(const QString &fileName) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     std::function<void (QQuickItem *)> updateNodesRecursive; | 
					
						
							|  |  |  |     updateNodesRecursive = [&updateNodesRecursive](QQuickItem *item) { | 
					
						
							|  |  |  |         const auto childItems = item->childItems(); | 
					
						
							|  |  |  |         for (QQuickItem *childItem : childItems) | 
					
						
							|  |  |  |             updateNodesRecursive(childItem); | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  | #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
 | 
					
						
							| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  |         DesignerSupport::updateDirtyNode(item); | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  | #else
 | 
					
						
							|  |  |  |         if (item->flags() & QQuickItem::ItemHasContents) | 
					
						
							|  |  |  |             item->update(); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2020-11-17 17:56:45 +02:00
										 |  |  |     updateNodesRecursive(m_containerItem); | 
					
						
							| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     QRect rect(QPoint(), m_contentItem->size().toSize()); | 
					
						
							| 
									
										
										
										
											2020-11-17 17:56:45 +02:00
										 |  |  |     QImage renderImage; | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  | #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
 | 
					
						
							| 
									
										
										
										
											2020-11-17 17:56:45 +02:00
										 |  |  |     renderImage = m_designerSupport.renderImageForItem(m_containerItem, rect, rect.size()); | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2020-11-17 17:56:45 +02:00
										 |  |  |     m_renderControl->polishItems(); | 
					
						
							|  |  |  |     m_renderControl->beginFrame(); | 
					
						
							|  |  |  |     m_renderControl->sync(); | 
					
						
							|  |  |  |     m_renderControl->render(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     bool readCompleted = false; | 
					
						
							|  |  |  |     QRhiReadbackResult readResult; | 
					
						
							|  |  |  |     readResult.completed = [&] { | 
					
						
							|  |  |  |         readCompleted = true; | 
					
						
							|  |  |  |         QImage wrapperImage(reinterpret_cast<const uchar *>(readResult.data.constData()), | 
					
						
							|  |  |  |                             readResult.pixelSize.width(), readResult.pixelSize.height(), | 
					
						
							|  |  |  |                             QImage::Format_RGBA8888_Premultiplied); | 
					
						
							|  |  |  |         if (m_rhi->isYUpInFramebuffer()) | 
					
						
							|  |  |  |             renderImage = wrapperImage.mirrored().copy(0, 0, rect.width(), rect.height()); | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             renderImage = wrapperImage.copy(0, 0, rect.width(), rect.height()); | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     QRhiResourceUpdateBatch *readbackBatch = m_rhi->nextResourceUpdateBatch(); | 
					
						
							|  |  |  |     readbackBatch->readBackTexture(m_texture, &readResult); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QQuickRenderControlPrivate *rd = QQuickRenderControlPrivate::get(m_renderControl); | 
					
						
							|  |  |  |     rd->cb->resourceUpdate(readbackBatch); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     m_renderControl->endFrame(); | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-03-24 13:51:16 +02:00
										 |  |  |     if (!fileName.isEmpty()) { | 
					
						
							|  |  |  |         QFileInfo fi(fileName); | 
					
						
							|  |  |  |         if (fi.suffix().isEmpty()) | 
					
						
							|  |  |  |             renderImage.save(fileName, "PNG"); | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             renderImage.save(fileName); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-17 17:56:45 +02:00
										 |  |  | void IconRenderer::resizeContent(int dimensions) | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2020-11-17 17:56:45 +02:00
										 |  |  |     QSizeF size(dimensions, dimensions); | 
					
						
							|  |  |  |     m_contentItem->setSize(size); | 
					
						
							| 
									
										
										
										
											2020-10-08 10:50:15 +03:00
										 |  |  |     if (m_contentItem->width() > m_containerItem->width()) | 
					
						
							|  |  |  |         m_containerItem->setWidth(m_contentItem->width()); | 
					
						
							|  |  |  |     if (m_contentItem->height() > m_containerItem->height()) | 
					
						
							|  |  |  |         m_containerItem->setHeight(m_contentItem->height()); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2020-11-17 17:56:45 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | bool IconRenderer::initRhi() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
 | 
					
						
							|  |  |  |     if (!m_rhi) { | 
					
						
							|  |  |  |         QQuickRenderControlPrivate *rd = QQuickRenderControlPrivate::get(m_renderControl); | 
					
						
							|  |  |  |         m_rhi = rd->rhi; | 
					
						
							|  |  |  |         if (!m_rhi) { | 
					
						
							|  |  |  |             qWarning() << __FUNCTION__ << "Rhi is null"; | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Don't bother deleting old ones as iconrender is a single shot executable
 | 
					
						
							|  |  |  |     m_texTarget = nullptr; | 
					
						
							|  |  |  |     m_rpDesc = nullptr; | 
					
						
							|  |  |  |     m_buffer = nullptr; | 
					
						
							|  |  |  |     m_texture = nullptr; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const QSize size = m_containerItem->size().toSize(); | 
					
						
							|  |  |  |     m_texture = m_rhi->newTexture(QRhiTexture::RGBA8, size, 1, | 
					
						
							|  |  |  |                                   QRhiTexture::RenderTarget | QRhiTexture::UsedAsTransferSource); | 
					
						
							|  |  |  |     if (!m_texture->create()) { | 
					
						
							|  |  |  |         qWarning() << __FUNCTION__ << "QRhiTexture creation failed"; | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     m_buffer = m_rhi->newRenderBuffer(QRhiRenderBuffer::DepthStencil, size, 1); | 
					
						
							|  |  |  |     if (!m_buffer->create()) { | 
					
						
							|  |  |  |         qWarning() << __FUNCTION__ << "Depth/stencil buffer creation failed"; | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QRhiTextureRenderTargetDescription rtDesc {QRhiColorAttachment(m_texture)}; | 
					
						
							|  |  |  |     rtDesc.setDepthStencilBuffer(m_buffer); | 
					
						
							|  |  |  |     m_texTarget = m_rhi->newTextureRenderTarget(rtDesc); | 
					
						
							|  |  |  |     m_rpDesc = m_texTarget->newCompatibleRenderPassDescriptor(); | 
					
						
							|  |  |  |     m_texTarget->setRenderPassDescriptor(m_rpDesc); | 
					
						
							|  |  |  |     if (!m_texTarget->create()) { | 
					
						
							|  |  |  |         qWarning() << __FUNCTION__ << "Texture render target creation failed"; | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // redirect Qt Quick rendering into our texture
 | 
					
						
							|  |  |  |     m_window->setRenderTarget(QQuickRenderTarget::fromRhiRenderTarget(m_texTarget)); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     return true; | 
					
						
							|  |  |  | } |