1 
2 
3 #include "toonz/tobjecthandle.h"
4 
5 #include "toonz/tstageobjectid.h"
6 #include "toonz/tstageobject.h"
7 #include "toonz/tstageobjectspline.h"
8 #include "toonz/txsheet.h"
9 #include "tvectorimage.h"
10 #include "tstroke.h"
11 
12 namespace {
13 
clearImage(TVectorImage * img)14 void clearImage(TVectorImage *img) {
15   while (img->getStrokeCount()) img->deleteStroke(0);
16 }
17 
18 // obj -> image
getSpline(TVectorImage * dstImg,TStageObjectId objId,TStageObjectSpline * currentSpline)19 void getSpline(TVectorImage *dstImg, TStageObjectId objId,
20                TStageObjectSpline *currentSpline) {
21   QMutexLocker lock(dstImg->getMutex());
22   clearImage(dstImg);
23   if (currentSpline)
24     dstImg->addStroke(new TStroke(*currentSpline->getStroke()));
25 }
26 
27 // image -> obj
setSpline(TVectorImage * srcImg,TStageObjectId objId,TStageObjectSpline * currentSpline)28 void setSpline(TVectorImage *srcImg, TStageObjectId objId,
29                TStageObjectSpline *currentSpline) {
30   if (!currentSpline) return;
31   if (srcImg->getStrokeCount() == 0) {
32     double d = 30;
33     std::vector<TThickPoint> points;
34     points.push_back(TPointD(-d, 0));
35     points.push_back(TPointD(0, 0));
36     points.push_back(TPointD(d, 0));
37     srcImg->addStroke(new TStroke(points), false);
38   }
39   TStroke *stroke = srcImg->getStroke(0);
40   currentSpline->setStroke(new TStroke(*stroke));
41 }
42 
43 }  // namespace
44 
45 //=============================================================================
46 // TXshLevelHandle
47 //-----------------------------------------------------------------------------
48 
TObjectHandle()49 TObjectHandle::TObjectHandle()
50     : m_objectId(TStageObjectId::NoneId)
51     , m_isSpline(false)
52     , m_splineImage(0)
53     , m_currentSpline(0) {
54   m_splineImage = new TVectorImage();
55   m_splineImage->addRef();
56 }
57 
58 //-----------------------------------------------------------------------------
59 
~TObjectHandle()60 TObjectHandle::~TObjectHandle() { m_splineImage->release(); }
61 
62 //-----------------------------------------------------------------------------
63 
getObjectId()64 TStageObjectId TObjectHandle::getObjectId() { return m_objectId; }
65 
66 //-----------------------------------------------------------------------------
67 
setObjectId(TStageObjectId objectId)68 void TObjectHandle::setObjectId(TStageObjectId objectId) {
69   if (m_objectId != objectId) {
70     m_objectId = objectId;
71     m_isSpline = false;
72     clearImage(m_splineImage);
73     emit objectSwitched();
74   }
75 }
76 
77 //-----------------------------------------------------------------------------
78 
setIsSpline(bool isSpline)79 void TObjectHandle::setIsSpline(bool isSpline) {
80   if (m_isSpline != isSpline) {
81     m_isSpline = isSpline;
82     emit objectSwitched();
83   }
84 }
85 
86 //-----------------------------------------------------------------------------
87 
commitSplineChanges()88 void TObjectHandle::commitSplineChanges() {
89   setSpline(m_splineImage, m_objectId, m_currentSpline);
90   emit splineChanged();
91 }
92 
93 //-----------------------------------------------------------------------------
94 
setSplineObject(TStageObjectSpline * splineObject)95 void TObjectHandle::setSplineObject(TStageObjectSpline *splineObject) {
96   m_currentSpline = splineObject;
97   if (m_isSpline && m_currentSpline)
98     getSpline(m_splineImage, m_objectId, m_currentSpline);
99 }
100