MeVisLabToolboxReference
|
00001 // **InsertLicense** code 00002 //---------------------------------------------------------------------------------- 00004 00010 //---------------------------------------------------------------------------------- 00011 00012 00013 #ifndef __mlLUTData_H 00014 #define __mlLUTData_H 00015 00016 // Local includes 00017 #ifndef __mlLUTSystem_H 00018 #include "mlLUTSystem.h" 00019 #endif 00020 #ifndef __mlLUTBasic_H 00021 #include "mlLUTBasic.h" 00022 #endif 00023 00024 00025 // ML includes 00026 #ifndef __mlDataTypes_H 00027 #include "mlDataTypes.h" 00028 #endif 00029 00030 00031 00032 ML_START_NAMESPACE 00033 00034 00042 class MLLUT_EXPORT LUTDataBase 00043 { 00044 protected: 00045 00047 LUTDataBase (MLDataType dataType); 00048 00050 MLErrorCode init (LUTVisualType visualType, int minIndex, int maxIndex, 00051 int minRow, int maxRow, int minLayer, int maxLayer); 00052 00057 MLErrorCode initShared1D (LUTVisualType visualType, int minIndex, int maxIndex, int row, int layer, 00058 LUTDataBase *srcLutData, int srcIndex, int srcRow, int srcLayer); 00059 00064 MLErrorCode initShared2D (LUTVisualType visualType, int minRow, int maxRow, int layer, 00065 LUTDataBase *srcLutData, int srcRow, int srcLayer); 00066 00067 00068 public: 00070 virtual ~LUTDataBase () { clear(); } 00071 00073 void clear (void); 00074 00075 00077 bool isInitialized (void) const { return _data != 0; } 00078 00080 bool ownsData (void) const { return _ownsData; } 00081 00083 MLDataType getDataType (void) const { return _dataType; } 00084 00086 int getEntrySize (void) const { return _entrySize; } 00087 00089 LUTVisualType getVisualType (void) const { return _visualType; } 00090 00092 int getNumChannels (void) const { return _numChannels; } 00093 00095 LUTDimensionality getDimensionality (void) const { return _dimensionality; } 00096 00098 int getMinIndex (void) const { return _minIndex; } 00099 00101 int getMaxIndex (void) const { return _maxIndex; } 00102 00104 int getWidth (void) const { return _maxIndex-_minIndex+1; } 00105 00107 int getMinRow (void) const { return _minRow; } 00108 00110 int getMaxRow (void) const { return _maxRow; } 00111 00113 int getHeight (void) const { return _maxRow-_minRow+1; } 00114 00116 int getMinLayer (void) const { return _minLayer; } 00117 00119 int getMaxLayer (void) const { return _maxLayer; } 00120 00122 int getDepth (void) const { return _maxLayer-_minLayer+1; } 00123 00125 int getLength (void) const { return _dataLength; } 00126 00130 int getStride (int dim) const; 00131 00133 int getDataSize (void) const { return _dataLength*_entrySize; } 00134 00137 bool isInRange (int index, int row = 0, int layer = 0) const; 00138 00139 00141 unsigned int getId (void) const { return _id; } 00142 00144 void setId (unsigned int id) { _id = id; } 00145 00146 00147 protected: 00148 00150 void reset (void); 00151 00153 void clearData (void); 00154 00156 bool initData (void); 00157 00158 00160 MLDataType _dataType; 00161 00163 int _entrySize; 00164 00166 int _dataLength; 00167 00169 void *_data; 00170 00172 bool _ownsData; 00173 00174 00176 LUTVisualType _visualType; 00177 00179 int _numChannels; 00180 00182 LUTDimensionality _dimensionality; 00183 00185 int _minIndex, _maxIndex; 00186 00188 int _minRow, _maxRow; 00189 00191 int _minLayer, _maxLayer; 00192 00195 int _strides[3]; 00196 00198 int _entryOffset; 00199 00200 00202 unsigned int _id; 00203 00204 }; 00205 00206 00207 00213 template <typename T> 00214 class LUTData : public LUTDataBase 00215 { 00216 public: 00217 00220 LUTData():LUTDataBase(getType((T*)0)) {}; 00221 00223 MLDataType getType(MLuint8*) { return MLuint8Type; } 00224 MLDataType getType(MLint8*) { return MLint8Type; } 00225 MLDataType getType(MLuint16*) { return MLuint16Type; } 00226 MLDataType getType(MLint16*) { return MLint16Type; } 00227 MLDataType getType(MLuint32*) { return MLuint32Type; } 00228 MLDataType getType(MLint32*) { return MLint32Type; } 00229 MLDataType getType(MLint64*) { return MLint64Type; } 00230 MLDataType getType(MLuint64*) { return MLuint64Type; } 00231 MLDataType getType(float*) { return MLfloatType; } 00232 MLDataType getType(double*) { return MLdoubleType; } 00233 MLDataType getType(MLldouble*) { return MLldoubleType; } 00234 00237 MLErrorCode init (LUTVisualType visualType, int minIndex, int maxIndex, T maxEntry) 00238 { return init(visualType, minIndex, maxIndex, 0, 0, 0, 0, maxEntry); } 00239 00242 MLErrorCode init (LUTVisualType visualType, int minIndex, int maxIndex, 00243 int minRow, int maxRow, T maxEntry) 00244 { return init(visualType, minIndex, maxIndex, minRow, maxRow, 0, 0, maxEntry); } 00245 00248 MLErrorCode init (LUTVisualType visualType, int minIndex, int maxIndex, 00249 int minRow, int maxRow, int minLayer, int maxLayer, T maxEntry); 00250 00251 00259 MLErrorCode initShared1D (LUTVisualType visualType, int minIndex, int maxIndex, int row, int layer, 00260 LUTData<T> *srcLutData, int srcIndex, int srcRow, int srcLayer); 00261 00269 MLErrorCode initShared2D (LUTVisualType visualType, int minRow, int maxRow, int layer, 00270 LUTData<T> *srcLutData, int srcRow, int srcLayer); 00271 00272 00274 T getMaxEntry (void) const { return _maxEntry; } 00275 00276 00278 T *getData (void) { return (T*)_data; } 00279 00281 const T *getData (void) const { return (const T*)_data; } 00282 00284 T *getEntriesAt (int index, int row, int layer) 00285 { return getData()+(index*_strides[0]+row*_strides[1]+layer*_strides[2]-_entryOffset); } 00286 00288 const T *getEntriesAt (int index, int row, int layer) const 00289 { return getData()+(index*_strides[0]+row*_strides[1]+layer*_strides[2]-_entryOffset); } 00290 00292 T *getEntriesAt (int index, int row) 00293 { return getEntriesAt(index, row, getMinLayer()); } 00294 00296 const T *getEntriesAt (int index, int row) const 00297 { return getEntriesAt(index, row, getMinLayer()); } 00298 00300 T *getEntriesAt (int index) 00301 { return getEntriesAt(index, getMinRow(), getMinLayer()); } 00302 00304 const T *getEntriesAt (int index) const 00305 { return getEntriesAt(index, getMinRow(), getMinLayer()); } 00306 00307 00309 virtual LUTData<T> *clone (void) const; 00310 00311 00312 protected: 00313 00315 T _maxEntry; 00316 00317 }; 00318 00319 00322 template <typename T> 00323 MLErrorCode LUTData<T>::init (LUTVisualType visualType, int minIndex, int maxIndex, 00324 int minRow, int maxRow, int minLayer, int maxLayer, T maxEntry) 00325 { 00326 MLErrorCode result = maxEntry >= 0 ? ML_RESULT_OK : ML_BAD_PARAMETER; 00327 00328 if (result == ML_RESULT_OK) { 00329 result = LUTDataBase::init(visualType, minIndex, maxIndex, minRow, maxRow, minLayer, maxLayer); 00330 } 00331 if (result == ML_RESULT_OK) { 00332 _maxEntry = maxEntry; 00333 } 00334 00335 return result; 00336 } 00337 00338 00346 template <typename T> 00347 MLErrorCode LUTData<T>::initShared1D (LUTVisualType visualType, int minIndex, int maxIndex, int row, int layer, 00348 LUTData<T> *srcLutData, int srcIndex, int srcRow, int srcLayer) 00349 { 00350 MLErrorCode result = 00351 LUTDataBase::initShared1D(visualType, minIndex, maxIndex, row, layer, srcLutData, srcIndex, srcRow, srcLayer); 00352 00353 if (result == ML_RESULT_OK) { 00354 _maxEntry = srcLutData->getMaxEntry(); 00355 } 00356 00357 return result; 00358 } 00359 00360 00368 template <typename T> 00369 MLErrorCode LUTData<T>::initShared2D (LUTVisualType visualType, int minRow, int maxRow, int layer, 00370 LUTData<T> *srcLutData, int srcRow, int srcLayer) 00371 { 00372 MLErrorCode result = 00373 LUTDataBase::initShared2D(visualType, minRow, maxRow, layer, srcLutData, srcRow, srcLayer); 00374 00375 if (result == ML_RESULT_OK) { 00376 _maxEntry = srcLutData->getMaxEntry(); 00377 } 00378 00379 return result; 00380 } 00381 00382 00384 template <typename T> 00385 LUTData<T> *LUTData<T>::clone (void) const 00386 { 00387 LUTData<T> *newLutData = new LUTData<T>; 00388 00389 if (newLutData) { 00390 if (newLutData->init(_visualType, _minIndex, _maxIndex, _minRow, _maxRow, 00391 _minLayer, _maxLayer, _maxEntry) != ML_RESULT_OK) { 00392 delete newLutData; 00393 newLutData = 0; 00394 } 00395 } 00396 00397 return newLutData; 00398 } 00399 00400 00401 ML_END_NAMESPACE 00402 00403 00404 00405 #endif 00406 // __mlLUTData_H