Fix BT.2100PQ

From and to algorithms were accidentally reversed before submitting
final patch.

Change-Id: I16e0afda26b77047facf4f65065224c8f3dce6c6
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
(cherry picked from commit 1b1f613b56fce643a7565e9280acc90e171caf7c)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
bb10
Allan Sandfeld Jensen 2024-06-10 15:38:35 +02:00 committed by Qt Cherry-pick Bot
parent 0723c6fd05
commit dce5164375
2 changed files with 32 additions and 9 deletions

View File

@ -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

View File

@ -7,6 +7,7 @@
#include <qcolorspace.h>
#include <qimage.h>
#include <qimagereader.h>
#include <qrgbafloat.h>
#include <private/qcolorspace_p.h>
@ -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<const QRgba64 *>(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"