aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/scenegraph/softwarecontext/context.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/scenegraph/softwarecontext/context.cpp')
-rw-r--r--src/plugins/scenegraph/softwarecontext/context.cpp216
1 files changed, 216 insertions, 0 deletions
diff --git a/src/plugins/scenegraph/softwarecontext/context.cpp b/src/plugins/scenegraph/softwarecontext/context.cpp
new file mode 100644
index 0000000000..33dc7e87e4
--- /dev/null
+++ b/src/plugins/scenegraph/softwarecontext/context.cpp
@@ -0,0 +1,216 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the Qt SceneGraph Raster Add-on.
+**
+** $QT_BEGIN_LICENSE$
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "context.h"
+
+#include "rectanglenode.h"
+#include "imagenode.h"
+#include "painternode.h"
+#include "pixmaptexture.h"
+#include "glyphnode.h"
+#include "ninepatchnode.h"
+#include "renderingvisitor.h"
+#include "softwarelayer.h"
+
+#include <QtCore/QCoreApplication>
+#include <QtCore/QElapsedTimer>
+
+#include <QtGui/QWindow>
+
+#include <QtQuick/QSGFlatColorMaterial>
+#include <QtQuick/QSGVertexColorMaterial>
+#include <QtQuick/QSGOpaqueTextureMaterial>
+#include <QtQuick/QSGTextureMaterial>
+#include <private/qsgdefaultimagenode_p.h>
+#include <private/qsgdefaultrectanglenode_p.h>
+#include <private/qsgdistancefieldglyphnode_p_p.h>
+#include <private/qsgdefaultglyphnode_p.h>
+
+#ifndef QSG_NO_RENDERER_TIMING
+static bool qsg_render_timing = !qgetenv("QSG_RENDER_TIMING").isEmpty();
+#endif
+
+namespace SoftwareContext
+{
+
+Renderer::Renderer(QSGRenderContext *context)
+ : QSGRenderer(context)
+{
+}
+
+void Renderer::renderScene(GLuint fboId)
+{
+ class B : public QSGBindable
+ {
+ public:
+ void bind() const { }
+ } bindable;
+ QSGRenderer::renderScene(bindable);
+}
+
+void Renderer::render()
+{
+ QWindow *currentWindow = static_cast<RenderContext*>(m_context)->currentWindow;
+ if (!m_backingStore)
+ m_backingStore.reset(new QBackingStore(currentWindow));
+
+ if (m_backingStore->size() != currentWindow->size())
+ m_backingStore->resize(currentWindow->size());
+
+ const QRect rect(0, 0, currentWindow->width(), currentWindow->height());
+ m_backingStore->beginPaint(rect);
+
+ QPaintDevice *device = m_backingStore->paintDevice();
+ QPainter painter(device);
+ painter.setRenderHint(QPainter::Antialiasing);
+
+ painter.fillRect(rect, clearColor());
+ RenderingVisitor(&painter).visitChildren(rootNode());
+
+ m_backingStore->endPaint();
+ m_backingStore->flush(rect);
+}
+
+void Renderer::nodeChanged(QSGNode *node, QSGNode::DirtyState state)
+{
+
+ QSGRenderer::nodeChanged(node, state);
+}
+
+PixmapRenderer::PixmapRenderer(QSGRenderContext *context)
+ : QSGRenderer(context)
+{
+
+}
+
+void PixmapRenderer::renderScene(GLuint)
+{
+ Q_UNREACHABLE();
+}
+
+void PixmapRenderer::render()
+{
+ Q_UNREACHABLE();
+}
+
+void PixmapRenderer::render(QPixmap *target)
+{
+ const QRect rect(0, 0, target->width(), target->height());
+ target->fill(clearColor());
+ QPainter painter(target);
+ painter.setRenderHint(QPainter::Antialiasing);
+
+ RenderingVisitor(&painter).visitChildren(rootNode());
+}
+
+RenderContext::RenderContext(QSGContext *ctx)
+ : QSGRenderContext(ctx)
+ , currentWindow(0)
+ , m_initialized(false)
+{
+}
+Context::Context(QObject *parent)
+ : QSGContext(parent)
+{
+ setDistanceFieldEnabled(false);
+}
+
+QSGRectangleNode *Context::createRectangleNode()
+{
+ return new RectangleNode();
+}
+
+QSGImageNode *Context::createImageNode()
+{
+ return new ImageNode();
+}
+
+QSGPainterNode *Context::createPainterNode(QQuickPaintedItem *item)
+{
+ return new PainterNode(item);
+}
+
+QSGGlyphNode *Context::createGlyphNode(QSGRenderContext *rc, bool preferNativeGlyphNode)
+{
+ Q_UNUSED(rc);
+ Q_UNUSED(preferNativeGlyphNode);
+ return new GlyphNode();
+}
+
+QSGNinePatchNode *Context::createNinePatchNode()
+{
+ return new NinePatchNode();
+}
+
+QSGLayer *Context::createLayer(QSGRenderContext *renderContext)
+{
+ return new SoftwareLayer(renderContext);
+}
+
+QSurfaceFormat Context::defaultSurfaceFormat() const
+{
+ QSurfaceFormat format = QSurfaceFormat::defaultFormat();
+ format.setRenderableType(QSurfaceFormat::DefaultRenderableType);
+ format.setMajorVersion(0);
+ format.setMinorVersion(0);
+ return format;
+}
+
+void RenderContext::initialize(QOpenGLContext *context)
+{
+ Q_UNUSED(context)
+ Q_UNREACHABLE();
+}
+
+void RenderContext::initializeIfNeeded()
+{
+ if (m_initialized)
+ return;
+ m_initialized = true;
+ emit initialized();
+}
+
+void RenderContext::invalidate()
+{
+ QSGRenderContext::invalidate();
+}
+
+QSGTexture *RenderContext::createTexture(const QImage &image) const
+{
+ return new PixmapTexture(image);
+}
+
+QSGTexture *RenderContext::createTextureNoAtlas(const QImage &image) const
+{
+ return new PixmapTexture(image);
+}
+
+QSGRenderer *RenderContext::createRenderer()
+{
+ return new Renderer(this);
+}
+
+
+void RenderContext::renderNextFrame(QSGRenderer *renderer, GLuint fbo)
+{
+ QSGRenderContext::renderNextFrame(renderer, fbo);
+}
+
+} // namespace