diff options
author | Bjørn Erik Nilsen <bjorn.nilsen@nokia.com> | 2009-06-17 14:49:57 (GMT) |
---|---|---|
committer | Bjørn Erik Nilsen <bjorn.nilsen@nokia.com> | 2009-06-17 15:19:44 (GMT) |
commit | 85f811b849f3b0e0b79e0f1b7bf41512d7f53414 (patch) | |
tree | f7dfed79e0f7935fb2be334dfa3715ec239d9f6d | |
parent | de0b9a76f8903448caa8e8995084b4d153f5c888 (diff) | |
download | Qt-85f811b849f3b0e0b79e0f1b7bf41512d7f53414.zip Qt-85f811b849f3b0e0b79e0f1b7bf41512d7f53414.tar.gz Qt-85f811b849f3b0e0b79e0f1b7bf41512d7f53414.tar.bz2 |
Reduce QTransform operations in QGraphicsView::paintEvent.
The view is usually untransformed, and in that case there's no need to
call QGraphicsView::viewportTransform() and QPainter::setWorldTransform().
Reviewed-by: Andreas
-rw-r--r-- | src/gui/graphicsview/qgraphicsview.cpp | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/src/gui/graphicsview/qgraphicsview.cpp b/src/gui/graphicsview/qgraphicsview.cpp index d354b49..5ed3a11 100644 --- a/src/gui/graphicsview/qgraphicsview.cpp +++ b/src/gui/graphicsview/qgraphicsview.cpp @@ -3246,8 +3246,9 @@ void QGraphicsView::paintEvent(QPaintEvent *event) painter.setRenderHints(d->renderHints, true); // Set up viewport transform - const QTransform viewTransform = viewportTransform(); - painter.setWorldTransform(viewTransform); + const bool viewTransformed = isTransformed(); + if (viewTransformed) + painter.setWorldTransform(viewportTransform()); // Draw background if ((d->cacheMode & CacheBackground) @@ -3272,16 +3273,22 @@ void QGraphicsView::paintEvent(QPaintEvent *event) if (!d->backgroundPixmapExposed.isEmpty()) { QPainter backgroundPainter(&d->backgroundPixmap); backgroundPainter.setClipRegion(d->backgroundPixmapExposed, Qt::ReplaceClip); - backgroundPainter.setTransform(viewportTransform()); + if (viewTransformed) + backgroundPainter.setTransform(painter.worldTransform()); backgroundPainter.setCompositionMode(QPainter::CompositionMode_Source); drawBackground(&backgroundPainter, exposedSceneRect); d->backgroundPixmapExposed = QRegion(); } // Blit the background from the background pixmap - painter.setWorldTransform(QTransform()); - painter.drawPixmap(QPoint(), d->backgroundPixmap); - painter.setWorldTransform(viewTransform); + if (viewTransformed) { + const QTransform viewTransform = painter.worldTransform(); + painter.setWorldTransform(QTransform()); + painter.drawPixmap(QPoint(), d->backgroundPixmap); + painter.setWorldTransform(viewTransform); + } else { + painter.drawPixmap(QPoint(), d->backgroundPixmap); + } } else { if (!(d->optimizationFlags & DontSavePainterState)) painter.save(); @@ -3292,7 +3299,7 @@ void QGraphicsView::paintEvent(QPaintEvent *event) // Items if (!(d->optimizationFlags & IndirectPainting)) { - d->scene->d_func()->drawSubtreeRecursive(0, &painter, viewTransform, &d->exposedRegion, + d->scene->d_func()->drawSubtreeRecursive(0, &painter, painter.worldTransform(), &d->exposedRegion, viewport(), 0); } else { // Find all exposed items @@ -3304,8 +3311,10 @@ void QGraphicsView::paintEvent(QPaintEvent *event) const int numItems = itemList.size(); QGraphicsItem **itemArray = &itemList[0]; // Relies on QList internals, but is perfectly valid. QStyleOptionGraphicsItem *styleOptionArray = d->allocStyleOptionsArray(numItems); - for (int i = 0; i < numItems; ++i) - itemArray[i]->d_ptr->initStyleOption(&styleOptionArray[i], viewTransform, d->exposedRegion, allItems); + for (int i = 0; i < numItems; ++i) { + itemArray[i]->d_ptr->initStyleOption(&styleOptionArray[i], painter.worldTransform(), + d->exposedRegion, allItems); + } // Draw the items. drawItems(&painter, numItems, itemArray, styleOptionArray); d->freeStyleOptionsArray(styleOptionArray); |