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.
283 lines
7.8 KiB
283 lines
7.8 KiB
2 years ago
|
/*=========================================================================
|
||
|
|
||
|
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;
|
||
|
}
|