23#include <kgenericfactory.h>
24#include <KoDocument.h>
25#include <KoFilterChain.h>
28#include <ImfRgbaFile.h>
37#include "kis_openexr_import.h"
40#include "kis_meta_registry.h"
42#include "kis_paint_layer.h"
43#include "kis_annotation.h"
44#include "kis_colorspace_factory_registry.h"
45#include "kis_iterators_pixel.h"
46#include "kis_abstract_colorspace.h"
47#include "kis_rgb_f32_colorspace.h"
48#include "kis_rgb_f16half_colorspace.h"
54typedef KGenericFactory<KisOpenEXRImport, KoFilter> KisOpenEXRImportFactory;
55K_EXPORT_COMPONENT_FACTORY(libchalk_openexr_import, KisOpenEXRImportFactory(
"kofficefilters"))
57KisOpenEXRImport::KisOpenEXRImport(KoFilter *, const
char *, const TQStringList&) : KoFilter()
61KisOpenEXRImport::~KisOpenEXRImport()
65KoFilter::ConversionStatus KisOpenEXRImport::convert(
const TQCString& from,
const TQCString& to)
67 if (from !=
"image/x-exr" || to !=
"application/x-chalk") {
68 return KoFilter::NotImplemented;
71 kdDebug(41008) <<
"\n\n\nChalk importing from OpenEXR\n";
73 KisDoc * doc =
dynamic_cast<KisDoc*
>(m_chain -> outputDocument());
75 return KoFilter::CreationError;
78 doc -> prepareForImport();
80 TQString filename = m_chain -> inputFile();
82 if (filename.isEmpty()) {
83 return KoFilter::FileNotFound;
86 RgbaInputFile file(TQFile::encodeName(filename));
87 Box2i dataWindow = file.dataWindow();
88 Box2i displayWindow = file.displayWindow();
90 kdDebug(41008) <<
"Data window: " << TQRect(dataWindow.min.x, dataWindow.min.y, dataWindow.max.x - dataWindow.min.x + 1, dataWindow.max.y - dataWindow.min.y + 1) << endl;
91 kdDebug(41008) <<
"Display window: " << TQRect(displayWindow.min.x, displayWindow.min.y, displayWindow.max.x - displayWindow.min.x + 1, displayWindow.max.y - displayWindow.min.y + 1) << endl;
93 int imageWidth = displayWindow.max.x - displayWindow.min.x + 1;
94 int imageHeight = displayWindow.max.y - displayWindow.min.y + 1;
96 TQString imageName =
"Imported from OpenEXR";
98 int dataWidth = dataWindow.max.x - dataWindow.min.x + 1;
99 int dataHeight = dataWindow.max.y - dataWindow.min.y + 1;
101 KisRgbF16HalfColorSpace *cs =
static_cast<KisRgbF16HalfColorSpace *
>((KisMetaRegistry::instance()->csRegistry()->getColorSpace(KisID(
"RGBAF16HALF",
""),
"")));
104 return KoFilter::InternalError;
107 doc -> undoAdapter() -> setUndo(
false);
109 KisImageSP image =
new KisImage(doc->undoAdapter(), imageWidth, imageHeight, cs, imageName);
112 return KoFilter::CreationError;
115 KisPaintLayerSP layer =
dynamic_cast<KisPaintLayer*
>(image->newLayer(image -> nextLayerName(), OPACITY_OPAQUE).data());
118 return KoFilter::CreationError;
121 TQMemArray<Rgba> pixels(dataWidth);
123 for (
int y = 0; y < dataHeight; ++y) {
125 file.setFrameBuffer(pixels.data() - dataWindow.min.x - (dataWindow.min.y + y) * dataWidth, 1, dataWidth);
126 file.readPixels(dataWindow.min.y + y);
128 KisHLineIterator it = layer->paintDevice()->createHLineIterator(dataWindow.min.x, dataWindow.min.y + y, dataWidth,
true);
129 Rgba *rgba = pixels.data();
131 while (!it.isDone()) {
135 half unmultipliedRed = rgba -> r;
136 half unmultipliedGreen = rgba -> g;
137 half unmultipliedBlue = rgba -> b;
139 if (rgba -> a >= HALF_EPSILON) {
140 unmultipliedRed /= rgba -> a;
141 unmultipliedGreen /= rgba -> a;
142 unmultipliedBlue /= rgba -> a;
145 cs -> setPixel(it.rawData(), unmultipliedRed, unmultipliedGreen, unmultipliedBlue, rgba -> a);
152 doc -> setCurrentImage(image);
153 doc -> undoAdapter() -> setUndo(
true);
154 doc -> setModified(
false);
159#include "kis_openexr_import.moc"