1
2
3 //#include "tpixelparam.h"
4 #include "tparamset.h"
5 #include "tdoubleparam.h"
6 #include "texception.h"
7 #include "tpixelutils.h"
8 #include "tstream.h"
9
10 class TPixelParamImp {
11 public:
TPixelParamImp(const TPixel32 & p)12 TPixelParamImp(const TPixel32 &p)
13 : m_r(new TDoubleParam(p.r / 255.0))
14 , m_g(new TDoubleParam(p.g / 255.0))
15 , m_b(new TDoubleParam(p.b / 255.0))
16 , m_m(new TDoubleParam(p.m / 255.0))
17 , m_isMatteEnabled(true) {}
TPixelParamImp(const TPixelParamImp & src)18 TPixelParamImp(const TPixelParamImp &src)
19 : m_r(src.m_r->clone())
20 , m_g(src.m_g->clone())
21 , m_b(src.m_b->clone())
22 , m_m(src.m_m->clone())
23 , m_isMatteEnabled(src.m_isMatteEnabled) {}
~TPixelParamImp()24 ~TPixelParamImp() {}
25 TDoubleParamP m_r, m_g, m_b, m_m;
26 bool m_isMatteEnabled;
27 };
28
29 PERSIST_IDENTIFIER(TPixelParam, "pixelParam")
30
31 //---------------------------------------------------------
32
TPixelParam(const TPixel32 & p)33 TPixelParam::TPixelParam(const TPixel32 &p) : m_data(new TPixelParamImp(p)) {
34 addParam(m_data->m_r, "Red");
35 addParam(m_data->m_g, "Green");
36 addParam(m_data->m_b, "Blue");
37 addParam(m_data->m_m, "Alpha");
38 std::string measureName("colorChannel");
39 m_data->m_r->setMeasureName(measureName);
40 m_data->m_g->setMeasureName(measureName);
41 m_data->m_b->setMeasureName(measureName);
42 m_data->m_m->setMeasureName(measureName);
43 }
44
45 //---------------------------------------------------------
46
TPixelParam(const TPixelParam & src)47 TPixelParam::TPixelParam(const TPixelParam &src)
48 : TParamSet(src.getName()), m_data(new TPixelParamImp(*src.m_data)) {
49 addParam(m_data->m_r, "Red");
50 addParam(m_data->m_g, "Green");
51 addParam(m_data->m_b, "Blue");
52 addParam(m_data->m_m, "Alpha");
53 std::string measureName("colorChannel");
54 m_data->m_r->setMeasureName(measureName);
55 m_data->m_g->setMeasureName(measureName);
56 m_data->m_b->setMeasureName(measureName);
57 m_data->m_m->setMeasureName(measureName);
58 }
59
60 //---------------------------------------------------------
61
copy(TParam * src)62 void TPixelParam::copy(TParam *src) {
63 TPixelParam *p = dynamic_cast<TPixelParam *>(src);
64 if (!p) throw TException("invalid source for copy");
65 setName(src->getName());
66 m_data->m_r->copy(p->m_data->m_r.getPointer());
67 m_data->m_g->copy(p->m_data->m_g.getPointer());
68 m_data->m_b->copy(p->m_data->m_b.getPointer());
69 m_data->m_m->copy(p->m_data->m_m.getPointer());
70 std::string measureName("colorChannel");
71
72 m_data->m_r->setMeasureName(measureName);
73 m_data->m_g->setMeasureName(measureName);
74 m_data->m_b->setMeasureName(measureName);
75 m_data->m_m->setMeasureName(measureName);
76 }
77
78 //---------------------------------------------------------
79
~TPixelParam()80 TPixelParam::~TPixelParam() { delete m_data; }
81
82 //---------------------------------------------------------
83
getDefaultValue() const84 TPixel32 TPixelParam::getDefaultValue() const {
85 TPixelD pixd(m_data->m_r->getDefaultValue(), m_data->m_g->getDefaultValue(),
86 m_data->m_b->getDefaultValue(), m_data->m_m->getDefaultValue());
87 return toPixel32(pixd);
88 }
89
90 //---------------------------------------------------------
91
setDefaultValue(const TPixel32 & p)92 void TPixelParam::setDefaultValue(const TPixel32 &p) {
93 TPixelD pixd = toPixelD(p);
94 m_data->m_r->setDefaultValue(pixd.r);
95 m_data->m_g->setDefaultValue(pixd.g);
96 m_data->m_b->setDefaultValue(pixd.b);
97 m_data->m_m->setDefaultValue(pixd.m);
98 }
99
100 //---------------------------------------------------------
101
getValueD(double frame) const102 TPixelD TPixelParam::getValueD(double frame) const {
103 return TPixelD(m_data->m_r->getValue(frame), m_data->m_g->getValue(frame),
104 m_data->m_b->getValue(frame), m_data->m_m->getValue(frame));
105 }
106
107 //---------------------------------------------------------
108
getValue(double frame) const109 TPixel32 TPixelParam::getValue(double frame) const {
110 return toPixel32(getValueD(frame));
111 }
112
113 //---------------------------------------------------------
114
getValue64(double frame) const115 TPixel64 TPixelParam::getValue64(double frame) const {
116 return toPixel64(getValueD(frame));
117 }
118
119 //---------------------------------------------------------
120
getPremultipliedValue(double frame) const121 TPixel32 TPixelParam::getPremultipliedValue(double frame) const {
122 return premultiply(getValue(frame));
123 }
124
125 //---------------------------------------------------------
126
setValueD(double frame,const TPixelD & p)127 bool TPixelParam::setValueD(double frame, const TPixelD &p) {
128 beginParameterChange();
129 m_data->m_r->setValue(frame, p.r);
130 m_data->m_g->setValue(frame, p.g);
131 m_data->m_b->setValue(frame, p.b);
132 m_data->m_m->setValue(frame, p.m);
133 endParameterChange();
134 return true;
135 }
136
137 //---------------------------------------------------------
138
setValue(double frame,const TPixel32 & pix)139 bool TPixelParam::setValue(double frame, const TPixel32 &pix) {
140 return setValueD(frame, toPixelD(pix));
141 }
142
143 //---------------------------------------------------------
144
setValue64(double frame,const TPixel64 & pix)145 bool TPixelParam::setValue64(double frame, const TPixel64 &pix) {
146 return setValueD(frame, toPixelD(pix));
147 }
148
149 //---------------------------------------------------------
150
loadData(TIStream & is)151 void TPixelParam::loadData(TIStream &is) {
152 std::string childName;
153 while (is.openChild(childName)) {
154 if (childName == "red")
155 m_data->m_r->loadData(is);
156 else if (childName == "green")
157 m_data->m_g->loadData(is);
158 else if (childName == "blue")
159 m_data->m_b->loadData(is);
160 else if (childName == "matte")
161 m_data->m_m->loadData(is);
162 else
163 throw TException("unknown channel name: " + childName);
164 is.closeChild();
165 }
166 }
167
168 //---------------------------------------------------------
169
saveData(TOStream & os)170 void TPixelParam::saveData(TOStream &os) {
171 os.openChild("red");
172 m_data->m_r->saveData(os);
173 os.closeChild();
174 os.openChild("green");
175 m_data->m_g->saveData(os);
176 os.closeChild();
177 os.openChild("blue");
178 m_data->m_b->saveData(os);
179 os.closeChild();
180 os.openChild("matte");
181 m_data->m_m->saveData(os);
182 os.closeChild();
183 }
184 //---------------------------------------------------------
185
getRed()186 TDoubleParamP &TPixelParam::getRed() { return m_data->m_r; }
187
188 //---------------------------------------------------------
189
getGreen()190 TDoubleParamP &TPixelParam::getGreen() { return m_data->m_g; }
191
192 //---------------------------------------------------------
193
getBlue()194 TDoubleParamP &TPixelParam::getBlue() { return m_data->m_b; }
195
196 //---------------------------------------------------------
197
getMatte()198 TDoubleParamP &TPixelParam::getMatte() { return m_data->m_m; }
199
200 //---------------------------------------------------------
201
enableMatte(bool on)202 void TPixelParam::enableMatte(bool on) {
203 m_data->m_isMatteEnabled = on;
204 if (on == false) m_data->m_m = new TDoubleParam(255.0);
205 }
206 //---------------------------------------------------------
207
isMatteEnabled() const208 bool TPixelParam::isMatteEnabled() const { return m_data->m_isMatteEnabled; }
209