summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2019-07-19 11:30:29 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2019-07-23 23:37:37 +0200
commit733ca2230c283cdfaae424eac481ddc33593f44f (patch)
tree235d10076fd80c4d1659f2b951e5b203bfe4e2b4
parentb6f7efba4831c411456400e2df87df99877f67ae (diff)
Fix comparisons of image with different color spaces
Take color space into account when comparing images, and fix gamma comparison that was trying to be too accurate. Change-Id: I3674653abb21b66aaacb557addc4afb4ee75cfdd Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
-rw-r--r--src/gui/image/qimage.cpp4
-rw-r--r--src/gui/painting/qcolorspace.cpp2
-rw-r--r--tests/auto/gui/image/qimage/tst_qimage.cpp18
3 files changed, 22 insertions, 2 deletions
diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp
index cd2fe5bc10..7ac4b3546e 100644
--- a/src/gui/image/qimage.cpp
+++ b/src/gui/image/qimage.cpp
@@ -3834,7 +3834,9 @@ bool QImage::operator==(const QImage & i) const
return false;
// obviously different stuff?
- if (i.d->height != d->height || i.d->width != d->width || i.d->format != d->format)
+ if (i.d->height != d->height || i.d->width != d->width)
+ return false;
+ if (i.d->format != d->format || i.d->colorSpace != d->colorSpace)
return false;
if (d->format != Format_RGB32) {
diff --git a/src/gui/painting/qcolorspace.cpp b/src/gui/painting/qcolorspace.cpp
index 3c336c9fe7..d058505e68 100644
--- a/src/gui/painting/qcolorspace.cpp
+++ b/src/gui/painting/qcolorspace.cpp
@@ -651,7 +651,7 @@ bool operator==(const QColorSpace &colorSpace1, const QColorSpace &colorSpace2)
if (colorSpace1.transferFunction() != colorSpace2.transferFunction())
return false;
if (colorSpace1.transferFunction() == QColorSpace::TransferFunction::Gamma)
- return colorSpace1.gamma() == colorSpace2.gamma();
+ return (qAbs(colorSpace1.gamma() - colorSpace2.gamma()) <= (1.0f / 512.0f));
return true;
}
diff --git a/tests/auto/gui/image/qimage/tst_qimage.cpp b/tests/auto/gui/image/qimage/tst_qimage.cpp
index 441ec17412..e007a15419 100644
--- a/tests/auto/gui/image/qimage/tst_qimage.cpp
+++ b/tests/auto/gui/image/qimage/tst_qimage.cpp
@@ -232,6 +232,8 @@ private slots:
void wideImage();
+ void colorspaceEquality();
+
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
void toWinHBITMAP_data();
void toWinHBITMAP();
@@ -3618,6 +3620,22 @@ void tst_QImage::wideImage()
// Qt6: Test that it actually works on 64bit architectures.
}
+void tst_QImage::colorspaceEquality()
+{
+ QImage image1(10, 10, QImage::Format_RGB32);
+ image1.fill(Qt::red);
+ QImage image2(image1);
+ QCOMPARE(image1, image2);
+ image1.setColorSpace(QColorSpace::SRgbLinear);
+ QVERIFY(image1 != image2);
+ image2.setColorSpace(QColorSpace::SRgbLinear);
+ QVERIFY(image1 == image2);
+ image1.setColorSpace(QColorSpace(QColorSpace::Gamut::DciP3D65, QColorSpace::TransferFunction::Gamma, 2.2f));
+ QVERIFY(image1 != image2);
+ image2.setColorSpace(QColorSpace(QColorSpace::Gamut::DciP3D65, QColorSpace::TransferFunction::Gamma, 2.2001f));
+ QVERIFY(image1 == image2);
+}
+
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
QT_BEGIN_NAMESPACE
Q_GUI_EXPORT HBITMAP qt_imageToWinHBITMAP(const QImage &p, int hbitmapFormat = 0);