summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gui/graphicsview/qgraphicsscene.cpp44
-rw-r--r--src/gui/graphicsview/qgraphicsscene_p.h3
-rw-r--r--src/gui/graphicsview/qgraphicsview.cpp3
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<QGraphicsItem *> &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;