00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #include <qgarlib/array.H>
00041
00042
00043
00044 namespace qgar
00045 {
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055 template <class T>
00056 GenMask2d<T>::GenMask2d()
00057
00058 : _pRefCnt(new int(0)),
00059 _width(0),
00060 _height(0),
00061 _pCoeffMap(0)
00062
00063 {
00064
00065 }
00066
00067
00068
00069
00070 template <class T>
00071 GenMask2d<T>::GenMask2d(const GenMask2d<T>& aMask)
00072
00073 : _pRefCnt(new int(0)),
00074 _width(aMask._width),
00075 _height(aMask._height)
00076
00077 {
00078 int size = _width * _height;
00079 _pCoeffMap = new T[size];
00080
00081 memcpy(_pCoeffMap, aMask.pCoeffMap(), size * sizeof(T));
00082 }
00083
00084
00085
00086
00087 template <class T>
00088 GenMask2d<T>::GenMask2d(unsigned int aWidth,
00089 unsigned int aHeight,
00090 T aValue)
00091
00092 : _pRefCnt(new int(0)),
00093 _width(aWidth),
00094 _height(aHeight)
00095
00096 {
00097 int size = _width * _height;
00098 _pCoeffMap = new T[size];
00099 qgFill(_pCoeffMap, size, aValue);
00100 }
00101
00102
00103
00104
00105 template <class T>
00106 GenMask2d<T>::GenMask2d(unsigned int aWidth,
00107 unsigned int aHeight,
00108 const T * const valArray)
00109
00110 : _pRefCnt(new int(0)),
00111 _width(aWidth),
00112 _height(aHeight)
00113
00114 {
00115 int size = _width * _height;
00116 _pCoeffMap = new T[size];
00117 memcpy(_pCoeffMap, valArray, size * sizeof(T));
00118 }
00119
00120
00121
00122
00123 template <class T>
00124 GenMask2d<T>::GenMask2d(const GenMask2d& rhs, int)
00125
00126 : _pRefCnt(rhs._pRefCnt),
00127 _width(rhs._width),
00128 _height(rhs._height),
00129 _pCoeffMap(rhs._pCoeffMap)
00130
00131 {
00132 (*_pRefCnt)++;
00133
00134 }
00135
00136
00137
00138
00139
00140
00141
00142 template <class T>
00143 GenMask2d<T>::~GenMask2d()
00144 {
00145 if (*_pRefCnt == 0)
00146 {
00147
00148
00149 delete [] _pCoeffMap;
00150 delete _pRefCnt;
00151 }
00152 else
00153 {
00154
00155
00156
00157 (*_pRefCnt)--;
00158 }
00159 }
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169 template <class T>
00170 inline int
00171 GenMask2d<T>::width() const
00172 {
00173 return _width;
00174 }
00175
00176
00177
00178
00179 template <class T>
00180 inline int
00181 GenMask2d<T>::height() const
00182 {
00183 return _height;
00184 }
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194 template <class T>
00195 T
00196 GenMask2d<T>::coeff(int aX, int aY) const
00197 {
00198 return *(_pCoeffMap + (aY * _width) + aX);
00199 }
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209 template <class T>
00210 inline T*
00211 GenMask2d<T>::pCoeffMap() const
00212 {
00213 return _pCoeffMap;
00214 }
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224 template <class T>
00225 void
00226 GenMask2d<T>::setCoeff(int aX, int aY, T aCoeff)
00227 {
00228 *(_pCoeffMap + (aY * _width) + aX) = aCoeff;
00229 }
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241 template <class T>
00242 GenMask2d<T> GenMask2d<T>::shallowCopy()
00243 {
00244 return GenMask2d(*this, 0);
00245 }
00246
00247
00248
00249
00250 template <class T>
00251 void
00252 GenMask2d<T>::PRIVATEdeepCopy(const GenMask2d<T>& aMask)
00253 {
00254
00255 if (this != &aMask)
00256 {
00257 _pRefCnt = new int(0);
00258 _width = aMask._width;
00259 _height = aMask._height;
00260
00261
00262 delete [] _pCoeffMap;
00263
00264
00265 int size = _width * _height;
00266 _pCoeffMap = new T[size];
00267
00268
00269 memcpy(_pCoeffMap, aMask.pCoeffMap(), size * sizeof(T));
00270 }
00271 }
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281 template <class T>
00282 GenMask2d<T>&
00283 GenMask2d<T>::operator=(const GenMask2d<T>& aMask)
00284 {
00285 PRIVATEdeepCopy(aMask);
00286 return *this;
00287 }
00288
00289
00290
00291
00292
00293 }