22#include <tdemessagebox.h>
25#include <ImfRgbaFile.h>
27#include <kgenericfactory.h>
28#include <KoDocument.h>
29#include <KoFilterChain.h>
34#include "kis_paint_layer.h"
35#include "kis_annotation.h"
37#include "kis_iterators_pixel.h"
38#include "kis_abstract_colorspace.h"
39#include "kis_paint_device.h"
40#include "kis_rgb_f32_colorspace.h"
41#include "kis_rgb_f16half_colorspace.h"
43#include "kis_openexr_export.h"
49typedef KGenericFactory<KisOpenEXRExport, KoFilter> KisOpenEXRExportFactory;
50K_EXPORT_COMPONENT_FACTORY(libchalk_openexr_export, KisOpenEXRExportFactory(
"kofficefilters"))
52KisOpenEXRExport::KisOpenEXRExport(KoFilter *, const
char *, const TQStringList&) : KoFilter()
56KisOpenEXRExport::~KisOpenEXRExport()
60KoFilter::ConversionStatus KisOpenEXRExport::convert(
const TQCString& from,
const TQCString& to)
62 if (to !=
"image/x-exr" || from !=
"application/x-chalk") {
63 return KoFilter::NotImplemented;
66 kdDebug(41008) <<
"Chalk exporting to OpenEXR\n";
70 KisDoc *doc =
dynamic_cast<KisDoc*
>(m_chain -> inputDocument());
71 TQString filename = m_chain -> outputFile();
74 return KoFilter::CreationError;
77 if (filename.isEmpty()) {
78 return KoFilter::FileNotFound;
81 KisImageSP img =
new KisImage(*doc -> currentImage());
85 bool undo = doc -> undoAdapter() -> undo();
86 doc -> undoAdapter() -> setUndo(
false);
90 KisPaintLayerSP layer =
dynamic_cast<KisPaintLayer*
>(img->activeLayer().data());
93 doc -> undoAdapter() -> setUndo(undo);
96 KisRgbF16HalfColorSpace *cs =
dynamic_cast<KisRgbF16HalfColorSpace *
>(layer->paintDevice()->colorSpace());
101 KMessageBox::information(0, i18n(
"The image is using an unsupported color space. "
102 "Please convert to 16-bit floating point RGB/Alpha "
103 "before saving in the OpenEXR format."));
106 doc -> setErrorMessage(
"USER_CANCELED");
108 return KoFilter::WrongFormat;
111 Box2i displayWindow(V2i(0, 0), V2i(img -> width() - 1, img -> height() - 1));
113 TQRect dataExtent = layer -> exactBounds();
114 int dataWidth = dataExtent.width();
115 int dataHeight = dataExtent.height();
117 Box2i dataWindow(V2i(dataExtent.left(), dataExtent.top()), V2i(dataExtent.right(), dataExtent.bottom()));
119 RgbaOutputFile file(TQFile::encodeName(filename), displayWindow, dataWindow, WRITE_RGBA);
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);
127 KisHLineIterator it = layer->paintDevice()->createHLineIterator(dataWindow.min.x, dataWindow.min.y + y, dataWidth,
false);
128 Rgba *rgba = pixels.data();
130 while (!it.isDone()) {
133 half unmultipliedRed;
134 half unmultipliedGreen;
135 half unmultipliedBlue;
138 cs -> getPixel(it.rawData(), &unmultipliedRed, &unmultipliedGreen, &unmultipliedBlue, &alpha);
139 rgba -> r = unmultipliedRed * alpha;
140 rgba -> g = unmultipliedGreen * alpha;
141 rgba -> b = unmultipliedBlue * alpha;
154#include "kis_openexr_export.moc"