summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGabriel de Dietrich <gabriel.dietrich-de@nokia.com>2009-11-18 11:21:08 (GMT)
committerJason McDonald <jason.mcdonald@nokia.com>2009-11-19 11:22:27 (GMT)
commited13768e7b0c2ccf30f3ba0c1260c70a8f7a8e76 (patch)
treecbdbdd7a79ec257baac143310cf503aa0f3d0840
parent2053560922c37b68fa107417c0555a34492f70e5 (diff)
downloadQt-ed13768e7b0c2ccf30f3ba0c1260c70a8f7a8e76.zip
Qt-ed13768e7b0c2ccf30f3ba0c1260c70a8f7a8e76.tar.gz
Qt-ed13768e7b0c2ccf30f3ba0c1260c70a8f7a8e76.tar.bz2
Crash when rendering a scene using DeviceCoordinateCache
The execution flow would allow the widget the scene would be rendered on to be null. However this very widget was being used when using DeviceCoordinateCache to get the desktop size. We now skip this optimisation when no widget is given. Auto-test included. Reviewed-by: bnilsen Task-number: QTBUG-5904 (cherry picked from commit b6070e9a069219e4049fcf017d6a160b80bf37b7)
-rw-r--r--src/gui/graphicsview/qgraphicsscene.cpp9
-rw-r--r--tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp16
2 files changed, 22 insertions, 3 deletions
diff --git a/src/gui/graphicsview/qgraphicsscene.cpp b/src/gui/graphicsview/qgraphicsscene.cpp
index 42089f5..e98d61c 100644
--- a/src/gui/graphicsview/qgraphicsscene.cpp
+++ b/src/gui/graphicsview/qgraphicsscene.cpp
@@ -4422,9 +4422,12 @@ void QGraphicsScenePrivate::drawItemHelper(QGraphicsItem *item, QPainter *painte
bool allowPartialCacheExposure = !viewRect.contains(deviceRect);
#else
// Only if deviceRect is 20% taller or wider than the desktop.
- QRect desktopRect = QApplication::desktop()->availableGeometry(widget);
- bool allowPartialCacheExposure = (desktopRect.width() * 1.2 < deviceRect.width()
- || desktopRect.height() * 1.2 < deviceRect.height());
+ bool allowPartialCacheExposure = false;
+ if (widget) {
+ QRect desktopRect = QApplication::desktop()->availableGeometry(widget);
+ allowPartialCacheExposure = (desktopRect.width() * 1.2 < deviceRect.width()
+ || desktopRect.height() * 1.2 < deviceRect.height());
+ }
#endif
QRegion scrollExposure;
if (deviceData->cacheIndent != QPoint() || allowPartialCacheExposure) {
diff --git a/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp b/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp
index c982eaa..8eb35e0 100644
--- a/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp
+++ b/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp
@@ -276,6 +276,7 @@ private slots:
void task176178_itemIndexMethodBreaksSceneRect();
void task160653_selectionChanged();
void task250680_childClip();
+ void taskQTBUG_5904_crashWithDeviceCoordinateCache();
};
void tst_QGraphicsScene::initTestCase()
@@ -4180,5 +4181,20 @@ void tst_QGraphicsScene::isActive()
}
+void tst_QGraphicsScene::taskQTBUG_5904_crashWithDeviceCoordinateCache()
+{
+ QGraphicsScene scene;
+ QGraphicsRectItem *rectItem = scene.addRect(QRectF(0, 0, 100, 200), QPen(Qt::black), QBrush(Qt::green));
+
+ rectItem->setCacheMode(QGraphicsItem::DeviceCoordinateCache);
+
+ QPixmap pixmap(100,200);
+ QPainter painter(&pixmap);
+ painter.setRenderHint(QPainter::Antialiasing);
+ scene.render(&painter);
+ painter.end();
+ // No crash, then it passed!
+}
+
QTEST_MAIN(tst_QGraphicsScene)
#include "tst_qgraphicsscene.moc"