diff options
Diffstat (limited to 'src/declarative/scenegraph/qsgcontext.cpp')
-rw-r--r-- | src/declarative/scenegraph/qsgcontext.cpp | 512 |
1 files changed, 0 insertions, 512 deletions
diff --git a/src/declarative/scenegraph/qsgcontext.cpp b/src/declarative/scenegraph/qsgcontext.cpp deleted file mode 100644 index 1545303d4a..0000000000 --- a/src/declarative/scenegraph/qsgcontext.cpp +++ /dev/null @@ -1,512 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** 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, Nokia gives you certain additional -** rights. These rights are described in the Nokia 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. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <private/qsgcontext_p.h> -#include <private/qsgrenderer_p.h> -#include "qsgnode.h" - -#include <private/qdeclarativepixmapcache_p.h> - -#include <private/qsgdefaultrenderer_p.h> - -#include <private/qsgdistancefieldutil_p.h> -#include <private/qsgdefaultdistancefieldglyphcache_p.h> -#include <private/qsgdefaultrectanglenode_p.h> -#include <private/qsgdefaultimagenode_p.h> -#include <private/qsgdefaultglyphnode_p.h> -#include <private/qsgdistancefieldglyphnode_p.h> - -#include <private/qsgtexture_p.h> -#include <QGuiApplication> -#include <QOpenGLContext> - -#include <QDeclarativeImageProvider> - -#include <private/qobject_p.h> -#include <qmutex.h> - -DEFINE_BOOL_CONFIG_OPTION(qmlFlashMode, QML_FLASH_MODE) -DEFINE_BOOL_CONFIG_OPTION(qmlTranslucentMode, QML_TRANSLUCENT_MODE) -DEFINE_BOOL_CONFIG_OPTION(qmlDisableDistanceField, QML_DISABLE_DISTANCEFIELD) - -/* - Comments about this class from Gunnar: - - The QSGContext class is right now two things.. The first is the - adaptation layer and central storage ground for all the things - in the scene graph, like textures and materials. This part really - belongs inside the scene graph coreapi. - - The other part is the QML adaptation classes, like how to implement - rectangle nodes. This is not part of the scene graph core API, but - more part of the QML adaptation of scene graph. - - If we ever move the scene graph core API into its own thing, this class - needs to be split in two. Right now its one because we're lazy when it comes - to defining plugin interfaces.. -*/ - - -QT_BEGIN_NAMESPACE - -class QSGContextPrivate : public QObjectPrivate -{ -public: - QSGContextPrivate() - : rootNode(0) - , renderer(0) - , gl(0) - , distanceFieldCacheManager(0) - , flashMode(qmlFlashMode()) - , distanceFieldDisabled(qmlDisableDistanceField()) - { - renderAlpha = qmlTranslucentMode() ? 0.5 : 1; - } - - ~QSGContextPrivate() - { - } - - QSGRootNode *rootNode; - QSGRenderer *renderer; - - QOpenGLContext *gl; - - QHash<QSGMaterialType *, QSGMaterialShader *> materials; - QHash<QDeclarativeTextureFactory *, QSGTexture *> textures; - - QSGDistanceFieldGlyphCacheManager *distanceFieldCacheManager; - - bool flashMode; - float renderAlpha; - bool distanceFieldDisabled; -}; - - -/*! - \class QSGContext - - \brief The QSGContext holds the scene graph entry points for one QML engine. - - The context is not ready for use until it has a QOpenGLContext. Once that happens, - the scene graph population can start. - - \internal - */ - -QSGContext::QSGContext(QObject *parent) : - QObject(*(new QSGContextPrivate), parent) -{ -} - - -QSGContext::~QSGContext() -{ - Q_D(QSGContext); - qDeleteAll(d->textures.values()); - d->textures.clear(); - delete d->renderer; - delete d->rootNode; - qDeleteAll(d->materials.values()); - delete d->distanceFieldCacheManager; -} - - -QSGTexture *QSGContext::textureForFactory(QDeclarativeTextureFactory *factory) -{ - Q_D(QSGContext); - if (!factory) - return 0; - - QSGTexture *texture = d->textures.value(factory); - if (!texture) { - if (QDeclarativeDefaultTextureFactory *dtf = qobject_cast<QDeclarativeDefaultTextureFactory *>(factory)) - texture = createTexture(dtf->image()); - else - texture = factory->createTexture(); - d->textures.insert(factory, texture); - connect(factory, SIGNAL(destroyed(QObject *)), this, SLOT(textureFactoryDestroyed(QObject *))); - } - return texture; -} - - -void QSGContext::textureFactoryDestroyed(QObject *o) -{ - Q_D(QSGContext); - QDeclarativeTextureFactory *f = static_cast<QDeclarativeTextureFactory *>(o); - - // This function will only be called on the scene graph thread, so it is - // safe to directly delete the texture here. - delete d->textures.take(f); -} - - - -/*! - Returns the renderer. The renderer instance is created through the adaptation layer. - */ -QSGRenderer *QSGContext::renderer() const -{ - Q_D(const QSGContext); - return d->renderer; -} - - -/*! - Returns the root node. The root node instance is only created once the scene graph - context becomes ready. - */ -QSGRootNode *QSGContext::rootNode() const -{ - Q_D(const QSGContext); - return d->rootNode; -} - - -QOpenGLContext *QSGContext::glContext() const -{ - Q_D(const QSGContext); - return d->gl; -} - -/*! - Initializes the scene graph context with the GL context \a context. This also - emits the ready() signal so that the QML graph can start building scene graph nodes. - */ -void QSGContext::initialize(QOpenGLContext *context) -{ - Q_D(QSGContext); - - Q_ASSERT(!d->gl); - - d->gl = context; - - d->renderer = createRenderer(); - d->renderer->setClearColor(Qt::white); - - d->rootNode = new QSGRootNode(); - d->renderer->setRootNode(d->rootNode); - - emit ready(); -} - - -/*! - Returns if the scene graph context is ready or not, meaning that it has a valid - GL context. - */ -bool QSGContext::isReady() const -{ - Q_D(const QSGContext); - return d->gl; -} - - -void QSGContext::renderNextFrame(QOpenGLFramebufferObject *fbo) -{ - Q_D(QSGContext); - - if (fbo) { - QSGBindableFbo bindable(fbo); - d->renderer->renderScene(bindable); - } else { - d->renderer->renderScene(); - } - -} - -/*! - Factory function for scene graph backends of the Rectangle element. - */ -QSGRectangleNode *QSGContext::createRectangleNode() -{ - return new QSGDefaultRectangleNode(this); -} - -/*! - Factory function for scene graph backends of the Image element. - */ -QSGImageNode *QSGContext::createImageNode() -{ - return new QSGDefaultImageNode; -} - -/*! - Factory function for scene graph backends of the distance-field glyph cache. - */ -QSGDistanceFieldGlyphCache *QSGContext::createDistanceFieldGlyphCache(const QRawFont &font) -{ - Q_D(QSGContext); - return new QSGDefaultDistanceFieldGlyphCache(d->distanceFieldCacheManager, glContext(), font); -} - -/*! - Factory function for scene graph backends of the Text elements; - */ -QSGGlyphNode *QSGContext::createGlyphNode() -{ - Q_D(QSGContext); - - // ### Do something with these before final release... - static bool doSubpixel = qApp->arguments().contains(QLatin1String("--text-subpixel-antialiasing")); - static bool doLowQualSubpixel = qApp->arguments().contains(QLatin1String("--text-subpixel-antialiasing-lowq")); - static bool doGray = qApp->arguments().contains(QLatin1String("--text-gray-antialiasing")); - - if (d->distanceFieldDisabled) { - return new QSGDefaultGlyphNode; - } else { - if (!d->distanceFieldCacheManager) { - d->distanceFieldCacheManager = new QSGDistanceFieldGlyphCacheManager(this); - if (doSubpixel) - d->distanceFieldCacheManager->setDefaultAntialiasingMode(QSGGlyphNode::HighQualitySubPixelAntialiasing); - else if (doLowQualSubpixel) - d->distanceFieldCacheManager->setDefaultAntialiasingMode(QSGGlyphNode::LowQualitySubPixelAntialiasing); - else if (doGray) - d->distanceFieldCacheManager->setDefaultAntialiasingMode(QSGGlyphNode::GrayAntialiasing); - } - - QSGGlyphNode *node = new QSGDistanceFieldGlyphNode(d->distanceFieldCacheManager); - return node; - } -} - -/*! - Factory function for the scene graph renderers. - - The renderers are used for the toplevel renderer and once for every - QQuickShaderEffectSource used in the QML scene. - */ -QSGRenderer *QSGContext::createRenderer() -{ - // ### Do something with this before release... - static bool doFrontToBack = qApp->arguments().contains(QLatin1String("--opaque-front-to-back")); - QSGDefaultRenderer *renderer = new QSGDefaultRenderer(this); - if (doFrontToBack) { - printf("QSGContext: Sorting opaque nodes front to back...\n"); - renderer->setSortFrontToBackEnabled(true); - } - return renderer; -} - - - -/*! - Return true if the image provider supports direct decoding of images, - straight into textures without going through a QImage first. - - If the implementation returns true from this function, the decodeImageToTexture() function - will be called to read data from a QIODevice, rather than QML decoding - the image using QImageReader and passing the result to setImage(). - - \warning This function will be called from outside the GUI and rendering threads - and must not make use of OpenGL. - */ - -bool QSGContext::canDecodeImageToTexture() const -{ - return true; -} - - - -/*! - Decode the data in \a dev directly to a texture provider of \a requestSize size. - The size of the decoded data should be written to \a impsize. - - If the implementation fails to decode the image data, it should return 0. The - image data will then be decoded normally. - - \warning This function will be called from outside the GUI and renderer threads - and must not make use of GL calls. - */ - -QSGTexture *QSGContext::decodeImageToTexture(QIODevice *dev, - QSize *size, - const QSize &requestSize) -{ - Q_UNUSED(dev); - Q_UNUSED(size); - Q_UNUSED(requestSize); - return 0; -} - - - -QSurfaceFormat QSGContext::defaultSurfaceFormat() const -{ - QSurfaceFormat format; - format.setDepthBufferSize(24); - format.setStencilBufferSize(8); - format.setSamples(16); - return format; -} - - -/*! - Factory function for texture objects. - - If \a image is a valid image, the QSGTexture::setImage function - will be called with \a image as argument. - */ - -QSGTexture *QSGContext::createTexture(const QImage &image) const -{ - QSGPlainTexture *t = new QSGPlainTexture(); - if (!image.isNull()) - t->setImage(image); - return t; -} - - - -/*! - Returns the minimum supported framebuffer object size. - */ - -QSize QSGContext::minimumFBOSize() const -{ -#ifdef Q_OS_MAC - return QSize(33, 33); -#else - return QSize(1, 1); -#endif -} - - - -/*! - Returns a material shader for the given material. - */ - -QSGMaterialShader *QSGContext::prepareMaterial(QSGMaterial *material) -{ - Q_D(QSGContext); - QSGMaterialType *type = material->type(); - QSGMaterialShader *shader = d->materials.value(type); - if (shader) - return shader; - - shader = material->createShader(); - shader->compile(); - shader->initialize(); - d->materials[type] = shader; - - return shader; -} - - - -/*! - Sets whether the scene graph should render with flashing update rectangles or not - */ - -void QSGContext::setFlashModeEnabled(bool enabled) -{ - d_func()->flashMode = enabled; -} - - -/*! - Returns true if the scene graph should be rendered with flashing update rectangles - */ -bool QSGContext::isFlashModeEnabled() const -{ - return d_func()->flashMode; -} - - -/*! - Sets the toplevel opacity for rendering. This value will be multiplied into all - drawing calls where possible. - - The default value is 1. Any other value will cause artifacts and is primarily - useful for debugging. - */ -void QSGContext::setRenderAlpha(qreal renderAlpha) -{ - d_func()->renderAlpha = renderAlpha; -} - - -/*! - Returns the toplevel opacity used for rendering. - - The default value is 1. - - \sa setRenderAlpha() - */ -qreal QSGContext::renderAlpha() const -{ - return d_func()->renderAlpha; -} - - -/*! - Sets whether or not the scene graph should use the distance field technique to render text - */ -void QSGContext::setDistanceFieldEnabled(bool enabled) -{ - d_func()->distanceFieldDisabled = !enabled; -} - - -/*! - Returns true if the scene graph uses the distance field technique to render text - */ -bool QSGContext::isDistanceFieldEnabled() const -{ - return !d_func()->distanceFieldDisabled; -} - - - -/*! - Creates a new animation driver. - */ - -QAnimationDriver *QSGContext::createAnimationDriver(QObject *parent) -{ - return new QAnimationDriver(parent); -} - - -QT_END_NAMESPACE |