Cloned library of VTK-5.0.0 with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

282 lines
7.8 KiB

/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkImageMapper.cxx,v $
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
#include "vtkImageMapper.h"
#include "vtkActor2D.h"
#include "vtkExecutive.h"
#include "vtkImageData.h"
#include "vtkImagingFactory.h"
#include "vtkInformation.h"
#include "vtkViewport.h"
#include "vtkWindow.h"
vtkCxxRevisionMacro(vtkImageMapper, "$Revision: 1.52 $");
//----------------------------------------------------------------------------
// Needed when we don't use the vtkStandardNewMacro.
vtkInstantiatorNewMacro(vtkImageMapper);
//----------------------------------------------------------------------------
#define VTK_RINT(x) ((x > 0.0) ? (int)(x + 0.5) : (int)(x - 0.5))
vtkImageMapper::vtkImageMapper()
{
vtkDebugMacro(<< "vtkImageMapper::vtkImageMapper" );
this->ColorWindow = 2000;
this->ColorLevel = 1000;
this->DisplayExtent[0] = this->DisplayExtent[1] = 0;
this->DisplayExtent[2] = this->DisplayExtent[3] = 0;
this->DisplayExtent[4] = this->DisplayExtent[5] = 0;
this->ZSlice = 0;
this->RenderToRectangle = 0;
this->UseCustomExtents = 0;
this->CustomDisplayExtents[0] = this->CustomDisplayExtents[1] = 0;
this->CustomDisplayExtents[2] = this->CustomDisplayExtents[3] = 0;
}
vtkImageMapper::~vtkImageMapper()
{
}
//----------------------------------------------------------------------------
void vtkImageMapper::SetInput(vtkImageData *input)
{
if(input)
{
this->SetInputConnection(0, input->GetProducerPort());
}
else
{
// Setting a NULL input removes the connection.
this->SetInputConnection(0, 0);
}
}
//----------------------------------------------------------------------------
vtkImageData *vtkImageMapper::GetInput()
{
if (this->GetNumberOfInputConnections(0) < 1)
{
return 0;
}
return vtkImageData::SafeDownCast(
this->GetExecutive()->GetInputData(0, 0));
}
unsigned long int vtkImageMapper::GetMTime()
{
unsigned long mTime=this->vtkMapper2D::GetMTime();
return mTime;
}
void vtkImageMapper::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os, indent);
os << indent << "Color Window: " << this->ColorWindow << "\n";
os << indent << "Color Level: " << this->ColorLevel << "\n";
os << indent << "ZSlice: " << this->ZSlice << "\n";
os << indent << "RenderToRectangle: " << this->RenderToRectangle << "\n";
os << indent << "UseCustomExtents: " << this->UseCustomExtents << "\n";
os << indent << "CustomDisplayExtents: " <<
this->CustomDisplayExtents[0] << " " <<
this->CustomDisplayExtents[1] << " " <<
this->CustomDisplayExtents[2] << " " <<
this->CustomDisplayExtents[3] << "\n";
//
}
vtkImageMapper* vtkImageMapper::New()
{
// First try to create the object from the vtkObjectFactory
vtkObject* ret = vtkImagingFactory::CreateInstance("vtkImageMapper");
return (vtkImageMapper*)ret;
}
double vtkImageMapper::GetColorShift()
{
return this->ColorWindow /2.0 - this->ColorLevel;
}
double vtkImageMapper::GetColorScale()
{
return 255.0 / this->ColorWindow;
}
void vtkImageMapper::RenderStart(vtkViewport* viewport, vtkActor2D* actor)
{
vtkDebugMacro(<< "vtkImageMapper::RenderOverlay");
vtkImageData *data;
if (!viewport)
{
vtkErrorMacro (<< "vtkImageMapper::Render - Null viewport argument");
return;
}
if (!actor)
{
vtkErrorMacro (<<"vtkImageMapper::Render - Null actor argument");
return;
}
if (!this->GetInput())
{
vtkDebugMacro(<< "vtkImageMapper::Render - Please Set the input.");
return;
}
this->GetInput()->UpdateInformation();
if (!this->UseCustomExtents)
{
// start with the wholeExtent
int wholeExtent[6];
memcpy(wholeExtent,this->GetInput()->GetWholeExtent(),6*sizeof(int));
memcpy(this->DisplayExtent,
this->GetInput()->GetWholeExtent(),6*sizeof(int));
// Set The z values to the zslice
this->DisplayExtent[4] = this->ZSlice;
this->DisplayExtent[5] = this->ZSlice;
// scale currently not handled
//double *scale = actor->GetScale();
// get the position
int *pos =
actor->GetPositionCoordinate()->GetComputedViewportValue(viewport);
// Get the viewport coordinates
double vCoords[4];
vCoords[0] = 0.0;
vCoords[1] = 0.0;
vCoords[2] = 1.0;
vCoords[3] = 1.0;
viewport->NormalizedViewportToViewport(vCoords[0],vCoords[1]);
viewport->NormalizedViewportToViewport(vCoords[2],vCoords[3]);
int *vSize = viewport->GetSize();
// the basic formula is that the draw pos equals
// the pos + extentPos + clippedAmount
// The concrete subclass will get the pos in display
// coordinates so we need to provide the extentPos plus
// clippedAmount in the PositionAdjustment variable
// Now clip to imager extents
if (pos[0] + wholeExtent[0] < 0)
{
this->DisplayExtent[0] = -pos[0];
}
if ((pos[0]+wholeExtent[1]) > vSize[0])
{
this->DisplayExtent[1] = vSize[0] - pos[0];
}
if (pos[1] + wholeExtent[2] < 0)
{
this->DisplayExtent[2] = -pos[1];
}
if ((pos[1]+wholeExtent[3]) > vSize[1])
{
this->DisplayExtent[3] = vSize[1] - pos[1];
}
// check for the condition where no pixels are visible.
if (this->DisplayExtent[0] > wholeExtent[1] ||
this->DisplayExtent[1] < wholeExtent[0] ||
this->DisplayExtent[2] > wholeExtent[3] ||
this->DisplayExtent[3] < wholeExtent[2] ||
this->DisplayExtent[4] > wholeExtent[5] ||
this->DisplayExtent[5] < wholeExtent[4])
{
return;
}
this->GetInput()->SetUpdateExtent(this->DisplayExtent);
// set the position adjustment
this->PositionAdjustment[0] = this->DisplayExtent[0];
this->PositionAdjustment[1] = this->DisplayExtent[2];
}
else // UseCustomExtents
{
this->DisplayExtent[0] = this->CustomDisplayExtents[0];
this->DisplayExtent[1] = this->CustomDisplayExtents[1];
this->DisplayExtent[2] = this->CustomDisplayExtents[2];
this->DisplayExtent[3] = this->CustomDisplayExtents[3];
this->DisplayExtent[4] = this->ZSlice;
this->DisplayExtent[5] = this->ZSlice;
//
this->GetInput()->SetUpdateExtentToWholeExtent();
// clear the position adjustment
this->PositionAdjustment[0] = 0;
this->PositionAdjustment[1] = 0;
}
// Get the region from the input
this->GetInput()->Update();
data = this->GetInput();
if ( !data)
{
vtkErrorMacro(<< "Render: Could not get data from input.");
return;
}
this->RenderData(viewport, data, actor);
}
//----------------------------------------------------------------------------
int vtkImageMapper::GetWholeZMin()
{
int *extent;
if ( ! this->GetInput())
{
return 0;
}
this->GetInput()->UpdateInformation();
extent = this->GetInput()->GetWholeExtent();
return extent[4];
}
//----------------------------------------------------------------------------
int vtkImageMapper::GetWholeZMax()
{
int *extent;
if ( ! this->GetInput())
{
return 0;
}
this->GetInput()->UpdateInformation();
extent = this->GetInput()->GetWholeExtent();
return extent[5];
}
//----------------------------------------------------------------------------
int vtkImageMapper::FillInputPortInformation(
int vtkNotUsed( port ), vtkInformation* info)
{
info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkImageData");
return 1;
}