Krita Source Code Documentation
Loading...
Searching...
No Matches
KisSaveGroupVisitor.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2016 Boudewijn Rempt <boud@valdyas.org>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
7
8#include <KisDocument.h>
9#include <kis_painter.h>
10#include <kis_paint_layer.h>
11#include <KisPart.h>
12
14 bool saveInvisible,
15 bool saveTopLevelOnly,
16 const QString &path,
17 const QString &baseName,
18 const QString &extension,
19 const QString &mimeFilter)
20 : m_image(image)
21 , m_saveInvisible(saveInvisible)
22 , m_saveTopLevelOnly(saveTopLevelOnly)
23 , m_path(path)
24 , m_baseName(baseName)
25 , m_extension(extension)
26 , m_mimeFilter(mimeFilter)
27{
28}
29
33
35 return true;
36}
37
39 return true;
40}
41
43 return true;
44}
45
47 return true;
48}
49
50
52 return true;
53}
54
55
57 return true;
58}
59
61 return true;
62}
63
65 return true;
66}
67
69 return true;
70}
71
73 return true;
74}
75
77 return true;
78}
79
81{
82 if (layer == m_image->rootLayer()) {
83 KisLayerSP child = qobject_cast<KisLayer*>(layer->firstChild().data());
84 while (child) {
85 child->accept(*this);
86 child = qobject_cast<KisLayer*>(child->nextSibling().data());
87 }
88
89 }
90 else if (layer->visible() || m_saveInvisible) {
91
92 QRect r = m_image->bounds();
93
94 KisDocument *exportDocument = KisPart::instance()->createDocument();
95 { // make sure dst is deleted before calling 'delete exportDocument',
96 // since KisDocument checks that its image is properly deref()'d.
97 KisImageSP dst = new KisImage(exportDocument->createUndoStore(), r.width(), r.height(), m_image->colorSpace(), layer->name());
99 exportDocument->setCurrentImage(dst);
100 KisPaintLayer* paintLayer = new KisPaintLayer(dst, "projection", layer->opacity());
101 KisPainter gc(paintLayer->paintDevice());
102 gc.bitBlt(QPoint(0, 0), layer->projection(), r);
103 dst->addNode(paintLayer, dst->rootLayer(), KisLayerSP(0));
104
105 dst->initialRefreshGraph();
106 }
107
108 QString path = m_path + "/" + m_baseName + "_" + layer->name().replace(' ', '_') + '.' + m_extension;
109
110 exportDocument->setFileBatchMode(true);
111 exportDocument->exportDocumentSync(path, m_mimeFilter.toLatin1());
112
113 if (!m_saveTopLevelOnly) {
114 KisGroupLayerSP child = dynamic_cast<KisGroupLayer*>(layer->firstChild().data());
115 while (child) {
116 child->accept(*this);
117 child = dynamic_cast<KisGroupLayer*>(child->nextSibling().data());
118 }
119 }
120 delete exportDocument;
121 }
122
123 return true;
124}
125
126
KisUndoStore * createUndoStore()
void setFileBatchMode(const bool batchMode)
bool exportDocumentSync(const QString &path, const QByteArray &mimeType, KisPropertiesConfigurationSP exportConfiguration=0)
void setCurrentImage(KisImageSP image, bool forceInitialUpdate=true, KisNodeSP preActivatedNode=nullptr)
KisGroupLayerSP rootLayer() const
const KoColorSpace * colorSpace() const
void initialRefreshGraph()
double xRes() const
double yRes() const
QRect bounds() const override
void setResolution(double xres, double yres)
void bitBlt(qint32 dstX, qint32 dstY, const KisPaintDeviceSP srcDev, qint32 srcX, qint32 srcY, qint32 srcWidth, qint32 srcHeight)
static KisPart * instance()
Definition KisPart.cpp:131
KisDocument * createDocument() const
Definition KisPart.cpp:230
bool visit(KisNode *) override
KisSaveGroupVisitor(KisImageWSP image, bool saveInvisible, bool saveTopLevelOnly, const QString &path, const QString &baseName, const QString &extension, const QString &mimeFilter)
QString name() const
quint8 opacity() const
virtual bool visible(bool recursive=false) const
bool accept(KisNodeVisitor &v) override
KisPaintDeviceSP projection() const override
Definition kis_layer.cc:820
bool addNode(KisNodeSP node, KisNodeSP parent=KisNodeSP(), KisNodeAdditionFlags flags=KisNodeAdditionFlag::None)
KisNodeSP firstChild() const
Definition kis_node.cpp:361
bool accept(KisNodeVisitor &v) override
Definition kis_node.cpp:269
KisNodeSP nextSibling() const
Definition kis_node.cpp:408
KisPaintDeviceSP paintDevice