diff options
author | Samuel Rødal <samuel.rodal@nokia.com> | 2010-12-07 11:53:37 (GMT) |
---|---|---|
committer | Samuel Rødal <samuel.rodal@nokia.com> | 2010-12-07 13:39:51 (GMT) |
commit | eac9e6a11e7727d8a749242f317362337ce89a1d (patch) | |
tree | 27e11cc2eec6863efdc5e86895c0cdbe3d4c5aba | |
parent | 532115bcaa370af827a5cbad017b272842c5aacf (diff) | |
download | Qt-eac9e6a11e7727d8a749242f317362337ce89a1d.zip Qt-eac9e6a11e7727d8a749242f317362337ce89a1d.tar.gz Qt-eac9e6a11e7727d8a749242f317362337ce89a1d.tar.bz2 |
Prevent always deep-copying in QPixmap::toImage() for raster pixmaps.
Calling paintEngine() can cause a deep copy since it will indirectly
call the bits() function. Since we don't want to create a paint engine
if it doesn't exist we should access the QImageData paintEngine variable
directly instead.
Reviewed-by: Olivier Goffart
-rw-r--r-- | src/gui/image/qpixmap_raster.cpp | 13 | ||||
-rw-r--r-- | tests/auto/qpixmap/tst_qpixmap.cpp | 10 |
2 files changed, 12 insertions, 11 deletions
diff --git a/src/gui/image/qpixmap_raster.cpp b/src/gui/image/qpixmap_raster.cpp index f080687..29bf5f5 100644 --- a/src/gui/image/qpixmap_raster.cpp +++ b/src/gui/image/qpixmap_raster.cpp @@ -50,6 +50,7 @@ #include "qimage.h" #include <QBuffer> #include <QImageReader> +#include <private/qimage_p.h> #include <private/qsimd_p.h> #include <private/qwidget_p.h> #include <private/qdrawhelper_p.h> @@ -303,11 +304,13 @@ bool QRasterPixmapData::hasAlphaChannel() const QImage QRasterPixmapData::toImage() const { - if (image.paintEngine() - && image.paintEngine()->isActive() - && image.paintEngine()->paintDevice() == &image) - { - return image.copy(); + if (!image.isNull()) { + QImageData *data = const_cast<QImage &>(image).data_ptr(); + if (data->paintEngine && data->paintEngine->isActive() + && data->paintEngine->paintDevice() == &image) + { + return image.copy(); + } } return image; diff --git a/tests/auto/qpixmap/tst_qpixmap.cpp b/tests/auto/qpixmap/tst_qpixmap.cpp index d5267b5..419518a1 100644 --- a/tests/auto/qpixmap/tst_qpixmap.cpp +++ b/tests/auto/qpixmap/tst_qpixmap.cpp @@ -129,10 +129,7 @@ private slots: void isNull(); void task_246446(); -#ifdef Q_WS_QWS void convertFromImageNoDetach(); -#endif - void convertFromImageDetach(); #if defined(Q_WS_WIN) @@ -913,11 +910,13 @@ void tst_QPixmap::isNull() } } -#ifdef Q_WS_QWS void tst_QPixmap::convertFromImageNoDetach() { + QPixmap randomPixmap(10, 10); + if (randomPixmap.pixmapData()->classId() != QPixmapData::RasterClass) + QSKIP("Test only valid for raster pixmaps", SkipAll); + //first get the screen format - QPixmap randomPixmap(10,10); QImage::Format screenFormat = randomPixmap.toImage().format(); QVERIFY(screenFormat != QImage::Format_Invalid); @@ -932,7 +931,6 @@ void tst_QPixmap::convertFromImageNoDetach() const QImage constCopy = copy; QVERIFY(constOrig.bits() == constCopy.bits()); } -#endif //Q_WS_QWS void tst_QPixmap::convertFromImageDetach() { |