diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2024-02-28 10:41:29 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2024-03-05 15:29:20 +0100 |
commit | e9f5bb7cbe196c8064368fb68a42e3a20e5855ea (patch) | |
tree | d935a2f0ea61204422585625e9aa21d5332d6c6e /src/gui/painting | |
parent | cee8a11d73db3c981ab0a3b3d42320e7b7db0dad (diff) |
Improve QColorTrc::isLinear and rename it isIdentity
Pick-to: 6.7
Change-Id: Id697fa3844610606c202e3fa717d631a3621e774
Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
Diffstat (limited to 'src/gui/painting')
-rw-r--r-- | src/gui/painting/qcolorspace.cpp | 2 | ||||
-rw-r--r-- | src/gui/painting/qcolortransferfunction_p.h | 24 | ||||
-rw-r--r-- | src/gui/painting/qcolortransfertable_p.h | 15 | ||||
-rw-r--r-- | src/gui/painting/qcolortrc_p.h | 6 | ||||
-rw-r--r-- | src/gui/painting/qicc.cpp | 30 |
5 files changed, 53 insertions, 24 deletions
diff --git a/src/gui/painting/qcolorspace.cpp b/src/gui/painting/qcolorspace.cpp index 487c295298..539a294102 100644 --- a/src/gui/painting/qcolorspace.cpp +++ b/src/gui/painting/qcolorspace.cpp @@ -319,7 +319,7 @@ void QColorSpacePrivate::setTransferFunctionTable(const QList<uint16_t> &transfe QColorTransferFunction curve; if (table.asColorTransferFunction(&curve)) { // Table recognized as a specific curve - if (curve.isLinear()) { + if (curve.isIdentity()) { transferFunction = QColorSpace::TransferFunction::Linear; gamma = 1.0f; } else if (curve.isSRgb()) { diff --git a/src/gui/painting/qcolortransferfunction_p.h b/src/gui/painting/qcolortransferfunction_p.h index a9bb26df59..8bbce3ca99 100644 --- a/src/gui/painting/qcolortransferfunction_p.h +++ b/src/gui/painting/qcolortransferfunction_p.h @@ -26,7 +26,8 @@ class Q_GUI_EXPORT QColorTransferFunction { public: QColorTransferFunction() noexcept - : m_a(1.0f), m_b(0.0f), m_c(1.0f), m_d(0.0f), m_e(0.0f), m_f(0.0f), m_g(1.0f), m_flags(0) + : m_a(1.0f), m_b(0.0f), m_c(1.0f), m_d(0.0f), m_e(0.0f), m_f(0.0f), m_g(1.0f) + , m_flags(quint32(Hints::Calculated) | quint32(Hints::IsGamma) | quint32(Hints::IsIdentity)) { } QColorTransferFunction(float a, float b, float c, float d, float e, float f, float g) noexcept : m_a(a), m_b(b), m_c(c), m_d(d), m_e(e), m_f(f), m_g(g), m_flags(0) @@ -37,10 +38,10 @@ public: updateHints(); return m_flags & quint32(Hints::IsGamma); } - bool isLinear() const + bool isIdentity() const { updateHints(); - return m_flags & quint32(Hints::IsLinear); + return m_flags & quint32(Hints::IsIdentity); } bool isSRgb() const { @@ -88,15 +89,19 @@ public: // A few predefined curves: static QColorTransferFunction fromGamma(float gamma) { - return QColorTransferFunction(1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, gamma); + return QColorTransferFunction(1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, gamma, + quint32(Hints::Calculated) | quint32(Hints::IsGamma) | + (paramCompare(gamma, 1.0f) ? quint32(Hints::IsIdentity) : 0)); } static QColorTransferFunction fromSRgb() { - return QColorTransferFunction(1.0f / 1.055f, 0.055f / 1.055f, 1.0f / 12.92f, 0.04045f, 0.0f, 0.0f, 2.4f); + return QColorTransferFunction(1.0f / 1.055f, 0.055f / 1.055f, 1.0f / 12.92f, 0.04045f, 0.0f, 0.0f, 2.4f, + quint32(Hints::Calculated) | quint32(Hints::IsSRgb)); } static QColorTransferFunction fromProPhotoRgb() { - return QColorTransferFunction(1.0f, 0.0f, 1.0f / 16.0f, 16.0f / 512.0f, 0.0f, 0.0f, 1.8f); + return QColorTransferFunction(1.0f, 0.0f, 1.0f / 16.0f, 16.0f / 512.0f, 0.0f, 0.0f, 1.8f, + quint32(Hints::Calculated)); } bool matches(const QColorTransferFunction &o) const { @@ -117,6 +122,9 @@ public: float m_g; private: + QColorTransferFunction(float a, float b, float c, float d, float e, float f, float g, quint32 flags) noexcept + : m_a(a), m_b(b), m_c(c), m_d(d), m_e(e), m_f(f), m_g(g), m_flags(flags) + { } static inline bool paramCompare(float p1, float p2) { // Much fuzzier than fuzzy compare. @@ -137,7 +145,7 @@ private: if (simple) { m_flags |= quint32(Hints::IsGamma); if (qFuzzyCompare(m_g, 1.0f)) - m_flags |= quint32(Hints::IsLinear); + m_flags |= quint32(Hints::IsIdentity); } else { if (*this == fromSRgb()) m_flags |= quint32(Hints::IsSRgb); @@ -147,7 +155,7 @@ private: enum class Hints : quint32 { Calculated = 1, IsGamma = 2, - IsLinear = 4, + IsIdentity = 4, IsSRgb = 8 }; mutable quint32 m_flags; diff --git a/src/gui/painting/qcolortransfertable_p.h b/src/gui/painting/qcolortransfertable_p.h index dc0f5804fd..20c35cac2d 100644 --- a/src/gui/painting/qcolortransfertable_p.h +++ b/src/gui/painting/qcolortransfertable_p.h @@ -48,6 +48,17 @@ public: return m_tableSize == 0; } + bool isIdentity() const + { + if (isEmpty()) + return true; + if (m_tableSize != 2) + return false; + if (!m_table8.isEmpty()) + return m_table8[0] == 0 && m_table8[1] == 255; + return m_table16[0] == 0 && m_table16[1] == 65535; + } + bool checkValidity() const { if (isEmpty()) @@ -137,6 +148,10 @@ public: bool asColorTransferFunction(QColorTransferFunction *transferFn) { Q_ASSERT(transferFn); + if (isEmpty()) { + *transferFn = QColorTransferFunction(); + return true; + } if (m_tableSize < 2) return false; if (!m_table8.isEmpty() && (m_table8[0] != 0 || m_table8[m_tableSize - 1] != 255)) diff --git a/src/gui/painting/qcolortrc_p.h b/src/gui/painting/qcolortrc_p.h index 9e879bb3e2..6f9030fa3a 100644 --- a/src/gui/painting/qcolortrc_p.h +++ b/src/gui/painting/qcolortrc_p.h @@ -39,9 +39,11 @@ public: Table }; - bool isLinear() const + bool isIdentity() const { - return m_type == Type::Uninitialized || (m_type == Type::Function && m_fun.isLinear()); + return m_type == Type::Uninitialized + || (m_type == Type::Function && m_fun.isIdentity()) + || (m_type == Type::Table && m_table.isIdentity()); } bool isValid() const { diff --git a/src/gui/painting/qicc.cpp b/src/gui/painting/qicc.cpp index f36c1db62b..d0bfa7eaa3 100644 --- a/src/gui/painting/qicc.cpp +++ b/src/gui/painting/qicc.cpp @@ -238,7 +238,7 @@ static bool isValidIccProfile(const ICCProfileHeader &header) static int writeColorTrc(QDataStream &stream, const QColorTrc &trc) { - if (trc.isLinear()) { + if (trc.isIdentity()) { stream << uint(Tag::curv) << uint(0); stream << uint(0); return 12; @@ -698,26 +698,30 @@ static bool parseTRCs(const QByteArray &data, const QHash<Tag, TagEntry> &tagInd qCWarning(lcIcc) << "fromIccProfile: Invalid bTRC"; return false; } - if (rCurve == gCurve && gCurve == bCurve && rCurve.m_type == QColorTrc::Type::Function) { - if (rCurve.m_fun.isLinear()) { + if (rCurve == gCurve && gCurve == bCurve) { + if (rCurve.isIdentity()) { qCDebug(lcIcc) << "fromIccProfile: Linear gamma detected"; colorspaceDPtr->trc[0] = QColorTransferFunction(); colorspaceDPtr->transferFunction = QColorSpace::TransferFunction::Linear; colorspaceDPtr->gamma = 1.0f; - } else if (rCurve.m_fun.isGamma()) { - qCDebug(lcIcc) << "fromIccProfile: Simple gamma detected"; - colorspaceDPtr->trc[0] = QColorTransferFunction::fromGamma(rCurve.m_fun.m_g); - colorspaceDPtr->transferFunction = QColorSpace::TransferFunction::Gamma; - colorspaceDPtr->gamma = rCurve.m_fun.m_g; - } else if (rCurve.m_fun.isSRgb()) { - qCDebug(lcIcc) << "fromIccProfile: sRGB gamma detected"; - colorspaceDPtr->trc[0] = QColorTransferFunction::fromSRgb(); - colorspaceDPtr->transferFunction = QColorSpace::TransferFunction::SRgb; + } else if (rCurve.m_type == QColorTrc::Type::Function) { + if (rCurve.m_fun.isGamma()) { + qCDebug(lcIcc) << "fromIccProfile: Simple gamma detected"; + colorspaceDPtr->trc[0] = QColorTransferFunction::fromGamma(rCurve.m_fun.m_g); + colorspaceDPtr->transferFunction = QColorSpace::TransferFunction::Gamma; + colorspaceDPtr->gamma = rCurve.m_fun.m_g; + } else if (rCurve.m_fun.isSRgb()) { + qCDebug(lcIcc) << "fromIccProfile: sRGB gamma detected"; + colorspaceDPtr->trc[0] = QColorTransferFunction::fromSRgb(); + colorspaceDPtr->transferFunction = QColorSpace::TransferFunction::SRgb; + } else { + colorspaceDPtr->trc[0] = rCurve; + colorspaceDPtr->transferFunction = QColorSpace::TransferFunction::Custom; + } } else { colorspaceDPtr->trc[0] = rCurve; colorspaceDPtr->transferFunction = QColorSpace::TransferFunction::Custom; } - colorspaceDPtr->trc[1] = colorspaceDPtr->trc[0]; colorspaceDPtr->trc[2] = colorspaceDPtr->trc[0]; } else { |