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