Krita Source Code Documentation
Loading...
Searching...
No Matches
exr_converter.cc File Reference
#include "exr_converter.h"
#include <half.h>
#include <ImfAttribute.h>
#include <ImfChannelList.h>
#include <ImfFrameBuffer.h>
#include <ImfHeader.h>
#include <ImfInputFile.h>
#include <ImfOutputFile.h>
#include <ImfStringAttribute.h>
#include "exr_extra_tags.h"
#include <QApplication>
#include <QMessageBox>
#include <QDomDocument>
#include <QThread>
#include <KoColorSpaceRegistry.h>
#include <KoCompositeOpRegistry.h>
#include <KoColorSpaceTraits.h>
#include <KoColorModelStandardIds.h>
#include <KoColor.h>
#include <KoColorProfile.h>
#include <KisDocument.h>
#include <kis_group_layer.h>
#include <kis_image.h>
#include <kis_paint_device.h>
#include <kis_paint_layer.h>
#include <kis_transaction.h>
#include "kis_iterator_ng.h"
#include <kis_exr_layers_sorter.h>
#include <kis_meta_data_entry.h>
#include <kis_meta_data_schema.h>
#include <kis_meta_data_schema_registry.h>
#include <kis_meta_data_store.h>
#include <kis_meta_data_value.h>
#include "kis_kra_savexml_visitor.h"
#include <KisImportExportAdditionalChecks.h>
#include <KisPortingUtils.h>

Go to the source code of this file.

Classes

class  Encoder
 
class  EncoderImpl< _T_, size, alphaPos >
 
struct  ExrGroupLayerInfo
 
struct  ExrLayerInfoBase
 
struct  ExrPaintLayerInfo
 
struct  ExrPaintLayerSaveInfo
 
struct  ExrPixel_< _T_, size >
 
struct  GrayPixelWrapper< T >
 
struct  EXRConverter::Private
 
struct  ExrPaintLayerInfo::Remap
 
struct  Rgba< _T_ >
 
struct  RgbPixelWrapper< T >
 

Macros

#define HDR_LAYER   "HDR Layer"
 

Enumerations

enum  ImageType { IT_UNKNOWN , IT_FLOAT16 , IT_FLOAT32 , IT_UNSUPPORTED }
 

Functions

template<typename T >
static T alphaEpsilon ()
 
template<typename T >
static T alphaNoiseThreshold ()
 
void encodeData (Imf::OutputFile &file, const QList< ExrPaintLayerSaveInfo > &informationObjects, int width, int height)
 
Encoderencoder (Imf::OutputFile &file, const ExrPaintLayerSaveInfo &info, int width)
 
ImageType imfTypeToKisType (Imf::PixelType type)
 
const KoColorSpacekisTypeToColorSpace (QString colorModelID, ImageType imageType)
 
template<typename T , typename Pixel , int size, int alphaPos>
void multiplyAlpha (Pixel *pixel)
 
static bool qFuzzyCompare (half p1, half p2)
 
static bool qFuzzyIsNull (half h)
 
bool recCheckGroup (const ExrGroupLayerInfo &group, QStringList list, int idx1, int idx2)
 
QString remap (const QMap< QString, QString > &current2original, const QString &current)
 
ExrGroupLayerInfosearchGroup (QList< ExrGroupLayerInfo > *groups, QStringList list, int idx1, int idx2)
 
KisPaintDeviceSP wrapLayerDevice (KisPaintDeviceSP device)
 

Macro Definition Documentation

◆ HDR_LAYER

#define HDR_LAYER   "HDR Layer"

Definition at line 56 of file exr_converter.cc.

Enumeration Type Documentation

◆ ImageType

enum ImageType
Enumerator
IT_UNKNOWN 
IT_FLOAT16 
IT_FLOAT32 
IT_UNSUPPORTED 

Definition at line 81 of file exr_converter.cc.

81 {
86};
@ IT_FLOAT32
@ IT_UNKNOWN
@ IT_FLOAT16
@ IT_UNSUPPORTED

Function Documentation

◆ alphaEpsilon()

template<typename T >
static T alphaEpsilon ( )
inlinestatic

Definition at line 222 of file exr_converter.cc.

223{
224 return static_cast<T>(HALF_EPSILON);
225}

◆ alphaNoiseThreshold()

template<typename T >
static T alphaNoiseThreshold ( )
inlinestatic

Definition at line 228 of file exr_converter.cc.

229{
230 return static_cast<T>(0.01); // 1%
231}

◆ encodeData()

void encodeData ( Imf::OutputFile & file,
const QList< ExrPaintLayerSaveInfo > & informationObjects,
int width,
int height )

Definition at line 1075 of file exr_converter.cc.

1076{
1077 QList<Encoder*> encoders;
1078 Q_FOREACH (const ExrPaintLayerSaveInfo& info, informationObjects) {
1079 encoders.push_back(encoder(file, info, width));
1080 }
1081
1082 for (int y = 0; y < height; ++y) {
1083 Imf::FrameBuffer frameBuffer;
1084 Q_FOREACH (Encoder* encoder, encoders) {
1085 encoder->prepareFrameBuffer(&frameBuffer, y);
1086 }
1087 file.setFrameBuffer(frameBuffer);
1088 Q_FOREACH (Encoder* encoder, encoders) {
1089 encoder->encodeData(y);
1090 }
1091 file.writePixels(1);
1092 }
1093 qDeleteAll(encoders);
1094}
virtual void encodeData(int line)=0
virtual void prepareFrameBuffer(Imf::FrameBuffer *, int line)=0
Encoder * encoder(Imf::OutputFile &file, const ExrPaintLayerSaveInfo &info, int width)

References Encoder::encodeData(), encoder(), and Encoder::prepareFrameBuffer().

◆ encoder()

Encoder * encoder ( Imf::OutputFile & file,
const ExrPaintLayerSaveInfo & info,
int width )

Definition at line 1035 of file exr_converter.cc.

1036{
1037 dbgFile << "Create encoder for" << info.name << info.channels << info.layerDevice->colorSpace()->channelCount();
1038 switch (info.layerDevice->colorSpace()->channelCount()) {
1039 case 1: {
1041 Q_ASSERT(info.pixelType == Imf::HALF);
1042 return new EncoderImpl < half, 1, -1 > (&file, &info, width);
1044 Q_ASSERT(info.pixelType == Imf::FLOAT);
1045 return new EncoderImpl < float, 1, -1 > (&file, &info, width);
1046 }
1047 break;
1048 }
1049 case 2: {
1051 Q_ASSERT(info.pixelType == Imf::HALF);
1052 return new EncoderImpl<half, 2, 1>(&file, &info, width);
1054 Q_ASSERT(info.pixelType == Imf::FLOAT);
1055 return new EncoderImpl<float, 2, 1>(&file, &info, width);
1056 }
1057 break;
1058 }
1059 case 4: {
1061 Q_ASSERT(info.pixelType == Imf::HALF);
1062 return new EncoderImpl<half, 4, 3>(&file, &info, width);
1064 Q_ASSERT(info.pixelType == Imf::FLOAT);
1065 return new EncoderImpl<float, 4, 3>(&file, &info, width);
1066 }
1067 break;
1068 }
1069 default:
1070 qFatal("Impossible error");
1071 }
1072 return 0;
1073}
const KoID Float32BitsColorDepthID("F32", ki18n("32-bit float/channel"))
const KoID Float16BitsColorDepthID("F16", ki18n("16-bit float/channel"))
const KoColorSpace * colorSpace() const
virtual quint32 channelCount() const =0
virtual KoID colorDepthId() const =0
#define dbgFile
Definition kis_debug.h:53
QList< QString > channels
QString name
name of the layer with a "." at the end (ie "group1.group2.layer1.")
KisPaintDeviceSP layerDevice
Imf::PixelType pixelType

References KoColorSpace::channelCount(), ExrPaintLayerSaveInfo::channels, KoColorSpace::colorDepthId(), KisPaintDevice::colorSpace(), dbgFile, Float16BitsColorDepthID, Float32BitsColorDepthID, ExrPaintLayerSaveInfo::layerDevice, ExrPaintLayerSaveInfo::name, and ExrPaintLayerSaveInfo::pixelType.

◆ imfTypeToKisType()

ImageType imfTypeToKisType ( Imf::PixelType type)

Definition at line 174 of file exr_converter.cc.

175{
176 switch (type) {
177 case Imf::UINT:
178 case Imf::NUM_PIXELTYPES:
179 return IT_UNSUPPORTED;
180 case Imf::HALF:
181 return IT_FLOAT16;
182 case Imf::FLOAT:
183 return IT_FLOAT32;
184 default:
185 qFatal("Out of bound enum");
186 return IT_UNKNOWN;
187 }
188}

References IT_FLOAT16, IT_FLOAT32, IT_UNKNOWN, and IT_UNSUPPORTED.

◆ kisTypeToColorSpace()

const KoColorSpace * kisTypeToColorSpace ( QString colorModelID,
ImageType imageType )

Our user settings are only for the RGB color model, for other models just use the default one provided by the color space.

Definition at line 190 of file exr_converter.cc.

191{
192
193 QString colorDepthID = "UNKNOWN";
194 switch(imageType) {
195 case IT_FLOAT16:
196 colorDepthID = Float16BitsColorDepthID.id();
197 break;
198 case IT_FLOAT32:
199 colorDepthID = Float32BitsColorDepthID.id();
200 break;
201 default:
202 return 0;
203 };
204
205 const QString colorSpaceId = KoColorSpaceRegistry::instance()->colorSpaceId(colorModelID, colorDepthID);
206 const QString defaultProfileForColorSpace = KoColorSpaceRegistry::instance()->defaultProfileForColorSpace(colorSpaceId);
207
212 const QString profileName =
213 colorModelID == RGBAColorModelID.id() ?
214 KisConfig(false).readEntry("ExrDefaultColorProfile", defaultProfileForColorSpace) :
215 defaultProfileForColorSpace;
216
217 return KoColorSpaceRegistry::instance()->colorSpace(colorModelID, colorDepthID, profileName);
218
219}
const KoID RGBAColorModelID("RGBA", ki18n("RGB/Alpha"))
T readEntry(const QString &name, const T &defaultValue=T())
Definition kis_config.h:789
QString id() const
Definition KoID.cpp:63
QString colorSpaceId(const QString &colorModelId, const QString &colorDepthId) const
const KoColorSpace * colorSpace(const QString &colorModelId, const QString &colorDepthId, const KoColorProfile *profile)
static KoColorSpaceRegistry * instance()
QString defaultProfileForColorSpace(const QString &colorSpaceId) const

References KoColorSpaceRegistry::colorSpace(), KoColorSpaceRegistry::colorSpaceId(), KoColorSpaceRegistry::defaultProfileForColorSpace(), Float16BitsColorDepthID, Float32BitsColorDepthID, KoID::id(), KoColorSpaceRegistry::instance(), IT_FLOAT16, IT_FLOAT32, KisConfig::readEntry(), and RGBAColorModelID.

◆ multiplyAlpha()

template<typename T , typename Pixel , int size, int alphaPos>
void multiplyAlpha ( Pixel * pixel)

Definition at line 356 of file exr_converter.cc.

357{
358 if (alphaPos >= 0) {
359 T alpha = pixel->data[alphaPos];
360
361 if (alpha > alphaEpsilon<T>()) {
362 for (int i = 0; i < size; ++i) {
363 if (i != alphaPos) {
364 pixel->data[i] *= alpha;
365 }
366 }
367
368 pixel->data[alphaPos] = alpha;
369 } else {
370 for (int i = 0; i < size; ++i) {
371 pixel->data[i] = 0;
372 }
373 }
374 }
375}
int size(const Forest< T > &forest)
Definition KisForest.h:1232

◆ qFuzzyCompare()

static bool qFuzzyCompare ( half p1,
half p2 )
inlinestatic

Definition at line 233 of file exr_converter.cc.

234{
235 return std::abs(p1 - p2) < float(HALF_EPSILON);
236}
QPointF p2
QPointF p1

References p1, and p2.

◆ qFuzzyIsNull()

static bool qFuzzyIsNull ( half h)
inlinestatic

Definition at line 238 of file exr_converter.cc.

239{
240 return std::abs(h) < float(HALF_EPSILON);
241}

◆ recCheckGroup()

bool recCheckGroup ( const ExrGroupLayerInfo & group,
QStringList list,
int idx1,
int idx2 )

Definition at line 485 of file exr_converter.cc.

486{
487 if (idx1 > idx2) return true;
488 if (group.name == list[idx2]) {
489 return recCheckGroup(*group.parent, list, idx1, idx2 - 1);
490 }
491 return false;
492}
bool recCheckGroup(const ExrGroupLayerInfo &group, QStringList list, int idx1, int idx2)
const ExrGroupLayerInfo * parent

References ExrLayerInfoBase::name, ExrLayerInfoBase::parent, and recCheckGroup().

◆ remap()

QString remap ( const QMap< QString, QString > & current2original,
const QString & current )

Definition at line 1204 of file exr_converter.cc.

1205{
1206 if (current2original.contains(current)) {
1207 return current2original[current];
1208 }
1209 return current;
1210}

◆ searchGroup()

ExrGroupLayerInfo * searchGroup ( QList< ExrGroupLayerInfo > * groups,
QStringList list,
int idx1,
int idx2 )

Definition at line 494 of file exr_converter.cc.

495{
496 if (idx1 > idx2) {
497 return 0;
498 }
499 // Look for the group
500 for (int i = 0; i < groups->size(); ++i) {
501 if (recCheckGroup(groups->at(i), list, idx1, idx2)) {
502 return &(*groups)[i];
503 }
504 }
505 // Create the group
507 info.name = list.at(idx2);
508 info.parent = searchGroup(groups, list, idx1, idx2 - 1);
509 groups->append(info);
510 return &groups->last();
511}
ExrGroupLayerInfo * searchGroup(QList< ExrGroupLayerInfo > *groups, QStringList list, int idx1, int idx2)

References ExrLayerInfoBase::name, ExrLayerInfoBase::parent, recCheckGroup(), and searchGroup().

◆ wrapLayerDevice()

KisPaintDeviceSP wrapLayerDevice ( KisPaintDeviceSP device)

We should try to keep the same profile of the space when possible (i.e. when the color model is kept the same)

Definition at line 1096 of file exr_converter.cc.

1097{
1098 const KoColorSpace *cs = device->colorSpace();
1099
1105 const KoColorProfile *targetBestEffortProfile = nullptr;
1106 if (cs->colorModelId() == GrayAColorModelID ||
1107 cs->colorModelId() == RGBAColorModelID) {
1108 targetBestEffortProfile = cs->profile();
1109 }
1110
1115 targetBestEffortProfile);
1116 } else if (cs->colorModelId() != GrayAColorModelID &&
1117 cs->colorModelId() != RGBAColorModelID) {
1120 cs->colorDepthId().id());
1121 }
1122
1123 if (*cs != *device->colorSpace()) {
1124 device = new KisPaintDevice(*device);
1125 device->convertTo(cs);
1126 }
1127
1128 return device;
1129}
const KoID GrayAColorModelID("GRAYA", ki18n("Grayscale/Alpha"))
void convertTo(const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags(), KUndo2Command *parentCommand=nullptr, KoUpdater *progressUpdater=nullptr)
virtual KoID colorModelId() const =0
virtual const KoColorProfile * profile() const =0

References KoColorSpace::colorDepthId(), KoColorSpace::colorModelId(), KisPaintDevice::colorSpace(), KoColorSpaceRegistry::colorSpace(), KisPaintDevice::convertTo(), Float16BitsColorDepthID, Float32BitsColorDepthID, GrayAColorModelID, KoID::id(), KoColorSpaceRegistry::instance(), KoColorSpace::profile(), and RGBAColorModelID.