Krita Source Code Documentation
Loading...
Searching...
No Matches
JPEGXLImport.cpp File Reference
#include "JPEGXLImport.h"
#include <KisGlobalResourcesInterface.h>
#include <jxl/decode_cxx.h>
#include <jxl/resizable_parallel_runner_cxx.h>
#include <jxl/types.h>
#include <kpluginfactory.h>
#include <QBuffer>
#include <algorithm>
#include <array>
#include <cstring>
#include <map>
#include <KisDocument.h>
#include <KisImportExportErrorCode.h>
#include <KoColorModelStandardIds.h>
#include <KoColorProfile.h>
#include <KoColorSpaceRegistry.h>
#include <KoColorTransferFunctions.h>
#include <KoConfig.h>
#include <dialogs/kis_dlg_hlg_import.h>
#include <filter/kis_filter.h>
#include <filter/kis_filter_configuration.h>
#include <filter/kis_filter_registry.h>
#include <kis_assert.h>
#include <kis_debug.h>
#include <kis_group_layer.h>
#include <kis_image_animation_interface.h>
#include <kis_iterator_ng.h>
#include <kis_meta_data_backend_registry.h>
#include <kis_paint_layer.h>
#include <kis_raster_keyframe_channel.h>
#include <JPEGXLImport.moc>

Go to the source code of this file.

Classes

class  JPEGXLImportData
 

Functions

void generateCallback (JPEGXLImportData &d)
 
template<typename channelsType , bool swap, LinearizePolicy policy>
void generateCallbackWithPolicy (JPEGXLImportData &d)
 
template<typename channelsType , bool swap>
void generateCallbackWithSwap (JPEGXLImportData &d)
 
template<typename channelsType >
void generateCallbackWithType (JPEGXLImportData &d)
 
template<typename channelsType , bool swap, LinearizePolicy policy, bool applyOOTF>
void imageOutCallback (JPEGXLImportData &d)
 
template<LinearizePolicy policy>
float linearizeValueAsNeeded (float value)
 
template<LinearizePolicy policy, typename T , typename std::enable_if_t< std::numeric_limits< T >::is_integer, int > = 1>
float value (const T *src, size_t ch)
 

Variables

static constexpr std::array< char, 4 > exifTag = {'e', 'x', 'i', 'f'}
 
static constexpr std::array< char, 4 > xmpTag = {'x', 'm', 'l', ' '}
 

Function Documentation

◆ generateCallback()

void generateCallback ( JPEGXLImportData & d)
inline

Definition at line 222 of file JPEGXLImport.cpp.

223{
224 switch (d.m_pixelFormat.data_type) {
225 case JXL_TYPE_FLOAT:
226 return generateCallbackWithType<float>(d);
227 case JXL_TYPE_UINT8:
228 return generateCallbackWithType<uint8_t>(d);
229 case JXL_TYPE_UINT16:
230 return generateCallbackWithType<uint16_t>(d);
231#ifdef HAVE_OPENEXR
232 case JXL_TYPE_FLOAT16:
233 return generateCallbackWithType<half>(d);
234 break;
235#endif
236 default:
237 KIS_ASSERT_X(false, "JPEGXL::generateCallback", "Unknown image format!");
238 }
239}
#define KIS_ASSERT_X(cond, where, what)
Definition kis_assert.h:40

References KIS_ASSERT_X.

◆ generateCallbackWithPolicy()

template<typename channelsType , bool swap, LinearizePolicy policy>
void generateCallbackWithPolicy ( JPEGXLImportData & d)
inline

Definition at line 181 of file JPEGXLImport.cpp.

182{
183 if (d.applyOOTF) {
184 imageOutCallback<channelsType, swap, policy, true>(d);
185 } else {
186 imageOutCallback<channelsType, swap, policy, false>(d);
187 }
188}

◆ generateCallbackWithSwap()

template<typename channelsType , bool swap>
void generateCallbackWithSwap ( JPEGXLImportData & d)
inline

Definition at line 191 of file JPEGXLImport.cpp.

192{
193 switch (d.linearizePolicy) {
195 generateCallbackWithPolicy<channelsType, swap, LinearizePolicy::LinearFromPQ>(d);
196 break;
198 generateCallbackWithPolicy<channelsType, swap, LinearizePolicy::LinearFromHLG>(d);
199 break;
201 generateCallbackWithPolicy<channelsType, swap, LinearizePolicy::LinearFromSMPTE428>(d);
202 break;
204 default:
205 generateCallbackWithPolicy<channelsType, swap, LinearizePolicy::KeepTheSame>(d);
206 break;
207 };
208}

References KeepTheSame, LinearFromHLG, LinearFromPQ, and LinearFromSMPTE428.

◆ generateCallbackWithType()

template<typename channelsType >
void generateCallbackWithType ( JPEGXLImportData & d)
inline

Definition at line 211 of file JPEGXLImport.cpp.

212{
213 if (d.m_colorID == RGBAColorModelID
214 && (d.m_depthID == Integer8BitsColorDepthID || d.m_depthID == Integer16BitsColorDepthID)
215 && d.linearizePolicy == LinearizePolicy::KeepTheSame) {
216 generateCallbackWithSwap<channelsType, true>(d);
217 } else {
218 generateCallbackWithSwap<channelsType, false>(d);
219 }
220}
const KoID Integer8BitsColorDepthID("U8", ki18n("8-bit integer/channel"))
const KoID Integer16BitsColorDepthID("U16", ki18n("16-bit integer/channel"))
const KoID RGBAColorModelID("RGBA", ki18n("RGB/Alpha"))

References Integer16BitsColorDepthID, Integer8BitsColorDepthID, KeepTheSame, and RGBAColorModelID.

◆ imageOutCallback()

template<typename channelsType , bool swap, LinearizePolicy policy, bool applyOOTF>
void imageOutCallback ( JPEGXLImportData & d)
inline

Definition at line 109 of file JPEGXLImport.cpp.

110{
111 const uint32_t xPos = d.m_header.layer_info.crop_x0;
112 const uint32_t yPos = d.m_header.layer_info.crop_y0;
113 const uint32_t width = d.m_header.layer_info.xsize;
114 const uint32_t height = d.m_header.layer_info.ysize;
115 KisHLineIteratorSP it = d.m_currentFrame->createHLineIteratorNG(xPos, yPos, width);
116
117 const auto *src = reinterpret_cast<const channelsType *>(d.m_rawData.data());
118 const uint32_t channels = d.m_pixelFormat.num_channels;
119
120 if (policy != LinearizePolicy::KeepTheSame) {
121 const KoColorSpace *cs = d.cs;
122 const double *lCoef = d.lCoef.constData();
123 QVector<float> pixelValues(static_cast<int>(cs->channelCount()));
124 float *tmp = pixelValues.data();
125 const quint32 alphaPos = cs->alphaPos();
126
127 for (size_t j = 0; j < height; j++) {
128 for (size_t i = 0; i < width; i++) {
129 for (size_t i = 0; i < channels; i++) {
130 tmp[i] = 1.0;
131 }
132
133 for (size_t ch = 0; ch < channels; ch++) {
134 if (ch == alphaPos) {
135 tmp[ch] = value<LinearizePolicy::KeepTheSame, channelsType>(src, ch);
136 } else {
137 tmp[ch] = value<policy, channelsType>(src, ch);
138 }
139 }
140
141 if (swap) {
142 std::swap(tmp[0], tmp[2]);
143 }
144
145 if (policy == LinearizePolicy::LinearFromHLG && applyOOTF) {
146 applyHLGOOTF(tmp, lCoef, d.displayGamma, d.displayNits);
147 }
148
149 cs->fromNormalisedChannelsValue(it->rawData(), pixelValues);
150
151 src += d.m_pixelFormat.num_channels;
152
153 it->nextPixel();
154 }
155 it->nextRow();
156 }
157 } else {
158 for (size_t j = 0; j < height; j++) {
159 for (size_t i = 0; i < width; i++) {
160 auto *dst = reinterpret_cast<channelsType *>(it->rawData());
161
162 std::memcpy(dst, src, channels * sizeof(channelsType));
163
164 if (swap) {
165 std::swap(dst[0], dst[2]);
166 } else if (d.isCMYK && d.m_info.uses_original_profile) {
167 // Swap alpha and key channel for CMYK
168 std::swap(dst[3], dst[4]);
169 }
170
171 src += d.m_pixelFormat.num_channels;
172
173 it->nextPixel();
174 }
175 it->nextRow();
176 }
177 }
178}
ALWAYS_INLINE void applyHLGOOTF(float *rgb, const double *lumaCoefficients, float gamma=1.2f, float nominalPeak=1000.0f) noexcept
virtual quint32 alphaPos() const =0
virtual quint32 channelCount() const =0
virtual void fromNormalisedChannelsValue(quint8 *pixel, const QVector< float > &values) const =0

References KoColorSpace::alphaPos(), applyHLGOOTF(), KoColorSpace::channelCount(), KoColorSpace::fromNormalisedChannelsValue(), KeepTheSame, and LinearFromHLG.

◆ linearizeValueAsNeeded()

template<LinearizePolicy policy>
float linearizeValueAsNeeded ( float value)
inline

Definition at line 80 of file JPEGXLImport.cpp.

81{
82 if (policy == LinearizePolicy::LinearFromPQ) {
84 } else if (policy == LinearizePolicy::LinearFromHLG) {
85 return removeHLGCurve(value);
86 } else if (policy == LinearizePolicy::LinearFromSMPTE428) {
88 }
89 return value;
90}
float value(const T *src, size_t ch)
ALWAYS_INLINE float removeHLGCurve(float x) noexcept
ALWAYS_INLINE float removeSMPTE_ST_428Curve(float x) noexcept
ALWAYS_INLINE float removeSmpte2048Curve(float x) noexcept

References LinearFromHLG, LinearFromPQ, LinearFromSMPTE428, removeHLGCurve(), removeSmpte2048Curve(), removeSMPTE_ST_428Curve(), and value().

◆ value()

template<LinearizePolicy policy, typename T , typename std::enable_if_t< std::numeric_limits< T >::is_integer, int > = 1>
float value ( const T * src,
size_t ch )
inline

Definition at line 93 of file JPEGXLImport.cpp.

94{
95 float v = float(src[ch]) / float(std::numeric_limits<T>::max());
96
97 return linearizeValueAsNeeded<policy>(v);
98}
qreal v

References v.

Variable Documentation

◆ exifTag

constexpr std::array<char, 4> exifTag = {'e', 'x', 'i', 'f'}
staticconstexpr

Definition at line 46 of file JPEGXLImport.cpp.

46{'e', 'x', 'i', 'f'};

◆ xmpTag

constexpr std::array<char, 4> xmpTag = {'x', 'm', 'l', ' '}
staticconstexpr

Definition at line 47 of file JPEGXLImport.cpp.

47{'x', 'm', 'l', ' '};