From dce516437518f4a6cc6c894887284fb23ed7949e Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Mon, 10 Jun 2024 15:38:35 +0200 Subject: [PATCH] Fix BT.2100PQ From and to algorithms were accidentally reversed before submitting final patch. Change-Id: I16e0afda26b77047facf4f65065224c8f3dce6c6 Reviewed-by: Laszlo Agocs (cherry picked from commit 1b1f613b56fce643a7565e9280acc90e171caf7c) Reviewed-by: Qt Cherry-pick Bot --- src/gui/painting/qcolortransfergeneric_p.h | 18 +++++++-------- .../painting/qcolorspace/tst_qcolorspace.cpp | 23 +++++++++++++++++++ 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/gui/painting/qcolortransfergeneric_p.h b/src/gui/painting/qcolortransfergeneric_p.h index b4e6e8dec7..c46f00e9dc 100644 --- a/src/gui/painting/qcolortransfergeneric_p.h +++ b/src/gui/painting/qcolortransfergeneric_p.h @@ -82,18 +82,18 @@ private: constexpr static float m_hlg_b = 1.f - (4.f * m_hlg_a); constexpr static float m_hlg_c = 0.55991073f; // 0.5 - a * ln(4 * a) + // PQ to linear [0-1] -> [0-64] + static float pqToLinear(float x) + { + x = std::pow(x, 1.f / m_pq_m2); + return std::pow((m_pq_c1 - x) / (m_pq_c3 * x - m_pq_c2), (1.f / m_pq_m1)) * m_pq_f; + } + // PQ from linear [0-64] -> [0-1] static float pqFromLinear(float x) { - x = std::pow(x * (1.f / m_pq_f), (1.f / m_pq_m1)); - return std::pow((m_pq_c1 - x) / (m_pq_c3 * x - m_pq_c2), (1.f / m_pq_m2)); - } - - // PQ from linear [0-1] -> [0-64] - static float pqToLinear(float x) - { - x = std::pow(x, m_pq_m1); - return std::pow((m_pq_c1 + m_pq_c2 * x) / (1.f + m_pq_c3 * x), m_pq_m2) * m_pq_f; + x = std::pow(x * (1.f / m_pq_f), m_pq_m1); + return std::pow((m_pq_c1 + m_pq_c2 * x) / (1.f + m_pq_c3 * x), m_pq_m2); } constexpr static float m_pq_c1 = 107.f / 128.f; // c3 - c2 + 1 diff --git a/tests/auto/gui/painting/qcolorspace/tst_qcolorspace.cpp b/tests/auto/gui/painting/qcolorspace/tst_qcolorspace.cpp index 6c103ce4f3..04887a3350 100644 --- a/tests/auto/gui/painting/qcolorspace/tst_qcolorspace.cpp +++ b/tests/auto/gui/painting/qcolorspace/tst_qcolorspace.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include @@ -73,6 +74,7 @@ private slots: void grayColorSpaceEffectivelySRgb(); void scaleAlphaValue(); + void hdrColorSpaces(); }; tst_QColorSpace::tst_QColorSpace() @@ -1064,5 +1066,26 @@ void tst_QColorSpace::scaleAlphaValue() QCOMPARE(reinterpret_cast(image.constBits())->alpha(), 257 * 125); } +void tst_QColorSpace::hdrColorSpaces() +{ + QColorSpace bt2020linear = QColorSpace::Bt2020; + bt2020linear.setTransferFunction(QColorSpace::TransferFunction::Linear); + + QColorTransform pqToLinear = QColorSpace(QColorSpace::Bt2100Pq).transformationToColorSpace(bt2020linear); + QColorTransform hlgToLinear = QColorSpace(QColorSpace::Bt2100Hlg).transformationToColorSpace(bt2020linear); + + QColor maxWhite = QColor::fromRgbF(1.0f, 1.0f, 1.0f); + QColor hlgWhite = QColor::fromRgbF(0.5f, 0.5f, 0.5f); + QCOMPARE(hlgToLinear.map(maxWhite).redF(), 12.f); + QCOMPARE(hlgToLinear.map(maxWhite).greenF(), 12.f); + QCOMPARE(hlgToLinear.map(maxWhite).blueF(), 12.f); + QCOMPARE(hlgToLinear.map(hlgWhite).redF(), 1.f); + QCOMPARE(hlgToLinear.map(hlgWhite).greenF(), 1.f); + QCOMPARE(hlgToLinear.map(hlgWhite).blueF(), 1.f); + QCOMPARE(pqToLinear.map(maxWhite).redF(), 64.f); + QCOMPARE(pqToLinear.map(maxWhite).greenF(), 64.f); + QCOMPARE(pqToLinear.map(maxWhite).blueF(), 64.f); +} + QTEST_MAIN(tst_QColorSpace) #include "tst_qcolorspace.moc"