7#ifndef KOCOLORTRANSFERFUNCTIONS_H
8#define KOCOLORTRANSFERFUNCTIONS_H
40 const float m1 = 2610.0f / 4096.0f / 4.0f;
41 const float m2 = 2523.0f / 4096.0f * 128.0f;
42 const float a1 = 3424.0f / 4096.0f;
43 const float c2 = 2413.0f / 4096.0f * 32.0f;
44 const float c3 = 2392.0f / 4096.0f * 32.0f;
45 const float a4 = 1.0f;
46 const float x_p = powf(0.008f * std::max(0.0f, x), m1);
47 const float res = powf((a1 + c2 * x_p) / (a4 + c3 * x_p), m2);
53 const float m1_r = 4096.0f * 4.0f / 2610.0f;
54 const float m2_r = 4096.0f / 2523.0f / 128.0f;
55 const float a1 = 3424.0f / 4096.0f;
56 const float c2 = 2413.0f / 4096.0f * 32.0f;
57 const float c3 = 2392.0f / 4096.0f * 32.0f;
59 const float x_p = powf(x, m2_r);
60 const float res = powf(qMax(0.0f, x_p - a1) / (c2 - c3 * x_p), m1_r);
68 const float k = 1.111f;
69 return 1.2f * powf(k, log2f(nominalPeak * (1.f / 1000.0f)));
76 const double *lumaCoefficients,
78 float nominalPeak = 1000.0f) noexcept
80 const float luma = (rgb[0] *
static_cast<float>(lumaCoefficients[0]))
81 + (rgb[1] *
static_cast<float>(lumaCoefficients[1]))
82 + (rgb[2] *
static_cast<float>(lumaCoefficients[2]));
83 const float a = nominalPeak * powf(luma, gamma - 1.f);
93 const double *lumaCoefficients,
95 float nominalPeak = 1000.0f) noexcept
97 const float luma = (rgb[0] *
static_cast<float>(lumaCoefficients[0]))
98 + (rgb[1] *
static_cast<float>(lumaCoefficients[1]))
99 + (rgb[2] *
static_cast<float>(lumaCoefficients[2]));
100 const float multiplier = powf(luma * (1.f / nominalPeak), (1.f - gamma) * (1.f / gamma)) * (1.f / nominalPeak);
101 rgb[0] *= multiplier;
102 rgb[1] *= multiplier;
103 rgb[2] *= multiplier;
108 const float a = 0.17883277f;
109 const float b = 0.28466892f;
110 const float c = 0.55991073f;
112 if (x > 1.0f / 12.0f) {
113 return (a * logf(12.0f * x - b) + c);
116 return (sqrtf(3.0f) * sqrtf(x));
122 const float a = 0.17883277f;
123 const float b = 0.28466892f;
124 const float c = 0.55991073f;
127 return x * x * (1.f / 3.0f);
129 return (expf((x - c) * (1.f / a)) + b) * (1.f / 12.0f);
135 return powf(48.0f * x * (1.f / 52.37f), (1.f / 2.6f));
140 return (52.37f / 48.0f) * powf(x, 2.6f);
145#if !defined(XSIMD_NO_SUPPORTED_ARCHITECTURE)
149template<
typename Arch>
155 constexpr float m1_r = 4096.0f * 4.0f / 2610.0f;
156 constexpr float m2_r = 4096.0f / 2523.0f / 128.0f;
157 constexpr float a1 = 3424.0f / 4096.0f;
158 constexpr float c2 = 2413.0f / 4096.0f * 32.0f;
159 constexpr float c3 = 2392.0f / 4096.0f * 32.0f;
170 constexpr float a = 0.17883277f;
171 constexpr float b = 0.28466892f;
172 constexpr float c = 0.55991073f;
174 const float_v x1 = x * x * (1.f / 3.0f);
176 (xsimd::exp((x - c) * (1.f / a)) + b) * (1.f / 12.0f);
177 x = xsimd::select(x <=
float_v(0.5f), x1, x2);
182 x = (52.37f / 48.0f) * xsimd::pow(x,
float_v(2.6f));
ALWAYS_INLINE void applyHLGOOTF(float *rgb, const double *lumaCoefficients, float gamma=1.2f, float nominalPeak=1000.0f) noexcept
ALWAYS_INLINE float removeHLGCurve(float x) noexcept
ALWAYS_INLINE void removeHLGOOTF(float *rgb, const double *lumaCoefficients, float gamma=1.2f, float nominalPeak=1000.0f) noexcept
static constexpr float max16bit
LinearizePolicy
The KoColorTransferFunctions class.
static constexpr uint16_t max12bit
static constexpr float multiplier12bit
static constexpr float multiplier10bit
ALWAYS_INLINE float removeSMPTE_ST_428Curve(float x) noexcept
static constexpr float multiplier16bit
ALWAYS_INLINE float applySmpte2048Curve(float x) noexcept
ALWAYS_INLINE float applySMPTE_ST_428Curve(float x) noexcept
ALWAYS_INLINE float removeSmpte2048Curve(float x) noexcept
ALWAYS_INLINE float HLGOOTFGamma(float nominalPeak) noexcept
ALWAYS_INLINE float applyHLGCurve(float x) noexcept
constexpr std::enable_if< sizeof...(values)==0, size_t >::type max()
static ALWAYS_INLINE void removeSmpte2048Curve(float_v &x) noexcept
typename KoStreamedMath< Arch >::float_v float_v
static ALWAYS_INLINE void removeSMPTE_ST_428Curve(float_v &x) noexcept
static ALWAYS_INLINE void removeHLGCurve(float_v &x) noexcept
xsimd::batch< float, _impl > float_v