summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/image/qimage_conversions.cpp4
-rw-r--r--tests/auto/gui/image/qimage/tst_qimage.cpp15
2 files changed, 17 insertions, 2 deletions
diff --git a/src/gui/image/qimage_conversions.cpp b/src/gui/image/qimage_conversions.cpp
index 28e3a48689..e1be032215 100644
--- a/src/gui/image/qimage_conversions.cpp
+++ b/src/gui/image/qimage_conversions.cpp
@@ -557,7 +557,7 @@ static inline uint qUnpremultiplyRgb30(uint rgb30)
}
case 2: {
uint rgb = rgb30 & 0x3fffffff;
- rgb += rgb >> 1;
+ rgb += (rgb >> 1) & 0x5ff7fdff;
return (a << 30) | rgb;
}
case 3:
@@ -2348,10 +2348,10 @@ Image_Converter qimage_converter_map[QImage::NImageFormats][QImage::NImageFormat
0,
0,
0,
+ 0,
convert_BGR30_to_RGB30,
convert_BGR30_to_RGB30,
0,
- 0,
convert_passthrough,
0, 0
}, // Format_RGB30
diff --git a/tests/auto/gui/image/qimage/tst_qimage.cpp b/tests/auto/gui/image/qimage/tst_qimage.cpp
index 51e4c6233e..266230de38 100644
--- a/tests/auto/gui/image/qimage/tst_qimage.cpp
+++ b/tests/auto/gui/image/qimage/tst_qimage.cpp
@@ -183,6 +183,7 @@ private slots:
void cleanupFunctions();
void devicePixelRatio();
+ void rgb30Unpremul();
void metadataPassthrough();
@@ -2829,6 +2830,20 @@ void tst_QImage::devicePixelRatio()
QCOMPARE(b.devicePixelRatio(), qreal(1.0));
}
+void tst_QImage::rgb30Unpremul()
+{
+ QImage a(3, 1, QImage::Format_A2RGB30_Premultiplied);
+ ((uint*)a.bits())[0] = (3U << 30) | (128 << 20) | (256 << 10) | 512;
+ ((uint*)a.bits())[1] = (2U << 30) | (131 << 20) | (259 << 10) | 515;
+ ((uint*)a.bits())[2] = (1U << 30) | ( 67 << 20) | (131 << 10) | 259;
+
+ QImage b = a.convertToFormat(QImage::Format_RGB30);
+ const uint* bbits = (const uint*)b.bits();
+ QCOMPARE(bbits[0], (3U << 30) | (128 << 20) | (256 << 10) | 512);
+ QCOMPARE(bbits[1], (3U << 30) | (196 << 20) | (388 << 10) | 772);
+ QCOMPARE(bbits[2], (3U << 30) | (201 << 20) | (393 << 10) | 777);
+}
+
void tst_QImage::metadataPassthrough()
{
QImage a(64, 64, QImage::Format_ARGB32);