diff options
-rw-r--r-- | src/gui/image/qpixmap_raster.cpp | 2 | ||||
-rw-r--r-- | src/gui/image/qplatformpixmap.cpp | 5 | ||||
-rw-r--r-- | src/gui/image/qplatformpixmap.h | 1 | ||||
-rw-r--r-- | tests/auto/gui/image/qpixmap/tst_qpixmap.cpp | 23 |
4 files changed, 31 insertions, 0 deletions
diff --git a/src/gui/image/qpixmap_raster.cpp b/src/gui/image/qpixmap_raster.cpp index 5c188f0362..30463f3c0d 100644 --- a/src/gui/image/qpixmap_raster.cpp +++ b/src/gui/image/qpixmap_raster.cpp @@ -353,7 +353,9 @@ void QRasterPlatformPixmap::createPixmapForImage(QImage &sourceImage, Qt::ImageC is_null = (w <= 0 || h <= 0); image.d->devicePixelRatio = sourceImage.devicePixelRatio(); + //ensure the pixmap and the image resulting from toImage() have the same cacheKey(); setSerialNumber(image.cacheKey() >> 32); + setDetachNumber(image.d->detach_no); } QImage* QRasterPlatformPixmap::buffer() diff --git a/src/gui/image/qplatformpixmap.cpp b/src/gui/image/qplatformpixmap.cpp index 2e12ae2e91..1d147e3d3c 100644 --- a/src/gui/image/qplatformpixmap.cpp +++ b/src/gui/image/qplatformpixmap.cpp @@ -173,6 +173,11 @@ void QPlatformPixmap::setSerialNumber(int serNo) ser_no = serNo; } +void QPlatformPixmap::setDetachNumber(int detNo) +{ + detach_no = detNo; +} + QImage QPlatformPixmap::toImage(const QRect &rect) const { if (rect.contains(QRect(0, 0, w, h))) diff --git a/src/gui/image/qplatformpixmap.h b/src/gui/image/qplatformpixmap.h index af3abecaf8..d54f31099e 100644 --- a/src/gui/image/qplatformpixmap.h +++ b/src/gui/image/qplatformpixmap.h @@ -132,6 +132,7 @@ public: protected: void setSerialNumber(int serNo); + void setDetachNumber(int detNo); int w; int h; int d; diff --git a/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp b/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp index 576519e2ca..e204da059d 100644 --- a/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp +++ b/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp @@ -114,6 +114,7 @@ private slots: void convertFromImageNoDetach(); void convertFromImageDetach(); + void convertFromImageCacheKey(); #if defined(Q_OS_WIN) void toWinHBITMAP_data(); @@ -779,6 +780,28 @@ void tst_QPixmap::convertFromImageDetach() QVERIFY(copy.isDetached()); } +void tst_QPixmap::convertFromImageCacheKey() +{ + QPixmap randomPixmap(10, 10); + if (randomPixmap.handle()->classId() != QPlatformPixmap::RasterClass) + QSKIP("Test only valid for raster pixmaps"); + + //first get the screen format + QImage::Format screenFormat = randomPixmap.toImage().format(); + QVERIFY(screenFormat != QImage::Format_Invalid); + + QImage orig(100,100, screenFormat); + orig.fill(0); + + QPixmap pix = QPixmap::fromImage(orig); + QImage copy = pix.toImage(); + + QVERIFY(copy.format() == screenFormat); + + QCOMPARE(orig.cacheKey(), pix.cacheKey()); + QCOMPARE(copy.cacheKey(), pix.cacheKey()); +} + #if defined(Q_OS_WIN) QT_BEGIN_NAMESPACE |