Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "mitkImageDataItem.h"
00020 #include "mitkMemoryUtilities.h"
00021 #include <vtkImageData.h>
00022 #include <vtkPointData.h>
00023
00024 #include <vtkBitArray.h>
00025 #include <vtkCharArray.h>
00026 #include <vtkDoubleArray.h>
00027 #include <vtkFloatArray.h>
00028 #include <vtkIntArray.h>
00029 #include <vtkLongArray.h>
00030 #include <vtkShortArray.h>
00031 #include <vtkUnsignedCharArray.h>
00032 #include <vtkUnsignedIntArray.h>
00033 #include <vtkUnsignedLongArray.h>
00034 #include <vtkUnsignedShortArray.h>
00035
00036 #include "ipFunc/mitkIpFunc.h"
00037
00038 mitk::ImageDataItem::ImageDataItem(const ImageDataItem& aParent, unsigned int dimension, void *data, bool manageMemory, size_t offset) :
00039 m_Data(NULL), m_ManageMemory(false), m_PicDescriptor(NULL), m_VtkImageData(NULL), m_Offset(offset), m_IsComplete(false), m_Size(0),
00040 m_Parent(&aParent)
00041 {
00042 m_PixelType = aParent.GetPixelType();
00043 m_PicDescriptor=mitkIpPicNew();
00044 m_PicDescriptor->bpe=m_PixelType.GetBpe();
00045 m_PicDescriptor->type=m_PixelType.GetType();
00046 m_PicDescriptor->dim=dimension;
00047 memcpy(m_PicDescriptor->n, aParent.GetPicDescriptor()->n, sizeof(mitkIpUInt4_t)*_mitkIpPicNDIM);
00048 m_PicDescriptor->data=m_Data=static_cast<unsigned char*>(aParent.GetData())+offset;
00049 mitkIpFuncCopyTags(m_PicDescriptor, aParent.GetPicDescriptor());
00050
00051 m_Size = _mitkIpPicSize(m_PicDescriptor);
00052 if(data != NULL)
00053 {
00054 memcpy(m_Data, data, m_Size);
00055 if(manageMemory)
00056 {
00057 delete [] (unsigned char*) data;
00058 }
00059 }
00060
00061 m_ReferenceCountLock.Lock();
00062 m_ReferenceCount = 0;
00063 m_ReferenceCountLock.Unlock();
00064 }
00065
00066 mitk::ImageDataItem::~ImageDataItem()
00067 {
00068 if(m_VtkImageData!=NULL)
00069 m_VtkImageData->Delete();
00070 if(m_PicDescriptor!=NULL)
00071 {
00072 m_PicDescriptor->data=NULL;
00073 mitkIpPicFree(m_PicDescriptor);
00074 }
00075 if(m_Parent.IsNull())
00076 {
00077 if(m_ManageMemory)
00078 delete [] m_Data;
00079 }
00080 }
00081
00082 mitk::ImageDataItem::ImageDataItem(const mitk::PixelType& type, unsigned int dimension, unsigned int *dimensions, void *data, bool manageMemory) :
00083 m_Data((unsigned char*)data), m_ManageMemory(manageMemory), m_PicDescriptor(NULL), m_VtkImageData(NULL), m_Offset(0), m_IsComplete(false), m_Size(0),
00084 m_Parent(NULL)
00085 {
00086
00087 m_PixelType = type;
00088 m_PicDescriptor=mitkIpPicNew();
00089 m_PicDescriptor->bpe=m_PixelType.GetBpe();
00090 m_PicDescriptor->type=m_PixelType.GetType();
00091 m_PicDescriptor->dim=dimension;
00092 memcpy(m_PicDescriptor->n, dimensions, sizeof(mitkIpUInt4_t)*(dimension<=_mitkIpPicNDIM?dimension:_mitkIpPicNDIM));
00093 unsigned char i;
00094 for(i=dimension; i < _mitkIpPicNDIM; ++i)
00095 m_PicDescriptor->n[i] = 1;
00096 m_Size = _mitkIpPicSize(m_PicDescriptor);
00097 if(m_Data == NULL)
00098 {
00099 m_Data = mitk::MemoryUtilities::AllocateElements<unsigned char>( m_Size );
00100 m_ManageMemory = true;
00101 }
00102 m_PicDescriptor->data=m_Data;
00103
00104 m_ReferenceCountLock.Lock();
00105 m_ReferenceCount = 0;
00106 m_ReferenceCountLock.Unlock();
00107 }
00108
00109 void mitk::ImageDataItem::ConstructVtkImageData() const
00110 {
00111 vtkImageData *inData = vtkImageData::New();
00112 vtkDataArray *scalars = NULL;
00113
00114 unsigned long size = 0;
00115 if ( m_PicDescriptor->dim == 1 )
00116 {
00117 inData->SetDimensions( m_PicDescriptor->n[0] -1, 1, 1);
00118 size = m_PicDescriptor->n[0];
00119 inData->SetOrigin( ((float) m_PicDescriptor->n[0]) / 2.0f, 0, 0 );
00120 }
00121 else
00122 if ( m_PicDescriptor->dim == 2 )
00123 {
00124 inData->SetDimensions( m_PicDescriptor->n[0] , m_PicDescriptor->n[1] , 1 );
00125 size = m_PicDescriptor->n[0] * m_PicDescriptor->n[1];
00126 inData->SetOrigin( ((float) m_PicDescriptor->n[0]) / 2.0f, ((float) m_PicDescriptor->n[1]) / 2.0f, 0 );
00127 }
00128 else
00129 if ( m_PicDescriptor->dim >= 3 )
00130 {
00131 inData->SetDimensions( m_PicDescriptor->n[0], m_PicDescriptor->n[1], m_PicDescriptor->n[2] );
00132 size = m_PicDescriptor->n[0] * m_PicDescriptor->n[1] * m_PicDescriptor->n[2];
00133
00134
00135 inData->SetOrigin( 0, 0, 0 );
00136 }
00137 else
00138 {
00139 inData->Delete () ;
00140 return;
00141 }
00142
00143 inData->SetNumberOfScalarComponents(m_PixelType.GetNumberOfComponents());
00144
00145 if ( ( m_PixelType.GetType() == mitkIpPicInt || m_PixelType.GetType() == mitkIpPicUInt ) && m_PixelType.GetBitsPerComponent() == 1 )
00146 {
00147 inData->SetScalarType( VTK_BIT );
00148 scalars = vtkBitArray::New();
00149 }
00150 else if ( m_PixelType.GetType() == mitkIpPicInt && m_PixelType.GetBitsPerComponent() == 8 )
00151 {
00152 inData->SetScalarType( VTK_CHAR );
00153 scalars = vtkCharArray::New();
00154 }
00155 else if ( m_PixelType.GetType() == mitkIpPicUInt && m_PixelType.GetBitsPerComponent() == 8 )
00156 {
00157 inData->SetScalarType( VTK_UNSIGNED_CHAR );
00158 scalars = vtkUnsignedCharArray::New();
00159 }
00160 else if ( m_PixelType.GetType() == mitkIpPicInt && m_PixelType.GetBitsPerComponent() == 16 )
00161 {
00162 inData->SetScalarType( VTK_SHORT );
00163 scalars = vtkShortArray::New();
00164 }
00165 else if ( m_PixelType.GetType() == mitkIpPicUInt && m_PixelType.GetBitsPerComponent() == 16 )
00166 {
00167 inData->SetScalarType( VTK_UNSIGNED_SHORT );
00168 scalars = vtkUnsignedShortArray::New();
00169 }
00170 else if ( m_PixelType.GetType() == mitkIpPicInt && m_PixelType.GetBitsPerComponent() == 32 )
00171 {
00172 inData->SetScalarType( VTK_INT );
00173 scalars = vtkIntArray::New();
00174 }
00175 else if ( m_PixelType.GetType() == mitkIpPicUInt && m_PixelType.GetBitsPerComponent() == 32 )
00176 {
00177 inData->SetScalarType( VTK_UNSIGNED_INT );
00178 scalars = vtkUnsignedIntArray::New();
00179 }
00180 else if ( m_PixelType.GetType() == mitkIpPicInt && m_PixelType.GetBitsPerComponent() == 64 )
00181 {
00182 inData->SetScalarType( VTK_LONG );
00183 scalars = vtkLongArray::New();
00184 }
00185 else if ( m_PixelType.GetType() == mitkIpPicUInt && m_PixelType.GetBitsPerComponent() == 64 )
00186 {
00187 inData->SetScalarType( VTK_UNSIGNED_LONG );
00188 scalars = vtkUnsignedLongArray::New();
00189 }
00190 else if ( m_PixelType.GetType() == mitkIpPicFloat && m_PixelType.GetBitsPerComponent() == 32 )
00191 {
00192 inData->SetScalarType( VTK_FLOAT );
00193 scalars = vtkFloatArray::New();
00194 }
00195 else if ( m_PixelType.GetType() == mitkIpPicFloat && m_PixelType.GetBitsPerComponent() == 64 )
00196 {
00197 inData->SetScalarType( VTK_DOUBLE );
00198 scalars = vtkDoubleArray::New();
00199 }
00200 else
00201 {
00202 inData->Delete();
00203 return;
00204 }
00205
00206 m_VtkImageData = inData;
00207
00208
00209 scalars->SetNumberOfComponents(m_VtkImageData->GetNumberOfScalarComponents());
00210
00211 scalars->SetVoidArray(m_PicDescriptor->data, _mitkIpPicElements(m_PicDescriptor)*m_VtkImageData->GetNumberOfScalarComponents(), 1);
00212
00213 m_VtkImageData->GetPointData()->SetScalars(scalars);
00214 scalars->Delete();
00215
00216 }
00217
00218 void mitk::ImageDataItem::Modified() const
00219 {
00220 if(m_VtkImageData)
00221 m_VtkImageData->Modified();
00222 }
00223
00224