From ba0d8e93d8525bb459e9b6cb384f2fe0701d5a02 Mon Sep 17 00:00:00 2001 From: Andy Nichols Date: Mon, 1 Sep 2014 16:49:58 +0200 Subject: Reformat project to be a Qt Module Change-Id: I2fe8df530a687247a9cd7ea12c1d8de79fef506e Reviewed-by: Simon Hausmann --- .../softwarecontext/renderingvisitor.cpp | 169 +++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 src/plugins/scenegraph/softwarecontext/renderingvisitor.cpp (limited to 'src/plugins/scenegraph/softwarecontext/renderingvisitor.cpp') 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 +#include +#include +#include + +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(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(node)) { + QSGTexture *texture = tn->texture(); + if (PixmapTexture *pt = dynamic_cast(texture)) { + const QPixmap &pm = pt->pixmap(); + painter->drawPixmap(tn->rect(), pm, QRectF(0, 0, pm.width(), pm.height())); + } else if (QSGPlainTexture *pt = dynamic_cast(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(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(node)->paint(painter); + return true; +} + +void RenderingVisitor::endVisit(QSGImageNode *) +{ +} + +bool RenderingVisitor::visit(QSGPainterNode *node) +{ + static_cast(node)->paint(painter); + return true; +} + +void RenderingVisitor::endVisit(QSGPainterNode *node) +{ + +} + +bool RenderingVisitor::visit(QSGRectangleNode *node) +{ + static_cast(node)->paint(painter); + return true; +} + +void RenderingVisitor::endVisit(QSGRectangleNode *) +{ +} + +bool RenderingVisitor::visit(QSGGlyphNode *node) +{ + static_cast(node)->paint(painter); + return true; +} + +void RenderingVisitor::endVisit(QSGGlyphNode *) +{ +} + +bool RenderingVisitor::visit(QSGNinePatchNode *node) +{ + static_cast(node)->paint(painter); + return true; +} + +void RenderingVisitor::endVisit(QSGNinePatchNode *) +{ +} + +bool RenderingVisitor::visit(QSGRootNode *) +{ + return true; +} + +void RenderingVisitor::endVisit(QSGRootNode *) +{ +} -- cgit v1.2.3