summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Rødal <samuel.rodal@nokia.com>2010-12-07 11:53:37 (GMT)
committerSamuel Rødal <samuel.rodal@nokia.com>2010-12-07 13:39:51 (GMT)
commiteac9e6a11e7727d8a749242f317362337ce89a1d (patch)
tree27e11cc2eec6863efdc5e86895c0cdbe3d4c5aba
parent532115bcaa370af827a5cbad017b272842c5aacf (diff)
downloadQt-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.cpp13
-rw-r--r--tests/auto/qpixmap/tst_qpixmap.cpp10
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()
{