diff options
author | Andreas Aardal Hanssen <andreas.aardal.hanssen@nokia.com> | 2009-04-01 17:04:50 +0200 |
---|---|---|
committer | Andreas Aardal Hanssen <andreas.aardal.hanssen@nokia.com> | 2009-04-02 09:09:29 +0200 |
commit | 1f9074b743c727165f21149a09fd08e32157faaf (patch) | |
tree | 42b72d24116a55e2edb95a5e657e905b77ad5fde | |
parent | ea66ff84b5eac1846afcaf80b3d24297be0dce8f (diff) | |
download | qt4-tools-1f9074b743c727165f21149a09fd08e32157faaf.tar.gz |
Fix slowdown regression in QGraphicsItem::ItemCoordinateCache
Right before Qt 4.5.0 was released, Alexis and I submitted change
7e9b000ee418ef2d9c8fadb2c6b8870e0335bd5e, which accidentally introduced
a rounding error causing items whose bounding rect contains fractional
numbers (e.g., QRectF(-0.5, -0.5, 11, 11)), to always be drawn with a
one-pixel strech even if otherwise untransformed. This caused a
significant slowdown for pixmap items and any shape item that uses
almost any pen width != 0, if they enable ItemCoordinateCache.
The fix is to consistently use the aligned rectangle both when generating
the cache pixmap and when drawing it.
Reviewed-by: Alexis
-rw-r--r-- | src/gui/graphicsview/qgraphicsscene.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/gui/graphicsview/qgraphicsscene.cpp b/src/gui/graphicsview/qgraphicsscene.cpp index 1f78a18d32..ff46e2e39b 100644 --- a/src/gui/graphicsview/qgraphicsscene.cpp +++ b/src/gui/graphicsview/qgraphicsscene.cpp @@ -4595,16 +4595,17 @@ void QGraphicsScenePrivate::drawItemHelper(QGraphicsItem *item, QPainter *painte if (cacheMode == QGraphicsItem::ItemCoordinateCache) { QSize pixmapSize; bool fixedCacheSize = false; + QRectF brectAligned = brect.toAlignedRect(); if ((fixedCacheSize = itemCache->fixedSize.isValid())) { pixmapSize = itemCache->fixedSize; } else { - pixmapSize = brect.toAlignedRect().size(); + pixmapSize = brectAligned.size().toSize(); } // Create or recreate the pixmap. int adjust = itemCache->fixedSize.isValid() ? 0 : 2; QSize adjustSize(adjust*2, adjust*2); - QRectF br = brect.adjusted(-adjust, -adjust, adjust, adjust); + QRectF br = brectAligned.adjusted(-adjust, -adjust, adjust, adjust); if (pix.isNull() || (!fixedCacheSize && (pixmapSize + adjustSize) != pix.size())) { pix = QPixmap(pixmapSize + adjustSize); itemCache->exposed.clear(); @@ -4614,9 +4615,11 @@ void QGraphicsScenePrivate::drawItemHelper(QGraphicsItem *item, QPainter *painte // Redraw any newly exposed areas. if (itemCache->allExposed || !itemCache->exposed.isEmpty()) { // Fit the item's bounding rect into the pixmap's coordinates. - const QPointF scale(pixmapSize.width() / brect.width(), pixmapSize.height() / brect.height()); QTransform itemToPixmap; - itemToPixmap.scale(scale.x(), scale.y()); + if (fixedCacheSize) { + const QPointF scale(pixmapSize.width() / brect.width(), pixmapSize.height() / brect.height()); + itemToPixmap.scale(scale.x(), scale.y()); + } itemToPixmap.translate(-br.x(), -br.y()); // Generate the item's exposedRect and map its list of expose |