1 #pragma once
2 //=============================================================================
3 // SeparateColorsPopup
4 //-----------------------------------------------------------------------------
5 #ifndef SEPARATECOLORSPOPUP_H
6 #define SEPARATECOLORSPOPUP_H
7 
8 #include "tfilepath.h"
9 #include "tpixel.h"
10 #include "traster.h"
11 #include "toonzqt/dvdialog.h"
12 
13 #include <QVector>
14 #include <QPair>
15 #include <QRunnable>
16 #include <QVector3D>
17 #include <QVector4D>
18 
19 class QLabel;
20 class QCheckBox;
21 class QGroupBox;
22 class QComboBox;
23 
24 class SeparateSwatch;
25 namespace DVGui {
26 class IntLineEdit;
27 class FileField;
28 class LineEdit;
29 class ColorField;
30 class ProgressDialog;
31 class CheckBox;
32 class DoubleField;
33 class IntField;
34 }  // namespace DVGui
35 
36 namespace ImageUtils {
37 class FrameTaskNotifier;
38 }
39 
40 using namespace DVGui;
41 using namespace ImageUtils;
42 
43 //----------------------------------
44 
45 class Separate4ColorsTask : public QRunnable {
46   int m_from, m_to;
47   QVector3D* m_src;
48   QVector4D* m_out;
49   const QVector3D m_paper_xyz, m_main_xyz, m_sub1_xyz, m_sub2_xyz, m_sub3_xyz;
50   const QVector4D m_pane_m12, m_pane_m13, m_pane_m23, m_pane_123;
51   const QVector3D m_R;
52   const float m_mainAdjust;
53   const float m_borderRatio;
54 
55   void run();
56 
57 public:
Separate4ColorsTask(int from,int to,QVector3D * src,QVector4D * out,const QVector3D paper_xyz,const QVector3D main_xyz,const QVector3D sub1_xyz,const QVector3D sub2_xyz,const QVector3D sub3_xyz,const QVector4D pane_m12,const QVector4D pane_m13,const QVector4D pane_m23,const QVector4D pane_123,const QVector3D R,const float mainAdjust,const float borderRatio)58   Separate4ColorsTask(int from, int to, QVector3D* src, QVector4D* out,
59                       const QVector3D paper_xyz, const QVector3D main_xyz,
60                       const QVector3D sub1_xyz, const QVector3D sub2_xyz,
61                       const QVector3D sub3_xyz, const QVector4D pane_m12,
62                       const QVector4D pane_m13, const QVector4D pane_m23,
63                       const QVector4D pane_123, const QVector3D R,
64                       const float mainAdjust, const float borderRatio)
65       : m_from(from)
66       , m_to(to)
67       , m_src(src)
68       , m_out(out)
69       , m_paper_xyz(paper_xyz)
70       , m_main_xyz(main_xyz)
71       , m_sub1_xyz(sub1_xyz)
72       , m_sub2_xyz(sub2_xyz)
73       , m_sub3_xyz(sub3_xyz)
74       , m_pane_m12(pane_m12)
75       , m_pane_m13(pane_m13)
76       , m_pane_m23(pane_m23)
77       , m_pane_123(pane_123)
78       , m_R(R)
79       , m_mainAdjust(mainAdjust)
80       , m_borderRatio(borderRatio) {}
81 };
82 
83 //----------------------------------
84 
85 class Separate3ColorsTask : public QRunnable {
86   int m_from, m_to;
87   QVector3D *m_src, *m_out;
88   const QVector3D m_paper_xyz, m_main_xyz, m_sub1_xyz, m_sub2_xyz;
89   const QVector4D m_pane;
90   const float m_mainAdjust;
91   const float m_borderRatio;
92 
93   void run();
94 
95 public:
Separate3ColorsTask(int from,int to,QVector3D * src,QVector3D * out,const QVector3D paper_xyz,const QVector3D main_xyz,const QVector3D sub1_xyz,const QVector3D sub2_xyz,const QVector4D pane,const float mainAdjust,const float borderRatio)96   Separate3ColorsTask(int from, int to, QVector3D* src, QVector3D* out,
97                       const QVector3D paper_xyz, const QVector3D main_xyz,
98                       const QVector3D sub1_xyz, const QVector3D sub2_xyz,
99                       const QVector4D pane, const float mainAdjust,
100                       const float borderRatio)
101       : m_from(from)
102       , m_to(to)
103       , m_src(src)
104       , m_out(out)
105       , m_paper_xyz(paper_xyz)
106       , m_main_xyz(main_xyz)
107       , m_sub1_xyz(sub1_xyz)
108       , m_sub2_xyz(sub2_xyz)
109       , m_pane(pane)
110       , m_mainAdjust(mainAdjust)
111       , m_borderRatio(borderRatio) {}
112 };
113 
114 //----------------------------------
115 
116 class SeparateColorsPopup : public DVGui::Dialog {
117   Q_OBJECT
118 
119   FrameTaskNotifier* m_notifier;
120   QPushButton *m_previewBtn, *m_okBtn, *m_cancelBtn, *m_autoBtn;
121   IntLineEdit *m_fromFld, *m_toFld;
122   FileField* m_saveInFileFld;
123   QComboBox* m_fileFormatCombo;
124 
125   DoubleField *m_subColorAdjustFld, *m_borderSmoothnessFld;
126 
127   QGroupBox* m_matteGroupBox;
128   DoubleField* m_matteThreshold;
129   IntField* m_matteRadius;
130 
131   ColorField *m_paperColorField, *m_mainColorField, *m_subColor1Field,
132       *m_subColor2Field, *m_subColor3Field;
133 
134   QCheckBox *m_outMainCB, *m_outSub1CB, *m_outSub2CB, *m_outSub3CB;
135   LineEdit *m_mainSuffixEdit, *m_sub1SuffixEdit, *m_sub2SuffixEdit,
136       *m_sub3SuffixEdit;
137 
138   IntField* m_previewFrameField;
139   QLabel* m_previewFrameLabel;
140   QVector<QPair<TFilePath, TFrameId>> m_srcFrames;
141 
142   QPushButton *m_pickBtn, *m_showMatteBtn, *m_showAlphaBtn;
143   SeparateSwatch* m_separateSwatch;
144 
145   ProgressDialog* m_progressDialog;
146   std::vector<TFilePath> m_srcFilePaths;
147 
148   QString m_lastAcceptedSaveInPath;
149 
150   bool m_isConverting;
151 
152   void doSeparate(const TFilePath& source, int from, int to, int framerate,
153                   FrameTaskNotifier* frameNotifier, bool do4Colors);
154 
155   void doCompute(TRaster32P raster, TDimensionI& dim, TRaster32P ras_m,
156                  TRaster32P ras_c1, TRaster32P ras_c2, bool isPreview = false);
157 
158   void doCompute(TRaster32P raster, TDimensionI& dim, TRaster32P ras_m,
159                  TRaster32P ras_c1, TRaster32P ras_c2, TRaster32P ras_c3,
160                  bool isPreview = false);
161 
162   void doPreview(TRaster32P& orgRas, TRaster32P& mainRas, TRaster32P& sub1Ras,
163                  TRaster32P& sub2Ras, TRaster32P& sub3Ras);
164 
165 public:
166   SeparateColorsPopup();
167   ~SeparateColorsPopup();
168   void setFiles(const std::vector<TFilePath>& fps);
169   bool isConverting();
170 
171 protected:
172   void showEvent(QShowEvent* e);
173   // store the current value to user env file
174   void hideEvent(QHideEvent* e);
175 
176 public slots:
177   // starts the convertion
178   void separate();
179   void onSeparateFinished();
180   void onPreviewBtnPressed();
181   void onPreviewFrameFieldValueChanged(bool isDragging);
182 
183   void onChange(bool isDragging);
onToggle()184   void onToggle() { onChange(false); }
onColorChange(const TPixel32 &,bool isDragging)185   void onColorChange(const TPixel32&, bool isDragging) { onChange(isDragging); }
186 
187   void onSaveSettings();
188   void onLoadSettings();
189 
190   void doSaveSettings(const TFilePath&);
191   void doLoadSettings(const TFilePath&, bool loadAll);
192 
193   void onSaveInPathChanged();
194 };
195 
196 #endif