11#include <QVersionNumber>
30 , m_image(doc->savingImage())
36 , m_image(doc->savingImage())
53 if (node->inherits(
"KisCloneLayer")) {
90 errUI <<
"ERROR: No maindoc.xml" << Qt::endl;
98 if (resultHere.
isOk()) {
157 if (!resultCode.
isOk()) {
167 qWarning() <<
"saving key frames failed";
173 qWarning() <<
"saving binary data failed";
179 qWarning() <<
"saving resources data failed";
185 qWarning() <<
"Saving storyboard data failed";
191 qWarning() <<
"Saving animation metadata failed";
197 qWarning() <<
"Saving audio data failed";
219 if (store->
open(
"root")) {
222 dbgUI <<
"saveToStream failed";
226 m_doc->
setErrorMessage(i18n(
"Not able to write '%1'. Partition full?", QString(
"maindoc.xml")));
230 if (store->
open(
"documentinfo.xml")) {
232 ,
"document-info" ,
"1.1");
235 QByteArray s = doc.toByteArray();
236 bool success = dev.write(s.data(), s.size());
245 if (store->
open(
"preview.png")) {
249 if (!result.
isOk()) {
264 QByteArray s = doc.toByteArray();
265 dev->open(QIODevice::WriteOnly);
266 int nwritten = dev->write(s.data(), s.size());
267 if (nwritten != (
int)s.size()) {
268 warnUI <<
"wrote " << nwritten <<
"- expected" << s.size();
270 return nwritten == (int)s.size();
276 QDomElement root = doc.documentElement();
278 root.setAttribute(
"editor",
"Krita");
293 QImage preview(pix.toImage().convertToFormat(QImage::Format_ARGB32, Qt::ColorOnly));
294 if (preview.size().isEmpty()) {
297 newSize = newSize.scaled(QSize(256, 256), Qt::KeepAspectRatio).expandedTo({1, 1});
298 preview = QImage(newSize, QImage::Format_ARGB32);
299 preview.fill(QColor(0, 0, 0, 0));
303 if (!io.
open(QIODevice::WriteOnly)) {
306 bool ret = preview.save(&io,
"PNG");
316 if (!store->
open(filename)) {
317 warnUI <<
"Entry " << filename <<
" not found!";
323 int errorLine, errorColumn;
324 bool ok = xmldoc.setContent(store->
device(), &errorMsg, &errorLine, &errorColumn);
327 errUI <<
"Parsing error in " << filename <<
"! Aborting!" << Qt::endl
328 <<
" In line: " << errorLine <<
", column: " << errorColumn << Qt::endl
329 <<
" Error message: " << errorMsg << Qt::endl;
331 filename, errorLine, errorColumn,
332 QCoreApplication::translate(
"QXml", errorMsg.toUtf8(), 0)));
335 dbgUI <<
"File" << filename <<
" loaded and parsed";
346 if (doc.doctype().name() !=
"DOC") {
347 errUI <<
"The format is not supported or the file is corrupted";
351 root = doc.documentElement();
353 QString versionTag = root.attribute(
"syntaxVersion",
"3.0");
354 QVersionNumber parsedVersionNumber = QVersionNumber::fromString(versionTag);
355 const int syntaxVersion = parsedVersionNumber.isNull() ? 3 : parsedVersionNumber.majorVersion();
357 if (syntaxVersion > 2) {
358 errUI <<
"The file is too new for this version of Krita:" << syntaxVersion;
359 m_doc->
setErrorMessage(i18n(
"The file is too new for this version of Krita (%1).", syntaxVersion));
363 if (!root.hasChildNodes()) {
364 errUI <<
"The file has no layers.";
369 QString kritaVersionTag = root.attribute(
"kritaVersion",
"6.0");
370 QVersionNumber kritaVersionNumber = QVersionNumber::fromString(kritaVersionTag);
371 if (kritaVersionNumber.isNull()) {
380 for (node = root.firstChild(); !node.isNull(); node = node.nextSibling()) {
381 if (node.isElement()) {
382 if (node.nodeName() ==
"IMAGE") {
383 QDomElement elem = node.toElement();
387 errUI <<
"Unknown error while opening the .kra file.";
431 if (entry.contains(
"/layers/")) {
432 layerPathName = entry.split(
"/layers/").first();
KoDocumentInfo * documentInfo() const
void hackPreliminarySetImage(KisImageSP image)
QPixmap generatePreview(const QSize &size)
Generates a preview picture of the document.
QString localFilePath() const
void setErrorMessage(const QString &errMsg)
QDomDocument createDomDocument(const QString &tagName, const QString &version) const
void setWarningMessage(const QString &warningMsg)
static QByteArray nativeFormatMimeType()
void setCurrentImage(KisImageSP image, bool forceInitialUpdate=true, KisNodeSP preActivatedNode=nullptr)
void disableDirtyRequests() override
void enableDirtyRequests() override
QRect bounds() const override
KisImageSP loadXML(const QDomElement &imageElement)
void loadAnimationMetadata(KoStore *store, KisImageSP image)
QStringList errorMessages() const
if empty, loading didn't fail...
void loadStoryboards(KoStore *store, KisDocument *doc)
QString imageName() const
QStringList warningMessages() const
if not empty, loading didn't fail, but there are problems
void loadBinaryData(KoStore *store, KisImageSP image, const QString &uri, bool external)
vKisNodeSP selectedNodes() const
void loadResources(KoStore *store, KisDocument *doc)
StoryboardItemList storyboardItemList() const
QList< KisPaintingAssistantSP > assistants() const
StoryboardCommentList storyboardCommentList() const
void loadAudio(KoStore *store, KisDocument *kisDoc)
bool saveKeyframes(KoStore *store, const QString &uri, bool external)
QStringList errorMessages() const
QDomElement saveXML(QDomDocument &doc, KisImageSP image)
bool saveAnimationMetadata(KoStore *store, KisImageSP image, const QString &uri)
bool saveResources(KoStore *store, KisImageSP image, const QString &uri)
bool saveBinaryData(KoStore *store, KisImageSP image, const QString &uri, bool external, bool addMergedImage)
bool saveAudio(KoStore *store)
bool saveStoryboard(KoStore *store, KisImageSP image, const QString &uri)
QStringList warningMessages() const
bool load(const QDomDocument &doc)
QDomDocument save(QDomDocument &doc)
bool open(OpenMode m) override
QIODevice * device() const
void setSubstitution(const QString &name, const QString &substitution)
When reading, in the paths in the store where name occurs, substitution is used.
virtual QStringList directoryList() const
static KoStore * createStore(const QString &fileName, Mode mode, const QByteArray &appIdentification=QByteArray(), Backend backend=Auto, bool writeMimetype=true)
bool hasFile(const QString &fileName) const
bool open(const QString &name)
bool hasDirectory(const QString &directoryName)
StoryboardCommentList storyboardCommentList()
KisImportExportErrorCode buildImage(QIODevice *io)
bool completeLoading(KoStore *store)
KisImportExportErrorCode buildFile(QIODevice *io, const QString &filename, bool addMergedImage=true)
QList< KisPaintingAssistantSP > assistants()
KraConverter(KisDocument *doc)
KisImportExportErrorCode saveRootDocuments(KoStore *store)
StoryboardCommentList m_storyboardCommentList
QList< KisPaintingAssistantSP > m_assistants
StoryboardItemList m_storyboardItemList
void setProgress(int progress)
QPointer< KoUpdater > m_updater
QDomDocument createDomDocument()
StoryboardItemList storyboardItemList()
KisKraLoader * m_kraLoader
KisImportExportErrorCode oldLoadAndParse(KoStore *store, const QString &filename, QDomDocument &xmldoc)
bool saveToStream(QIODevice *dev)
KisImportExportErrorCode loadXML(const QDomDocument &doc, KoStore *store)
KisImportExportErrorCode savePreview(KoStore *store)
typedef void(QOPENGLF_APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer)
void fixCloneLayers(KisImageSP image, KisNodeSP root)
static const char CURRENT_DTD_VERSION[]
@ FormatFeaturesUnsupported
KRITAVERSION_EXPORT QString versionString(bool checkGit=false)
KisLayerSP reincarnateAsPaintLayer() const
bool addNode(KisNodeSP node, KisNodeSP parent=KisNodeSP(), KisNodeAdditionFlags flags=KisNodeAdditionFlag::None)
bool removeNode(KisNodeSP node)
KisNodeSP prevSibling() const
KisNodeSP firstChild() const
quint32 childCount() const
KisNodeSP nextSibling() const