summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Rødal <sroedal@trolltech.com>2009-05-05 13:31:10 (GMT)
committerSamuel Rødal <sroedal@trolltech.com>2009-05-05 13:42:21 (GMT)
commitd89d1eb47e69c2c2dc1121ef92fd08ef983e3e63 (patch)
tree3b09d34e6f0a0ae2418691df7bac3e1c8a6037cb
parent2a1eed4c718c8fa4a69351691aa466339d280126 (diff)
downloadQt-d89d1eb47e69c2c2dc1121ef92fd08ef983e3e63.zip
Qt-d89d1eb47e69c2c2dc1121ef92fd08ef983e3e63.tar.gz
Qt-d89d1eb47e69c2c2dc1121ef92fd08ef983e3e63.tar.bz2
Fixed bug where 0-opacity would cause images to be drawn fully opaque.
The bug appears in the raster paint engine and only in release mode as the cause of the bug is in the MMX and SSE blend functions which are disabled in debug. To prevent it simply we return early if we detect that we have an opacity of 0. Reviewed-by: Trond
-rw-r--r--src/gui/painting/qpaintengine_raster.cpp2
-rw-r--r--tests/auto/qpainter/tst_qpainter.cpp18
2 files changed, 19 insertions, 1 deletions
diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp
index ba1e27c..e249b3e 100644
--- a/src/gui/painting/qpaintengine_raster.cpp
+++ b/src/gui/painting/qpaintengine_raster.cpp
@@ -1022,7 +1022,7 @@ void QRasterPaintEnginePrivate::drawImage(const QPointF &pt,
int alpha,
const QRect &sr)
{
- if (!clip.isValid())
+ if (alpha == 0 || !clip.isValid())
return;
Q_ASSERT(img.depth() >= 8);
diff --git a/tests/auto/qpainter/tst_qpainter.cpp b/tests/auto/qpainter/tst_qpainter.cpp
index c81bf67..87f9c13 100644
--- a/tests/auto/qpainter/tst_qpainter.cpp
+++ b/tests/auto/qpainter/tst_qpainter.cpp
@@ -225,6 +225,8 @@ private slots:
void extendedBlendModes();
+ void zeroOpacity();
+
private:
void fillData();
QColor baseColor( int k, int intensity=255 );
@@ -4150,5 +4152,21 @@ void tst_QPainter::extendedBlendModes()
QVERIFY(testCompositionMode(191, 191, 96, QPainter::CompositionMode_Exclusion));
}
+void tst_QPainter::zeroOpacity()
+{
+ QImage source(1, 1, QImage::Format_ARGB32_Premultiplied);
+ source.fill(0xffffffff);
+
+ QImage target(1, 1, QImage::Format_RGB32);
+ target.fill(0xff000000);
+
+ QPainter p(&target);
+ p.setOpacity(0.0);
+ p.drawImage(0, 0, source);
+ p.end();
+
+ QCOMPARE(target.pixel(0, 0), 0xff000000);
+}
+
QTEST_MAIN(tst_QPainter)
#include "tst_qpainter.moc"