Simplify QColorSpace named presets

We don't need a getter for the 'preset' of a color-space, as color
spaces can be compared to the presets directly. This allows us to
remove the Undefined and Unknown values from the presets.

Internally we still distinguish known presets from unknown or undefined
presets via the magic 0-value. The validity of a QColorSpace is not
based on this preset, but on its actual values.

Fixes: QTBUG-77963
Change-Id: I1e0a2a4be83021b8c82b3c778019f680fd46455b
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
Tor Arne Vestbø 2019-08-30 17:41:23 +02:00
parent 098d7549c1
commit cc1ea2bf47
7 changed files with 100 additions and 116 deletions

View File

@ -5025,7 +5025,7 @@ QImage QImage::convertedToColorSpace(const QColorSpace &colorSpace) const
QColorSpace QImage::colorSpace() const QColorSpace QImage::colorSpace() const
{ {
if (!d) if (!d)
return QColorSpace::Undefined; return QColorSpace();
return d->colorSpace; return d->colorSpace;
} }

View File

@ -152,8 +152,7 @@ QColorMatrix QColorSpacePrimaries::toXyzMatrix() const
} }
QColorSpacePrivate::QColorSpacePrivate() QColorSpacePrivate::QColorSpacePrivate()
: id(QColorSpace::Unknown) : primaries(QColorSpace::Primaries::Custom)
, primaries(QColorSpace::Primaries::Custom)
, transferFunction(QColorSpace::TransferFunction::Custom) , transferFunction(QColorSpace::TransferFunction::Custom)
, gamma(0.0f) , gamma(0.0f)
, whitePoint(QColorVector::null()) , whitePoint(QColorVector::null())
@ -161,16 +160,11 @@ QColorSpacePrivate::QColorSpacePrivate()
{ {
} }
QColorSpacePrivate::QColorSpacePrivate(QColorSpace::ColorSpaceId colorSpaceId) QColorSpacePrivate::QColorSpacePrivate(QColorSpace::NamedColorSpace namedColorSpace)
: id(colorSpaceId) : namedColorSpace(namedColorSpace)
, gamma(0.0f) , gamma(0.0f)
{ {
switch (colorSpaceId) { switch (namedColorSpace) {
case QColorSpace::Undefined:
primaries = QColorSpace::Primaries::Custom;
transferFunction = QColorSpace::TransferFunction::Custom;
description = QStringLiteral("Undefined");
break;
case QColorSpace::SRgb: case QColorSpace::SRgb:
primaries = QColorSpace::Primaries::SRgb; primaries = QColorSpace::Primaries::SRgb;
transferFunction = QColorSpace::TransferFunction::SRgb; transferFunction = QColorSpace::TransferFunction::SRgb;
@ -202,9 +196,6 @@ QColorSpacePrivate::QColorSpacePrivate(QColorSpace::ColorSpaceId colorSpaceId)
transferFunction = QColorSpace::TransferFunction::Bt2020; transferFunction = QColorSpace::TransferFunction::Bt2020;
description = QStringLiteral("BT.2020"); description = QStringLiteral("BT.2020");
break; break;
case QColorSpace::Unknown:
qWarning("Can not create an unknown color space");
Q_FALLTHROUGH();
default: default:
Q_UNREACHABLE(); Q_UNREACHABLE();
} }
@ -216,8 +207,7 @@ QColorSpacePrivate::QColorSpacePrivate(QColorSpace::Primaries primaries, QColorS
, transferFunction(fun) , transferFunction(fun)
, gamma(gamma) , gamma(gamma)
{ {
if (!identifyColorSpace()) identifyColorSpace();
id = QColorSpace::Unknown;
initialize(); initialize();
} }
@ -235,71 +225,71 @@ QColorSpacePrivate::QColorSpacePrivate(const QColorSpacePrimaries &primaries,
setTransferFunction(); setTransferFunction();
} }
bool QColorSpacePrivate::identifyColorSpace() void QColorSpacePrivate::identifyColorSpace()
{ {
switch (primaries) { switch (primaries) {
case QColorSpace::Primaries::SRgb: case QColorSpace::Primaries::SRgb:
if (transferFunction == QColorSpace::TransferFunction::SRgb) { if (transferFunction == QColorSpace::TransferFunction::SRgb) {
id = QColorSpace::SRgb; namedColorSpace = QColorSpace::SRgb;
if (description.isEmpty()) if (description.isEmpty())
description = QStringLiteral("sRGB"); description = QStringLiteral("sRGB");
return true; return;
} }
if (transferFunction == QColorSpace::TransferFunction::Linear) { if (transferFunction == QColorSpace::TransferFunction::Linear) {
id = QColorSpace::SRgbLinear; namedColorSpace = QColorSpace::SRgbLinear;
if (description.isEmpty()) if (description.isEmpty())
description = QStringLiteral("Linear sRGB"); description = QStringLiteral("Linear sRGB");
return true; return;
} }
break; break;
case QColorSpace::Primaries::AdobeRgb: case QColorSpace::Primaries::AdobeRgb:
if (transferFunction == QColorSpace::TransferFunction::Gamma) { if (transferFunction == QColorSpace::TransferFunction::Gamma) {
if (qAbs(gamma - 2.19921875f) < (1/1024.0f)) { if (qAbs(gamma - 2.19921875f) < (1/1024.0f)) {
id = QColorSpace::AdobeRgb; namedColorSpace = QColorSpace::AdobeRgb;
if (description.isEmpty()) if (description.isEmpty())
description = QStringLiteral("Adobe RGB"); description = QStringLiteral("Adobe RGB");
return true; return;
} }
} }
break; break;
case QColorSpace::Primaries::DciP3D65: case QColorSpace::Primaries::DciP3D65:
if (transferFunction == QColorSpace::TransferFunction::SRgb) { if (transferFunction == QColorSpace::TransferFunction::SRgb) {
id = QColorSpace::DisplayP3; namedColorSpace = QColorSpace::DisplayP3;
if (description.isEmpty()) if (description.isEmpty())
description = QStringLiteral("Display P3"); description = QStringLiteral("Display P3");
return true; return;
} }
break; break;
case QColorSpace::Primaries::ProPhotoRgb: case QColorSpace::Primaries::ProPhotoRgb:
if (transferFunction == QColorSpace::TransferFunction::ProPhotoRgb) { if (transferFunction == QColorSpace::TransferFunction::ProPhotoRgb) {
id = QColorSpace::ProPhotoRgb; namedColorSpace = QColorSpace::ProPhotoRgb;
if (description.isEmpty()) if (description.isEmpty())
description = QStringLiteral("ProPhoto RGB"); description = QStringLiteral("ProPhoto RGB");
return true; return;
} }
if (transferFunction == QColorSpace::TransferFunction::Gamma) { if (transferFunction == QColorSpace::TransferFunction::Gamma) {
// ProPhoto RGB's curve is effectively gamma 1.8 for 8bit precision. // ProPhoto RGB's curve is effectively gamma 1.8 for 8bit precision.
if (qAbs(gamma - 1.8f) < (1/1024.0f)) { if (qAbs(gamma - 1.8f) < (1/1024.0f)) {
id = QColorSpace::ProPhotoRgb; namedColorSpace = QColorSpace::ProPhotoRgb;
if (description.isEmpty()) if (description.isEmpty())
description = QStringLiteral("ProPhoto RGB"); description = QStringLiteral("ProPhoto RGB");
return true; return;
} }
} }
break; break;
case QColorSpace::Primaries::Bt2020: case QColorSpace::Primaries::Bt2020:
if (transferFunction == QColorSpace::TransferFunction::Bt2020) { if (transferFunction == QColorSpace::TransferFunction::Bt2020) {
id = QColorSpace::Bt2020; namedColorSpace = QColorSpace::Bt2020;
if (description.isEmpty()) if (description.isEmpty())
description = QStringLiteral("BT.2020"); description = QStringLiteral("BT.2020");
return true; return;
} }
break; break;
default: default:
break; break;
} }
id = QColorSpace::Unknown;
return false; namedColorSpace = Unknown;
} }
void QColorSpacePrivate::initialize() void QColorSpacePrivate::initialize()
@ -410,12 +400,10 @@ QColorTransform QColorSpacePrivate::transformationToColorSpace(const QColorSpace
/*! /*!
\enum QColorSpace::ColorSpaceId \enum QColorSpace::NamedColorSpace
Predefined color spaces. Predefined color spaces.
\value Undefined An empty, invalid or unsupported color space.
\value Unknown A valid color space that doesn't match any of the predefined color spaces.
\value SRgb The sRGB color space, which Qt operates in by default. It is a close approximation \value SRgb The sRGB color space, which Qt operates in by default. It is a close approximation
of how most classic monitors operate, and a mode most software and hardware support. of how most classic monitors operate, and a mode most software and hardware support.
\l{http://www.color.org/chardata/rgb/srgb.xalter}{ICC registration of sRGB}. \l{http://www.color.org/chardata/rgb/srgb.xalter}{ICC registration of sRGB}.
@ -458,22 +446,25 @@ QColorTransform QColorSpacePrivate::transformationToColorSpace(const QColorSpace
*/ */
/*! /*!
Creates a new colorspace object that represents \a colorSpaceId. Creates a new colorspace object that represents an undefined and invalid colorspace.
*/ */
QColorSpace::QColorSpace(QColorSpace::ColorSpaceId colorSpaceId) QColorSpace::QColorSpace()
: d_ptr(nullptr)
{ {
static QColorSpacePrivate *predefinedColorspacePrivates[QColorSpace::Bt2020]; }
// Unknown and undefined both returns the static undefined colorspace
if (colorSpaceId > QColorSpace::Unknown) { /*!
if (!predefinedColorspacePrivates[colorSpaceId - 2]) { Creates a new colorspace object that represents a \a namedColorSpace.
predefinedColorspacePrivates[colorSpaceId - 2] = new QColorSpacePrivate(colorSpaceId); */
predefinedColorspacePrivates[colorSpaceId - 2]->ref.ref(); QColorSpace::QColorSpace(NamedColorSpace namedColorSpace)
} {
d_ptr = predefinedColorspacePrivates[colorSpaceId - 2]; static QColorSpacePrivate *predefinedColorspacePrivates[QColorSpace::Bt2020 + 1];
d_ptr->ref.ref(); if (!predefinedColorspacePrivates[namedColorSpace]) {
Q_ASSERT(isValid()); predefinedColorspacePrivates[namedColorSpace] = new QColorSpacePrivate(namedColorSpace);
predefinedColorspacePrivates[namedColorSpace]->ref.ref();
} }
d_ptr = predefinedColorspacePrivates[namedColorSpace];
d_ptr->ref.ref();
Q_ASSERT(isValid());
} }
/*! /*!
@ -544,17 +535,6 @@ QColorSpace &QColorSpace::operator=(const QColorSpace &colorSpace)
never fails. never fails.
*/ */
/*!
Returns the id of the predefined color space this object
represents or \c Unknown if it doesn't match any of them.
*/
QColorSpace::ColorSpaceId QColorSpace::colorSpaceId() const noexcept
{
if (Q_UNLIKELY(!d_ptr))
return QColorSpace::Undefined;
return d_ptr->id;
}
/*! /*!
Returns the predefined primaries of the color space Returns the predefined primaries of the color space
or \c primaries::Custom if it doesn't match any of them. or \c primaries::Custom if it doesn't match any of them.
@ -596,8 +576,6 @@ float QColorSpace::gamma() const noexcept
/*! /*!
Sets the transfer function to \a transferFunction and \a gamma. Sets the transfer function to \a transferFunction and \a gamma.
\note This also changes colorSpaceId().
\sa transferFunction(), gamma(), withTransferFunction() \sa transferFunction(), gamma(), withTransferFunction()
*/ */
void QColorSpace::setTransferFunction(QColorSpace::TransferFunction transferFunction, float gamma) void QColorSpace::setTransferFunction(QColorSpace::TransferFunction transferFunction, float gamma)
@ -634,8 +612,6 @@ QColorSpace QColorSpace::withTransferFunction(QColorSpace::TransferFunction tran
/*! /*!
Sets the primaries to those of the \a primariesId set. Sets the primaries to those of the \a primariesId set.
\note This also changes colorSpaceId().
\sa primaries() \sa primaries()
*/ */
void QColorSpace::setPrimaries(QColorSpace::Primaries primariesId) void QColorSpace::setPrimaries(QColorSpace::Primaries primariesId)
@ -655,8 +631,6 @@ void QColorSpace::setPrimaries(QColorSpace::Primaries primariesId)
Set primaries to the chromaticities of \a whitePoint, \a redPoint, \a greenPoint Set primaries to the chromaticities of \a whitePoint, \a redPoint, \a greenPoint
and \a bluePoint. and \a bluePoint.
\note This also changes colorSpaceId().
\sa primaries() \sa primaries()
*/ */
void QColorSpace::setPrimaries(const QPointF &whitePoint, const QPointF &redPoint, void QColorSpace::setPrimaries(const QPointF &whitePoint, const QPointF &redPoint,
@ -718,7 +692,6 @@ QColorSpace QColorSpace::fromIccProfile(const QByteArray &iccProfile)
if (QIcc::fromIccProfile(iccProfile, &colorSpace)) if (QIcc::fromIccProfile(iccProfile, &colorSpace))
return colorSpace; return colorSpace;
QColorSpacePrivate *d = QColorSpacePrivate::getWritable(colorSpace); QColorSpacePrivate *d = QColorSpacePrivate::getWritable(colorSpace);
d->id = QColorSpace::Undefined;
d->iccProfile = iccProfile; d->iccProfile = iccProfile;
return colorSpace; return colorSpace;
} }
@ -728,7 +701,8 @@ QColorSpace QColorSpace::fromIccProfile(const QByteArray &iccProfile)
*/ */
bool QColorSpace::isValid() const noexcept bool QColorSpace::isValid() const noexcept
{ {
return d_ptr && d_ptr->id != QColorSpace::Undefined && d_ptr->toXyz.isValid() return d_ptr
&& d_ptr->toXyz.isValid()
&& d_ptr->trc[0].isValid() && d_ptr->trc[1].isValid() && d_ptr->trc[2].isValid(); && d_ptr->trc[0].isValid() && d_ptr->trc[1].isValid() && d_ptr->trc[2].isValid();
} }
@ -744,11 +718,17 @@ bool operator==(const QColorSpace &colorSpace1, const QColorSpace &colorSpace2)
if (!colorSpace1.d_ptr || !colorSpace2.d_ptr) if (!colorSpace1.d_ptr || !colorSpace2.d_ptr)
return false; return false;
if (colorSpace1.colorSpaceId() == QColorSpace::Undefined && colorSpace2.colorSpaceId() == QColorSpace::Undefined) if (colorSpace1.d_ptr->namedColorSpace && colorSpace2.d_ptr->namedColorSpace)
return colorSpace1.d_ptr->iccProfile == colorSpace2.d_ptr->iccProfile; return colorSpace1.d_ptr->namedColorSpace == colorSpace2.d_ptr->namedColorSpace;
if (colorSpace1.colorSpaceId() != QColorSpace::Unknown && colorSpace2.colorSpaceId() != QColorSpace::Unknown) const bool valid1 = colorSpace1.isValid();
return colorSpace1.colorSpaceId() == colorSpace2.colorSpaceId(); const bool valid2 = colorSpace2.isValid();
if (!valid1 && !valid2)
return colorSpace1.d_ptr->iccProfile == colorSpace2.d_ptr->iccProfile;
else if (!valid1 || !valid2)
return false;
// At this point one or both color spaces are unknown but valid, and must be compared in detail instead
if (colorSpace1.primaries() != QColorSpace::Primaries::Custom && colorSpace2.primaries() != QColorSpace::Primaries::Custom) { if (colorSpace1.primaries() != QColorSpace::Primaries::Custom && colorSpace2.primaries() != QColorSpace::Primaries::Custom) {
if (colorSpace1.primaries() != colorSpace2.primaries()) if (colorSpace1.primaries() != colorSpace2.primaries())
@ -839,7 +819,9 @@ QDebug operator<<(QDebug dbg, const QColorSpace &colorSpace)
QDebugStateSaver saver(dbg); QDebugStateSaver saver(dbg);
dbg.nospace(); dbg.nospace();
dbg << "QColorSpace("; dbg << "QColorSpace(";
dbg << colorSpace.colorSpaceId() << ", " << colorSpace.primaries() << ", " << colorSpace.transferFunction(); if (colorSpace.d_ptr->namedColorSpace)
dbg << colorSpace.d_ptr->namedColorSpace << ", ";
dbg << colorSpace.primaries() << ", " << colorSpace.transferFunction();
dbg << ", gamma=" << colorSpace.gamma(); dbg << ", gamma=" << colorSpace.gamma();
dbg << ')'; dbg << ')';
return dbg; return dbg;

View File

@ -54,17 +54,15 @@ class Q_GUI_EXPORT QColorSpace
{ {
Q_GADGET Q_GADGET
public: public:
enum ColorSpaceId { enum NamedColorSpace {
Undefined = 0, SRgb = 1,
Unknown = 1,
SRgb,
SRgbLinear, SRgbLinear,
AdobeRgb, AdobeRgb,
DisplayP3, DisplayP3,
ProPhotoRgb, ProPhotoRgb,
Bt2020, Bt2020,
}; };
Q_ENUM(ColorSpaceId) Q_ENUM(NamedColorSpace)
enum class Primaries { enum class Primaries {
Custom = 0, Custom = 0,
SRgb, SRgb,
@ -84,7 +82,8 @@ public:
}; };
Q_ENUM(TransferFunction) Q_ENUM(TransferFunction)
QColorSpace(ColorSpaceId colorSpaceId = Undefined); QColorSpace();
QColorSpace(NamedColorSpace namedColorSpace);
QColorSpace(Primaries primaries, TransferFunction fun, float gamma = 0.0f); QColorSpace(Primaries primaries, TransferFunction fun, float gamma = 0.0f);
QColorSpace(Primaries primaries, float gamma); QColorSpace(Primaries primaries, float gamma);
QColorSpace(const QPointF &whitePoint, const QPointF &redPoint, QColorSpace(const QPointF &whitePoint, const QPointF &redPoint,
@ -108,7 +107,6 @@ public:
void swap(QColorSpace &colorSpace) noexcept void swap(QColorSpace &colorSpace) noexcept
{ qSwap(d_ptr, colorSpace.d_ptr); } { qSwap(d_ptr, colorSpace.d_ptr); }
ColorSpaceId colorSpaceId() const noexcept;
Primaries primaries() const noexcept; Primaries primaries() const noexcept;
TransferFunction transferFunction() const noexcept; TransferFunction transferFunction() const noexcept;
float gamma() const noexcept; float gamma() const noexcept;
@ -133,7 +131,11 @@ public:
private: private:
Q_DECLARE_PRIVATE(QColorSpace) Q_DECLARE_PRIVATE(QColorSpace)
QColorSpacePrivate *d_ptr; QColorSpacePrivate *d_ptr = nullptr;
#ifndef QT_NO_DEBUG_STREAM
friend Q_GUI_EXPORT QDebug operator<<(QDebug dbg, const QColorSpace &colorSpace);
#endif
}; };
bool Q_GUI_EXPORT operator==(const QColorSpace &colorSpace1, const QColorSpace &colorSpace2); bool Q_GUI_EXPORT operator==(const QColorSpace &colorSpace1, const QColorSpace &colorSpace2);

View File

@ -90,7 +90,7 @@ class QColorSpacePrivate : public QSharedData
{ {
public: public:
QColorSpacePrivate(); QColorSpacePrivate();
QColorSpacePrivate(QColorSpace::ColorSpaceId colorSpaceId); QColorSpacePrivate(QColorSpace::NamedColorSpace namedColorSpace);
QColorSpacePrivate(QColorSpace::Primaries primaries, QColorSpace::TransferFunction fun, float gamma); QColorSpacePrivate(QColorSpace::Primaries primaries, QColorSpace::TransferFunction fun, float gamma);
QColorSpacePrivate(const QColorSpacePrimaries &primaries, QColorSpace::TransferFunction fun, float gamma); QColorSpacePrivate(const QColorSpacePrimaries &primaries, QColorSpace::TransferFunction fun, float gamma);
QColorSpacePrivate(const QColorSpacePrivate &other) = default; QColorSpacePrivate(const QColorSpacePrivate &other) = default;
@ -118,10 +118,12 @@ public:
void initialize(); void initialize();
void setToXyzMatrix(); void setToXyzMatrix();
void setTransferFunction(); void setTransferFunction();
bool identifyColorSpace(); void identifyColorSpace();
QColorTransform transformationToColorSpace(const QColorSpacePrivate *out) const; QColorTransform transformationToColorSpace(const QColorSpacePrivate *out) const;
QColorSpace::ColorSpaceId id; static constexpr QColorSpace::NamedColorSpace Unknown = QColorSpace::NamedColorSpace(0);
QColorSpace::NamedColorSpace namedColorSpace = Unknown;
QColorSpace::Primaries primaries; QColorSpace::Primaries primaries;
QColorSpace::TransferFunction transferFunction; QColorSpace::TransferFunction transferFunction;
float gamma; float gamma;

View File

@ -765,10 +765,9 @@ bool fromIccProfile(const QByteArray &data, QColorSpace *colorSpace)
qCDebug(lcIcc) << "fromIccProfile: Description" << colorspaceDPtr->description; qCDebug(lcIcc) << "fromIccProfile: Description" << colorspaceDPtr->description;
} }
if (!colorspaceDPtr->identifyColorSpace()) colorspaceDPtr->identifyColorSpace();
colorspaceDPtr->id = QColorSpace::Unknown; if (colorspaceDPtr->namedColorSpace)
else qCDebug(lcIcc) << "fromIccProfile: Named colorspace detected: " << QColorSpace::NamedColorSpace(colorspaceDPtr->namedColorSpace);
qCDebug(lcIcc) << "fromIccProfile: Named colorspace detected: " << colorSpace->colorSpaceId();
colorspaceDPtr->iccProfile = data; colorspaceDPtr->iccProfile = data;

View File

@ -1890,9 +1890,8 @@ void tst_QImageReader::saveFormat()
void tst_QImageReader::saveColorSpace_data() void tst_QImageReader::saveColorSpace_data()
{ {
QTest::addColumn<QColorSpace::ColorSpaceId>("colorspaceId"); QTest::addColumn<QColorSpace::NamedColorSpace>("namedColorSpace");
QTest::newRow("Undefined") << QColorSpace::Undefined;
QTest::newRow("sRGB") << QColorSpace::SRgb; QTest::newRow("sRGB") << QColorSpace::SRgb;
QTest::newRow("sRGB(linear)") << QColorSpace::SRgbLinear; QTest::newRow("sRGB(linear)") << QColorSpace::SRgbLinear;
QTest::newRow("AdobeRGB") << QColorSpace::AdobeRgb; QTest::newRow("AdobeRGB") << QColorSpace::AdobeRgb;
@ -1902,11 +1901,11 @@ void tst_QImageReader::saveColorSpace_data()
void tst_QImageReader::saveColorSpace() void tst_QImageReader::saveColorSpace()
{ {
QFETCH(QColorSpace::ColorSpaceId, colorspaceId); QFETCH(QColorSpace::NamedColorSpace, namedColorSpace);
QImage orig(":/images/kollada.png"); QImage orig(":/images/kollada.png");
orig.setColorSpace(colorspaceId); orig.setColorSpace(namedColorSpace);
QBuffer buf; QBuffer buf;
buf.open(QIODevice::WriteOnly); buf.open(QIODevice::WriteOnly);
QVERIFY(orig.save(&buf, "png")); QVERIFY(orig.save(&buf, "png"));

View File

@ -35,7 +35,7 @@
#include <private/qcolorspace_p.h> #include <private/qcolorspace_p.h>
Q_DECLARE_METATYPE(QColorSpace::ColorSpaceId) Q_DECLARE_METATYPE(QColorSpace::NamedColorSpace)
Q_DECLARE_METATYPE(QColorSpace::Primaries) Q_DECLARE_METATYPE(QColorSpace::Primaries)
Q_DECLARE_METATYPE(QColorSpace::TransferFunction) Q_DECLARE_METATYPE(QColorSpace::TransferFunction)
@ -82,25 +82,25 @@ void tst_QColorSpace::movable()
QColorSpace cs2 = QColorSpace::SRgbLinear; QColorSpace cs2 = QColorSpace::SRgbLinear;
QVERIFY(cs1.isValid()); QVERIFY(cs1.isValid());
QVERIFY(cs2.isValid()); QVERIFY(cs2.isValid());
QCOMPARE(cs1.colorSpaceId(), QColorSpace::SRgb); QCOMPARE(cs1, QColorSpace::SRgb);
cs2 = std::move(cs1); cs2 = std::move(cs1);
QVERIFY(!cs1.isValid()); QVERIFY(!cs1.isValid());
QVERIFY(cs2.isValid()); QVERIFY(cs2.isValid());
QCOMPARE(cs2.colorSpaceId(), QColorSpace::SRgb); QCOMPARE(cs2, QColorSpace::SRgb);
QCOMPARE(cs1.colorSpaceId(), QColorSpace::Undefined); QVERIFY(cs1 != QColorSpace::SRgb);
QCOMPARE(cs1, QColorSpace()); QCOMPARE(cs1, QColorSpace());
QColorSpace cs3(std::move(cs2)); QColorSpace cs3(std::move(cs2));
QVERIFY(!cs2.isValid()); QVERIFY(!cs2.isValid());
QVERIFY(cs3.isValid()); QVERIFY(cs3.isValid());
QCOMPARE(cs3.colorSpaceId(), QColorSpace::SRgb); QCOMPARE(cs3, QColorSpace::SRgb);
QCOMPARE(cs2.colorSpaceId(), QColorSpace::Undefined); QCOMPARE(cs2, QColorSpace());
} }
void tst_QColorSpace::namedColorSpaces_data() void tst_QColorSpace::namedColorSpaces_data()
{ {
QTest::addColumn<QColorSpace::ColorSpaceId>("colorSpaceId"); QTest::addColumn<QColorSpace::NamedColorSpace>("namedColorSpace");
QTest::addColumn<QColorSpace::Primaries>("primariesId"); QTest::addColumn<QColorSpace::Primaries>("primariesId");
QTest::addColumn<QColorSpace::TransferFunction>("transferFunctionId"); QTest::addColumn<QColorSpace::TransferFunction>("transferFunctionId");
@ -126,15 +126,15 @@ void tst_QColorSpace::namedColorSpaces_data()
void tst_QColorSpace::namedColorSpaces() void tst_QColorSpace::namedColorSpaces()
{ {
QFETCH(QColorSpace::ColorSpaceId, colorSpaceId); QFETCH(QColorSpace::NamedColorSpace, namedColorSpace);
QFETCH(QColorSpace::Primaries, primariesId); QFETCH(QColorSpace::Primaries, primariesId);
QFETCH(QColorSpace::TransferFunction, transferFunctionId); QFETCH(QColorSpace::TransferFunction, transferFunctionId);
QColorSpace colorSpace = colorSpaceId; QColorSpace colorSpace = namedColorSpace;
QVERIFY(colorSpace.isValid()); QVERIFY(colorSpace.isValid());
QCOMPARE(colorSpace.colorSpaceId(), colorSpaceId); QCOMPARE(colorSpace, namedColorSpace);
QCOMPARE(colorSpace.primaries(), primariesId); QCOMPARE(colorSpace.primaries(), primariesId);
QCOMPARE(colorSpace.transferFunction(), transferFunctionId); QCOMPARE(colorSpace.transferFunction(), transferFunctionId);
} }
@ -147,14 +147,14 @@ void tst_QColorSpace::toIccProfile_data()
void tst_QColorSpace::toIccProfile() void tst_QColorSpace::toIccProfile()
{ {
QFETCH(QColorSpace::ColorSpaceId, colorSpaceId); QFETCH(QColorSpace::NamedColorSpace, namedColorSpace);
QFETCH(QColorSpace::Primaries, primariesId); QFETCH(QColorSpace::Primaries, primariesId);
QFETCH(QColorSpace::TransferFunction, transferFunctionId); QFETCH(QColorSpace::TransferFunction, transferFunctionId);
Q_UNUSED(primariesId); Q_UNUSED(primariesId);
Q_UNUSED(transferFunctionId); Q_UNUSED(transferFunctionId);
QColorSpace colorSpace = colorSpaceId; QColorSpace colorSpace = namedColorSpace;
QByteArray iccProfile = colorSpace.iccProfile(); QByteArray iccProfile = colorSpace.iccProfile();
QVERIFY(!iccProfile.isEmpty()); QVERIFY(!iccProfile.isEmpty());
@ -172,7 +172,7 @@ void tst_QColorSpace::toIccProfile()
void tst_QColorSpace::fromIccProfile_data() void tst_QColorSpace::fromIccProfile_data()
{ {
QTest::addColumn<QString>("testProfile"); QTest::addColumn<QString>("testProfile");
QTest::addColumn<QColorSpace::ColorSpaceId>("colorSpaceId"); QTest::addColumn<QColorSpace::NamedColorSpace>("namedColorSpace");
QTest::addColumn<QColorSpace::TransferFunction>("transferFunction"); QTest::addColumn<QColorSpace::TransferFunction>("transferFunction");
QTest::addColumn<QString>("description"); QTest::addColumn<QString>("description");
@ -181,14 +181,14 @@ void tst_QColorSpace::fromIccProfile_data()
QTest::newRow("sRGB2014 (ICCv2)") << prefix + "sRGB2014.icc" << QColorSpace::SRgb QTest::newRow("sRGB2014 (ICCv2)") << prefix + "sRGB2014.icc" << QColorSpace::SRgb
<< QColorSpace::TransferFunction::SRgb << QString("sRGB2014"); << QColorSpace::TransferFunction::SRgb << QString("sRGB2014");
// My monitor's profile: // My monitor's profile:
QTest::newRow("HP ZR30w (ICCv4)") << prefix + "HP_ZR30w.icc" << QColorSpace::Unknown QTest::newRow("HP ZR30w (ICCv4)") << prefix + "HP_ZR30w.icc" << QColorSpace::NamedColorSpace(0)
<< QColorSpace::TransferFunction::Gamma << QString("HP Z30i"); << QColorSpace::TransferFunction::Gamma << QString("HP Z30i");
} }
void tst_QColorSpace::fromIccProfile() void tst_QColorSpace::fromIccProfile()
{ {
QFETCH(QString, testProfile); QFETCH(QString, testProfile);
QFETCH(QColorSpace::ColorSpaceId, colorSpaceId); QFETCH(QColorSpace::NamedColorSpace, namedColorSpace);
QFETCH(QColorSpace::TransferFunction, transferFunction); QFETCH(QColorSpace::TransferFunction, transferFunction);
QFETCH(QString, description); QFETCH(QString, description);
@ -198,15 +198,17 @@ void tst_QColorSpace::fromIccProfile()
QColorSpace fileColorSpace = QColorSpace::fromIccProfile(iccProfile); QColorSpace fileColorSpace = QColorSpace::fromIccProfile(iccProfile);
QVERIFY(fileColorSpace.isValid()); QVERIFY(fileColorSpace.isValid());
QCOMPARE(fileColorSpace.colorSpaceId(), colorSpaceId); if (namedColorSpace)
QCOMPARE(fileColorSpace, namedColorSpace);
QCOMPARE(fileColorSpace.transferFunction(), transferFunction); QCOMPARE(fileColorSpace.transferFunction(), transferFunction);
QCOMPARE(QColorSpacePrivate::get(fileColorSpace)->description, description); QCOMPARE(QColorSpacePrivate::get(fileColorSpace)->description, description);
} }
void tst_QColorSpace::imageConversion_data() void tst_QColorSpace::imageConversion_data()
{ {
QTest::addColumn<QColorSpace::ColorSpaceId>("fromColorSpace"); QTest::addColumn<QColorSpace::NamedColorSpace>("fromColorSpace");
QTest::addColumn<QColorSpace::ColorSpaceId>("toColorSpace"); QTest::addColumn<QColorSpace::NamedColorSpace>("toColorSpace");
QTest::addColumn<int>("tolerance"); QTest::addColumn<int>("tolerance");
QTest::newRow("sRGB -> Display-P3") << QColorSpace::SRgb << QColorSpace::DisplayP3 << 0; QTest::newRow("sRGB -> Display-P3") << QColorSpace::SRgb << QColorSpace::DisplayP3 << 0;
@ -220,8 +222,8 @@ void tst_QColorSpace::imageConversion_data()
void tst_QColorSpace::imageConversion() void tst_QColorSpace::imageConversion()
{ {
QFETCH(QColorSpace::ColorSpaceId, fromColorSpace); QFETCH(QColorSpace::NamedColorSpace, fromColorSpace);
QFETCH(QColorSpace::ColorSpaceId, toColorSpace); QFETCH(QColorSpace::NamedColorSpace, toColorSpace);
QFETCH(int, tolerance); QFETCH(int, tolerance);
QImage testImage(256, 1, QImage::Format_RGB32); QImage testImage(256, 1, QImage::Format_RGB32);
@ -275,7 +277,7 @@ void tst_QColorSpace::loadImage()
QVERIFY(!image.isNull()); QVERIFY(!image.isNull());
QVERIFY(image.colorSpace().isValid()); QVERIFY(image.colorSpace().isValid());
QCOMPARE(image.colorSpace().colorSpaceId(), QColorSpace::ProPhotoRgb); QCOMPARE(image.colorSpace(), QColorSpace::ProPhotoRgb);
QVERIFY(!image.colorSpace().iccProfile().isEmpty()); QVERIFY(!image.colorSpace().iccProfile().isEmpty());
QColorSpace defaultProPhotoRgb = QColorSpace::ProPhotoRgb; QColorSpace defaultProPhotoRgb = QColorSpace::ProPhotoRgb;
@ -398,7 +400,6 @@ void tst_QColorSpace::invalidPrimaries()
{ {
QColorSpace custom(QPointF(), QPointF(), QPointF(), QPointF(), QColorSpace::TransferFunction::Linear); QColorSpace custom(QPointF(), QPointF(), QPointF(), QPointF(), QColorSpace::TransferFunction::Linear);
QVERIFY(!custom.isValid()); QVERIFY(!custom.isValid());
QCOMPARE(custom.colorSpaceId(), QColorSpace::Undefined);
} }
void tst_QColorSpace::changeTransferFunction() void tst_QColorSpace::changeTransferFunction()
@ -409,7 +410,7 @@ void tst_QColorSpace::changeTransferFunction()
QCOMPARE(sRgbLinear.transferFunction(), QColorSpace::TransferFunction::Linear); QCOMPARE(sRgbLinear.transferFunction(), QColorSpace::TransferFunction::Linear);
QCOMPARE(sRgbLinear.gamma(), 1.0f); QCOMPARE(sRgbLinear.gamma(), 1.0f);
QCOMPARE(sRgbLinear.primaries(), QColorSpace::Primaries::SRgb); QCOMPARE(sRgbLinear.primaries(), QColorSpace::Primaries::SRgb);
QCOMPARE(sRgbLinear.colorSpaceId(), QColorSpace::SRgbLinear); QCOMPARE(sRgbLinear, QColorSpace::SRgbLinear);
QCOMPARE(sRgbLinear, QColorSpace(QColorSpace::SRgbLinear)); QCOMPARE(sRgbLinear, QColorSpace(QColorSpace::SRgbLinear));
QVERIFY(sRgbLinear != sRgb); QVERIFY(sRgbLinear != sRgb);
QCOMPARE(sRgbLinear.withTransferFunction(QColorSpace::TransferFunction::SRgb), sRgb); QCOMPARE(sRgbLinear.withTransferFunction(QColorSpace::TransferFunction::SRgb), sRgb);
@ -418,7 +419,6 @@ void tst_QColorSpace::changeTransferFunction()
aRgb.setTransferFunction(QColorSpace::TransferFunction::SRgb); aRgb.setTransferFunction(QColorSpace::TransferFunction::SRgb);
QCOMPARE(aRgb.transferFunction(), QColorSpace::TransferFunction::SRgb); QCOMPARE(aRgb.transferFunction(), QColorSpace::TransferFunction::SRgb);
QCOMPARE(aRgb.primaries(), QColorSpace::Primaries::AdobeRgb); QCOMPARE(aRgb.primaries(), QColorSpace::Primaries::AdobeRgb);
QCOMPARE(aRgb.colorSpaceId(), QColorSpace::Unknown);
QVERIFY(aRgb != QColorSpace(QColorSpace::AdobeRgb)); QVERIFY(aRgb != QColorSpace(QColorSpace::AdobeRgb));
QVERIFY(aRgb != sRgb); QVERIFY(aRgb != sRgb);
QCOMPARE(aRgb.withTransferFunction(QColorSpace::TransferFunction::Gamma, 2.2f), QCOMPARE(aRgb.withTransferFunction(QColorSpace::TransferFunction::Gamma, 2.2f),