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 #include "mitkImageBackground2D.h"
00019
00020 #include "mitkVtkLayerController.h"
00021
00022
00023 #include "vtkSystemIncludes.h"
00024 #include "vtkRenderer.h"
00025 #include "vtkMapper.h"
00026 #include "vtkObjectFactory.h"
00027 #include "vtkImageActor.h"
00028 #include "vtkRenderWindow.h"
00029 #include "vtkImageImport.h"
00030 #include "vtkCommand.h"
00031 #include "vtkCamera.h"
00032
00033 #include <iostream>
00034
00035
00036 class vtkVideoSizeCallback : public vtkCommand
00037 {
00038 public:
00039 static vtkVideoSizeCallback *New(){ return new vtkVideoSizeCallback; }
00040
00041 vtkRenderer * m_ImageRenderer;
00042 int m_ImageWidth, m_ImageHeight;
00043
00044 void SetVtkVideoRenderer(vtkRenderer* r)
00045 {
00046 m_ImageRenderer = r;
00047 }
00048 void SetVideoDimensions(int x, int y)
00049 {
00050 m_ImageWidth = x; m_ImageHeight = y;
00051 }
00052
00053 virtual void Execute(vtkObject* , unsigned long, void*)
00054 {
00055
00056
00057 }
00058 };
00059
00060 mitk::ImageBackground2D::ImageBackground2D()
00061 {
00062 m_ImageWidth = 0;
00063 m_ImageHeight = 0;
00064 m_ImageScalarComponents = 3;
00065 m_ParallelScale = 0;
00066 m_RenderWindow = NULL;
00067
00068 m_Actor = vtkImageActor::New();
00069 m_ImageRenderer = vtkRenderer::New();
00070 m_VtkImageImport = vtkImageImport::New();
00071
00072 m_ImageData = NULL;
00073 }
00074
00075 void mitk::ImageBackground2D::InitVtkImageImport()
00076 {
00077
00078
00079 m_VtkImageImport->SetDataScalarTypeToUnsignedChar();
00080 m_VtkImageImport->SetNumberOfScalarComponents(m_ImageScalarComponents);
00081 m_VtkImageImport->SetWholeExtent(0,m_ImageWidth-1,0,m_ImageHeight-1,0,1-1);
00082 m_VtkImageImport->SetDataExtentToWholeExtent();
00083 }
00084
00085 mitk::ImageBackground2D::~ImageBackground2D()
00086 {
00087 if ( m_RenderWindow != NULL )
00088 if ( this->IsEnabled() )
00089 this->Disable();
00090 if ( m_Actor!=NULL )
00091 m_Actor->Delete();
00092 if ( m_ImageRenderer != NULL )
00093 m_ImageRenderer->Delete();
00094 if ( m_VtkImageImport != NULL)
00095 m_VtkImageImport->Delete();
00096 }
00102 void mitk::ImageBackground2D::SetRenderWindow(vtkRenderWindow* renderWindow )
00103 {
00104 m_RenderWindow = renderWindow;
00105
00106
00107
00108
00109 }
00110
00111 void mitk::ImageBackground2D::SetParallelScale(int scale)
00112 {
00113 m_ParallelScale = scale;
00114 m_ImageRenderer->GetActiveCamera()->SetParallelScale(m_ParallelScale);
00115 }
00116 int mitk::ImageBackground2D::GetParallelScale()
00117 {
00118
00119 return static_cast<int>(m_ImageRenderer->GetActiveCamera()->GetParallelScale());
00120 }
00125 void mitk::ImageBackground2D::Enable()
00126 {
00127 m_ImageRenderer = vtkRenderer::New();
00128
00129 mitk::VtkLayerController::GetInstance(m_RenderWindow)->InsertBackgroundRenderer(m_ImageRenderer,true);
00130
00131 char * c = 0;
00132 Update(c);
00133 m_Actor->SetInput(m_VtkImageImport->GetOutput());
00134
00135 m_ImageRenderer->AddActor2D(m_Actor);
00136 m_ImageRenderer->ResetCamera();
00137 m_ImageRenderer->InteractiveOff();
00138 m_ImageRenderer->GetActiveCamera()->ParallelProjectionOn();
00139 if(m_ParallelScale == 0)
00140 m_ImageRenderer->GetActiveCamera()->SetParallelScale(m_ImageHeight/2);
00141
00142
00143
00144
00145 }
00146
00151 void mitk::ImageBackground2D::Disable()
00152 {
00153 if ( this->IsEnabled() )
00154 mitk::VtkLayerController::GetInstance(m_RenderWindow)->RemoveRenderer(m_ImageRenderer);
00155 }
00160 bool mitk::ImageBackground2D::IsEnabled()
00161 {
00162 if ( mitk::VtkLayerController::GetInstance(m_RenderWindow)->IsRendererInserted(m_ImageRenderer))
00163 return true;
00164 else
00165 return false;
00166 }
00167
00168 void mitk::ImageBackground2D::Update(char * dataPointer)
00169 {
00170 if(!IsEnabled())
00171 return;
00172
00173
00174 if(m_ImageData == NULL)
00175 m_ImageData = new unsigned char[m_ImageHeight*m_ImageWidth*m_ImageScalarComponents];
00176
00177 if(!dataPointer)
00178 {
00179 unsigned char* b = m_ImageData;
00180 for ( int textCounter = 0; textCounter < (m_ImageHeight*m_ImageWidth*m_ImageScalarComponents); textCounter++ )
00181 *b++ = 0;
00182 }
00183
00184 m_VtkImageImport->SetImportVoidPointer(m_ImageData);
00185 m_VtkImageImport->Modified();
00186 m_VtkImageImport->Update();
00187 m_RenderWindow->Render();
00188
00189 }
00190
00191 void mitk::ImageBackground2D::Update(char * dataPointer, int width, int height, int imageScalarComponents)
00192 {
00193
00194 if(!IsEnabled())
00195 return;
00196
00197
00198 if(!dataPointer || (imageScalarComponents != 1 && imageScalarComponents != 3))
00199 {
00200
00201 if(m_ImageData == NULL)
00202 m_ImageData = new unsigned char[m_ImageHeight*m_ImageWidth*m_ImageScalarComponents];
00203
00204 unsigned char* b = m_ImageData;
00205 for ( int textCounter = 0; textCounter < (m_ImageHeight*m_ImageWidth*m_ImageScalarComponents); textCounter++ )
00206 *b++ = 0;
00207 }
00208 else
00209 {
00210 if(m_ImageWidth == 0)
00211 {
00212 m_ImageHeight = height;
00213 m_ImageWidth = width;
00214 m_ImageScalarComponents = imageScalarComponents;
00215 InitVtkImageImport();
00216 }
00217
00218
00219
00220 if(m_ImageData == NULL)
00221 m_ImageData = new unsigned char[m_ImageHeight*m_ImageWidth*m_ImageScalarComponents];
00222
00223 int column, row;
00224 unsigned char* tex = m_ImageData;
00225 char* data = dataPointer;
00226
00227
00228
00229
00230 if(imageScalarComponents == 1)
00231 {
00232 m_VtkImageImport->SetNumberOfScalarComponents(m_ImageScalarComponents);
00233
00234 unsigned char g;
00235 for (column = 0; column < m_ImageHeight; column++)
00236 for (row = 0; row < m_ImageWidth; row++)
00237 {
00238 g = *data++;
00239 *tex++ = g;
00240 }
00241 }
00242 else if(imageScalarComponents == 3)
00243 {
00244
00245 unsigned char r, g, b;
00246 for (column = 0; column < m_ImageHeight; column++)
00247 for (row = 0; row < m_ImageWidth; row++)
00248 {
00249 b = *data++;
00250 g = *data++;
00251 r = *data++;
00252 *tex++ = r;
00253 *tex++ = g;
00254 *tex++ = b;
00255 }
00256 }
00257
00258 }
00259
00260
00261
00262 m_VtkImageImport->SetImportVoidPointer(m_ImageData);
00263 m_VtkImageImport->Modified();
00264 m_VtkImageImport->Update();
00265 m_RenderWindow->Render();
00266
00267 }
00268
00269