Krita Source Code Documentation
Loading...
Searching...
No Matches
CSVSaver Class Reference

#include <csv_saver.h>

+ Inheritance diagram for CSVSaver:

Public Member Functions

KisImportExportErrorCode buildAnimation (QIODevice *io)
 
 CSVSaver (KisDocument *doc, bool batchMode)
 
KisImageSP image ()
 
 ~CSVSaver () override
 

Private Slots

void cancel ()
 

Private Member Functions

QString convertToBlending (const QString &)
 
void createTempImage (KisDocument *)
 
KisImportExportErrorCode encode (QIODevice *io)
 
KisImportExportErrorCode getLayer (CSVLayerRecord *, KisDocument *, KisKeyframeSP, const QString &, int, int)
 

Private Attributes

bool m_batchMode
 
KisDocumentm_doc
 
KisImageSP m_image
 
bool m_stop
 

Detailed Description

Definition at line 19 of file csv_saver.h.

Constructor & Destructor Documentation

◆ CSVSaver()

CSVSaver::CSVSaver ( KisDocument * doc,
bool batchMode )

Definition at line 40 of file csv_saver.cpp.

41 : m_image(doc->savingImage())
42 , m_doc(doc)
43 , m_batchMode(batchMode)
44 , m_stop(false)
45{
46}
KisDocument * m_doc
Definition csv_saver.h:41
KisImageSP m_image
Definition csv_saver.h:40
bool m_stop
Definition csv_saver.h:43
bool m_batchMode
Definition csv_saver.h:42
KisImageSP savingImage

◆ ~CSVSaver()

CSVSaver::~CSVSaver ( )
override

Definition at line 48 of file csv_saver.cpp.

49{
50}

Member Function Documentation

◆ buildAnimation()

KisImportExportErrorCode CSVSaver::buildAnimation ( QIODevice * io)

Definition at line 458 of file csv_saver.cpp.

459{
461 return encode(io);
462}
KisImportExportErrorCode encode(QIODevice *io)
Definition csv_saver.cpp:57
#define KIS_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:85

References encode(), ImportExportCodes::InternalError, KIS_ASSERT_RECOVER_RETURN_VALUE, and m_image.

◆ cancel

void CSVSaver::cancel ( )
privateslot

Definition at line 464 of file csv_saver.cpp.

465{
466 m_stop = true;
467}

References m_stop.

◆ convertToBlending()

QString CSVSaver::convertToBlending ( const QString & opid)
private

Definition at line 343 of file csv_saver.cpp.

344{
345 if (opid == COMPOSITE_OVER) return "Color";
346 if (opid == COMPOSITE_BEHIND) return "Behind";
347 if (opid == COMPOSITE_ERASE) return "Erase";
348 // "Shade"
349 if (opid == COMPOSITE_LINEAR_LIGHT) return "Light";
350 if (opid == COMPOSITE_COLORIZE) return "Colorize";
351 if (opid == COMPOSITE_HUE) return "Hue";
352 if ((opid == COMPOSITE_ADD) ||
353 (opid == COMPOSITE_LINEAR_DODGE)) return "Add";
354 if (opid == COMPOSITE_INVERSE_SUBTRACT) return "Sub";
355 if (opid == COMPOSITE_MULT) return "Multiply";
356 if (opid == COMPOSITE_SCREEN) return "Screen";
357 // "Replace"
358 // "Substitute"
359 if (opid == COMPOSITE_DIFF) return "Difference";
360 if (opid == COMPOSITE_DIVIDE) return "Divide";
361 if (opid == COMPOSITE_OVERLAY) return "Overlay";
362 if (opid == COMPOSITE_DODGE) return "Light2";
363 if (opid == COMPOSITE_BURN) return "Shade2";
364 if (opid == COMPOSITE_HARD_LIGHT) return "HardLight";
365 if ((opid == COMPOSITE_SOFT_LIGHT_PHOTOSHOP) ||
366 (opid == COMPOSITE_SOFT_LIGHT_SVG)) return "SoftLight";
367 if (opid == COMPOSITE_GRAIN_EXTRACT) return "GrainExtract";
368 if (opid == COMPOSITE_GRAIN_MERGE) return "GrainMerge";
369 if (opid == COMPOSITE_SUBTRACT) return "Sub2";
370 if (opid == COMPOSITE_DARKEN) return "Darken";
371 if (opid == COMPOSITE_LIGHTEN) return "Lighten";
372 if (opid == COMPOSITE_SATURATION) return "Saturation";
373
374 return "Color";
375}
const QString COMPOSITE_OVER
const QString COMPOSITE_DARKEN
const QString COMPOSITE_OVERLAY
const QString COMPOSITE_DIVIDE
const QString COMPOSITE_DODGE
const QString COMPOSITE_SOFT_LIGHT_SVG
const QString COMPOSITE_ADD
const QString COMPOSITE_LIGHTEN
const QString COMPOSITE_GRAIN_MERGE
const QString COMPOSITE_SOFT_LIGHT_PHOTOSHOP
const QString COMPOSITE_INVERSE_SUBTRACT
const QString COMPOSITE_MULT
const QString COMPOSITE_SATURATION
const QString COMPOSITE_LINEAR_LIGHT
const QString COMPOSITE_COLORIZE
const QString COMPOSITE_HARD_LIGHT
const QString COMPOSITE_SCREEN
const QString COMPOSITE_DIFF
const QString COMPOSITE_ERASE
const QString COMPOSITE_HUE
const QString COMPOSITE_BEHIND
const QString COMPOSITE_SUBTRACT
const QString COMPOSITE_BURN
const QString COMPOSITE_LINEAR_DODGE
const QString COMPOSITE_GRAIN_EXTRACT

References COMPOSITE_ADD, COMPOSITE_BEHIND, COMPOSITE_BURN, COMPOSITE_COLORIZE, COMPOSITE_DARKEN, COMPOSITE_DIFF, COMPOSITE_DIVIDE, COMPOSITE_DODGE, COMPOSITE_ERASE, COMPOSITE_GRAIN_EXTRACT, COMPOSITE_GRAIN_MERGE, COMPOSITE_HARD_LIGHT, COMPOSITE_HUE, COMPOSITE_INVERSE_SUBTRACT, COMPOSITE_LIGHTEN, COMPOSITE_LINEAR_DODGE, COMPOSITE_LINEAR_LIGHT, COMPOSITE_MULT, COMPOSITE_OVER, COMPOSITE_OVERLAY, COMPOSITE_SATURATION, COMPOSITE_SCREEN, COMPOSITE_SOFT_LIGHT_PHOTOSHOP, COMPOSITE_SOFT_LIGHT_SVG, and COMPOSITE_SUBTRACT.

◆ createTempImage()

void CSVSaver::createTempImage ( KisDocument * exportDoc)
private

Definition at line 441 of file csv_saver.cpp.

442{
443 exportDoc->setInfiniteAutoSaveInterval();
444 exportDoc->setFileBatchMode(true);
445
446 KisImageSP exportImage = new KisImage(exportDoc->createUndoStore(),
448 QString());
449
450 exportImage->setResolution(m_image->xRes(), m_image->yRes());
451 exportDoc->setCurrentImage(exportImage);
452
453 KisPaintLayer* paintLayer = new KisPaintLayer(exportImage, "paint device", OPACITY_OPAQUE_U8);
454 exportImage->addNode(paintLayer, exportImage->rootLayer(), KisLayerSP(0));
455}
const quint8 OPACITY_OPAQUE_U8
KisUndoStore * createUndoStore()
void setFileBatchMode(const bool batchMode)
void setCurrentImage(KisImageSP image, bool forceInitialUpdate=true, KisNodeSP preActivatedNode=nullptr)
void setInfiniteAutoSaveInterval()
KisGroupLayerSP rootLayer() const
const KoColorSpace * colorSpace() const
qint32 width() const
double xRes() const
double yRes() const
qint32 height() const
void setResolution(double xres, double yres)
bool addNode(KisNodeSP node, KisNodeSP parent=KisNodeSP(), KisNodeAdditionFlags flags=KisNodeAdditionFlag::None)

References KisNodeFacade::addNode(), KisImage::colorSpace(), KisDocument::createUndoStore(), KisImage::height(), m_image, OPACITY_OPAQUE_U8, KisImage::rootLayer(), KisDocument::setCurrentImage(), KisDocument::setFileBatchMode(), KisDocument::setInfiniteAutoSaveInterval(), KisImage::setResolution(), KisImage::width(), KisImage::xRes(), and KisImage::yRes().

◆ encode()

KisImportExportErrorCode CSVSaver::encode ( QIODevice * io)
private

Definition at line 57 of file csv_saver.cpp.

58{
59 int idx;
60 int start, end;
61 KisNodeSP node;
62 QByteArray ba;
63// KisTimeKeyframePair keyframeEntry;
64 KisKeyframeSP keyframe;
66
68
69 KisCursorOverrideLock cursorLock(Qt::WaitCursor);
70
71// XXX: Stream was unused?
72// //DataStream instead of TextStream for correct line endings
73// QDataStream stream(&f);
74
75 //Using the original local path
76 QString path = m_doc->localFilePath();
77
78 if (path.right(4).toUpper() == ".CSV")
79 path = path.left(path.size() - 4);
80 else {
81 // something is wrong: the local file name is not .csv!
82 // trying the given (probably temporary) filename as well
83
84 KIS_SAFE_ASSERT_RECOVER(0 && "Wrong extension of the saved file!") {
85 path = path.left(path.size() - 4);
86 }
87 }
88 path.append(".frames");
89
90 //create directory
91
92 QDir dir(path);
93 if (!dir.exists()) {
94 dir.mkpath(".");
95 }
96 //according to the QT docs, the slash is a universal directory separator
97 path.append("/");
98
99 node = m_image->rootLayer()->firstChild();
100
101 //TODO: correct handling of the layer tree.
102 //for now, only top level paint layers are saved
103
104 idx = 0;
105
106 while (node) {
107 if (node->inherits("KisLayer")) {
108 KisLayer* paintLayer = qobject_cast<KisLayer*>(node.data());
109 CSVLayerRecord* layerRecord = new CSVLayerRecord();
110 layers.prepend(layerRecord); //reverse order!
111
112 layerRecord->name = paintLayer->name();
113 layerRecord->name.replace(QRegularExpression("[\"\\r\\n]"), "_");
114
115 if (layerRecord->name.isEmpty())
116 layerRecord->name= QString("Unnamed-%1").arg(idx);
117
118 layerRecord->visible = (paintLayer->visible()) ? 1 : 0;
119 layerRecord->density = (float)(paintLayer->opacity()) / OPACITY_OPAQUE_U8;
120 layerRecord->blending = convertToBlending(paintLayer->compositeOpId());
121 layerRecord->layer = paintLayer;
122 layerRecord->channel = paintLayer->original()->keyframeChannel();
123 layerRecord->last = "";
124 layerRecord->frame = 0;
125 idx++;
126 }
127 node = node->nextSibling();
128 }
129
130 KisTimeSpan range = animation->documentPlaybackRange();
131
132 start = (range.isValid()) ? range.start() : 0;
133
134 if (!range.isInfinite()) {
135 end = range.end();
136
137 if (end < start) end = start;
138 } else {
139 //undefined length, searching for the last keyframe
140 end = start;
141 int keyframeTime;
142
143 for (idx = 0; idx < layers.size(); idx++) {
144 KisRasterKeyframeChannel *channel = layers.at(idx)->channel;
145
146 if (channel) {
147 keyframeTime = channel->lastKeyframeTime();
148
149 if ( (channel->keyframeAt(keyframeTime)) && (keyframeTime > end) )
150 end = keyframeTime;
151 }
152 }
153 }
154
155 //create temporary doc for exporting
156 QScopedPointer<KisDocument> exportDoc(KisPart::instance()->createDocument());
157 createTempImage(exportDoc.data());
158
160
161 if (!m_batchMode) {
162 // TODO: use other systems of progress reporting (KisViewManager::createUnthreadedUpdater()
163 //emit m_doc->statusBarMessage(i18n("Saving CSV file..."));
164 //emit m_doc->sigProgress(0);
165 //connect(m_doc, SIGNAL(sigProgressCanceled()), this, SLOT(cancel()));
166 }
167 int frame = start;
168 int step = 0;
169
170 do {
171 qApp->processEvents();
172
173 if (m_stop) {
175 break;
176 }
177
178 switch(step) {
179
180 case 0 : //first row
181 if (io->write("UTF-8, TVPaint, \"CSV 1.0\"\r\n") < 0) {
183 }
184 break;
185
186 case 1 : //scene header names
187 if (io->write("Project Name, Width, Height, Frame Count, Layer Count, Frame Rate, Pixel Aspect Ratio, Field Mode\r\n") < 0) {
189 }
190 break;
191
192 case 2 : //scene header values
193 ba = QString("\"%1\", ").arg(m_image->objectName()).toUtf8();
194 if (io->write(ba.data()) < 0) {
196 break;
197 }
198 ba = QString("%1, %2, ").arg(m_image->width()).arg(m_image->height()).toUtf8();
199 if (io->write(ba.data()) < 0) {
201 break;
202 }
203
204 ba = QString("%1, %2, ").arg(end - start + 1).arg(layers.size()).toUtf8();
205 if (io->write(ba.data()) < 0) {
207 break;
208 }
209 //the framerate is an integer here
210 ba = QString("%1, ").arg((double)(animation->framerate()),0,'f',6).toUtf8();
211 if (io->write(ba.data()) < 0) {
213 break;
214 }
215 ba = QString("%1, Progressive\r\n").arg((double)(m_image->xRes() / m_image->yRes()),0,'f',6).toUtf8();
216 if (io->write(ba.data()) < 0) {
218 break;
219 }
220 break;
221
222 case 3 : //layer header values
223 if (io->write("#Layers") < 0) { //Layers
225 break;
226 }
227
228 for (idx = 0; idx < layers.size(); idx++) {
229 ba = QString(", \"%1\"").arg(layers.at(idx)->name).toUtf8();
230 if (io->write(ba.data()) < 0)
231 break;
232 }
233 break;
234
235 case 4 :
236 if (io->write("\r\n#Density") < 0) { //Density
238 break;
239 }
240 for (idx = 0; idx < layers.size(); idx++) {
241 ba = QString(", %1").arg((double)(layers.at(idx)->density), 0, 'f', 6).toUtf8();
242 if (io->write(ba.data()) < 0)
243 break;
244 }
245 break;
246
247 case 5 :
248 if (io->write("\r\n#Blending") < 0) { //Blending
250 break;
251 }
252 for (idx = 0; idx < layers.size(); idx++) {
253 ba = QString(", \"%1\"").arg(layers.at(idx)->blending).toUtf8();
254 if (io->write(ba.data()) < 0)
255 break;
256 }
257 break;
258
259 case 6 :
260 if (io->write("\r\n#Visible") < 0) { //Visible
262 break;
263 }
264 for (idx = 0; idx < layers.size(); idx++) {
265 ba = QString(", %1").arg(layers.at(idx)->visible).toUtf8();
266 if (io->write(ba.data()) < 0)
267 break;
268 }
269 if (idx < layers.size()) {
271 }
272 break;
273
274 default : //frames
275
276 if (frame > end) {
277 if (io->write("\r\n") < 0)
279
280 step = 8;
281 break;
282 }
283
284 ba = QString("\r\n#%1").arg(frame, 5, 10, QChar('0')).toUtf8();
285 if (io->write(ba.data()) < 0) {
287 break;
288 }
289
290 for (idx = 0; idx < layers.size(); idx++) {
291 CSVLayerRecord *layer = layers.at(idx);
292 KisRasterKeyframeChannel *channel = layer->channel;
293
294 if (channel) {
295 if (frame == start) {
296 keyframe = channel->activeKeyframeAt(frame);
297 } else {
298 keyframe = channel->keyframeAt(frame); //TODO: Ugly...
299 }
300 } else {
301 keyframe.clear(); // without animation
302 }
303
304 if ( keyframe || (frame == start) ) {
305
306 if (!m_batchMode) {
307 //emit m_doc->sigProgress(((frame - start) * layers.size() + idx) * 100 /
308 // ((end - start) * layers.size()));
309 }
310 retval = getLayer(layer, exportDoc.data(), keyframe, path, frame, idx);
311
312 if (!retval.isOk())
313 break;
314 }
315 ba = QString(", \"%1\"").arg(layer->last).toUtf8();
316
317 if (io->write(ba.data()) < 0)
318 break;
319 }
320 if (idx < layers.size())
322
323 frame++;
324 step = 6; //keep step here
325 break;
326 }
327 step++;
328 } while((retval.isOk()) && (step < 8));
329
330 qDeleteAll(layers);
331
332 // io->close(); it seems this is not required anymore
333
334 if (!m_batchMode) {
335 //disconnect(m_doc, SIGNAL(sigProgressCanceled()), this, SLOT(cancel()));
336 //emit m_doc->sigProgress(100);
337 //emit m_doc->clearStatusBarMessage();
338 }
339
340 return retval;
341}
KisRasterKeyframeChannel * channel
QString convertToBlending(const QString &)
void createTempImage(KisDocument *)
KisImportExportErrorCode getLayer(CSVLayerRecord *, KisDocument *, KisKeyframeSP, const QString &, int, int)
QString localFilePath() const
const KisTimeSpan & documentPlaybackRange() const
documentPlaybackRange
KisImageAnimationInterface * animationInterface() const
KisKeyframeSP keyframeAt(int time) const
Get a keyframe at specified time. Used primarily when the value of a given keyframe is needed.
KisKeyframeSP activeKeyframeAt(int time) const
KisRasterKeyframeChannel * keyframeChannel() const
static KisPart * instance()
Definition KisPart.cpp:131
The KisRasterKeyframeChannel is a concrete KisKeyframeChannel subclass that stores and manages KisRas...
int start() const
bool isInfinite() const
int end() const
bool isValid() const
#define KIS_SAFE_ASSERT_RECOVER(cond)
Definition kis_assert.h:126
KisDocument * createDocument(QList< KisNodeSP > nodes, KisImageSP srcImage, const QRect &copiedBounds)
const QString & compositeOpId() const
QString name() const
quint8 opacity() const
virtual bool visible(bool recursive=false) const
KisPaintDeviceSP original() const override=0
KisNodeSP firstChild() const
Definition kis_node.cpp:361
KisNodeSP nextSibling() const
Definition kis_node.cpp:408

References KisKeyframeChannel::activeKeyframeAt(), KisImage::animationInterface(), CSVLayerRecord::blending, ImportExportCodes::Cancelled, CSVLayerRecord::channel, KisBaseNode::compositeOpId(), convertToBlending(), createDocument(), createTempImage(), KisSharedPtr< T >::data(), CSVLayerRecord::density, KisImageAnimationInterface::documentPlaybackRange(), KisTimeSpan::end(), ImportExportCodes::Failure, KisNode::firstChild(), CSVLayerRecord::frame, KisImageAnimationInterface::framerate(), getLayer(), KisImage::height(), KisPart::instance(), KisTimeSpan::isInfinite(), KisImportExportErrorCode::isOk(), KisTimeSpan::isValid(), KisKeyframeChannel::keyframeAt(), KisPaintDevice::keyframeChannel(), KIS_SAFE_ASSERT_RECOVER, CSVLayerRecord::last, KisKeyframeChannel::lastKeyframeTime(), CSVLayerRecord::layer, KisDocument::localFilePath(), m_batchMode, m_doc, m_image, m_stop, KisBaseNode::name(), CSVLayerRecord::name, KisNode::nextSibling(), ImportExportCodes::OK, KisBaseNode::opacity(), OPACITY_OPAQUE_U8, KisLayer::original(), KisImage::rootLayer(), KisTimeSpan::start(), KisBaseNode::visible(), CSVLayerRecord::visible, KisImage::width(), KisImage::xRes(), and KisImage::yRes().

◆ getLayer()

KisImportExportErrorCode CSVSaver::getLayer ( CSVLayerRecord * layer,
KisDocument * exportDoc,
KisKeyframeSP keyframe,
const QString & path,
int frame,
int idx )
private

Definition at line 377 of file csv_saver.cpp.

378{
379 //render to the temp layer
380 KisImageSP image = exportDoc->savingImage();
381
382 if (!image) image= exportDoc->image();
383
385
386 if (!keyframe.isNull()) {
387 KisRasterKeyframeSP rasterKeyframe = keyframe.dynamicCast<KisRasterKeyframe>();
388 if (rasterKeyframe) {
389 rasterKeyframe->writeFrameToDevice(device);
390 }
391 } else {
392 device->makeCloneFrom(layer->layer->projection(),image->bounds()); // without animation
393 }
394 QRect bounds = device->exactBounds();
395
396 if (bounds.isEmpty()) {
397 layer->last = ""; //empty frame
399 }
400 layer->last = QString("frame%1-%2.png").arg(idx + 1,5,10,QChar('0')).arg(frame,5,10,QChar('0'));
401
402 QString filename = path;
403 filename.append(layer->last);
404
405 //save to PNG
407 const KoColorSpace* cs = device->colorSpace();
408
409 bool isThereAlpha = false;
410 while (it.nextPixel()) {
411 if (cs->opacityU8(it.oldRawData()) != OPACITY_OPAQUE_U8) {
412 isThereAlpha = true;
413 break;
414 }
415 }
416
418 device = new KisPaintDevice(*device.data());
419 device->convertTo(KoColorSpaceRegistry::instance()->rgb8());
420 }
421 KisPNGOptions options;
422
423 options.alpha = isThereAlpha;
424 options.interlace = false;
425 options.compression = 8;
426 options.tryToSaveAsIndexed = false;
427 options.transparencyFillColor = QColor(0,0,0);
428 options.saveSRGBProfile = true; //TVPaint can use only sRGB
429 options.forceSRGB = false;
430
431 KisPNGConverter kpc(exportDoc);
432
433 KisImportExportErrorCode result = kpc.buildFile(filename, image->bounds(),
434 image->xRes(), image->yRes(), device,
436 options, (KisMetaData::Store* )0 );
437
438 return result;
439}
KisImageSP image()
Definition csv_saver.cpp:52
KisImageSP image
vKisAnnotationSP_it endAnnotations()
QRect bounds() const override
vKisAnnotationSP_it beginAnnotations()
static bool isColorSpaceSupported(const KoColorSpace *cs)
QRect exactBounds() const
const KoColorSpace * colorSpace() const
void convertTo(const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags(), KUndo2Command *parentCommand=nullptr, KoUpdater *progressUpdater=nullptr)
void makeCloneFrom(KisPaintDeviceSP src, const QRect &rect)
The KisRasterKeyframe class is a concrete subclass of KisKeyframe that wraps a physical raster image ...
virtual quint8 opacityU8(const quint8 *pixel) const =0
#define bounds(x, a, b)
virtual KisPaintDeviceSP projection() const =0
KisPaintDeviceSP projection() const override
Definition kis_layer.cc:820
QColor transparencyFillColor
static KoColorSpaceRegistry * instance()

References KisPNGOptions::alpha, KisImage::beginAnnotations(), KisImage::bounds(), bounds, KisPNGConverter::buildFile(), KisPaintDevice::colorSpace(), KisPNGOptions::compression, KisPaintDevice::convertTo(), KisSharedPtr< T >::data(), KisImage::endAnnotations(), KisPaintDevice::exactBounds(), KisNode::firstChild(), KisPNGOptions::forceSRGB, KisDocument::image, image(), KoColorSpaceRegistry::instance(), KisPNGOptions::interlace, KisPNGConverter::isColorSpaceSupported(), CSVLayerRecord::last, CSVLayerRecord::layer, KisPaintDevice::makeCloneFrom(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::nextPixel(), ImportExportCodes::OK, KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::oldRawData(), OPACITY_OPAQUE_U8, KoColorSpace::opacityU8(), KisBaseNode::projection(), KisLayer::projection(), KisImage::rootLayer(), KisPNGOptions::saveSRGBProfile, KisDocument::savingImage, KisPNGOptions::transparencyFillColor, KisPNGOptions::tryToSaveAsIndexed, KisImage::xRes(), and KisImage::yRes().

◆ image()

KisImageSP CSVSaver::image ( )

Definition at line 52 of file csv_saver.cpp.

53{
54 return m_image;
55}

References m_image.

Member Data Documentation

◆ m_batchMode

bool CSVSaver::m_batchMode
private

Definition at line 42 of file csv_saver.h.

◆ m_doc

KisDocument* CSVSaver::m_doc
private

Definition at line 41 of file csv_saver.h.

◆ m_image

KisImageSP CSVSaver::m_image
private

Definition at line 40 of file csv_saver.h.

◆ m_stop

bool CSVSaver::m_stop
private

Definition at line 43 of file csv_saver.h.


The documentation for this class was generated from the following files: