Krita Source Code Documentation
Loading...
Searching...
No Matches
KisSeExprScript.cpp
Go to the documentation of this file.
1/*
2 * This file is part of Krita
3 *
4 * SPDX-FileCopyrightText: 2020 L. E. Segovia <amy@amyspark.me>
5 *
6 * SPDX-License-Identifier: GPL-2.0-or-later
7 */
8
9#include <FlakeDebug.h>
10#include <KoStore.h>
11#include <KoStoreDevice.h>
12#include <QBuffer>
13#include <QDir>
14#include <QFileInfo>
15#include <QTextDecoder>
16#include <kis_assert.h>
17
18#include "KisSeExprScript.h"
19
21 QString script;
22 QByteArray data;
23};
24
25KisSeExprScript::KisSeExprScript(const QString &filename)
26 : KoResource(filename)
27 , d(new Private)
28{
29 setName(name().replace("_", " "));
30 if (name().endsWith(defaultFileExtension())) {
31 const QFileInfo f(name());
32 setName(f.completeBaseName());
33 }
34}
35
36KisSeExprScript::KisSeExprScript(const QImage &image, const QString &script, const QString &name, const QString &folderName)
37 : KoResource(QString())
38 , d(new Private)
39{
43
44 QFileInfo fileInfo(folderName + QDir::separator() + name + defaultFileExtension());
45
46 int i = 1;
47 while (fileInfo.exists()) {
48 fileInfo.setFile(folderName + QDir::separator() + name + QString::number(i) + defaultFileExtension());
49 i++;
50 }
51
52 setFilename(fileInfo.filePath());
53}
54
59
61 : KoResource(rhs)
62 , d(new Private)
63{
65 // only valid if we could clone the settings
66 setScript(rhs.script());
67 setValid(rhs.valid());
68}
69
74
75bool KisSeExprScript::loadFromDevice(QIODevice *dev, KisResourcesInterfaceSP resourcesInterface)
76{
77 Q_UNUSED(resourcesInterface);
78
79 if (!dev->isOpen())
80 dev->open(QIODevice::ReadOnly);
81
82 d->data = dev->readAll();
83
84 // TODO: test
85 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(d->data.size() != 0, false);
86
87 if (filename().isNull()) {
88 warnFlake << "Cannot load SeExpr script" << name() << ", there is no filename set";
89 return false;
90 }
91
92 if (d->data.isNull()) {
93 QFile file(filename());
94 if (file.size() == 0) {
95 warnFlake << "Cannot load SeExpr script" << name() << "there is no data available";
96 return false;
97 }
98
99 if (!file.open(QIODevice::ReadOnly)) {
100 warnFlake << "Cannot load SeExpr script" << name() << ":" << file.errorString();
101 return false;
102 }
103 d->data = file.readAll();
104 file.close();
105 }
106
107 QBuffer buf(&d->data);
108 buf.open(QBuffer::ReadOnly);
109
110 QScopedPointer<KoStore> store(KoStore::createStore(&buf, KoStore::Read, "application/x-krita-seexpr-script", KoStore::Zip));
111 if (!store || store->bad())
112 return false;
113
114 bool storeOpened = store->open("script.se");
115 if (!storeOpened) {
116 return false;
117 }
118
119 d->script = QString(store->read(store->size()));
120 store->close();
121
122 if (store->open("preview.png")) {
123 KoStoreDevice previewDev(store.data());
124 previewDev.open(QIODevice::ReadOnly);
125
126 QImage preview = QImage();
127 preview.load(&previewDev, "PNG");
128 setImage(preview);
129
130 (void)store->close();
131 }
132
133 buf.close();
134
135 setValid(true);
136 setDirty(false);
137
138 return true;
139}
140
141bool KisSeExprScript::saveToDevice(QIODevice *dev) const
142{
143 KoStore *store(KoStore::createStore(dev, KoStore::Write, "application/x-krita-seexpr-script", KoStore::Zip));
144 if (!store || store->bad())
145 return false;
146
147 if (!store->open("script.se")) {
148 return false;
149 }
150
151 KoStoreDevice storeDev(store);
152 storeDev.open(QIODevice::WriteOnly);
153
154 storeDev.write(d->script.toUtf8());
155
156 if (!store->close()) {
157 return false;
158 }
159
160 if (!store->open("preview.png")) {
161 return false;
162 }
163
164 KoStoreDevice previewDev(store);
165 previewDev.open(QIODevice::WriteOnly);
166
167 image().save(&previewDev, "PNG");
168 if (!store->close()) {
169 return false;
170 }
171
172 return store->finalize();
173}
174
175QPair<QString, QString> KisSeExprScript::resourceType() const
176{
177 return QPair<QString, QString>(ResourceType::SeExprScripts, "");
178}
179
181{
182 return QString(".kse");
183}
184
186{
187 return d->script;
188}
189
190void KisSeExprScript::setScript(const QString &script)
191{
192 d->script = script;
193}
194
196{
197 return KoResourceSP(new KisSeExprScript(*this));
198}
199
201{
202 return KoResource::name().replace("_", " ");
203}
#define warnFlake
Definition FlakeDebug.h:16
void setScript(const QString &script)
set SeExpr expression script
QString name() const override
QString defaultFileExtension() const override
bool loadFromDevice(QIODevice *dev, KisResourcesInterfaceSP resourcesInterface) override
KoResourceSP clone() const override
Private *const d
KisSeExprScript(const QString &filename)
QPair< QString, QString > resourceType() const override
QString script() const
script the actual script
bool saveToDevice(QIODevice *dev) const override
bool open(OpenMode m) override
bool close()
Definition KoStore.cpp:156
@ Read
Definition KoStore.h:29
@ Write
Definition KoStore.h:29
@ Zip
Definition KoStore.h:30
bool bad() const
Definition KoStore.cpp:414
static KoStore * createStore(const QString &fileName, Mode mode, const QByteArray &appIdentification=QByteArray(), Backend backend=Auto, bool writeMimetype=true)
Definition KoStore.cpp:39
bool finalize()
Definition KoStore.cpp:395
bool open(const QString &name)
Definition KoStore.cpp:109
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130
typedef void(QOPENGLF_APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer)
QSharedPointer< KoResource > KoResourceSP
const QString SeExprScripts
void setValid(bool valid)
void setName(const QString &name)
QImage image
void setFilename(const QString &filename)
QString filename
void setDirty(bool value)
Mark the preset as modified but not saved.
void setImage(const QImage &image)
bool isDirty() const
QString name