From f36c55cd4724a8023ff34036b74c96982714f63a Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Mon, 15 Oct 2012 12:31:40 +0200 Subject: [PATCH] Adding DesignerWindowManager for Qt Quick Designer MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit DesignerWindowManager implements a render path just for Qt Quick Designer, which is single threaded and does not open visible windows. Change-Id: I02b0d1b819a7a5391b9bb14ee6efa1a32e0c8ad7 Reviewed-by: Samuel Rødal --- src/quick/designer/designer.pri | 6 +- src/quick/designer/designersupport.cpp | 23 ++++++ src/quick/designer/designersupport.h | 9 +- src/quick/designer/designerwindowmanager.cpp | 118 +++++++++++++++++++++++++++ src/quick/designer/designerwindowmanager_p.h | 107 ++++++++++++++++++++++++ src/quick/items/qquickwindowmanager.cpp | 20 +++-- src/quick/items/qquickwindowmanager_p.h | 4 + 7 files changed, 277 insertions(+), 10 deletions(-) create mode 100644 src/quick/designer/designerwindowmanager.cpp create mode 100644 src/quick/designer/designerwindowmanager_p.h diff --git a/src/quick/designer/designer.pri b/src/quick/designer/designer.pri index c523525..9f3f7e8 100644 --- a/src/quick/designer/designer.pri +++ b/src/quick/designer/designer.pri @@ -1,2 +1,4 @@ -HEADERS += designer/designersupport.h -SOURCES += designer/designersupport.cpp +HEADERS += designer/designersupport.h \ + designer/designerwindowmanager_p.h +SOURCES += designer/designersupport.cpp \ + designer/designerwindowmanager.cpp diff --git a/src/quick/designer/designersupport.cpp b/src/quick/designer/designersupport.cpp index c06e8f0..78445d7 100644 --- a/src/quick/designer/designersupport.cpp +++ b/src/quick/designer/designersupport.cpp @@ -46,9 +46,13 @@ #include #include #include +#include #include #include +#include "designerwindowmanager_p.h" + + QT_BEGIN_NAMESPACE DesignerSupport::DesignerSupport() @@ -119,6 +123,7 @@ QImage DesignerSupport::renderImageForItem(QQuickItem *referencedItem, const QRe return QImage(); renderTexture->setRect(boundingRect); renderTexture->setSize(imageSize); + renderTexture->markDirtyTexture(); renderTexture->updateTexture(); QImage renderImage = renderTexture->toImage(); @@ -138,6 +143,14 @@ bool DesignerSupport::isDirty(QQuickItem *referencedItem, DirtyType dirtyType) return QQuickItemPrivate::get(referencedItem)->dirtyAttributes & dirtyType; } +void DesignerSupport::addDirty(QQuickItem *referencedItem, DesignerSupport::DirtyType dirtyType) +{ + if (referencedItem == 0) + return; + + QQuickItemPrivate::get(referencedItem)->dirtyAttributes |= dirtyType; +} + void DesignerSupport::resetDirty(QQuickItem *referencedItem) { if (referencedItem == 0) @@ -410,4 +423,14 @@ void DesignerSupport::updateDirtyNode(QQuickItem *item) QQuickWindowPrivate::get(item->window())->updateDirtyNode(item); } +void DesignerSupport::activateDesignerWindowManager() +{ + QQuickWindowManager::setInstance(new DesignerWindowManager); +} + +void DesignerSupport::createOpenGLContext(QQuickWindow *window) +{ + DesignerWindowManager::createOpenGLContext(window); +} + QT_END_NAMESPACE diff --git a/src/quick/designer/designersupport.h b/src/quick/designer/designersupport.h index 54331fd..e27cb3b 100644 --- a/src/quick/designer/designersupport.h +++ b/src/quick/designer/designersupport.h @@ -70,6 +70,7 @@ class QTransform; class QQmlContext; class QQuickView; class QObject; +class QQuickWindow; class Q_QUICK_EXPORT DesignerSupport { @@ -99,7 +100,8 @@ public: TransformUpdateMask = TransformOrigin | Transform | BasicTransform | Position | Size | Window, ComplexTransformUpdateMask = Transform | Window, ContentUpdateMask = Size | Content | Smooth | Window, - ChildrenUpdateMask = ChildrenChanged | ChildrenStackingChanged | EffectReference | Window + ChildrenUpdateMask = ChildrenChanged | ChildrenStackingChanged | EffectReference | Window, + AllMask = TransformUpdateMask | ContentUpdateMask | ChildrenUpdateMask }; @@ -112,6 +114,7 @@ public: QImage renderImageForItem(QQuickItem *referencedItem, const QRectF &boundingRect, const QSize &imageSize); static bool isDirty(QQuickItem *referencedItem, DirtyType dirtyType); + static void addDirty(QQuickItem *referencedItem, DirtyType dirtyType); static void resetDirty(QQuickItem *referencedItem); static QTransform windowTransform(QQuickItem *referencedItem); @@ -141,6 +144,10 @@ public: static void updateDirtyNode(QQuickItem *item); + static void activateDesignerWindowManager(); + + static void createOpenGLContext(QQuickWindow *window); + private: QHash m_itemTextureHash; }; diff --git a/src/quick/designer/designerwindowmanager.cpp b/src/quick/designer/designerwindowmanager.cpp new file mode 100644 index 0000000..fca9f53 --- /dev/null +++ b/src/quick/designer/designerwindowmanager.cpp @@ -0,0 +1,118 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtQml module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "designerwindowmanager_p.h" + +#include + +#include + + +QT_BEGIN_NAMESPACE + +DesignerWindowManager::DesignerWindowManager() + : m_sgContext(QSGContext::createDefaultContext()) +{ +} + +void DesignerWindowManager::show(QQuickWindow *window) +{ + makeOpenGLContext(window); +} + +void DesignerWindowManager::hide(QQuickWindow *) +{ +} + +void DesignerWindowManager::windowDestroyed(QQuickWindow *) +{ +} + +void DesignerWindowManager::makeOpenGLContext(QQuickWindow *window) +{ + if (!m_openGlContext) { + m_openGlContext.reset(new QOpenGLContext()); + m_openGlContext->setFormat(window->requestedFormat()); + m_openGlContext->create(); + if (!m_openGlContext->makeCurrent(window)) + qWarning("QQuickWindow: makeCurrent() failed..."); + m_sgContext->initialize(m_openGlContext.data()); + } else { + m_openGlContext->makeCurrent(window); + } +} + +void DesignerWindowManager::exposureChanged(QQuickWindow *) +{ +} + +QImage DesignerWindowManager::grab(QQuickWindow *) +{ + return QImage(); +} + +void DesignerWindowManager::resize(QQuickWindow *, const QSize &) +{ +} + +void DesignerWindowManager::maybeUpdate(QQuickWindow *) +{ +} + +QSGContext *DesignerWindowManager::sceneGraphContext() const +{ + return m_sgContext.data(); +} + +void DesignerWindowManager::createOpenGLContext(QQuickWindow *window) +{ + window->create(); + window->update(); +} + +void DesignerWindowManager::update(QQuickWindow *window) +{ + makeOpenGLContext(window); +} + +QT_END_NAMESPACE + + diff --git a/src/quick/designer/designerwindowmanager_p.h b/src/quick/designer/designerwindowmanager_p.h new file mode 100644 index 0000000..222a93f --- /dev/null +++ b/src/quick/designer/designerwindowmanager_p.h @@ -0,0 +1,107 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtQml module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef DESIGNERWINDOWMANAGER_P_H +#define DESIGNERWINDOWMANAGER_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include + +#include +#include +#include + + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +class QQuickWindow; +class QSGContext; +class QAnimationDriver; +class QOpenGLContext; + +class DesignerWindowManager : public QObject, public QQuickWindowManager +{ + Q_OBJECT +public: + DesignerWindowManager(); + + void show(QQuickWindow *window); + void hide(QQuickWindow *window); + + void windowDestroyed(QQuickWindow *window); + + void makeOpenGLContext(QQuickWindow *window); + void exposureChanged(QQuickWindow *window); + QImage grab(QQuickWindow *window); + void resize(QQuickWindow *window, const QSize &size); + + void maybeUpdate(QQuickWindow *window); + void update(QQuickWindow *window); // identical for this implementation. + + void releaseResources() { } + + QAnimationDriver *animationDriver() const { return 0; } + + QSGContext *sceneGraphContext() const; + + static void createOpenGLContext(QQuickWindow *window); + +private: + QScopedPointer m_openGlContext; + QScopedPointer m_sgContext; +}; + +QT_END_NAMESPACE + +QT_END_HEADER +#endif // DESIGNERWINDOWMANAGER_P_H diff --git a/src/quick/items/qquickwindowmanager.cpp b/src/quick/items/qquickwindowmanager.cpp index 6596343..dd27182 100644 --- a/src/quick/items/qquickwindowmanager.cpp +++ b/src/quick/items/qquickwindowmanager.cpp @@ -74,6 +74,8 @@ extern Q_GUI_EXPORT QImage qt_gl_read_framebuffer(const QSize &size, bool alpha_ DEFINE_BOOL_CONFIG_OPTION(qmlNoThreadedRenderer, QML_BAD_GUI_RENDER_LOOP); DEFINE_BOOL_CONFIG_OPTION(qmlForceThreadedRenderer, QML_FORCE_THREADED_RENDERER); // Might trigger graphics driver threading bugs, use at own risk +QQuickWindowManager *QQuickWindowManager::s_instance = 0; + QQuickWindowManager::~QQuickWindowManager() { } @@ -124,11 +126,9 @@ public: QQuickWindowManager *QQuickWindowManager::instance() { - static QQuickWindowManager *theInstance; - - if (!theInstance) { + if (!s_instance) { - theInstance = QSGContext::createWindowManager(); + s_instance = QSGContext::createWindowManager(); bool bufferQueuing = QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::BufferQueueingOpenGL); bool fancy = bufferQueuing @@ -148,13 +148,19 @@ QQuickWindowManager *QQuickWindowManager::instance() if (fixedAnimationSteps) QUnifiedTimer::instance(true)->setConsistentTiming(true); - if (!theInstance) { - theInstance = fancy + if (!s_instance) { + s_instance = fancy ? (QQuickWindowManager*) new QQuickRenderThreadSingleContextWindowManager : (QQuickWindowManager*) new QQuickTrivialWindowManager; } } - return theInstance; + return s_instance; +} + +void QQuickWindowManager::setInstance(QQuickWindowManager *instance) +{ + Q_ASSERT(!s_instance); + s_instance = instance; } QQuickTrivialWindowManager::QQuickTrivialWindowManager() diff --git a/src/quick/items/qquickwindowmanager_p.h b/src/quick/items/qquickwindowmanager_p.h index 7a6d261..ac46fd3 100644 --- a/src/quick/items/qquickwindowmanager_p.h +++ b/src/quick/items/qquickwindowmanager_p.h @@ -76,6 +76,10 @@ public: // ### make this less of a singleton static QQuickWindowManager *instance(); + static void setInstance(QQuickWindowManager *instance); + +private: + static QQuickWindowManager *s_instance; }; QT_END_NAMESPACE -- 2.7.4