File indexing completed on 2024-06-09 04:27:49

0001 /*
0002  *  SPDX-FileCopyrightText: 2016 Boudewijn Rempt <boud@valdyas.org>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #ifndef _KIS_SPRITER_EXPORT_H_
0008 #define _KIS_SPRITER_EXPORT_H_
0009 
0010 #include <QVariant>
0011 #include <QDomDocument>
0012 #include <QList>
0013 
0014 #include <KisImportExportFilter.h>
0015 #include <kis_types.h>
0016 
0017 struct SpriterFile {
0018     qreal id {0.0};
0019     QString name;
0020     QString pathName;
0021     QString baseName;
0022     QString layerName;
0023     qreal width {0.0};
0024     qreal height {0.0};
0025     qreal x {0.0};
0026     qreal y {0.0};
0027 };
0028 
0029 struct Folder {
0030     qreal id {0.0};
0031     QString name;
0032     QString pathName;
0033     QString baseName;
0034     QString groupName;
0035     QList<SpriterFile> files;
0036 };
0037 
0038 struct Bone {
0039     qreal id {0.0};
0040     const Bone *parentBone {nullptr};
0041     QString name;
0042     qreal x {0.0};
0043     qreal y {0.0};
0044     qreal width {0.0};
0045     qreal height {0.0};
0046     qreal localX {0.0};
0047     qreal localY {0.0};
0048     qreal localAngle {0.0};
0049     qreal localScaleX {0.0};
0050     qreal localScaleY {0.0};
0051     qreal fixLocalX {0.0};
0052     qreal fixLocalY {0.0};
0053     qreal fixLocalAngle {0.0};
0054     qreal fixLocalScaleX {0.0};
0055     qreal fixLocalScaleY {0.0};
0056     QList<Bone*> bones;
0057 
0058     ~Bone() {
0059         qDeleteAll(bones);
0060         bones.clear();
0061     }
0062 };
0063 
0064 struct SpriterSlot {
0065     QString name;
0066     bool defaultAttachmentFlag = false;
0067 };
0068 
0069 struct SpriterObject {
0070     qreal id {0.0};
0071     qreal folderId {0.0};
0072     qreal fileId {0.0};
0073     Bone *bone {nullptr};
0074     SpriterSlot *slot {nullptr};
0075     qreal x {0.0};
0076     qreal y {0.0};
0077     qreal localX {0.0};
0078     qreal localY {0.0};
0079     qreal localAngle {0.0};
0080     qreal localScaleX {0.0};
0081     qreal localScaleY {0.0};
0082     qreal fixLocalX {0.0};
0083     qreal fixLocalY {0.0};
0084     qreal fixLocalAngle {0.0};
0085     qreal fixLocalScaleX {0.0};
0086     qreal fixLocalScaleY {0.0};
0087 
0088     ~SpriterObject() {
0089         delete slot;
0090     }
0091 };
0092 
0093 class KisSpriterExport : public KisImportExportFilter
0094 {
0095     Q_OBJECT
0096 public:
0097     KisSpriterExport(QObject *parent, const QVariantList &);
0098     ~KisSpriterExport() override;
0099     bool supportsIO() const override { return false; }
0100     KisImportExportErrorCode convert(KisDocument *document, QIODevice *io,  KisPropertiesConfigurationSP configuration = 0) override;
0101     void initializeCapabilities() override;
0102 private:
0103 
0104     KisImportExportErrorCode savePaintDevice(KisPaintDeviceSP dev, const QString &fileName);
0105     KisImportExportErrorCode parseFolder(KisGroupLayerSP parentGroup, const QString &folderName, const QString &basePath, int *folderId = 0);
0106     Bone *parseBone(const Bone *parent, KisGroupLayerSP groupLayer);
0107     void fixBone(Bone *bone);
0108     void fillScml(QDomDocument &scml, const QString &entityName);
0109     void writeBoneRef(const Bone *bone, QDomElement &mainline, QDomDocument &scml);
0110     void writeBone(const Bone *bone, QDomElement &timeline, QDomDocument &scml);
0111 
0112     KisImageSP m_image;
0113     qreal m_timelineid {0.0};
0114     QList<Folder> m_folders;
0115     Bone *m_rootBone {nullptr};
0116     QList<SpriterObject> m_objects;
0117     KisGroupLayerSP m_rootLayer; // Not the image's root later, but the one that is named "root"
0118     KisLayerSP m_boneLayer;
0119 
0120 };
0121 
0122 #endif