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
parent
0723c6fd05
commit
dce5164375
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
Loading…
Reference in New Issue