From df23e7804f41ae55598d07d8f36d321a9774ade6 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Mon, 25 Aug 2014 14:43:59 +0200 Subject: Add support for rendering QSGSimpleTextureNode's With this change, Canvas works correctly, at least in Image mode. Change-Id: I6641c07b031870dad3c7f9f50ece163724ad429a Reviewed-by: Simon Hausmann --- softwarecontext/context.cpp | 2 +- softwarecontext/renderingvisitor.cpp | 27 +++++++++++++++++++-------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/softwarecontext/context.cpp b/softwarecontext/context.cpp index 1a8b07b1b4..6b72bbfaad 100644 --- a/softwarecontext/context.cpp +++ b/softwarecontext/context.cpp @@ -190,7 +190,7 @@ QSGTexture *RenderContext::createTexture(const QImage &image) const QSGTexture *RenderContext::createTextureNoAtlas(const QImage &image) const { - return QSGRenderContext::createTextureNoAtlas(image); + return new PixmapTexture(image); } QSGRenderer *RenderContext::createRenderer() diff --git a/softwarecontext/renderingvisitor.cpp b/softwarecontext/renderingvisitor.cpp index 247c4b7c3b..869ca6d49e 100644 --- a/softwarecontext/renderingvisitor.cpp +++ b/softwarecontext/renderingvisitor.cpp @@ -24,8 +24,11 @@ #include "glyphnode.h" #include "ninepatchnode.h" #include "painternode.h" +#include "pixmaptexture.h" #include +#include +#include RenderingVisitor::RenderingVisitor(QPainter *painter) : painter(painter) @@ -59,22 +62,30 @@ void RenderingVisitor::endVisit(QSGClipNode *) bool RenderingVisitor::visit(QSGGeometryNode *node) { - //Check for QSGSimpleRect - QSGSimpleRectNode *rectNode = 0; - rectNode = dynamic_cast(node); - if (rectNode) { + 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 { + Q_UNREACHABLE(); } - return true; } -void RenderingVisitor::endVisit(QSGGeometryNode *node) +void RenderingVisitor::endVisit(QSGGeometryNode *) { - } bool RenderingVisitor::visit(QSGOpacityNode *node) @@ -89,7 +100,7 @@ bool RenderingVisitor::visit(QSGOpacityNode *node) return true; } -void RenderingVisitor::endVisit(QSGOpacityNode *node) +void RenderingVisitor::endVisit(QSGOpacityNode *) { painter->restore(); } -- cgit v1.2.3