1 
2 
3 #include "toonz/sceneproperties.h"
4 
5 // TnzLib includes
6 #include "toonz/cleanupparameters.h"
7 #include "toonz/tcenterlinevectorizer.h"
8 #include "toonz/captureparameters.h"
9 #include "toonz/tcamera.h"
10 #include "toonz/tstageobjecttree.h"
11 #include "toonz/txshleveltypes.h"
12 #include "toonz/preferences.h"
13 #include "cleanuppalette.h"
14 #include "toonz/boardsettings.h"
15 
16 // TnzBase includes
17 #include "toutputproperties.h"
18 #include "trasterfx.h"
19 #include "tscanner.h"
20 
21 // TnzCore includes
22 #include "tstream.h"
23 #include "tpalette.h"
24 #include "tproperty.h"
25 #include "tiio.h"
26 
27 //=============================================================================
28 
TSceneProperties()29 TSceneProperties::TSceneProperties()
30     : m_cleanupParameters(new CleanupParameters())
31     , m_scanParameters(new TScannerParameters())
32     , m_vectorizerParameters(new VectorizerParameters())
33     , m_captureParameters(new CaptureParameters())
34     , m_outputProp(new TOutputProperties())
35     , m_previewProp(new TOutputProperties())
36     , m_bgColor(255, 255, 255, 0)
37     , m_markerDistance(6)
38     , m_markerOffset(0)
39     , m_fullcolorSubsampling(1)
40     , m_tlvSubsampling(1)
41     , m_fieldGuideSize(16)
42     , m_fieldGuideAspectRatio(1.77778)
43     , m_columnColorFilterOnRender(false)
44     , m_camCapSaveInPath() {
45   // Default color
46   m_notesColor.push_back(TPixel32(255, 235, 140));
47   m_notesColor.push_back(TPixel32(255, 160, 120));
48   m_notesColor.push_back(TPixel32(255, 180, 190));
49   m_notesColor.push_back(TPixel32(135, 205, 250));
50   m_notesColor.push_back(TPixel32(145, 240, 145));
51   m_notesColor.push_back(TPixel32(130, 255, 210));
52   m_notesColor.push_back(TPixel32(150, 245, 255));
53 }
54 
55 //-----------------------------------------------------------------------------
56 
~TSceneProperties()57 TSceneProperties::~TSceneProperties() {
58   delete m_cleanupParameters;
59   delete m_scanParameters;
60   delete m_vectorizerParameters;
61   delete m_captureParameters;
62   clearPointerContainer(m_cameras);
63   delete m_outputProp;
64   delete m_previewProp;
65 }
66 
67 //-----------------------------------------------------------------------------
68 
assign(const TSceneProperties * sprop)69 void TSceneProperties::assign(const TSceneProperties *sprop) {
70   assert(sprop);
71 
72   m_hGuides      = sprop->m_hGuides;
73   m_vGuides      = sprop->m_vGuides;
74   *m_outputProp  = *sprop->m_outputProp;
75   *m_previewProp = *sprop->m_previewProp;
76 
77   m_cleanupParameters->assign(sprop->m_cleanupParameters);
78   m_scanParameters->assign(sprop->m_scanParameters);
79 
80   assert(sprop->m_vectorizerParameters);
81   *m_vectorizerParameters = *sprop->m_vectorizerParameters;
82 
83   if (sprop != this) {
84     m_cameras = sprop->m_cameras;
85     for (int i     = 0; i < (int)m_cameras.size(); i++)
86       m_cameras[i] = new TCamera(*m_cameras[i]);
87   }
88   m_bgColor                   = sprop->m_bgColor;
89   m_markerDistance            = sprop->m_markerDistance;
90   m_markerOffset              = sprop->m_markerOffset;
91   m_fullcolorSubsampling      = sprop->m_fullcolorSubsampling;
92   m_tlvSubsampling            = sprop->m_tlvSubsampling;
93   m_fieldGuideSize            = sprop->m_fieldGuideSize;
94   m_fieldGuideAspectRatio     = sprop->m_fieldGuideAspectRatio;
95   m_columnColorFilterOnRender = sprop->m_columnColorFilterOnRender;
96   int i;
97   for (i = 0; i < m_notesColor.size(); i++)
98     m_notesColor.replace(i, sprop->getNoteColor(i));
99 }
100 
101 //-----------------------------------------------------------------------------
102 
onInitialize()103 void TSceneProperties::onInitialize() {
104   // set initial output folder to $scenefolder when the scene folder mode is set
105   // in user preferences
106   if (Preferences::instance()->getPathAliasPriority() ==
107           Preferences::SceneFolderAlias &&
108       !TFilePath("$scenefolder").isAncestorOf(m_outputProp->getPath())) {
109     std::string ext = m_outputProp->getPath().getDottedType();
110     m_outputProp->setPath(TFilePath("$scenefolder/") + ext);
111   }
112 
113   //  m_scanParameters->adaptToCurrentScanner();
114 }
115 
116 //-----------------------------------------------------------------------------
117 
setBgColor(const TPixel32 & color)118 void TSceneProperties::setBgColor(const TPixel32 &color) { m_bgColor = color; }
119 
120 //-----------------------------------------------------------------------------
121 
setMarkers(int distance,int offset)122 void TSceneProperties::setMarkers(int distance, int offset) {
123   m_markerDistance = distance;
124   m_markerOffset   = offset;
125 }
126 
127 //-----------------------------------------------------------------------------
128 
setFullcolorSubsampling(int s)129 void TSceneProperties::setFullcolorSubsampling(int s) {
130   assert(1 <= s && s <= 100);
131   m_fullcolorSubsampling = tcrop(s, 1, 100);
132 }
133 
134 //-----------------------------------------------------------------------------
135 
setTlvSubsampling(int s)136 void TSceneProperties::setTlvSubsampling(int s) {
137   assert(1 <= s && s <= 100);
138   m_tlvSubsampling = tcrop(s, 1, 100);
139 }
140 
141 //-----------------------------------------------------------------------------
142 
setFieldGuideSize(int size)143 void TSceneProperties::setFieldGuideSize(int size) {
144   assert(1 <= size && size <= 100);
145   m_fieldGuideSize = tcrop(size, 1, 100);
146 }
147 
148 //-----------------------------------------------------------------------------
149 
setFieldGuideAspectRatio(double ar)150 void TSceneProperties::setFieldGuideAspectRatio(double ar) {
151   assert(ar >= 0);
152   if (ar <= 0) ar         = 1;
153   m_fieldGuideAspectRatio = ar;
154 }
155 
156 //-----------------------------------------------------------------------------
157 
saveData(TOStream & os) const158 void TSceneProperties::saveData(TOStream &os) const {
159   if (!m_hGuides.empty()) {
160     os.openChild("hGuides");
161     for (int i = 0; i < (int)m_hGuides.size(); i++) os << m_hGuides[i];
162     os.closeChild();
163   }
164   if (!m_vGuides.empty()) {
165     os.openChild("vGuides");
166     for (int i = 0; i < (int)m_vGuides.size(); i++) os << m_vGuides[i];
167     os.closeChild();
168   }
169 
170   int i;
171   if (!m_cameras.empty()) {
172     os.openChild("cameras");
173     for (i = 0; i < (int)m_cameras.size(); i++) {
174       os.openChild("camera");
175       m_cameras[i]->saveData(os);
176       os.closeChild();
177     }
178     os.closeChild();
179   }
180 
181   os.openChild("outputs");
182   std::vector<TOutputProperties *> outputs;
183   outputs.push_back(getOutputProperties());
184   outputs.push_back(getPreviewProperties());
185   for (i = 0; i < (int)outputs.size(); i++) {
186     TOutputProperties &out    = *outputs[i];
187     const TRenderSettings &rs = out.getRenderSettings();
188     std::map<std::string, std::string> attr;
189     attr["name"] = i == 0 ? "main" : "preview";
190     os.openChild("output", attr);
191 
192     TFilePath outPath = out.getPath();
193     int from, to, step;
194     out.getRange(from, to, step);
195     os.child("range") << from << to;
196     os.child("step") << step;
197     os.child("shrink") << rs.m_shrinkX;
198     os.child("applyShrinkToViewer") << (rs.m_applyShrinkToViewer ? 1 : 0);
199     os.child("fps") << out.getFrameRate();
200     os.child("path") << outPath;
201     os.child("bpp") << rs.m_bpp;
202     os.child("multimedia") << out.getMultimediaRendering();
203     os.child("threadsIndex") << out.getThreadIndex();
204     os.child("maxTileSizeIndex") << out.getMaxTileSizeIndex();
205     os.child("subcameraPrev") << (out.isSubcameraPreview() ? 1 : 0);
206     os.child("stereoscopic") << (rs.m_stereoscopic ? 1 : 0)
207                              << rs.m_stereoscopicShift;
208 
209     switch (rs.m_quality) {
210     case TRenderSettings::StandardResampleQuality:
211       os.child("resquality") << (int)0;
212       break;
213     case TRenderSettings::ImprovedResampleQuality:
214       os.child("resquality") << (int)1;
215       break;
216     case TRenderSettings::HighResampleQuality:
217       os.child("resquality") << (int)2;
218       break;
219     case TRenderSettings::Triangle_FilterResampleQuality:
220       os.child("resquality") << (int)100;
221       break;
222     case TRenderSettings::Mitchell_FilterResampleQuality:
223       os.child("resquality") << (int)101;
224       break;
225     case TRenderSettings::Cubic5_FilterResampleQuality:
226       os.child("resquality") << (int)102;
227       break;
228     case TRenderSettings::Cubic75_FilterResampleQuality:
229       os.child("resquality") << (int)103;
230       break;
231     case TRenderSettings::Cubic1_FilterResampleQuality:
232       os.child("resquality") << (int)104;
233       break;
234     case TRenderSettings::Hann2_FilterResampleQuality:
235       os.child("resquality") << (int)105;
236       break;
237     case TRenderSettings::Hann3_FilterResampleQuality:
238       os.child("resquality") << (int)106;
239       break;
240     case TRenderSettings::Hamming2_FilterResampleQuality:
241       os.child("resquality") << (int)107;
242       break;
243     case TRenderSettings::Hamming3_FilterResampleQuality:
244       os.child("resquality") << (int)108;
245       break;
246     case TRenderSettings::Lanczos2_FilterResampleQuality:
247       os.child("resquality") << (int)109;
248       break;
249     case TRenderSettings::Lanczos3_FilterResampleQuality:
250       os.child("resquality") << (int)110;
251       break;
252     case TRenderSettings::Gauss_FilterResampleQuality:
253       os.child("resquality") << (int)111;
254       break;
255     case TRenderSettings::ClosestPixel_FilterResampleQuality:
256       os.child("resquality") << (int)112;
257       break;
258     case TRenderSettings::Bilinear_FilterResampleQuality:
259       os.child("resquality") << (int)113;
260       break;
261     default:
262       assert(false);
263     }
264     switch (rs.m_fieldPrevalence) {
265     case TRenderSettings::NoField:
266       os.child("fieldprevalence") << (int)0;
267       break;
268     case TRenderSettings::EvenField:
269       os.child("fieldprevalence") << (int)1;
270       break;
271     case TRenderSettings::OddField:
272       os.child("fieldprevalence") << (int)2;
273       break;
274     default:
275       assert(false);
276     }
277     os.child("gamma") << rs.m_gamma;
278     os.child("timestretch") << rs.m_timeStretchFrom << rs.m_timeStretchTo;
279 
280     if (out.getOffset() != 0) os.child("offset") << out.getOffset();
281 
282     os.openChild("formatsProperties");
283     std::vector<std::string> fileExtensions;
284     out.getFileFormatPropertiesExtensions(fileExtensions);
285     for (int i = 0; i < (int)fileExtensions.size(); i++) {
286       std::string ext    = fileExtensions[i];
287       TPropertyGroup *pg = out.getFileFormatProperties(ext);
288       assert(pg);
289       std::map<std::string, std::string> attr;
290       attr["ext"] = ext;
291       os.openChild("formatProperties", attr);
292       pg->saveData(os);
293       os.closeChild();
294     }
295     os.closeChild();
296 
297     if (out.getBoardSettings() && out.getBoardSettings()->getDuration()) {
298       os.openChild("clapperboardSettings");
299       out.getBoardSettings()->saveData(os);
300       os.closeChild();
301     }
302 
303     os.closeChild();  // </output>
304   }
305   os.closeChild();
306   os.openChild("cleanupParameters");
307   m_cleanupParameters->saveData(os);
308   os.closeChild();
309   os.openChild("scanParameters");
310   m_scanParameters->saveData(os);
311   os.closeChild();
312   os.openChild("vectorizerParameters");
313   m_vectorizerParameters->saveData(os);
314   os.closeChild();
315   os.child("bgColor") << m_bgColor;
316   os.child("markers") << m_markerDistance << m_markerOffset;
317   os.child("subsampling") << m_fullcolorSubsampling << m_tlvSubsampling;
318   os.child("fieldguide") << m_fieldGuideSize << m_fieldGuideAspectRatio;
319   if (m_columnColorFilterOnRender) os.child("columnColorFilterOnRender") << 1;
320   if (!m_camCapSaveInPath.isEmpty())
321     os.child("cameraCaputureSaveInPath") << m_camCapSaveInPath;
322 
323   os.openChild("noteColors");
324   for (i = 0; i < m_notesColor.size(); i++) os << m_notesColor.at(i);
325   os.closeChild();
326 }
327 
328 //-----------------------------------------------------------------------------
329 /*! Set all scene properties elements, to information contained in \b TIStream
330    \b is.
331                 \sa saveData()
332 */
loadData(TIStream & is,bool isLoadingProject)333 void TSceneProperties::loadData(TIStream &is, bool isLoadingProject) {
334   TSceneProperties defaultProperties;
335   assign(&defaultProperties);
336 
337   int globFrom = -1, globTo = 0, globStep = 1;
338   double globFrameRate = -1;
339   std::string tagName;
340   *m_outputProp = *m_previewProp = TOutputProperties();
341   while (is.matchTag(tagName)) {
342     if (tagName == "projectPath") {
343       TFilePath projectPath;
344       is >> projectPath;
345     } else if (tagName == "range") {
346       is >> globFrom >> globTo;
347     }  // backCompatibility: prima range e fps non erano in Output
348     else if (tagName == "step") {
349       is >> globStep;
350     } else if (tagName == "fps") {
351       is >> globFrameRate;
352     } else if (tagName == "bgColor") {
353       is >> m_bgColor;
354     } else if (tagName == "viewerBgColor" || tagName == "previewBgColor" ||
355                tagName == "chessboardColor1" ||
356                tagName == "chessboardColor2")  // back compatibility
357     {
358       TPixel32 dummy;
359       is >> dummy;
360     } else if (tagName == "markers") {
361       is >> m_markerDistance >> m_markerOffset;
362     } else if (tagName == "subsampling") {
363       is >> m_fullcolorSubsampling >> m_tlvSubsampling;
364     } else if (tagName == "fieldguide") {
365       is >> m_fieldGuideSize >> m_fieldGuideAspectRatio;
366     } else if (tagName == "columnColorFilterOnRender") {
367       int val;
368       is >> val;
369       enableColumnColorFilterOnRender(val == 1);
370     } else if (tagName == "safearea") {
371       double dummy1, dummy2;
372       is >> dummy1 >> dummy2;
373     }  // back compatibility
374     else if (tagName == "columnIconLoadingPolicy") {
375       int dummy;
376       is >> dummy;
377     }                                 // back compatibility
378     else if (tagName == "playrange")  // back compatibility
379     {
380       std::string dummy;
381       is >> globFrom >> globTo >> dummy;
382     } else if (tagName == "camera")  // back compatibility with tab 2.2
383     {
384       clearPointerContainer(m_cameras);
385       m_cameras.clear();
386       TCamera *camera = new TCamera();
387       m_cameras.push_back(camera);
388       TDimension res(0, 0);
389       is >> res.lx >> res.ly;
390       camera->setRes(res);
391       double cameraDpi = 36.0;
392       camera->setSize(TDimensionD(res.lx / cameraDpi, res.ly / cameraDpi));
393     } else if (tagName == "playRange") {
394       int playR0, playR1;
395       is >> playR0 >> playR1;
396     } else if (tagName == "hGuides" || tagName == "vGuides") {
397       Guides &guides = tagName == "hGuides" ? m_hGuides : m_vGuides;
398       while (!is.matchEndTag()) {
399         double g;
400         is >> g;
401         guides.push_back(g);
402       }
403       continue;
404     } else if (tagName == "cameras") {
405       clearPointerContainer(m_cameras);
406       m_cameras.clear();
407       while (is.matchTag(tagName)) {
408         if (tagName == "camera") {
409           TCamera *camera = new TCamera();
410           m_cameras.push_back(camera);
411           camera->loadData(is);
412         }  // if "camera"
413         else
414           throw TException("unexpected property tag: " + tagName);
415         is.closeChild();
416       }
417     } else if (tagName == "outputs" || tagName == "outputStreams") {
418       while (is.matchTag(tagName)) {
419         if (tagName == "output" || tagName == "outputStream") {
420           TOutputProperties dummyOut;
421           TOutputProperties *outPtr = &dummyOut;
422           std::string name          = is.getTagAttribute("name");
423           if (name == "preview")
424             outPtr = m_previewProp;
425           else if (name == "main")
426             outPtr               = m_outputProp;
427           TOutputProperties &out = *outPtr;
428           TRenderSettings renderSettings;
429           if (globFrom != -1)
430             out.setRange(globFrom, globTo, globStep);
431           else if (globStep != 1) {
432             int from, to, dummy;
433             out.getRange(from, to, dummy);
434             out.setRange(from, to, globStep);
435           }
436 
437           if (globFrameRate != -1) out.setFrameRate(globFrameRate);
438           while (is.matchTag(tagName)) {
439             if (tagName == "camera") {
440               int dummy;
441               is >> dummy;
442             }                                    // per compatibilita'
443             else if (tagName == "cameraData") {  // per compatibilita'
444               while (is.matchTag(tagName)) {
445                 if (tagName == "size") {
446                   TDimensionD size(0, 0);
447                   is >> size.lx >> size.ly;
448                 } else if (tagName == "res") {
449                   TDimension res(0, 0);
450                   is >> res.lx >> res.ly;
451                 }
452                 is.closeChild();
453               }
454             } else if (tagName == "path") {
455               TFilePath fp;
456               is >> fp;
457               std::string ext    = fp.getUndottedType();
458               TPropertyGroup *pg = out.getFileFormatProperties(ext);
459               if (ext == "avi" && pg->getPropertyCount() != 1)
460                 fp = fp.withType("tif");
461               out.setPath(fp);
462             } else if (tagName == "offset") {
463               int j;
464               is >> j;
465               out.setOffset(j);
466             } else if (tagName == "range") {
467               int from, to, step, dummy;
468               is >> from >> to;
469               out.getRange(dummy, dummy, step);
470               out.setRange(from, to, step);
471             } else if (tagName == "step") {
472               int dummy, from, to, step;
473               is >> step;
474               out.getRange(from, to, dummy);
475               out.setRange(from, to, step);
476             } else if (tagName == "shrink") {
477               int shrink;
478               is >> shrink;
479               renderSettings.m_shrinkX = renderSettings.m_shrinkY = shrink;
480             } else if (tagName == "applyShrinkToViewer") {
481               int applyShrinkToViewer;
482               is >> applyShrinkToViewer;
483               renderSettings.m_applyShrinkToViewer = (applyShrinkToViewer != 0);
484             } else if (tagName == "fps") {
485               double j;
486               is >> j;
487               out.setFrameRate(j);
488             } else if (tagName == "bpp") {
489               int j;
490               is >> j;
491               if (j == 32 || j == 64) renderSettings.m_bpp = j;
492             } else if (tagName == "multimedia") {
493               int j;
494               is >> j;
495               out.setMultimediaRendering(j);
496             } else if (tagName == "threadsIndex") {
497               int j;
498               is >> j;
499               out.setThreadIndex(j);
500             } else if (tagName == "maxTileSizeIndex") {
501               int j;
502               is >> j;
503               out.setMaxTileSizeIndex(j);
504             } else if (tagName == "subcameraPrev") {
505               int j;
506               is >> j;
507               out.setSubcameraPreview(j != 0);
508             } else if (tagName == "resquality") {
509               int j;
510               is >> j;
511               switch (j) {
512               case 0:
513                 renderSettings.m_quality =
514                     TRenderSettings::StandardResampleQuality;
515                 break;
516               case 1:
517                 renderSettings.m_quality =
518                     TRenderSettings::ImprovedResampleQuality;
519                 break;
520               case 2:
521                 renderSettings.m_quality = TRenderSettings::HighResampleQuality;
522                 break;
523               case 100:
524                 renderSettings.m_quality =
525                     TRenderSettings::Triangle_FilterResampleQuality;
526                 break;
527               case 101:
528                 renderSettings.m_quality =
529                     TRenderSettings::Mitchell_FilterResampleQuality;
530                 break;
531               case 102:
532                 renderSettings.m_quality =
533                     TRenderSettings::Cubic5_FilterResampleQuality;
534                 break;
535               case 103:
536                 renderSettings.m_quality =
537                     TRenderSettings::Cubic75_FilterResampleQuality;
538                 break;
539               case 104:
540                 renderSettings.m_quality =
541                     TRenderSettings::Cubic1_FilterResampleQuality;
542                 break;
543               case 105:
544                 renderSettings.m_quality =
545                     TRenderSettings::Hann2_FilterResampleQuality;
546                 break;
547               case 106:
548                 renderSettings.m_quality =
549                     TRenderSettings::Hann3_FilterResampleQuality;
550                 break;
551               case 107:
552                 renderSettings.m_quality =
553                     TRenderSettings::Hamming2_FilterResampleQuality;
554                 break;
555               case 108:
556                 renderSettings.m_quality =
557                     TRenderSettings::Hamming3_FilterResampleQuality;
558                 break;
559               case 109:
560                 renderSettings.m_quality =
561                     TRenderSettings::Lanczos2_FilterResampleQuality;
562                 break;
563               case 110:
564                 renderSettings.m_quality =
565                     TRenderSettings::Lanczos3_FilterResampleQuality;
566                 break;
567               case 111:
568                 renderSettings.m_quality =
569                     TRenderSettings::Gauss_FilterResampleQuality;
570                 break;
571               case 112:
572                 renderSettings.m_quality =
573                     TRenderSettings::ClosestPixel_FilterResampleQuality;
574                 break;
575               case 113:
576                 renderSettings.m_quality =
577                     TRenderSettings::Bilinear_FilterResampleQuality;
578                 break;
579               default:
580                 renderSettings.m_quality =
581                     TRenderSettings::StandardResampleQuality;
582               }
583             } else if (tagName == "fieldprevalence") {
584               int j;
585               is >> j;
586               switch (j) {
587               case 0:
588                 renderSettings.m_fieldPrevalence = TRenderSettings::NoField;
589                 break;
590               case 1:
591                 renderSettings.m_fieldPrevalence = TRenderSettings::EvenField;
592                 break;
593               case 2:
594                 renderSettings.m_fieldPrevalence = TRenderSettings::OddField;
595                 break;
596               default:
597                 renderSettings.m_fieldPrevalence = TRenderSettings::NoField;
598                 break;
599               }
600             } else if (tagName == "gamma") {
601               double g;
602               is >> g;
603               renderSettings.m_gamma = g;
604             } else if (tagName == "timestretch") {
605               double from, to;
606               is >> from >> to;
607               renderSettings.m_timeStretchFrom = from;
608               renderSettings.m_timeStretchTo   = to;
609             } else if (tagName == "stereoscopic") {
610               int doit;
611               double val;
612               is >> doit >> val;
613               renderSettings.m_stereoscopic      = (doit == 1);
614               renderSettings.m_stereoscopicShift = val;
615             }
616 
617             // TODO: aggiungere la lettura della quality
618             else if (tagName == "res") {  // obsoleto
619               TDimension d(0, 0);
620               is >> d.lx >> d.ly;
621               if (!is.eos()) {
622                 std::string s;
623                 is >> s;
624               }
625             } else if (tagName == "formatsProperties") {
626               while (is.matchTag(tagName)) {
627                 if (tagName == "formatProperties") {
628                   std::string ext    = is.getTagAttribute("ext");
629                   TPropertyGroup *pg = out.getFileFormatProperties(ext);
630                   if (ext == "avi") {
631                     TPropertyGroup appProperties;
632                     appProperties.loadData(is);
633                     if (pg->getPropertyCount() != 1 ||
634                         appProperties.getPropertyCount() != 1) {
635                       is.closeChild();
636                       continue;
637                     }
638                     TEnumProperty *enumProp =
639                         dynamic_cast<TEnumProperty *>(pg->getProperty(0));
640                     TEnumProperty *enumAppProp = dynamic_cast<TEnumProperty *>(
641                         appProperties.getProperty(0));
642                     assert(enumAppProp && enumProp);
643                     if (enumAppProp && enumProp) {
644                       try {
645                         enumProp->setValue(enumAppProp->getValue());
646                       } catch (TProperty::RangeError &) {
647                       }
648                     } else
649                       throw TException();
650                   } else
651                     pg->loadData(is);
652 
653                   ////////ここだ!
654                   {
655                     TPropertyGroup *refPg = Tiio::makeWriterProperties(ext);
656                     pg->assignUINames(refPg);
657                     delete refPg;
658                   }
659 
660                   is.closeChild();
661                 } else
662                   throw TException("unexpected tag: " + tagName);
663               }  // end while
664             } else if (tagName == "clapperboardSettings") {
665               assert(out.getBoardSettings());
666               out.getBoardSettings()->loadData(is);
667             } else {
668               throw TException("unexpected property tag: " + tagName);
669             }
670             is.closeChild();
671           }
672           if (renderSettings.m_timeStretchFrom ==
673                   renderSettings.m_timeStretchTo &&
674               renderSettings.m_timeStretchTo == 1)
675             renderSettings.m_timeStretchFrom = renderSettings.m_timeStretchTo =
676                 out.getFrameRate();
677 
678           out.setRenderSettings(renderSettings);
679         } else
680           throw TException("unexpected property tag: " + tagName);
681         is.closeChild();
682       }  // while (outputs/outputStreams)
683     } else if (tagName == "cleanupPalette") {
684       m_cleanupParameters->m_cleanupPalette->loadData(is);
685     } else if (tagName == "cleanupParameters") {
686       m_cleanupParameters->loadData(is, !isLoadingProject);
687     } else if (tagName == "scanParameters") {
688       // m_scanParameters->adaptToCurrentScanner(); Rallenta tutto!!!
689       m_scanParameters->loadData(is);
690     } else if (tagName == "vectorizerParameters") {
691       m_vectorizerParameters->loadData(is);
692     } else if (tagName == "captureParameters") {
693       m_captureParameters->loadData(is);
694     } else if (tagName == "defaultLevelParameters") {
695       // this
696       int type;
697       double width, height, dpi;
698       is >> type >> width >> height >> dpi;
699     } else if (tagName == "noteColors") {
700       int i = 0;
701       while (!is.eos()) {
702         TPixel32 color;
703         is >> color;
704         m_notesColor.replace(i, color);
705         i++;
706       }
707       assert(i == 7);
708     } else if (tagName == "cameraCaputureSaveInPath") {
709       is >> m_camCapSaveInPath;
710     } else {
711       throw TException("unexpected property tag: " + tagName);
712     }
713     is.closeChild();
714   }
715 }
716 
717 //-----------------------------------------------------------------------------
718 
cloneCamerasFrom(TStageObjectTree * stageObjects)719 void TSceneProperties::cloneCamerasFrom(TStageObjectTree *stageObjects) {
720   clearPointerContainer(m_cameras);
721   int cameraCount = stageObjects->getCameraCount();
722 
723   int tmpCameraId = 0;
724 
725   for (int i = 0; i < cameraCount;) {
726     /*-- カメラが見つからなかった場合、tmpCameraIdのみ進める --*/
727     if (!stageObjects->getStageObject(TStageObjectId::CameraId(tmpCameraId),
728                                       false)) {
729       tmpCameraId++;
730       continue;
731     }
732     TStageObject *cameraObject =
733         stageObjects->getStageObject(TStageObjectId::CameraId(tmpCameraId));
734     TCamera *camera = new TCamera(*cameraObject->getCamera());
735     m_cameras.push_back(camera);
736     /*-- カメラが見つかったので、i も tmpCameraId も進める --*/
737     i++;
738     tmpCameraId++;
739   }
740 }
741 
742 //-----------------------------------------------------------------------------
743 
cloneCamerasTo(TStageObjectTree * stageObjects) const744 void TSceneProperties::cloneCamerasTo(TStageObjectTree *stageObjects) const {
745   TDimension maxCameraRes(0, 0);
746 
747   for (int i = 0; i < (int)m_cameras.size(); i++) {
748     TStageObject *cameraPegbar =
749         stageObjects->getStageObject(TStageObjectId::CameraId(i));
750     TCamera *camera = m_cameras[i];
751 
752     TDimension cameraRes = camera->getRes();
753     bool modified        = false;
754     if (maxCameraRes.lx > 0 && cameraRes.lx > maxCameraRes.lx) {
755       cameraRes.lx = maxCameraRes.lx;
756       modified     = true;
757     }
758     if (maxCameraRes.ly > 0 && cameraRes.ly > maxCameraRes.ly) {
759       cameraRes.ly = maxCameraRes.ly;
760       modified     = true;
761     }
762     if (modified) camera->setRes(cameraRes);
763 
764     *cameraPegbar->getCamera() = *m_cameras[i];
765   }
766 }
767 
768 //-----------------------------------------------------------------------------
769 
getNoteColors() const770 QList<TPixel32> TSceneProperties::getNoteColors() const { return m_notesColor; }
771 
772 //-----------------------------------------------------------------------------
773 
getNoteColor(int colorIndex) const774 TPixel32 TSceneProperties::getNoteColor(int colorIndex) const {
775   return m_notesColor[colorIndex];
776 }
777 
778 //-----------------------------------------------------------------------------
779 
setNoteColor(TPixel32 color,int colorIndex)780 void TSceneProperties::setNoteColor(TPixel32 color, int colorIndex) {
781   m_notesColor[colorIndex] = color;
782 }
783