Pencil2D  ff90c0872e88be3bf81c548cd60f01983012ec49
Pencil2D is an animation software for both bitmap and vector graphics. It is free, multi-platform, and open source.
 All Classes Functions
layervector.cpp
1 /*
2 
3 Pencil - Traditional Animation Software
4 Copyright (C) 2005-2007 Patrick Corrieri & Pascal Naidon
5 Copyright (C) 2012-2017 Matthew Chiawen Chang
6 
7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License
9 as published by the Free Software Foundation; version 2 of the License.
10 
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15 
16 */
17 #include "layervector.h"
18 #include "vectorimage.h"
19 #include <QtDebug>
20 
21 LayerVector::LayerVector(Object* object) : Layer( object, Layer::VECTOR )
22 {
23  mName = QString(tr("Vector Layer"));
24 }
25 
26 LayerVector::~LayerVector()
27 {
28 }
29 
30 // ------
31 /*
32 QImage* LayerVector::getImageAtIndex( int index,
33  QSize size,
34  bool simplified,
35  bool showThinLines,
36  bool antialiasing)
37 {
38  if ( index < 0 || index >= framesImage.size() )
39  {
40  return NULL;
41  }
42  else
43  {
44  VectorImage* vectorImage = getVectorImageAtIndex(index);
45  QImage* image = framesImage.at(index);
46  if (vectorImage->isModified() || size != image->size() )
47  {
48  if ( image->size() != size)
49  {
50  delete image;
51  framesImage[index] = image = new QImage(size, QImage::Format_ARGB32_Premultiplied);
52  }
53  vectorImage->outputImage(image, size, myView,
54  simplified, showThinLines,
55  antialiasing );
56  vectorImage->setModified(false);
57  }
58  return image;
59  }
60 }
61 */
62 
63 bool LayerVector::usesColour(int colorIndex)
64 {
65  bool bUseColor = false;
66  foreachKeyFrame( [&] ( KeyFrame* pKeyFrame )
67  {
68  auto pVecImage = static_cast< VectorImage* >( pKeyFrame );
69 
70  bUseColor = bUseColor || pVecImage->usesColour( colorIndex );
71  } );
72 
73  return bUseColor;
74 }
75 
76 void LayerVector::removeColour( int colorIndex )
77 {
78  foreachKeyFrame( [=]( KeyFrame* pKeyFrame )
79  {
80  auto pVecImage = static_cast< VectorImage* >( pKeyFrame );
81  pVecImage->removeColour( colorIndex );
82  } );
83 }
84 
85 void LayerVector::loadImageAtFrame(QString path, int frameNumber)
86 {
87  if ( keyExists( frameNumber ) )
88  {
89  removeKeyFrame( frameNumber );
90  }
91  VectorImage* vecImg = new VectorImage;
92  vecImg->setPos( frameNumber );
93  vecImg->setObject( object() );
94  vecImg->read( path );
95  addKeyFrame( frameNumber, vecImg );
96 }
97 
98 Status LayerVector::saveKeyFrame( KeyFrame* pKeyFrame, QString path )
99 {
100  QStringList debugInfo = QStringList() << "LayerVector::saveKeyFrame" << QString( "pKeyFrame.pos() = %1" ).arg( pKeyFrame->pos() ) << QString( "path = " ).append( path );
101  VectorImage* pVecImage = static_cast< VectorImage* >( pKeyFrame );
102 
103  QString theFileName = fileName( pKeyFrame->pos() );
104  QString strFilePath = QDir( path ).filePath( theFileName );
105  debugInfo << QString( "strFilePath = " ).append( strFilePath );
106  Status st = pVecImage->write( strFilePath, "VEC" );
107  if ( !st.ok() )
108  {
109  QStringList vecImageDetails = st.detailsList();
110  for ( QString detail : vecImageDetails )
111  {
112  detail.prepend( "&nbsp;&nbsp;" );
113  }
114  debugInfo << QString( "- VectorImage failed to write" ) << vecImageDetails;
115  return Status( Status::FAIL, debugInfo );
116  }
117 
118  return Status::OK;
119 }
120 
121 QString LayerVector::fileName( int frame )
122 {
123  QString layerNumberString = QString::number( id() );
124  QString frameNumberString = QString::number(frame);
125  while ( layerNumberString.length() < 3) layerNumberString.prepend("0");
126  while ( frameNumberString.length() < 3) frameNumberString.prepend("0");
127  return layerNumberString+"."+frameNumberString+".vec";
128 }
129 
130 QDomElement LayerVector::createDomElement(QDomDocument& doc)
131 {
132  QDomElement layerTag = doc.createElement("layer");
133 
134  layerTag.setAttribute( "id", id() );
135  layerTag.setAttribute( "name", mName );
136  layerTag.setAttribute( "visibility", mVisible );
137  layerTag.setAttribute( "type", type() );
138 
139  foreachKeyFrame( [&] ( KeyFrame* pKeyFrame )
140  {
141  //QDomElement imageTag = framesVector[index]->createDomElement(doc); // if we want to embed the data
142  QDomElement imageTag = doc.createElement( "image" );
143  imageTag.setAttribute( "frame", pKeyFrame->pos() );
144  imageTag.setAttribute( "src", fileName( pKeyFrame->pos() ) );
145  layerTag.appendChild( imageTag );
146  } );
147 
148  return layerTag;
149 }
150 
151 void LayerVector::loadDomElement(QDomElement element, QString dataDirPath)
152 {
153  if ( !element.attribute( "id" ).isNull() )
154  {
155  int id = element.attribute( "id" ).toInt();
156  setId( id );
157  }
158  mName = element.attribute("name");
159  mVisible = (element.attribute("visibility") == "1");
160 
161  QDomNode imageTag = element.firstChild();
162  while (!imageTag.isNull())
163  {
164  QDomElement imageElement = imageTag.toElement();
165  if (!imageElement.isNull())
166  {
167  if (imageElement.tagName() == "image")
168  {
169  if (!imageElement.attribute("src").isNull())
170  {
171  QString path = dataDirPath +"/" + imageElement.attribute("src"); // the file is supposed to be in the data directory
172  QFileInfo fi(path);
173  if (!fi.exists()) path = imageElement.attribute("src");
174  int position = imageElement.attribute("frame").toInt();
175  loadImageAtFrame( path, position );
176  }
177  else
178  {
179  int frame = imageElement.attribute("frame").toInt();
180  addNewEmptyKeyAt( frame );
181  getVectorImageAtFrame( frame )->loadDomElement(imageElement);
182  }
183  }
184  }
185  imageTag = imageTag.nextSibling();
186  }
187 }
188 
189 VectorImage* LayerVector::getVectorImageAtFrame( int frameNumber )
190 {
191  return static_cast< VectorImage* >( getKeyFrameAt( frameNumber ) );
192 }
193 
194 VectorImage* LayerVector::getLastVectorImageAtFrame( int frameNumber, int increment )
195 {
196  return static_cast< VectorImage* >( getLastKeyFrameAtPosition( frameNumber + increment ) );
197 }
198 
Definition: layer.h:32
Definition: object.h:71