Krita Source Code Documentation
Loading...
Searching...
No Matches
JPEGXLImport.cpp File Reference
#include "JPEGXLImport.h"
#include <KoColorProfileQuery.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 223 of file JPEGXLImport.cpp.

224{
225 switch (d.m_pixelFormat.data_type) {
226 case JXL_TYPE_FLOAT:
227 return generateCallbackWithType<float>(d);
228 case JXL_TYPE_UINT8:
229 return generateCallbackWithType<uint8_t>(d);
230 case JXL_TYPE_UINT16:
231 return generateCallbackWithType<uint16_t>(d);
232#ifdef HAVE_OPENEXR
233 case JXL_TYPE_FLOAT16:
234 return generateCallbackWithType<half>(d);
235 break;
236#endif
237 default:
238 KIS_ASSERT_X(false, "JPEGXL::generateCallback", "Unknown image format!");
239 }
240}
#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 182 of file JPEGXLImport.cpp.

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

◆ generateCallbackWithSwap()

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

Definition at line 192 of file JPEGXLImport.cpp.

193{
194 switch (d.linearizePolicy) {
196 generateCallbackWithPolicy<channelsType, swap, LinearizePolicy::LinearFromPQ>(d);
197 break;
199 generateCallbackWithPolicy<channelsType, swap, LinearizePolicy::LinearFromHLG>(d);
200 break;
202 generateCallbackWithPolicy<channelsType, swap, LinearizePolicy::LinearFromSMPTE428>(d);
203 break;
205 default:
206 generateCallbackWithPolicy<channelsType, swap, LinearizePolicy::KeepTheSame>(d);
207 break;
208 };
209}

References KeepTheSame, LinearFromHLG, LinearFromPQ, and LinearFromSMPTE428.

◆ generateCallbackWithType()

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

Definition at line 212 of file JPEGXLImport.cpp.

213{
214 if (d.m_colorID == RGBAColorModelID
215 && (d.m_depthID == Integer8BitsColorDepthID || d.m_depthID == Integer16BitsColorDepthID)
216 && d.linearizePolicy == LinearizePolicy::KeepTheSame) {
217 generateCallbackWithSwap<channelsType, true>(d);
218 } else {
219 generateCallbackWithSwap<channelsType, false>(d);
220 }
221}
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 110 of file JPEGXLImport.cpp.

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

82{
83 if (policy == LinearizePolicy::LinearFromPQ) {
85 } else if (policy == LinearizePolicy::LinearFromHLG) {
86 return removeHLGCurve(value);
87 } else if (policy == LinearizePolicy::LinearFromSMPTE428) {
89 }
90 return value;
91}
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 94 of file JPEGXLImport.cpp.

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

References v.

Variable Documentation

◆ exifTag

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

Definition at line 47 of file JPEGXLImport.cpp.

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

◆ xmpTag

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

Definition at line 48 of file JPEGXLImport.cpp.

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