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 "mitkManufacturerLogo.h"
00019
00020 #include "mitkVtkLayerController.h"
00021
00022 #include <mitkStandardFileLocations.h>
00023 #include <mitkConfig.h>
00024 #include <itkObject.h>
00025 #include <itkMacro.h>
00026 #include <itksys/SystemTools.hxx>
00027
00028 #include <vtkImageImport.h>
00029 #include <vtkRenderer.h>
00030 #include <vtkRenderWindow.h>
00031 #include <vtkMapper.h>
00032 #include <vtkImageActor.h>
00033 #include <vtkImageMapper.h>
00034 #include <vtkPolyData.h>
00035 #include <vtkCamera.h>
00036 #include <vtkObjectFactory.h>
00037 #include <vtkRendererCollection.h>
00038 #include <vtkPNGReader.h>
00039 #include <vtkImageData.h>
00040 #include <vtkConfigure.h>
00041 #include <vtkImageFlip.h>
00042
00043 #include <mbilogo.h>
00044
00045 #include <algorithm>
00046
00047
00048 mitk::ManufacturerLogo::ManufacturerLogo()
00049 :m_ImageData(NULL)
00050 {
00051 m_RenderWindow = NULL;
00052 m_Renderer = vtkRenderer::New();
00053 m_Actor = vtkImageActor::New();
00054 m_Mapper = vtkImageMapper::New();
00055 m_PngReader = vtkPNGReader::New();
00056 m_VtkImageImport = vtkImageImport::New();
00057
00058 m_LogoPosition = mitk::ManufacturerLogo::LowerRight;
00059
00060 m_IsEnabled = false;
00061 m_ForceShowMBIDepartmentLogo = false;
00062
00063 m_ZoomFactor = 1.15;
00064 m_Opacity = 0.5;
00065
00066 m_FileName = "";
00067 m_PngReader->SetFileName(m_FileName.c_str());
00068 }
00069
00070 mitk::ManufacturerLogo::~ManufacturerLogo()
00071 {
00072 if ( m_RenderWindow != NULL )
00073 if ( this->IsEnabled() )
00074 this->Disable();
00075
00076 if ( m_Mapper != NULL )
00077 m_Mapper->Delete();
00078
00079 if ( m_Actor!=NULL )
00080 m_Actor->Delete();
00081
00082 if ( m_Renderer != NULL )
00083 m_Renderer->Delete();
00084
00085 if ( m_PngReader != NULL )
00086 m_PngReader->Delete();
00087
00088 if ( m_VtkImageImport != NULL )
00089 m_VtkImageImport->Delete();
00090
00091 if ( m_ImageData != NULL)
00092 delete[] m_ImageData;
00093 }
00094
00100 void mitk::ManufacturerLogo::SetRenderWindow( vtkRenderWindow* renderWindow )
00101 {
00102 m_RenderWindow = renderWindow;
00103 }
00104
00109 vtkRenderWindow* mitk::ManufacturerLogo::GetRenderWindow()
00110 {
00111 return m_RenderWindow;
00112 }
00113
00119 vtkRenderer* mitk::ManufacturerLogo::GetVtkRenderer()
00120 {
00121 return m_Renderer;
00122 }
00123
00127 vtkImageActor* mitk::ManufacturerLogo::GetActor()
00128 {
00129 return m_Actor;
00130 }
00131
00136 vtkImageMapper* mitk::ManufacturerLogo::GetMapper()
00137 {
00138 return m_Mapper;
00139 }
00140
00141 void mitk::ManufacturerLogo::SetLogoSource(const char* filename)
00142 {
00143 std::string file = filename;
00144 if(file.length() != 0)
00145 {
00146 m_FileName = filename;
00147 m_PngReader->SetFileName(m_FileName.c_str());
00148 }
00149 }
00150
00155 void mitk::ManufacturerLogo::Enable()
00156 {
00157 if(m_IsEnabled)
00158 return;
00159
00160 if(m_RenderWindow != NULL)
00161 {
00162 if(itksys::SystemTools::FileExists(m_FileName.c_str()) && !m_ForceShowMBIDepartmentLogo)
00163 {
00164 m_PngReader->Update();
00165 m_Actor->SetInput(m_PngReader->GetOutput());
00166 }
00167 else
00168 {
00169 m_VtkImageImport->SetDataScalarTypeToUnsignedChar();
00170 m_VtkImageImport->SetNumberOfScalarComponents(mbiLogo_NumberOfScalars);
00171 m_VtkImageImport->SetWholeExtent(0,mbiLogo_Width-1,0,mbiLogo_Height-1,0,1-1);
00172 m_VtkImageImport->SetDataExtentToWholeExtent();
00173
00174
00175 m_ImageData = new char[mbiLogo_Height*mbiLogo_Width*mbiLogo_NumberOfScalars];
00176
00177 unsigned int column, row;
00178 char * dest = m_ImageData;
00179 char * source = (char*) &mbiLogo_Data[0];;
00180 char r, g, b, a;
00181 for (column = 0; column < mbiLogo_Height; column++)
00182 for (row = 0; row < mbiLogo_Width; row++)
00183 {
00184 b = *source++;
00185 g = *source++;
00186 r = *source++;
00187 a = *source++;
00188
00189 *dest++ = r;
00190 *dest++ = g;
00191 *dest++ = b;
00192 *dest++ = a;
00193 }
00194
00195 m_VtkImageImport->SetImportVoidPointer(m_ImageData);
00196 m_VtkImageImport->Modified();
00197 m_VtkImageImport->Update();
00198
00199 m_Actor->SetInput(m_VtkImageImport->GetOutput());
00200 }
00201
00202 #if ( VTK_MAJOR_VERSION >= 5 )
00203 m_Actor->SetOpacity(m_Opacity);
00204 #endif
00205
00206 m_Renderer->AddActor( m_Actor );
00207 m_Renderer->InteractiveOff();
00208
00209 SetupCamera();
00210 SetupPosition();
00211
00212 mitk::VtkLayerController::GetInstance(m_RenderWindow)->InsertForegroundRenderer(m_Renderer,false);
00213
00214 m_IsEnabled = true;
00215 }
00216 }
00217
00218
00219 void mitk::ManufacturerLogo::SetupCamera()
00220 {
00221
00222
00223 vtkImageData * image = m_Actor->GetInput();
00224 m_Camera = m_Renderer->GetActiveCamera();
00225 m_Camera->SetClippingRange(1,100000);
00226
00227 if ( !image )
00228 return;
00229
00230 double spacing[3];
00231 double origin[3];
00232 int dimensions[3];
00233
00234 image->GetSpacing(spacing);
00235 image->GetOrigin(origin);
00236 image->GetDimensions(dimensions);
00237
00238 double focalPoint[3];
00239 double position[3];
00240
00241 for ( unsigned int cc = 0; cc < 3; cc++)
00242 {
00243 focalPoint[cc] = origin[cc] + ( spacing[cc] * dimensions[cc] ) / 2.0;
00244 position[cc] = focalPoint[cc];
00245 }
00246
00247
00248 m_Camera->SetViewUp (0,1,0);
00249 int idx = 2;
00250 const double distanceToFocalPoint = 1000;
00251 position[idx] = distanceToFocalPoint;
00252
00253 m_Camera->ParallelProjectionOn();
00254 m_Camera->SetPosition (position);
00255 m_Camera->SetFocalPoint (focalPoint);
00256
00257 int d1 = (idx + 1) % 3;
00258 int d2 = (idx + 2) % 3;
00259
00260 double max = std::max(dimensions[d1],dimensions[d2]);
00261
00262 m_Camera->SetParallelScale( max / 2 );
00263 }
00264
00265 void mitk::ManufacturerLogo::SetupPosition()
00266 {
00267
00268 double newPos[4];
00269 int dimensions[3];
00270 vtkImageData * image = m_Actor->GetInput();
00271 image->GetDimensions(dimensions);
00272
00273 double max = std::max(dimensions[0],dimensions[1]);
00274 double normX = dimensions[0] / max;
00275 double normY = dimensions[1] / max;
00276
00277 double buffer = 0;
00278
00279 switch(m_LogoPosition)
00280 {
00281 case mitk::ManufacturerLogo::LowerLeft:
00282 {
00283 newPos[0] = (0 + buffer);
00284 newPos[1] = (0 + buffer);
00285 newPos[2] = 0.2 * normX * m_ZoomFactor;
00286 newPos[3] = 0.2 * normY * m_ZoomFactor;
00287 break;
00288 }
00289 case mitk::ManufacturerLogo::LowerRight:
00290 {
00291 newPos[0] = (1 - buffer) - 0.2 * normX * m_ZoomFactor;
00292 newPos[1] = 0.0;
00293 newPos[2] = (1 - buffer);
00294 newPos[3] = 0.2 * normY * m_ZoomFactor;
00295 break;
00296 }
00297 case mitk::ManufacturerLogo::UpperLeft:
00298 {
00299 newPos[0] = (0 + buffer);
00300 newPos[1] = (1 - buffer) - 0.2 * normY * m_ZoomFactor;
00301 newPos[2] = 0.2 * normX * m_ZoomFactor;
00302 newPos[3] = (1 - buffer);
00303 break;
00304 }
00305 case mitk::ManufacturerLogo::UpperRight:
00306 {
00307 newPos[0] = (1 - buffer) - 0.2 * normX * m_ZoomFactor;
00308 newPos[1] = (1 - buffer) - 0.2 * normY * m_ZoomFactor;
00309 newPos[2] = (1 - buffer);
00310 newPos[3] = (1 - buffer);
00311 break;
00312 }
00313 case mitk::ManufacturerLogo::Middle:
00314 default:
00315 {
00316 newPos[0] = 0.5 - 0.2 * normX * m_ZoomFactor;
00317 newPos[1] = 0.5 + 0.2 * normY * m_ZoomFactor;
00318 newPos[2] = 0.5 - 0.2 * normX * m_ZoomFactor;
00319 newPos[3] = 0.5 + 0.2 * normY * m_ZoomFactor;
00320 break;
00321 }
00322 }
00323
00324 m_Renderer->SetViewport(newPos);
00325 }
00326
00327 void mitk::ManufacturerLogo::ForceMBILogoVisible(bool visible)
00328 {
00329 m_ForceShowMBIDepartmentLogo = visible;
00330 }
00331
00332 void mitk::ManufacturerLogo::SetZoomFactor( double factor )
00333 {
00334 m_ZoomFactor = factor;
00335 }
00336 void mitk::ManufacturerLogo::SetOpacity(double opacity)
00337 {
00338 m_Opacity = opacity;
00339 }
00340
00345 void mitk::ManufacturerLogo::Disable()
00346 {
00347 if ( this->IsEnabled() && !m_ForceShowMBIDepartmentLogo )
00348 {
00349 mitk::VtkLayerController::GetInstance(m_RenderWindow)->RemoveRenderer(m_Renderer);
00350 m_IsEnabled = false;
00351 }
00352 }
00353
00358 bool mitk::ManufacturerLogo::IsEnabled()
00359 {
00360 return m_IsEnabled;
00361 }
00362
00363
00364 void mitk::ManufacturerLogo::SetRequestedRegionToLargestPossibleRegion()
00365 {
00366
00367 }
00368
00369 bool mitk::ManufacturerLogo::RequestedRegionIsOutsideOfTheBufferedRegion()
00370 {
00371 return false;
00372 }
00373
00374 bool mitk::ManufacturerLogo::VerifyRequestedRegion()
00375 {
00376 return true;
00377 }
00378
00379 void mitk::ManufacturerLogo::SetRequestedRegion(itk::DataObject*)
00380 {
00381
00382 }
00383