Krita Source Code Documentation
Loading...
Searching...
No Matches
HDR Namespace Reference

Classes

struct  readLayerImpl
 

Functions

template<ConversionPolicy policy>
ALWAYS_INLINE float applyCurveAsNeeded (float value)
 
template<typename... Args>
auto readInterleavedLayer (const int luma, LinearizePolicy linearizePolicy, bool applyOOTF, const int channels, const int width, const int height, const uint8_t *img, const int stride, KisHLineIteratorSP it, float displayGamma, float displayNits, const KoColorSpace *colorSpace)
 
template<typename CSTrait , bool swap, bool convertToRec2020, bool isLinear, ConversionPolicy conversionPolicy, typename DestTrait , bool removeOOTF>
QByteArray writeLayer (const int width, const int height, KisHLineConstIteratorSP it, float hlgGamma, float hlgNominalPeak, const KoColorSpace *cs)
 
template<typename... Args>
auto writeLayer (const KoID &id, Args &&...args)
 
template<typename CSTrait , bool swap>
QByteArray writeLayerNoConversion (const int width, const int height, KisHLineConstIteratorSP it, float hlgGamma, float hlgNominalPeak, const KoColorSpace *cs)
 
template<typename CSTrait , bool swap, bool convertToRec2020, bool isLinear, ConversionPolicy linearizePolicy, typename DestTrait , bool removeOOTF, typename... Args>
ALWAYS_INLINE auto writeLayerSimplify (Args &&...args)
 
template<typename CSTrait , bool swap, bool convertToRec2020, bool isLinear, typename... Args>
ALWAYS_INLINE auto writeLayerWithLinear (ConversionPolicy linearizePolicy, Args &&...args)
 
template<typename CSTrait , bool swap, bool convertToRec2020, bool isLinear, ConversionPolicy linearizePolicy, typename DestTrait , typename... Args>
ALWAYS_INLINE auto writeLayerWithPolicy (bool removeOOTF, Args &&...args)
 
template<typename CSTrait , bool swap, bool convertToRec2020, typename... Args>
ALWAYS_INLINE auto writeLayerWithRec2020 (bool isLinear, Args &&...args)
 
template<typename CSTrait , bool swap, typename... Args>
ALWAYS_INLINE auto writeLayerWithSwap (bool convertToRec2020, Args &&...args)
 

Function Documentation

◆ applyCurveAsNeeded()

template<ConversionPolicy policy>
ALWAYS_INLINE float HDR::applyCurveAsNeeded ( float value)

Definition at line 146 of file kis_jpegxl_export_tools.h.

147{
148 if (policy == ConversionPolicy::ApplyPQ) {
150 } else if (policy == ConversionPolicy::ApplyHLG) {
151 return applyHLGCurve(value);
152 } else if (policy == ConversionPolicy::ApplySMPTE428) {
154 }
155 return value;
156}
float value(const T *src, size_t ch)
ALWAYS_INLINE float applySmpte2048Curve(float x) noexcept
ALWAYS_INLINE float applySMPTE_ST_428Curve(float x) noexcept
ALWAYS_INLINE float applyHLGCurve(float x) noexcept

References ApplyHLG, applyHLGCurve(), ApplyPQ, applySmpte2048Curve(), ApplySMPTE428, applySMPTE_ST_428Curve(), and value().

◆ readInterleavedLayer()

template<typename... Args>
auto HDR::readInterleavedLayer ( const int luma,
LinearizePolicy linearizePolicy,
bool applyOOTF,
const int channels,
const int width,
const int height,
const uint8_t * img,
const int stride,
KisHLineIteratorSP it,
float displayGamma,
float displayNits,
const KoColorSpace * colorSpace )
inline

Definition at line 153 of file HeifImport.cpp.

165{
166 return createOptimizedClass<HDR::readLayerImpl>(luma,
167 linearizePolicy,
168 applyOOTF,
169 channels,
170 width,
171 height,
172 img,
173 stride,
174 it,
175 displayGamma,
176 displayNits,
177 colorSpace);
178}

◆ writeLayer() [1/2]

template<typename CSTrait , bool swap, bool convertToRec2020, bool isLinear, ConversionPolicy conversionPolicy, typename DestTrait , bool removeOOTF>
QByteArray HDR::writeLayer ( const int width,
const int height,
KisHLineConstIteratorSP it,
float hlgGamma,
float hlgNominalPeak,
const KoColorSpace * cs )
inline

Definition at line 165 of file kis_jpegxl_export_tools.h.

171{
172 const int channels = static_cast<int>(CSTrait::channels_nb);
173 QVector<float> pixelValues(channels);
174 QVector<qreal> pixelValuesLinear(channels);
175 const KoColorProfile *profile = cs->profile();
176 const QVector<qreal> lCoef = cs->lumaCoefficients();
177 double *src = pixelValuesLinear.data();
178 float *dst = pixelValues.data();
179
180 QByteArray res;
181 res.resize(width * height * static_cast<int>(DestTrait::pixelSize));
182
183 quint8 *ptr = reinterpret_cast<quint8 *>(res.data());
184
185 for (int y = 0; y < height; y++) {
186 for (int x = 0; x < width; x++) {
187 CSTrait::normalisedChannelsValue(it->rawDataConst(), pixelValues);
188 if (!convertToRec2020 && !isLinear) {
189 for (int i = 0; i < channels; i++) {
190 src[i] = static_cast<double>(dst[i]);
191 }
192 profile->linearizeFloatValue(pixelValuesLinear);
193 for (int i = 0; i < channels; i++) {
194 dst[i] = static_cast<float>(src[i]);
195 }
196 }
197
198 if (conversionPolicy == ConversionPolicy::ApplyHLG && removeOOTF) {
199 removeHLGOOTF(dst, lCoef.constData(), hlgGamma, hlgNominalPeak);
200 }
201
202 for (int ch = 0; ch < channels; ch++) {
203 if (ch == CSTrait::alpha_pos) {
204 dst[ch] = applyCurveAsNeeded<ConversionPolicy::KeepTheSame>(
205 dst[ch]);
206 } else {
207 dst[ch] = applyCurveAsNeeded<conversionPolicy>(dst[ch]);
208 }
209 }
210
211 if (swap) {
212 std::swap(dst[0], dst[2]);
213 }
214
215 DestTrait::fromNormalisedChannelsValue(ptr, pixelValues);
216
217 ptr += DestTrait::pixelSize;
218
219 it->nextPixel();
220 }
221
222 it->nextRow();
223 }
224
225 return res;
226}
ALWAYS_INLINE void removeHLGOOTF(float *rgb, const double *lumaCoefficients, float gamma=1.2f, float nominalPeak=1000.0f) noexcept
virtual const quint8 * rawDataConst() const =0
virtual bool nextPixel()=0
virtual void nextRow()=0
QVector< qreal > lumaCoefficients
virtual const KoColorProfile * profile() const =0
virtual void linearizeFloatValue(QVector< qreal > &Value) const =0

References ApplyHLG, KoColorProfile::linearizeFloatValue(), KoColorSpace::lumaCoefficients, KisBaseConstIteratorNG::nextPixel(), KisHLineConstIteratorNG::nextRow(), KoColorSpace::profile(), KisBaseConstAccessor::rawDataConst(), and removeHLGOOTF().

◆ writeLayer() [2/2]

template<typename... Args>
auto HDR::writeLayer ( const KoID & id,
Args &&... args )
inline

Definition at line 357 of file kis_jpegxl_export_tools.h.

358{
359 if (id == Integer8BitsColorDepthID) {
360 return writeLayerWithSwap<KoBgrU8Traits, true>(std::forward<Args>(args)...);
361 } else if (id == Integer16BitsColorDepthID) {
362 return writeLayerWithSwap<KoBgrU16Traits, true>(std::forward<Args>(args)...);
363#ifdef HAVE_OPENEXR
364 } else if (id == Float16BitsColorDepthID) {
365 return writeLayerWithSwap<KoBgrF16Traits, false>(std::forward<Args>(args)...);
366#endif
367 } else if (id == Float32BitsColorDepthID) {
368 return writeLayerWithSwap<KoBgrF32Traits, false>(std::forward<Args>(args)...);
369 } else {
370 KIS_ASSERT_X(false, "JPEGXLExport::writeLayer", "unsupported bit depth!");
371 return QByteArray();
372 }
373}
const KoID Float32BitsColorDepthID("F32", ki18n("32-bit float/channel"))
const KoID Float16BitsColorDepthID("F16", ki18n("16-bit float/channel"))
const KoID Integer8BitsColorDepthID("U8", ki18n("8-bit integer/channel"))
const KoID Integer16BitsColorDepthID("U16", ki18n("16-bit integer/channel"))
#define KIS_ASSERT_X(cond, where, what)
Definition kis_assert.h:40

References Float16BitsColorDepthID, Float32BitsColorDepthID, Integer16BitsColorDepthID, Integer8BitsColorDepthID, and KIS_ASSERT_X.

◆ writeLayerNoConversion()

template<typename CSTrait , bool swap>
QByteArray HDR::writeLayerNoConversion ( const int width,
const int height,
KisHLineConstIteratorSP it,
float hlgGamma,
float hlgNominalPeak,
const KoColorSpace * cs )
inline

Definition at line 229 of file kis_jpegxl_export_tools.h.

235{
236 Q_UNUSED(hlgGamma);
237 Q_UNUSED(hlgNominalPeak);
238 Q_UNUSED(cs);
239
240 const int channels = static_cast<int>(CSTrait::channels_nb);
241 QVector<float> pixelValues(channels);
242 QVector<qreal> pixelValuesLinear(channels);
243
244 QByteArray res;
245 res.resize(width * height * static_cast<int>(CSTrait::pixelSize));
246
247 quint8 *ptr = reinterpret_cast<quint8 *>(res.data());
248
249 for (int y = 0; y < height; y++) {
250 for (int x = 0; x < width; x++) {
251 auto *dst = reinterpret_cast<typename CSTrait::channels_type *>(ptr);
252
253 std::memcpy(dst, it->rawDataConst(), CSTrait::pixelSize);
254
255 if (swap) {
256 std::swap(dst[0], dst[2]);
257 }
258
259 ptr += CSTrait::pixelSize;
260
261 it->nextPixel();
262 }
263
264 it->nextRow();
265 }
266
267 return res;
268}

References KisBaseConstIteratorNG::nextPixel(), KisHLineConstIteratorNG::nextRow(), and KisBaseConstAccessor::rawDataConst().

◆ writeLayerSimplify()

template<typename CSTrait , bool swap, bool convertToRec2020, bool isLinear, ConversionPolicy linearizePolicy, typename DestTrait , bool removeOOTF, typename... Args>
ALWAYS_INLINE auto HDR::writeLayerSimplify ( Args &&... args)

Definition at line 278 of file kis_jpegxl_export_tools.h.

279{
280 if (linearizePolicy != ConversionPolicy::KeepTheSame) {
281 return writeLayer<CSTrait, swap, convertToRec2020, isLinear, linearizePolicy, DestTrait, removeOOTF>(
282 std::forward<Args>(args)...);
283 } else {
284 return writeLayerNoConversion<CSTrait, swap>(std::forward<Args>(args)...);
285 }
286}

References KeepTheSame.

◆ writeLayerWithLinear()

template<typename CSTrait , bool swap, bool convertToRec2020, bool isLinear, typename... Args>
ALWAYS_INLINE auto HDR::writeLayerWithLinear ( ConversionPolicy linearizePolicy,
Args &&... args )

Definition at line 307 of file kis_jpegxl_export_tools.h.

308{
309 if (linearizePolicy == ConversionPolicy::ApplyHLG) {
310 return writeLayerWithPolicy<CSTrait,
311 swap,
312 convertToRec2020,
313 isLinear,
315 KoBgrU16Traits>(std::forward<Args>(args)...);
316 } else if (linearizePolicy == ConversionPolicy::ApplyPQ) {
317 return writeLayerWithPolicy<CSTrait,
318 swap,
319 convertToRec2020,
320 isLinear,
322 KoBgrU16Traits>(std::forward<Args>(args)...);
323 } else if (linearizePolicy == ConversionPolicy::ApplySMPTE428) {
324 return writeLayerWithPolicy<CSTrait,
325 swap,
326 convertToRec2020,
327 isLinear,
329 KoBgrU16Traits>(std::forward<Args>(args)...);
330 } else {
331 return writeLayerWithPolicy<CSTrait, swap, convertToRec2020, isLinear, ConversionPolicy::KeepTheSame, CSTrait>(
332 std::forward<Args>(args)...);
333 }
334}
ALWAYS_INLINE auto writeLayerWithPolicy(bool removeOOTF, Args &&...args)
PROPAGATE_CONST_CONSTEXPR void swap(propagate_const< T > &pt, propagate_const< T > &pu) noexcept(noexcept(swap(declval< T & >(), declval< T & >())))

References ApplyHLG, ApplyPQ, ApplySMPTE428, and writeLayerWithPolicy().

◆ writeLayerWithPolicy()

template<typename CSTrait , bool swap, bool convertToRec2020, bool isLinear, ConversionPolicy linearizePolicy, typename DestTrait , typename... Args>
ALWAYS_INLINE auto HDR::writeLayerWithPolicy ( bool removeOOTF,
Args &&... args )

Definition at line 295 of file kis_jpegxl_export_tools.h.

296{
297 if (removeOOTF) {
298 return writeLayerSimplify<CSTrait, swap, convertToRec2020, isLinear, linearizePolicy, DestTrait, true>(
299 std::forward<Args>(args)...);
300 } else {
301 return writeLayerSimplify<CSTrait, swap, convertToRec2020, isLinear, linearizePolicy, DestTrait, false>(
302 std::forward<Args>(args)...);
303 }
304}

◆ writeLayerWithRec2020()

template<typename CSTrait , bool swap, bool convertToRec2020, typename... Args>
ALWAYS_INLINE auto HDR::writeLayerWithRec2020 ( bool isLinear,
Args &&... args )

Definition at line 337 of file kis_jpegxl_export_tools.h.

338{
339 if (isLinear) {
340 return writeLayerWithLinear<CSTrait, swap, convertToRec2020, true>(std::forward<Args>(args)...);
341 } else {
342 return writeLayerWithLinear<CSTrait, swap, convertToRec2020, false>(std::forward<Args>(args)...);
343 }
344}

◆ writeLayerWithSwap()

template<typename CSTrait , bool swap, typename... Args>
ALWAYS_INLINE auto HDR::writeLayerWithSwap ( bool convertToRec2020,
Args &&... args )

Definition at line 347 of file kis_jpegxl_export_tools.h.

348{
349 if (convertToRec2020) {
350 return writeLayerWithRec2020<CSTrait, swap, true>(std::forward<Args>(args)...);
351 } else {
352 return writeLayerWithRec2020<CSTrait, swap, false>(std::forward<Args>(args)...);
353 }
354}