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

#include <kis_kra_savexml_visitor.h>

+ Inheritance diagram for KisSaveXmlVisitor:

Public Member Functions

QStringList errorMessages () const
 
QMap< const KisNode *, QString > keyframeFileNames ()
 
 KisSaveXmlVisitor (QDomDocument doc, const QDomElement &element, quint32 &count, const QString &url, bool root)
 
QMap< const KisNode *, QString > nodeFileNames ()
 
QDomElement savePaintLayerAttributes (KisPaintLayer *layer, QDomDocument &doc, bool saveLayerOffset)
 
void setSelectedNodes (vKisNodeSP selectedNodes)
 
bool visit (KisAdjustmentLayer *layer) override
 
virtual bool visit (KisAdjustmentLayer *layer)=0
 
bool visit (KisCloneLayer *layer) override
 
virtual bool visit (KisCloneLayer *layer)=0
 
bool visit (KisColorizeMask *mask) override
 
virtual bool visit (KisColorizeMask *mask)=0
 
bool visit (KisExternalLayer *) override
 
virtual bool visit (KisExternalLayer *layer)=0
 
bool visit (KisFilterMask *mask) override
 
virtual bool visit (KisFilterMask *mask)=0
 
bool visit (KisGeneratorLayer *layer) override
 
virtual bool visit (KisGeneratorLayer *layer)=0
 
bool visit (KisGroupLayer *layer) override
 
virtual bool visit (KisGroupLayer *layer)=0
 
bool visit (KisNode *) override
 
virtual bool visit (KisNode *node)=0
 
bool visit (KisPaintLayer *layer) override
 
virtual bool visit (KisPaintLayer *layer)=0
 
bool visit (KisSelectionMask *mask) override
 
virtual bool visit (KisSelectionMask *mask)=0
 
bool visit (KisTransformMask *mask) override
 
virtual bool visit (KisTransformMask *mask)=0
 
bool visit (KisTransparencyMask *mask) override
 
virtual bool visit (KisTransparencyMask *mask)=0
 
- Public Member Functions inherited from KisNodeVisitor
 KisNodeVisitor ()
 
virtual ~KisNodeVisitor ()
 

Static Public Member Functions

static void loadPaintLayerAttributes (const QDomElement &el, KisPaintLayer *layer, bool loadLayerOffset)
 

Private Member Functions

void saveLayer (QDomElement &el, const QString &layerType, const KisLayer *layer)
 
void saveMask (QDomElement &el, const QString &maskType, const KisMaskSP mask)
 
bool saveMasks (KisNode *node, QDomElement &layerElement)
 
void saveNodeKeyframes (const KisNode *node, QString filename, QDomElement &el)
 
bool saveReferenceImagesLayer (KisExternalLayer *layer)
 

Static Private Member Functions

static void loadLayerAttributes (const QDomElement &el, KisLayer *layer)
 

Private Attributes

quint32 & m_count
 
QDomDocument m_doc
 
QDomElement m_elem
 
QStringList m_errorMessages
 
QMap< const KisNode *, QString > m_keyframeFileNames
 
QMap< const KisNode *, QString > m_nodeFileNames
 
bool m_root
 
vKisNodeSP m_selectedNodes
 
QString m_url
 

Friends

class KisKraSaveXmlVisitorTest
 

Additional Inherited Members

- Protected Member Functions inherited from KisNodeVisitor
bool visitAll (KisNode *node, bool breakOnFail=false)
 
bool visitAllInverse (KisNode *node, bool breakOnFail=false)
 

Detailed Description

Definition at line 18 of file kis_kra_savexml_visitor.h.

Constructor & Destructor Documentation

◆ KisSaveXmlVisitor()

KisSaveXmlVisitor::KisSaveXmlVisitor ( QDomDocument doc,
const QDomElement & element,
quint32 & count,
const QString & url,
bool root )

Definition at line 45 of file kis_kra_savexml_visitor.cpp.

47 , m_doc(doc)
48 , m_count(count)
49 , m_url(url)
50 , m_root(root)
51{
52 Q_ASSERT(!element.isNull());
53 m_elem = element;
54}

References m_elem.

Member Function Documentation

◆ errorMessages()

QStringList KisSaveXmlVisitor::errorMessages ( ) const

Definition at line 61 of file kis_kra_savexml_visitor.cpp.

62{
63 return m_errorMessages;
64}

References m_errorMessages.

◆ keyframeFileNames()

QMap< const KisNode *, QString > KisSaveXmlVisitor::keyframeFileNames ( )
inline

Definition at line 50 of file kis_kra_savexml_visitor.h.

50 {
52 }
QMap< const KisNode *, QString > m_keyframeFileNames

◆ loadLayerAttributes()

void KisSaveXmlVisitor::loadLayerAttributes ( const QDomElement & el,
KisLayer * layer )
staticprivate

Definition at line 297 of file kis_kra_savexml_visitor.cpp.

298{
299 if (el.hasAttribute(NAME)) {
300 QString layerName = el.attribute(NAME);
301 if (layerName != layer->name()) {
302 // Make the EXR layername leading in case of conflicts
303 layer->setName(layerName);
304 }
305 }
306
307 if (el.hasAttribute(CHANNEL_FLAGS)) {
308 layer->setChannelFlags(stringToFlags(el.attribute(CHANNEL_FLAGS)));
309 }
310
311 if (el.hasAttribute(OPACITY)) {
312 layer->setOpacity(el.attribute(OPACITY).toInt());
313 }
314
315 if (el.hasAttribute(COMPOSITE_OP)) {
316 layer->setCompositeOpId(el.attribute(COMPOSITE_OP));
317 }
318
319 if (el.hasAttribute(VISIBLE)) {
320 layer->setVisible(el.attribute(VISIBLE).toInt());
321 }
322
323 if (el.hasAttribute(LOCKED)) {
324 layer->setUserLocked(el.attribute(LOCKED).toInt());
325 }
326
327 if (el.hasAttribute(X)) {
328 layer->setX(el.attribute(X).toInt());
329 }
330
331 if (el.hasAttribute(Y)) {
332 layer->setY(el.attribute(Y).toInt());
333 }
334
335 if (el.hasAttribute(UUID)) {
336 layer->setUuid(QUuid::fromString(el.attribute(UUID)));
337 }
338
339 if (el.hasAttribute(COLLAPSED)) {
340 layer->setCollapsed(el.attribute(COLLAPSED).toInt());
341 }
342
343 if (el.hasAttribute(COLOR_LABEL)) {
344 layer->setColorLabelIndex(el.attribute(COLOR_LABEL).toInt());
345 }
346
347 if (el.hasAttribute(VISIBLE_IN_TIMELINE)) {
348 layer->setPinnedToTimeline(el.attribute(VISIBLE_IN_TIMELINE).toInt());
349 }
350
351 if (el.hasAttribute(LAYER_STYLE_UUID)) {
352 QString uuidString = el.attribute(LAYER_STYLE_UUID);
353 QUuid uuid(uuidString);
354 if (!uuid.isNull()) {
355 KisPSDLayerStyleSP dumbLayerStyle(new KisPSDLayerStyle());
356 dumbLayerStyle->setUuid(uuid);
357 layer->setLayerStyle(dumbLayerStyle);
358 } else {
359 warnKrita << "WARNING: Layer style for layer" << layer->name() << "contains invalid UUID" << uuidString;
360 }
361 }
362
363 if (layer->inherits("KisShapeLayer") && el.hasAttribute(ANTIALIASED)) {
364 KisShapeLayer *shapeLayer = static_cast<KisShapeLayer*>(layer);
365 shapeLayer->setAntialiased(el.attribute(ANTIALIASED).toInt());
366 }
367}
void setAntialiased(const bool antialiased)
#define warnKrita
Definition kis_debug.h:87
const QString Y
const QString NAME
const QString VISIBLE
const QString COLOR_LABEL
const QString OPACITY
const QString X
const QString COMPOSITE_OP
const QString VISIBLE_IN_TIMELINE
const QString LOCKED
QBitArray stringToFlags(const QString &string, int size=-1, char token='0', bool defaultTrue=true)
const QString COLLAPSED
const QString ANTIALIASED
const QString UUID
const QString LAYER_STYLE_UUID
const QString CHANNEL_FLAGS
void setPinnedToTimeline(bool pinned)
virtual void setUserLocked(bool l)
void setOpacity(quint8 val)
virtual void setVisible(bool visible, bool loading=false)
void setUuid(const QUuid &id)
void setColorLabelIndex(int index)
void setName(const QString &name)
void setCollapsed(bool collapsed)
QString name() const
void setCompositeOpId(const QString &compositeOpId)
void setX(qint32 x) override
Definition kis_layer.cc:983
virtual void setChannelFlags(const QBitArray &channelFlags)
Definition kis_layer.cc:342
void setLayerStyle(KisPSDLayerStyleSP layerStyle)
Definition kis_layer.cc:254
void setY(qint32 y) override
Definition kis_layer.cc:989
The KisPSDLayerStyle class implements loading, saving and applying the PSD layer effects.

References KRA::ANTIALIASED, KRA::CHANNEL_FLAGS, KRA::COLLAPSED, KRA::COLOR_LABEL, KRA::COMPOSITE_OP, KRA::LAYER_STYLE_UUID, KRA::LOCKED, KisBaseNode::name(), KRA::NAME, KRA::OPACITY, KisShapeLayer::setAntialiased(), KisLayer::setChannelFlags(), KisBaseNode::setCollapsed(), KisBaseNode::setColorLabelIndex(), KisBaseNode::setCompositeOpId(), KisLayer::setLayerStyle(), KisBaseNode::setName(), KisBaseNode::setOpacity(), KisBaseNode::setPinnedToTimeline(), KisBaseNode::setUserLocked(), KisBaseNode::setUuid(), KisBaseNode::setVisible(), KisLayer::setX(), KisLayer::setY(), KRA::stringToFlags(), KRA::UUID, KRA::VISIBLE, KRA::VISIBLE_IN_TIMELINE, warnKrita, KRA::X, and KRA::Y.

◆ loadPaintLayerAttributes()

void KisSaveXmlVisitor::loadPaintLayerAttributes ( const QDomElement & el,
KisPaintLayer * layer,
bool loadLayerOffset )
static

Definition at line 129 of file kis_kra_savexml_visitor.cpp.

130{
131 QDomElement copy = el;
132
133 if (!loadLayerOffset) {
134 copy.removeAttribute(X);
135 copy.removeAttribute(Y);
136 }
137
138 loadLayerAttributes(copy, layer);
139
140 if (copy.hasAttribute(CHANNEL_LOCK_FLAGS)) {
142 }
143}
static void loadLayerAttributes(const QDomElement &el, KisLayer *layer)
const QString CHANNEL_LOCK_FLAGS
void setChannelLockFlags(const QBitArray &channelFlags)

References KRA::CHANNEL_LOCK_FLAGS, loadLayerAttributes(), KisPaintLayer::setChannelLockFlags(), KRA::stringToFlags(), KRA::X, and KRA::Y.

◆ nodeFileNames()

QMap< const KisNode *, QString > KisSaveXmlVisitor::nodeFileNames ( )
inline

Definition at line 46 of file kis_kra_savexml_visitor.h.

46 {
47 return m_nodeFileNames;
48 }
QMap< const KisNode *, QString > m_nodeFileNames

◆ saveLayer()

void KisSaveXmlVisitor::saveLayer ( QDomElement & el,
const QString & layerType,
const KisLayer * layer )
private

Definition at line 378 of file kis_kra_savexml_visitor.cpp.

379{
380 QString filename = LAYER + QString::number(m_count);
381
382 el.setAttribute(CHANNEL_FLAGS, flagsToString(layer->channelFlags()));
383 el.setAttribute(NAME, layer->name());
384 el.setAttribute(OPACITY, layer->opacity());
385 el.setAttribute(COMPOSITE_OP, layer->compositeOp()->id());
386 el.setAttribute(VISIBLE, layer->visible());
387 el.setAttribute(LOCKED, layer->userLocked());
388 el.setAttribute(NODE_TYPE, layerType);
389 el.setAttribute(FILE_NAME, filename);
390 el.setAttribute(X, layer->x());
391 el.setAttribute(Y, layer->y());
392 el.setAttribute(UUID, layer->uuid().toString());
393 el.setAttribute(COLLAPSED, layer->collapsed());
394 el.setAttribute(COLOR_LABEL, layer->colorLabelIndex());
395 el.setAttribute(VISIBLE_IN_TIMELINE, layer->isPinnedToTimeline());
396
397 if(layerType == SHAPE_LAYER) {
398 const KisShapeLayer *shapeLayer = static_cast<const KisShapeLayer*>(layer);
399 el.setAttribute(ANTIALIASED, shapeLayer->antialiased());
400 }
401
402 if (layer->layerStyle()) {
403 el.setAttribute(LAYER_STYLE_UUID, layer->layerStyle()->uuid().toString());
404 }
405
406 Q_FOREACH (KisNodeSP node, m_selectedNodes) {
407 if (node.data() == layer) {
408 el.setAttribute("selected", "true");
409 break;
410 }
411 }
412
413 saveNodeKeyframes(layer, filename, el);
414
415 m_nodeFileNames[layer] = filename;
416
417 dbgFile << "Saved layer "
418 << layer->name()
419 << " of type " << layerType
420 << " with filename " << LAYER + QString::number(m_count);
421}
void saveNodeKeyframes(const KisNode *node, QString filename, QDomElement &el)
bool antialiased() const
#define dbgFile
Definition kis_debug.h:53
QString flagsToString(const QBitArray &flags, int size=-1, char trueToken='1', char falseToken='0', bool defaultTrue=true)
const QString FILE_NAME
const QString NODE_TYPE
const QString LAYER
const QString SHAPE_LAYER
QUuid uuid() const
bool isPinnedToTimeline() const
int colorLabelIndex() const
bool userLocked() const
quint8 opacity() const
virtual bool visible(bool recursive=false) const
qint32 y() const override
Definition kis_layer.cc:978
QBitArray channelFlags
Definition kis_layer.cc:167
const KoCompositeOp * compositeOp() const override
returns the layer's composite op for the colorspace of the layer's parent.
Definition kis_layer.cc:232
qint32 x() const override
Definition kis_layer.cc:973
KisPSDLayerStyleSP layerStyle
Definition kis_layer.cc:171

References KisShapeLayer::antialiased(), KRA::ANTIALIASED, KRA::CHANNEL_FLAGS, KisLayer::channelFlags, KisBaseNode::collapsed, KRA::COLLAPSED, KRA::COLOR_LABEL, KisBaseNode::colorLabelIndex(), KRA::COMPOSITE_OP, KisLayer::compositeOp(), KisSharedPtr< T >::data(), dbgFile, KRA::FILE_NAME, KRA::flagsToString(), KoCompositeOp::id, KisBaseNode::isPinnedToTimeline(), KRA::LAYER, KRA::LAYER_STYLE_UUID, KisLayer::layerStyle, KRA::LOCKED, m_count, m_nodeFileNames, m_selectedNodes, KisBaseNode::name(), KRA::NAME, KRA::NODE_TYPE, KisBaseNode::opacity(), KRA::OPACITY, saveNodeKeyframes(), KRA::SHAPE_LAYER, KisBaseNode::userLocked(), KisBaseNode::uuid(), KRA::UUID, KisBaseNode::visible(), KRA::VISIBLE, KRA::VISIBLE_IN_TIMELINE, KisLayer::x(), KRA::X, KisLayer::y(), and KRA::Y.

◆ saveMask()

void KisSaveXmlVisitor::saveMask ( QDomElement & el,
const QString & maskType,
const KisMaskSP mask )
private

Definition at line 423 of file kis_kra_savexml_visitor.cpp.

424{
425 QString filename = MASK + QString::number(m_count);
426
427 el.setAttribute(NAME, mask->name());
428 el.setAttribute(VISIBLE, mask->visible());
429 el.setAttribute(LOCKED, mask->userLocked());
430 el.setAttribute(NODE_TYPE, maskType);
431 el.setAttribute(FILE_NAME, filename);
432 el.setAttribute(X, mask->x());
433 el.setAttribute(Y, mask->y());
434 el.setAttribute(UUID, mask->uuid().toString());
435 el.setAttribute(COLOR_LABEL, mask->colorLabelIndex());
436 el.setAttribute(VISIBLE_IN_TIMELINE, mask->isPinnedToTimeline());
437
438 if (maskType == SELECTION_MASK) {
439 el.setAttribute(ACTIVE, mask->nodeProperties().boolProperty("active"));
440 } else if (maskType == COLORIZE_MASK) {
441 el.setAttribute(COLORSPACE_NAME, mask->colorSpace()->id());
442 el.setAttribute(COMPOSITE_OP, mask->compositeOpId());
445
446 const KisColorizeMask *colorizeMask = dynamic_cast<const KisColorizeMask*>(mask.data());
447 KIS_SAFE_ASSERT_RECOVER_NOOP(colorizeMask);
448
449 if (colorizeMask) {
450 el.setAttribute(COLORIZE_USE_EDGE_DETECTION, colorizeMask->useEdgeDetection());
452 el.setAttribute(COLORIZE_FUZZY_RADIUS, KisDomUtils::toString(colorizeMask->fuzzyRadius()));
453 el.setAttribute(COLORIZE_CLEANUP, int(100 * colorizeMask->cleanUpAmount()));
454 el.setAttribute(COLORIZE_LIMIT_TO_DEVICE, colorizeMask->limitToDeviceBounds());
455 }
456 }
457
458 saveNodeKeyframes(mask, filename, el);
459
460 m_nodeFileNames[mask] = filename;
461
462 dbgFile << "Saved mask "
463 << mask->name()
464 << " of type " << maskType
465 << " with filename " << filename;
466}
bool limitToDeviceBounds() const
qreal cleanUpAmount() const
qreal fuzzyRadius() const
bool useEdgeDetection() const
qreal edgeDetectionSize() const
static QVariant nodeProperty(KisNodeSP node, const KoID &id, const QVariant &defaultValue)
bool boolProperty(const QString &name, bool defaultValue=false) const
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130
@ MASK
Definition kis_brush.h:32
const QString COLORIZE_CLEANUP
const QString COLORIZE_FUZZY_RADIUS
const QString COLORIZE_EDIT_KEYSTROKES
const QString COLORIZE_EDGE_DETECTION_SIZE
const QString COLORIZE_MASK
const QString COLORIZE_SHOW_COLORING
const QString COLORIZE_USE_EDGE_DETECTION
const QString ACTIVE
const QString COLORSPACE_NAME
const QString SELECTION_MASK
const QString COLORIZE_LIMIT_TO_DEVICE
QString toString(const QString &value)
const QString & compositeOpId() const
const KoProperties & nodeProperties() const
qint32 x() const override
Definition kis_mask.cc:431
qint32 y() const override
Definition kis_mask.cc:438
const KoColorSpace * colorSpace() const override
Definition kis_mask.cc:135

References KRA::ACTIVE, KoProperties::boolProperty(), KisColorizeMask::cleanUpAmount(), KRA::COLOR_LABEL, KRA::COLORIZE_CLEANUP, KRA::COLORIZE_EDGE_DETECTION_SIZE, KRA::COLORIZE_EDIT_KEYSTROKES, KRA::COLORIZE_FUZZY_RADIUS, KRA::COLORIZE_LIMIT_TO_DEVICE, KRA::COLORIZE_MASK, KRA::COLORIZE_SHOW_COLORING, KRA::COLORIZE_USE_EDGE_DETECTION, KisLayerPropertiesIcons::colorizeEditKeyStrokes, KisLayerPropertiesIcons::colorizeShowColoring, KisBaseNode::colorLabelIndex(), KisMask::colorSpace(), KRA::COLORSPACE_NAME, KRA::COMPOSITE_OP, KisBaseNode::compositeOpId(), KisSharedPtr< T >::data(), dbgFile, KisColorizeMask::edgeDetectionSize(), KRA::FILE_NAME, KisColorizeMask::fuzzyRadius(), KoColorSpace::id, KisBaseNode::isPinnedToTimeline(), KIS_SAFE_ASSERT_RECOVER_NOOP, KisColorizeMask::limitToDeviceBounds(), KRA::LOCKED, m_count, m_nodeFileNames, MASK, KisBaseNode::name(), KRA::NAME, KRA::NODE_TYPE, KisBaseNode::nodeProperties(), KisLayerPropertiesIcons::nodeProperty(), saveNodeKeyframes(), KRA::SELECTION_MASK, KisDomUtils::toString(), KisColorizeMask::useEdgeDetection(), KisBaseNode::userLocked(), KisBaseNode::uuid(), KRA::UUID, KisBaseNode::visible(), KRA::VISIBLE, KRA::VISIBLE_IN_TIMELINE, KisMask::x(), KRA::X, KisMask::y(), and KRA::Y.

◆ saveMasks()

bool KisSaveXmlVisitor::saveMasks ( KisNode * node,
QDomElement & layerElement )
private

Definition at line 468 of file kis_kra_savexml_visitor.cpp.

469{
470 if (node->childCount() > 0) {
471 QDomElement elem = m_doc.createElement(MASKS);
472 Q_ASSERT(!layerElement.isNull());
473 layerElement.appendChild(elem);
474 KisSaveXmlVisitor visitor(m_doc, elem, m_count, m_url, false);
475 visitor.setSelectedNodes(m_selectedNodes);
476 bool success = visitor.visitAllInverse(node);
477 m_errorMessages.append(visitor.errorMessages());
478 if (!m_errorMessages.isEmpty()) {
479 return false;
480 }
481
482 QMapIterator<const KisNode*, QString> i(visitor.nodeFileNames());
483 while (i.hasNext()) {
484 i.next();
485 m_nodeFileNames[i.key()] = i.value();
486 }
487
488 i = QMapIterator<const KisNode*, QString>(visitor.keyframeFileNames());
489 while (i.hasNext()) {
490 i.next();
491 m_keyframeFileNames[i.key()] = i.value();
492 }
493
494 return success;
495 }
496 return true;
497}
const QString MASKS
quint32 childCount() const
Definition kis_node.cpp:414

References KisNode::childCount(), errorMessages(), keyframeFileNames(), m_count, m_doc, m_errorMessages, m_keyframeFileNames, m_nodeFileNames, m_selectedNodes, m_url, KRA::MASKS, nodeFileNames(), setSelectedNodes(), and KisNodeVisitor::visitAllInverse().

◆ saveNodeKeyframes()

void KisSaveXmlVisitor::saveNodeKeyframes ( const KisNode * node,
QString filename,
QDomElement & el )
private

Definition at line 369 of file kis_kra_savexml_visitor.cpp.

370{
371 if (node->isAnimated()) {
372 QString keyframeFile = nodeFilename + ".keyframes.xml";
373 m_keyframeFileNames[node] = keyframeFile;
374 nodeElement.setAttribute(KEYFRAME_FILE, keyframeFile);
375 }
376}
const QString KEYFRAME_FILE
bool isAnimated() const

References KisBaseNode::isAnimated(), KRA::KEYFRAME_FILE, and m_keyframeFileNames.

◆ savePaintLayerAttributes()

QDomElement KisSaveXmlVisitor::savePaintLayerAttributes ( KisPaintLayer * layer,
QDomDocument & doc,
bool saveLayerOffset )

Definition at line 111 of file kis_kra_savexml_visitor.cpp.

112{
113 QDomElement element = doc.createElement(LAYER);
114 saveLayer(element, PAINT_LAYER, layer);
115 element.setAttribute(CHANNEL_LOCK_FLAGS, flagsToString(layer->channelLockFlags()));
116 element.setAttribute(COLORSPACE_NAME, layer->paintDevice()->colorSpace()->id());
117
118 element.setAttribute(ONION_SKIN_ENABLED, layer->onionSkinEnabled());
119 element.setAttribute(VISIBLE_IN_TIMELINE, layer->isPinnedToTimeline());
120
121 if (!saveLayerOffset) {
122 element.removeAttribute(X);
123 element.removeAttribute(Y);
124 }
125
126 return element;
127}
const KoColorSpace * colorSpace() const
void saveLayer(QDomElement &el, const QString &layerType, const KisLayer *layer)
const QString PAINT_LAYER
const QString ONION_SKIN_ENABLED
const QBitArray & channelLockFlags() const
KisPaintDeviceSP paintDevice
bool onionSkinEnabled() const

References KRA::CHANNEL_LOCK_FLAGS, KisPaintLayer::channelLockFlags(), KisPaintDevice::colorSpace(), KRA::COLORSPACE_NAME, KRA::flagsToString(), KoColorSpace::id, KisBaseNode::isPinnedToTimeline(), KRA::LAYER, KRA::ONION_SKIN_ENABLED, KisPaintLayer::onionSkinEnabled(), KRA::PAINT_LAYER, KisPaintLayer::paintDevice, saveLayer(), KRA::VISIBLE_IN_TIMELINE, KRA::X, and KRA::Y.

◆ saveReferenceImagesLayer()

bool KisSaveXmlVisitor::saveReferenceImagesLayer ( KisExternalLayer * layer)
private

Definition at line 499 of file kis_kra_savexml_visitor.cpp.

500{
501 auto *referencesLayer = dynamic_cast<KisReferenceImagesLayer*>(layer);
502 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(referencesLayer, false);
503
504 QDomElement layerElement = m_doc.createElement(LAYER);
505 layerElement.setAttribute(NODE_TYPE, REFERENCE_IMAGES_LAYER);
506
507 int nextId = 0;
508 Q_FOREACH(KoShape *shape, referencesLayer->shapes()) {
509 auto *reference = dynamic_cast<KisReferenceImage*>(shape);
510 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(reference, false);
511 reference->saveXml(m_doc, layerElement, nextId);
512 nextId++;
513 }
514
515 m_elem.appendChild(layerElement);
516 m_count++;
517 return true;
518}
The KisReferenceImage class represents a single reference image.
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129
const QString REFERENCE_IMAGES_LAYER

References KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE, KRA::LAYER, m_count, m_doc, m_elem, KRA::NODE_TYPE, and KRA::REFERENCE_IMAGES_LAYER.

◆ setSelectedNodes()

void KisSaveXmlVisitor::setSelectedNodes ( vKisNodeSP selectedNodes)

Definition at line 56 of file kis_kra_savexml_visitor.cpp.

57{
58 m_selectedNodes = selectedNodes;
59}

References m_selectedNodes.

◆ visit() [1/24]

bool KisSaveXmlVisitor::visit ( KisAdjustmentLayer * layer)
overridevirtual

Implements KisNodeVisitor.

Definition at line 195 of file kis_kra_savexml_visitor.cpp.

196{
197 if (!layer->filter()) {
198 return false;
199 }
200 QDomElement layerElement = m_doc.createElement(LAYER);
201 saveLayer(layerElement, ADJUSTMENT_LAYER, layer);
202 layerElement.setAttribute(FILTER_NAME, layer->filter()->name());
203 layerElement.setAttribute(FILTER_VERSION, layer->filter()->version());
204 m_elem.appendChild(layerElement);
205
206 m_count++;
207 return saveMasks(layer, layerElement);
208}
virtual KisFilterConfigurationSP filter() const
bool saveMasks(KisNode *node, QDomElement &layerElement)
const QString FILTER_NAME
const QString FILTER_VERSION
const QString ADJUSTMENT_LAYER

References KRA::ADJUSTMENT_LAYER, KisNodeFilterInterface::filter(), KRA::FILTER_NAME, KRA::FILTER_VERSION, KRA::LAYER, m_count, m_doc, m_elem, saveLayer(), and saveMasks().

◆ visit() [2/24]

virtual bool KisNodeVisitor::visit ( KisAdjustmentLayer * layer)
virtual

Implements KisNodeVisitor.

◆ visit() [3/24]

bool KisSaveXmlVisitor::visit ( KisCloneLayer * layer)
overridevirtual

Implements KisNodeVisitor.

Definition at line 222 of file kis_kra_savexml_visitor.cpp.

223{
224 QDomElement layerElement = m_doc.createElement(LAYER);
225 saveLayer(layerElement, CLONE_LAYER, layer);
226 layerElement.setAttribute(CLONE_FROM, layer->copyFromInfo().name());
227 layerElement.setAttribute(CLONE_FROM_UUID, layer->copyFromInfo().uuid().toString());
228 layerElement.setAttribute(CLONE_TYPE, layer->copyType());
229 m_elem.appendChild(layerElement);
230
231 m_count++;
232 return saveMasks(layer, layerElement);
233}
const QString CLONE_FROM
const QString CLONE_TYPE
const QString CLONE_FROM_UUID
const QString CLONE_LAYER
KisNodeUuidInfo copyFromInfo
CopyLayerType copyType() const

References KRA::CLONE_FROM, KRA::CLONE_FROM_UUID, KRA::CLONE_LAYER, KRA::CLONE_TYPE, KisCloneLayer::copyFromInfo, KisCloneLayer::copyType(), KRA::LAYER, m_count, m_doc, m_elem, KisNodeUuidInfo::name(), saveLayer(), saveMasks(), and KisNodeUuidInfo::uuid().

◆ visit() [4/24]

virtual bool KisNodeVisitor::visit ( KisCloneLayer * layer)
virtual

Implements KisNodeVisitor.

◆ visit() [5/24]

bool KisSaveXmlVisitor::visit ( KisColorizeMask * mask)
overridevirtual

Implements KisNodeVisitor.

Definition at line 275 of file kis_kra_savexml_visitor.cpp.

276{
277 Q_ASSERT(mask);
278 QDomElement el = m_doc.createElement(MASK);
279 saveMask(el, COLORIZE_MASK, mask);
280 m_elem.appendChild(el);
281 m_count++;
282 return true;
283}
void saveMask(QDomElement &el, const QString &maskType, const KisMaskSP mask)

References KRA::COLORIZE_MASK, m_count, m_doc, m_elem, MASK, and saveMask().

◆ visit() [6/24]

virtual bool KisNodeVisitor::visit ( KisColorizeMask * mask)
virtual

Implements KisNodeVisitor.

◆ visit() [7/24]

bool KisSaveXmlVisitor::visit ( KisExternalLayer * layer)
overridevirtual

Implements KisNodeVisitor.

Definition at line 66 of file kis_kra_savexml_visitor.cpp.

67{
68 if (layer->inherits("KisReferenceImagesLayer")) {
69 return saveReferenceImagesLayer(layer);
70 } else if (layer->inherits("KisShapeLayer")) {
71 QDomElement layerElement = m_doc.createElement(LAYER);
72 saveLayer(layerElement, SHAPE_LAYER, layer);
73 m_elem.appendChild(layerElement);
74 m_count++;
75 return saveMasks(layer, layerElement);
76 }
77 else if (layer->inherits("KisFileLayer")) {
78 QDomElement layerElement = m_doc.createElement(LAYER);
79 saveLayer(layerElement, FILE_LAYER, layer);
80
81 KisFileLayer *fileLayer = dynamic_cast<KisFileLayer*>(layer);
82 KIS_ASSERT(fileLayer);
83
84 QString path = fileLayer->path();
85
86 QDir d(QFileInfo(m_url).absolutePath());
87
88#ifndef Q_OS_ANDROID
89 layerElement.setAttribute("source", d.relativeFilePath(path));
90#else
91 layerElement.setAttribute("source", path);
92#endif
93
94 if (fileLayer->scalingMethod() == KisFileLayer::ToImagePPI) {
95 layerElement.setAttribute("scale", "true");
96 }
97 else {
98 layerElement.setAttribute("scale", "false");
99 }
100 layerElement.setAttribute("scalingmethod", (int)fileLayer->scalingMethod());
101 layerElement.setAttribute(COLORSPACE_NAME, layer->original()->colorSpace()->id());
102 layerElement.setAttribute("scalingfilter", fileLayer->scalingFilter());
103
104 m_elem.appendChild(layerElement);
105 m_count++;
106 return saveMasks(layer, layerElement);
107 }
108 return false;
109}
The KisFileLayer class loads a particular file as a layer into the layer stack.
QString path() const
ScalingMethod scalingMethod() const
QString scalingFilter() const
bool saveReferenceImagesLayer(KisExternalLayer *layer)
#define KIS_ASSERT(cond)
Definition kis_assert.h:33
const QString FILE_LAYER
KisPaintDeviceSP original() const override=0

References KisPaintDevice::colorSpace(), KRA::COLORSPACE_NAME, KRA::FILE_LAYER, KoColorSpace::id, KIS_ASSERT, KRA::LAYER, m_count, m_doc, m_elem, m_url, KisLayer::original(), KisFileLayer::path(), saveLayer(), saveMasks(), saveReferenceImagesLayer(), KisFileLayer::scalingFilter(), KisFileLayer::scalingMethod(), KRA::SHAPE_LAYER, and KisFileLayer::ToImagePPI.

◆ visit() [8/24]

virtual bool KisNodeVisitor::visit ( KisExternalLayer * layer)
virtual

Implements KisNodeVisitor.

◆ visit() [9/24]

bool KisSaveXmlVisitor::visit ( KisFilterMask * mask)
overridevirtual

Implements KisNodeVisitor.

Definition at line 235 of file kis_kra_savexml_visitor.cpp.

236{
237 Q_ASSERT(mask);
238 if (!mask->filter()) {
239 return false;
240 }
241 QDomElement el = m_doc.createElement(MASK);
242 saveMask(el, FILTER_MASK, mask);
243 el.setAttribute(FILTER_NAME, mask->filter()->name());
244 el.setAttribute(FILTER_VERSION, mask->filter()->version());
245
246 m_elem.appendChild(el);
247
248 m_count++;
249 return true;
250}
const QString FILTER_MASK

References KisNodeFilterInterface::filter(), KRA::FILTER_MASK, KRA::FILTER_NAME, KRA::FILTER_VERSION, m_count, m_doc, m_elem, MASK, and saveMask().

◆ visit() [10/24]

virtual bool KisNodeVisitor::visit ( KisFilterMask * mask)
virtual

Implements KisNodeVisitor.

◆ visit() [11/24]

bool KisSaveXmlVisitor::visit ( KisGeneratorLayer * layer)
overridevirtual

Implements KisNodeVisitor.

Definition at line 210 of file kis_kra_savexml_visitor.cpp.

211{
212 QDomElement layerElement = m_doc.createElement(LAYER);
213 saveLayer(layerElement, GENERATOR_LAYER, layer);
214 layerElement.setAttribute(GENERATOR_NAME, layer->filter()->name());
215 layerElement.setAttribute(GENERATOR_VERSION, layer->filter()->version());
216 m_elem.appendChild(layerElement);
217
218 m_count++;
219 return saveMasks(layer, layerElement);
220}
const QString GENERATOR_NAME
const QString GENERATOR_VERSION
const QString GENERATOR_LAYER

References KisNodeFilterInterface::filter(), KRA::GENERATOR_LAYER, KRA::GENERATOR_NAME, KRA::GENERATOR_VERSION, KRA::LAYER, m_count, m_doc, m_elem, saveLayer(), and saveMasks().

◆ visit() [12/24]

virtual bool KisNodeVisitor::visit ( KisGeneratorLayer * layer)
virtual

Implements KisNodeVisitor.

◆ visit() [13/24]

bool KisSaveXmlVisitor::visit ( KisGroupLayer * layer)
overridevirtual

Implements KisNodeVisitor.

Definition at line 153 of file kis_kra_savexml_visitor.cpp.

154{
155 QDomElement layerElement;
156
157 if (m_root) // if this is the root we fake so not to save it
158 layerElement = m_elem;
159 else {
160 layerElement = m_doc.createElement(LAYER);
161 saveLayer(layerElement, GROUP_LAYER, layer);
162 layerElement.setAttribute(PASS_THROUGH_MODE, layer->passThroughMode());
163 layerElement.setAttribute(COLORSPACE_NAME, layer->colorSpace()->id());
164 layerElement.setAttribute(PROFILE, layer->colorSpace()->profile()->name());
165 m_elem.appendChild(layerElement);
166 }
167 QDomElement elem = m_doc.createElement(LAYERS);
168 Q_ASSERT(!layerElement.isNull());
169 layerElement.appendChild(elem);
170 KisSaveXmlVisitor visitor(m_doc, elem, m_count, m_url, false);
171 visitor.setSelectedNodes(m_selectedNodes);
172 m_count++;
173 bool success = visitor.visitAllInverse(layer);
174
175 m_errorMessages.append(visitor.errorMessages());
176 if (!m_errorMessages.isEmpty()) {
177 return false;
178 }
179
180 QMapIterator<const KisNode*, QString> i(visitor.nodeFileNames());
181 while (i.hasNext()) {
182 i.next();
183 m_nodeFileNames[i.key()] = i.value();
184 }
185
186 i = QMapIterator<const KisNode*, QString>(visitor.keyframeFileNames());
187 while (i.hasNext()) {
188 i.next();
189 m_keyframeFileNames[i.key()] = i.value();
190 }
191
192 return success;
193}
virtual const KoColorProfile * profile() const =0
const QString PASS_THROUGH_MODE
const QString GROUP_LAYER
const QString LAYERS
const QString PROFILE
const KoColorSpace * colorSpace() const override

References KisGroupLayer::colorSpace(), KRA::COLORSPACE_NAME, errorMessages(), KRA::GROUP_LAYER, KoColorSpace::id, keyframeFileNames(), KRA::LAYER, KRA::LAYERS, m_count, m_doc, m_elem, m_errorMessages, m_keyframeFileNames, m_nodeFileNames, m_root, m_selectedNodes, m_url, KoColorProfile::name, nodeFileNames(), KRA::PASS_THROUGH_MODE, KisGroupLayer::passThroughMode, KoColorSpace::profile(), KRA::PROFILE, saveLayer(), setSelectedNodes(), and KisNodeVisitor::visitAllInverse().

◆ visit() [14/24]

virtual bool KisNodeVisitor::visit ( KisGroupLayer * layer)
virtual

Implements KisNodeVisitor.

◆ visit() [15/24]

bool KisSaveXmlVisitor::visit ( KisNode * )
inlineoverridevirtual

Implements KisNodeVisitor.

Definition at line 31 of file kis_kra_savexml_visitor.h.

31 {
32 return true;
33 }

◆ visit() [16/24]

virtual bool KisNodeVisitor::visit ( KisNode * node)
virtual

Implements KisNodeVisitor.

◆ visit() [17/24]

bool KisSaveXmlVisitor::visit ( KisPaintLayer * layer)
overridevirtual

Implements KisNodeVisitor.

Definition at line 145 of file kis_kra_savexml_visitor.cpp.

146{
147 QDomElement layerElement = savePaintLayerAttributes(layer, m_doc, true);
148 m_elem.appendChild(layerElement);
149 m_count++;
150 return saveMasks(layer, layerElement);
151}
QDomElement savePaintLayerAttributes(KisPaintLayer *layer, QDomDocument &doc, bool saveLayerOffset)

References m_count, m_doc, m_elem, saveMasks(), and savePaintLayerAttributes().

◆ visit() [18/24]

virtual bool KisNodeVisitor::visit ( KisPaintLayer * layer)
virtual

Implements KisNodeVisitor.

◆ visit() [19/24]

bool KisSaveXmlVisitor::visit ( KisSelectionMask * mask)
overridevirtual

Implements KisNodeVisitor.

Definition at line 285 of file kis_kra_savexml_visitor.cpp.

286{
287 Q_ASSERT(mask);
288
289 QDomElement el = m_doc.createElement(MASK);
290 saveMask(el, SELECTION_MASK, mask);
291 m_elem.appendChild(el);
292 m_count++;
293 return true;
294}

References m_count, m_doc, m_elem, MASK, saveMask(), and KRA::SELECTION_MASK.

◆ visit() [20/24]

virtual bool KisNodeVisitor::visit ( KisSelectionMask * mask)
virtual

Implements KisNodeVisitor.

◆ visit() [21/24]

bool KisSaveXmlVisitor::visit ( KisTransformMask * mask)
overridevirtual

Implements KisNodeVisitor.

Definition at line 252 of file kis_kra_savexml_visitor.cpp.

253{
254 Q_ASSERT(mask);
255
256 QDomElement el = m_doc.createElement(MASK);
257 saveMask(el, TRANSFORM_MASK, mask);
258
259 m_elem.appendChild(el);
260
261 m_count++;
262 return true;
263}
const QString TRANSFORM_MASK

References m_count, m_doc, m_elem, MASK, saveMask(), and KRA::TRANSFORM_MASK.

◆ visit() [22/24]

virtual bool KisNodeVisitor::visit ( KisTransformMask * mask)
virtual

Implements KisNodeVisitor.

◆ visit() [23/24]

bool KisSaveXmlVisitor::visit ( KisTransparencyMask * mask)
overridevirtual

Implements KisNodeVisitor.

Definition at line 265 of file kis_kra_savexml_visitor.cpp.

266{
267 Q_ASSERT(mask);
268 QDomElement el = m_doc.createElement(MASK);
269 saveMask(el, TRANSPARENCY_MASK, mask);
270 m_elem.appendChild(el);
271 m_count++;
272 return true;
273}
const QString TRANSPARENCY_MASK

References m_count, m_doc, m_elem, MASK, saveMask(), and KRA::TRANSPARENCY_MASK.

◆ visit() [24/24]

virtual bool KisNodeVisitor::visit ( KisTransparencyMask * mask)
virtual

Implements KisNodeVisitor.

Friends And Related Symbol Documentation

◆ KisKraSaveXmlVisitorTest

friend class KisKraSaveXmlVisitorTest
friend

Definition at line 70 of file kis_kra_savexml_visitor.h.

Member Data Documentation

◆ m_count

quint32& KisSaveXmlVisitor::m_count
private

Definition at line 77 of file kis_kra_savexml_visitor.h.

◆ m_doc

QDomDocument KisSaveXmlVisitor::m_doc
private

Definition at line 75 of file kis_kra_savexml_visitor.h.

◆ m_elem

QDomElement KisSaveXmlVisitor::m_elem
private

Definition at line 76 of file kis_kra_savexml_visitor.h.

◆ m_errorMessages

QStringList KisSaveXmlVisitor::m_errorMessages
private

Definition at line 80 of file kis_kra_savexml_visitor.h.

◆ m_keyframeFileNames

QMap<const KisNode*, QString> KisSaveXmlVisitor::m_keyframeFileNames
private

Definition at line 74 of file kis_kra_savexml_visitor.h.

◆ m_nodeFileNames

QMap<const KisNode*, QString> KisSaveXmlVisitor::m_nodeFileNames
private

Definition at line 73 of file kis_kra_savexml_visitor.h.

◆ m_root

bool KisSaveXmlVisitor::m_root
private

Definition at line 79 of file kis_kra_savexml_visitor.h.

◆ m_selectedNodes

vKisNodeSP KisSaveXmlVisitor::m_selectedNodes
private

Definition at line 72 of file kis_kra_savexml_visitor.h.

◆ m_url

QString KisSaveXmlVisitor::m_url
private

Definition at line 78 of file kis_kra_savexml_visitor.h.


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