Pencil2D Animation
Download Community News Docs Contribute
  • Overview
  • Articles
  • Code
  •  
  • Class List
  • Class Index
  • Class Hierarchy
  • Class Members
  • File List
Loading...
Searching...
No Matches
  • core_lib
  • src
  • structure
layervector.cpp
1/*
2
3Pencil2D - Traditional Animation Software
4Copyright (C) 2005-2007 Patrick Corrieri & Pascal Naidon
5Copyright (C) 2012-2020 Matthew Chiawen Chang
6
7This program is free software; you can redistribute it and/or
8modify it under the terms of the GNU General Public License
9as published by the Free Software Foundation; version 2 of the License.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16*/
17#include "layervector.h"
18
19#include "vectorimage.h"
20#include <QDir>
21#include <QFile>
22#include <QFileInfo>
23#include "util/util.h"
24
25LayerVector::LayerVector(int id) : Layer(id, Layer::VECTOR)
26{
27 setName(tr("Vector Layer"));
28}
29
30LayerVector::~LayerVector()
31{
32}
33
34bool LayerVector::usesColor(int colorIndex)
35{
36 bool bUseColor = false;
37 foreachKeyFrame([&](KeyFrame* pKeyFrame)
38 {
39 auto pVecImage = static_cast<VectorImage*>(pKeyFrame);
40
41 bUseColor = bUseColor || pVecImage->usesColor(colorIndex);
42 });
43
44 return bUseColor;
45}
46
47void LayerVector::removeColor(int colorIndex)
48{
49 foreachKeyFrame([=](KeyFrame* pKeyFrame)
50 {
51 auto pVecImage = static_cast<VectorImage*>(pKeyFrame);
52 pVecImage->removeColor(colorIndex);
53 });
54}
55
56void LayerVector::moveColor(int start, int end)
57{
58 foreachKeyFrame( [=] (KeyFrame* pKeyFrame)
59 {
60 auto pVecImage = static_cast<VectorImage*>(pKeyFrame);
61 pVecImage->moveColor(start, end);
62 });
63}
64
65void LayerVector::loadImageAtFrame(QString path, int frameNumber)
66{
67 if (keyExists(frameNumber))
68 {
69 removeKeyFrame(frameNumber);
70 }
71 VectorImage* vecImg = new VectorImage;
72 vecImg->setPos(frameNumber);
73 vecImg->read(path);
74 addKeyFrame(frameNumber, vecImg);
75}
76
77Status LayerVector::saveKeyFrameFile(KeyFrame* keyFrame, QString path)
78{
79 QString theFileName = fileName(keyFrame);
80 QString strFilePath = QDir(path).filePath(theFileName);
81
82 VectorImage* vecImage = static_cast<VectorImage*>(keyFrame);
83
84 if (needSaveFrame(keyFrame, strFilePath) == false)
85 {
86 return Status::SAFE;
87 }
88
89 Status st = vecImage->write(strFilePath, "VEC");
90 if (!st.ok())
91 {
92 vecImage->setFileName("");
93
94 DebugDetails dd;
95 dd << "LayerVector::saveKeyFrameFile";
96 dd << QString(" KeyFrame.pos() = %1").arg(keyFrame->pos());
97 dd << QString(" strFilePath = ").append(strFilePath);
98 dd << "Error: Failed to save VectorImage";
99 dd.collect(st.details());
100 return Status(Status::FAIL, dd);
101 }
102
103 vecImage->setFileName(strFilePath);
104 vecImage->setModified(false);
105 return Status::OK;
106}
107
108KeyFrame* LayerVector::createKeyFrame(int position)
109{
110 VectorImage* v = new VectorImage;
111 v->setPos(position);
112 return v;
113}
114
115QString LayerVector::fileName(KeyFrame* key) const
116{
117 return QString::asprintf("%03d.%03d.vec", id(), key->pos());
118}
119
120bool LayerVector::needSaveFrame(KeyFrame* key, const QString& strSavePath)
121{
122 if (key->isModified()) // keyframe was modified
123 return true;
124 if (QFile::exists(strSavePath) == false) // hasn't been saved before
125 return true;
126 if (strSavePath != key->fileName()) // key frame moved
127 return true;
128 return false;
129}
130
131QDomElement LayerVector::createDomElement(QDomDocument& doc) const
132{
133 QDomElement layerElem = createBaseDomElement(doc);
134
135 foreachKeyFrame([&](KeyFrame* keyframe)
136 {
137 QDomElement imageTag = doc.createElement("image");
138 imageTag.setAttribute("frame", keyframe->pos());
139 imageTag.setAttribute("src", fileName(keyframe));
140 VectorImage* image = getVectorImageAtFrame(keyframe->pos());
141 imageTag.setAttribute("opacity", image->getOpacity());
142 layerElem.appendChild(imageTag);
143
144 Q_ASSERT(QFileInfo(keyframe->fileName()).fileName() == fileName(keyframe));
145 });
146
147 return layerElem;
148}
149
150void LayerVector::loadDomElement(const QDomElement& element, QString dataDirPath, ProgressCallback progressStep)
151{
152 this->loadBaseDomElement(element);
153
154 QDomNode imageTag = element.firstChild();
155 while (!imageTag.isNull())
156 {
157 QDomElement imageElement = imageTag.toElement();
158 if (!imageElement.isNull() && imageElement.tagName() == "image")
159 {
160 int position;
161 QString rawPath = imageElement.attribute("src");
162 if (!rawPath.isNull())
163 {
164 QString path = validateDataPath(rawPath, dataDirPath);
165 if (!path.isEmpty())
166 {
167 position = imageElement.attribute("frame").toInt();
168 loadImageAtFrame(path, position);
169 getVectorImageAtFrame(position)->setOpacity(imageElement.attribute("opacity", "1.0").toDouble());
170 }
171 }
172 else
173 {
174 position = imageElement.attribute("frame").toInt();
175 addNewKeyFrameAt(position);
176 getVectorImageAtFrame(position)->loadDomElement(imageElement);
177 getVectorImageAtFrame(position)->setOpacity(imageElement.attribute("opacity", "1.0").toDouble());
178 }
179
180
181
182 progressStep();
183 }
184 imageTag = imageTag.nextSibling();
185 }
186}
187
188VectorImage* LayerVector::getVectorImageAtFrame(int frameNumber) const
189{
190 return static_cast<VectorImage*>(getKeyFrameAt(frameNumber));
191}
192
193VectorImage* LayerVector::getLastVectorImageAtFrame(int frameNumber, int increment) const
194{
195 return static_cast<VectorImage*>(getLastKeyFrameAtPosition(frameNumber + increment));
196}
197
198void LayerVector::replaceKeyFrame(const KeyFrame* vectorImage)
199{
200 *getVectorImageAtFrame(vectorImage->pos()) = *static_cast<const VectorImage*>(vectorImage);
201}
DebugDetails
Definition: pencilerror.h:25
KeyFrame
Definition: keyframe.h:30
Layer
Definition: layer.h:33
Layer::addNewKeyFrameAt
bool addNewKeyFrameAt(int position)
Creates a new keyframe at the given position, unless one already exists.
Definition: layer.cpp:170
Layer::addKeyFrame
virtual bool addKeyFrame(int position, KeyFrame *pKeyFrame)
Adds a keyframe at the given position, unless one already exists.
Definition: layer.cpp:191
Status
Definition: pencilerror.h:40
VectorImage
Definition: vectorimage.h:32
VectorImage::loadDomElement
void loadDomElement(QDomElement element)
VectorImage::loadDomElement.
Definition: vectorimage.cpp:193
VectorImage::usesColor
bool usesColor(int index)
VectorImage::usesColor.
Definition: vectorimage.cpp:1136
VectorImage::removeColor
void removeColor(int index)
VectorImage::removeColor.
Definition: vectorimage.cpp:1153
VectorImage::read
bool read(QString filePath)
VectorImage::read.
Definition: vectorimage.cpp:73
VectorImage::write
Status write(QString filePath, QString format)
VectorImage::write.
Definition: vectorimage.cpp:112
QDir
QDir::filePath
QString filePath(const QString &fileName) const const
QDomDocument
QDomDocument::createElement
QDomElement createElement(const QString &tagName)
QDomElement
QDomElement::attribute
QString attribute(const QString &name, const QString &defValue) const const
QDomElement::setAttribute
void setAttribute(const QString &name, const QString &value)
QDomElement::tagName
QString tagName() const const
QDomNode
QDomNode::appendChild
QDomNode appendChild(const QDomNode &newChild)
QDomNode::firstChild
QDomNode firstChild() const const
QDomNode::isNull
bool isNull() const const
QDomNode::nextSibling
QDomNode nextSibling() const const
QDomNode::toElement
QDomElement toElement() const const
QFile::exists
bool exists() const const
QFileInfo
QFileInfo::fileName
QString fileName() const const
QString
QString::append
QString & append(QChar ch)
QString::arg
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
QString::asprintf
QString asprintf(const char *cformat,...)
QString::isEmpty
bool isEmpty() const const
QString::isNull
bool isNull() const const
QString::toDouble
double toDouble(bool *ok) const const
QString::toInt
int toInt(bool *ok, int base) const const
Generated on Thu May 8 2025 04:47:53 for Pencil2D by doxygen 1.9.6 based on revision 4513250b1d5b1a3676ec0e67b06b7a885ceaae39