From 1873203f3a3c64a2eb59bbc555eb8edf6b30315a Mon Sep 17 00:00:00 2001 From: Andreas Aardal Hanssen Date: Mon, 25 May 2009 16:41:31 +0200 Subject: Fix optimization flags and opacity. --- src/gui/graphicsview/qgraphicsscene.cpp | 44 +++++++++++++++++++++++---------- src/gui/graphicsview/qgraphicsscene_p.h | 3 ++- src/gui/graphicsview/qgraphicsview.cpp | 3 ++- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/src/gui/graphicsview/qgraphicsscene.cpp b/src/gui/graphicsview/qgraphicsscene.cpp index 362d66d..e360a07 100644 --- a/src/gui/graphicsview/qgraphicsscene.cpp +++ b/src/gui/graphicsview/qgraphicsscene.cpp @@ -5019,12 +5019,22 @@ void QGraphicsScenePrivate::drawItemHelper(QGraphicsItem *item, QPainter *painte } void QGraphicsScenePrivate::drawSubtreeRecursive(QGraphicsItem *item, QPainter *painter, const QTransform &viewTransform, - const QRegion &exposedRegion, QWidget *widget) + const QRegion &exposedRegion, QWidget *widget, + QGraphicsView::OptimizationFlags optimizationFlags) { - if (item && (!item->isVisible() || qFuzzyIsNull(item->opacity()))) + if (item && (!item->isVisible())) return; - painter->save(); + bool hasOpacity = item && item->d_ptr->hasEffectiveOpacity; + bool childClip = (item && (item->flags() & QGraphicsItem::ItemClipsChildrenToShape)); + bool savePainter = !(optimizationFlags & QGraphicsView::DontSavePainterState); + + QTransform restoreTransform; + if (childClip || hasOpacity) { + painter->save(); + } else { + restoreTransform = painter->worldTransform(); + } // Set transform if (item) { @@ -5047,8 +5057,10 @@ void QGraphicsScenePrivate::drawSubtreeRecursive(QGraphicsItem *item, QPainter * } // Setup recursive clipping. - if (item && (item->flags() & QGraphicsItem::ItemClipsChildrenToShape)) + if (childClip) painter->setClipPath(item->shape(), Qt::IntersectClip); + if (hasOpacity) + painter->setOpacity(item->effectiveOpacity()); #if 0 const QList &children = item ? item->d_ptr->children : topLevelItems; @@ -5065,34 +5077,40 @@ void QGraphicsScenePrivate::drawSubtreeRecursive(QGraphicsItem *item, QPainter * QGraphicsItem *child = children.at(i); if (!(child->flags() & QGraphicsItem::ItemStacksBehindParent)) break; - drawSubtreeRecursive(child, painter, viewTransform, exposedRegion, widget); + drawSubtreeRecursive(child, painter, viewTransform, exposedRegion, widget, optimizationFlags); } // Draw item - if (item) { - QRect itemViewRect = painter->worldTransform().mapRect(item->boundingRect()).toRect().adjusted(-1, -1, 1, 1); + if (item && !item->d_ptr->isFullyTransparent()) { + QRectF brect = item->boundingRect(); + _q_adjustRect(&brect); + QRect itemViewRect = painter->worldTransform().mapRect(brect).toRect().adjusted(-1, -1, 1, 1); if (itemViewRect.intersects(exposedRegion.boundingRect())) { QStyleOptionGraphicsItem option; item->d_ptr->initStyleOption(&option, painter->worldTransform(), exposedRegion); bool clipsToShape = (item->flags() & QGraphicsItem::ItemClipsToShape); - if (clipsToShape) { + if (savePainter || clipsToShape) painter->save(); + if (clipsToShape) painter->setClipPath(item->shape(), Qt::IntersectClip); - } drawItemHelper(item, painter, &option, widget, false); - - if (clipsToShape) + + if (savePainter || clipsToShape) painter->restore(); } } // Draw children in front for (; i < children.size(); ++i) - drawSubtreeRecursive(children.at(i), painter, viewTransform, exposedRegion, widget); + drawSubtreeRecursive(children.at(i), painter, viewTransform, exposedRegion, widget, optimizationFlags); - painter->restore(); + if (childClip || hasOpacity) { + painter->restore(); + } else { + painter->setWorldTransform(restoreTransform, /* combine = */ false); + } } /*! diff --git a/src/gui/graphicsview/qgraphicsscene_p.h b/src/gui/graphicsview/qgraphicsscene_p.h index 369b0ef..0ac1765 100644 --- a/src/gui/graphicsview/qgraphicsscene_p.h +++ b/src/gui/graphicsview/qgraphicsscene_p.h @@ -57,6 +57,7 @@ #if !defined(QT_NO_GRAPHICSVIEW) || (QT_EDITION & QT_MODULE_GRAPHICSVIEW) != QT_MODULE_GRAPHICSVIEW +#include "qgraphicsview.h" #include "qgraphicsscene_bsp_p.h" #include "qgraphicsitem_p.h" @@ -254,7 +255,7 @@ public: bool painterStateProtection); void drawSubtreeRecursive(QGraphicsItem *item, QPainter *painter, const QTransform &viewTransform, - const QRegion &exposedRegion, QWidget *widget); + const QRegion &exposedRegion, QWidget *widget, QGraphicsView::OptimizationFlags optimizationFlags); QStyle *style; QFont font; diff --git a/src/gui/graphicsview/qgraphicsview.cpp b/src/gui/graphicsview/qgraphicsview.cpp index 2459c49..40c84db 100644 --- a/src/gui/graphicsview/qgraphicsview.cpp +++ b/src/gui/graphicsview/qgraphicsview.cpp @@ -3435,7 +3435,8 @@ void QGraphicsView::paintEvent(QPaintEvent *event) const char *directEnv = getenv("QGRAPHICSVIEW_DIRECT"); bool overrideDirectPaint = directEnv && atoi(directEnv) != 0; if (overrideDirectPaint || (d->optimizationFlags & BypassDrawItems)) { - d->scene->d_func()->drawSubtreeRecursive(0, &painter, viewTransform, exposedRegion, viewport()); + d->scene->d_func()->drawSubtreeRecursive(0, &painter, viewTransform, exposedRegion, + viewport(), d->optimizationFlags); } else { // Find all exposed items bool allItems = false; -- cgit v0.12