MeVisLabToolboxReference
MeVisLab/Standard/Sources/Shared/MLLUT/mlLUTData.h
Go to the documentation of this file.
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