aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/scenegraph/softwarecontext/renderingvisitor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/scenegraph/softwarecontext/renderingvisitor.cpp')
-rw-r--r--src/plugins/scenegraph/softwarecontext/renderingvisitor.cpp169
1 files changed, 169 insertions, 0 deletions
diff --git a/src/plugins/scenegraph/softwarecontext/renderingvisitor.cpp b/src/plugins/scenegraph/softwarecontext/renderingvisitor.cpp
new file mode 100644
index 0000000000..879c30eb4f
--- /dev/null
+++ b/src/plugins/scenegraph/softwarecontext/renderingvisitor.cpp
@@ -0,0 +1,169 @@
+/****************************************************************************
+**
+** 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 "renderingvisitor.h"
+
+#include "imagenode.h"
+#include "rectanglenode.h"
+#include "glyphnode.h"
+#include "ninepatchnode.h"
+#include "painternode.h"
+#include "pixmaptexture.h"
+
+#include <QtQuick/QSGSimpleRectNode>
+#include <QtQuick/qsgsimpletexturenode.h>
+#include <private/qsgtexture_p.h>
+#include <private/qquickshadereffectnode_p.h>
+
+RenderingVisitor::RenderingVisitor(QPainter *painter)
+ : painter(painter)
+{
+
+}
+
+bool RenderingVisitor::visit(QSGTransformNode *node)
+{
+ painter->save();
+ painter->setTransform(node->matrix().toTransform(), /*combine*/true);
+ return true;
+}
+
+void RenderingVisitor::endVisit(QSGTransformNode *)
+{
+ painter->restore();
+}
+
+bool RenderingVisitor::visit(QSGClipNode *node)
+{
+ painter->save();
+ painter->setClipRect(node->clipRect(), Qt::IntersectClip);
+ return true;
+}
+
+void RenderingVisitor::endVisit(QSGClipNode *)
+{
+ painter->restore();
+}
+
+bool RenderingVisitor::visit(QSGGeometryNode *node)
+{
+ if (QSGSimpleRectNode *rectNode = dynamic_cast<QSGSimpleRectNode *>(node)) {
+ if (!rectNode->material()->flags() & QSGMaterial::Blending)
+ painter->setCompositionMode(QPainter::CompositionMode_Source);
+ painter->fillRect(rectNode->rect(), rectNode->color());
+ painter->setCompositionMode(QPainter::CompositionMode_SourceOver);
+ } else if (QSGSimpleTextureNode *tn = dynamic_cast<QSGSimpleTextureNode *>(node)) {
+ QSGTexture *texture = tn->texture();
+ if (PixmapTexture *pt = dynamic_cast<PixmapTexture *>(texture)) {
+ const QPixmap &pm = pt->pixmap();
+ painter->drawPixmap(tn->rect(), pm, QRectF(0, 0, pm.width(), pm.height()));
+ } else if (QSGPlainTexture *pt = dynamic_cast<QSGPlainTexture *>(texture)) {
+ const QImage &im = pt->image();
+ painter->drawImage(tn->rect(), im, QRectF(0, 0, im.width(), im.height()));
+ } else {
+ Q_UNREACHABLE();
+ }
+ } else if (QQuickShaderEffectNode *sn = dynamic_cast<QQuickShaderEffectNode *>(node)) {
+ Q_UNUSED(sn)
+ } else {
+ Q_UNREACHABLE();
+ }
+ return true;
+}
+
+void RenderingVisitor::endVisit(QSGGeometryNode *)
+{
+}
+
+bool RenderingVisitor::visit(QSGOpacityNode *node)
+{
+ painter->save();
+
+ const qreal newOpacity = painter->opacity() * node->opacity();
+ if (qFuzzyIsNull(newOpacity))
+ return false;
+
+ painter->setOpacity(newOpacity);
+ return true;
+}
+
+void RenderingVisitor::endVisit(QSGOpacityNode *)
+{
+ painter->restore();
+}
+
+bool RenderingVisitor::visit(QSGImageNode *node)
+{
+ static_cast<ImageNode*>(node)->paint(painter);
+ return true;
+}
+
+void RenderingVisitor::endVisit(QSGImageNode *)
+{
+}
+
+bool RenderingVisitor::visit(QSGPainterNode *node)
+{
+ static_cast<PainterNode*>(node)->paint(painter);
+ return true;
+}
+
+void RenderingVisitor::endVisit(QSGPainterNode *node)
+{
+
+}
+
+bool RenderingVisitor::visit(QSGRectangleNode *node)
+{
+ static_cast<RectangleNode*>(node)->paint(painter);
+ return true;
+}
+
+void RenderingVisitor::endVisit(QSGRectangleNode *)
+{
+}
+
+bool RenderingVisitor::visit(QSGGlyphNode *node)
+{
+ static_cast<GlyphNode*>(node)->paint(painter);
+ return true;
+}
+
+void RenderingVisitor::endVisit(QSGGlyphNode *)
+{
+}
+
+bool RenderingVisitor::visit(QSGNinePatchNode *node)
+{
+ static_cast<NinePatchNode*>(node)->paint(painter);
+ return true;
+}
+
+void RenderingVisitor::endVisit(QSGNinePatchNode *)
+{
+}
+
+bool RenderingVisitor::visit(QSGRootNode *)
+{
+ return true;
+}
+
+void RenderingVisitor::endVisit(QSGRootNode *)
+{
+}