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.
 
 
 
 
 
 

543 lines
13 KiB

/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkImageExport.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 "vtkImageExport.h"
#include "vtkExecutive.h"
#include "vtkObjectFactory.h"
#include "vtkImageData.h"
#include <ctype.h>
#include <string.h>
vtkCxxRevisionMacro(vtkImageExport, "$Revision: 1.32 $");
vtkStandardNewMacro(vtkImageExport);
//----------------------------------------------------------------------------
vtkImageExport::vtkImageExport()
{
this->ImageLowerLeft = 1;
this->ExportVoidPointer = 0;
this->DataDimensions[0] = this->DataDimensions[1] =
this->DataDimensions[2] = 0;
this->LastPipelineMTime = 0;
this->SetNumberOfOutputPorts(0);
}
//----------------------------------------------------------------------------
vtkImageExport::~vtkImageExport()
{
}
//----------------------------------------------------------------------------
void vtkImageExport::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os,indent);
os << indent << "ImageLowerLeft: "
<< (this->ImageLowerLeft ? "On\n" : "Off\n");
}
vtkImageData *vtkImageExport::GetInput()
{
if (this->GetNumberOfInputConnections(0) < 1)
{
return 0;
}
return vtkImageData::SafeDownCast(
this->GetExecutive()->GetInputData(0, 0));
}
//----------------------------------------------------------------------------
int vtkImageExport::GetDataMemorySize()
{
vtkImageData *input = this->GetInput();
if (input == NULL)
{
return 0;
}
input->UpdateInformation();
int *extent = input->GetWholeExtent();
int size = input->GetScalarSize();
size *= input->GetNumberOfScalarComponents();
size *= (extent[1] - extent[0] + 1);
size *= (extent[3] - extent[2] + 1);
size *= (extent[5] - extent[4] + 1);
return size;
}
//----------------------------------------------------------------------------
void vtkImageExport::GetDataDimensions(int *dims)
{
vtkImageData *input = this->GetInput();
if (input == NULL)
{
dims[0] = dims[1] = dims[2] = 0;
return;
}
input->UpdateInformation();
int *extent = input->GetWholeExtent();
dims[0] = extent[1]-extent[0]+1;
dims[1] = extent[3]-extent[2]+1;
dims[2] = extent[5]-extent[4]+1;
}
//----------------------------------------------------------------------------
void vtkImageExport::SetExportVoidPointer(void *ptr)
{
if (this->ExportVoidPointer == ptr)
{
return;
}
this->ExportVoidPointer = ptr;
this->Modified();
}
//----------------------------------------------------------------------------
// This is the superclasses style of Execute method. Convert it into
// an imaging style Execute method.
int vtkImageExport::RequestData(
vtkInformation* vtkNotUsed( request ),
vtkInformationVector** vtkNotUsed( inputVector ),
vtkInformationVector* vtkNotUsed( outputVector ))
{
// we are the end of the pipeline, we do nothing
return 1;
}
//----------------------------------------------------------------------------
// Exports all the data from the input.
void vtkImageExport::Export(void *output)
{
if (!this->GetPointerToData())
{
// GetPointerToData() outputs an error message.
return;
}
if (this->ImageLowerLeft)
{
memcpy(output,this->GetPointerToData(),this->GetDataMemorySize());
}
else
{ // flip the image when it is output
void *ptr = this->GetPointerToData();
int *extent = this->GetInput()->GetWholeExtent();
int xsize = extent[1]-extent[0]+1;
int ysize = extent[3]-extent[2]+1;
int zsize = extent[5]-extent[4]+1;
int csize = this->GetInput()->GetScalarSize()* \
this->GetInput()->GetNumberOfScalarComponents();
for (int i = 0; i < zsize; i++)
{
ptr = (void *)(((char *)ptr) + ysize*xsize*csize);
for (int j = 0; j < ysize; j++)
{
ptr = (void *)(((char *)ptr) - xsize*csize);
memcpy(output, ptr, xsize*csize);
output = (void *)(((char *)output) + xsize*csize);
}
ptr = (void *)(((char *)ptr) + ysize*xsize*csize);
}
}
}
//----------------------------------------------------------------------------
// Provides a valid pointer to the data (only valid until the next
// update, though)
void *vtkImageExport::GetPointerToData()
{
// Error checking
if ( this->GetInput() == NULL )
{
vtkErrorMacro(<<"Export: Please specify an input!");
return 0;
}
vtkImageData *input = this->GetInput();
input->UpdateInformation();
input->SetUpdateExtent(input->GetWholeExtent());
input->ReleaseDataFlagOff();
input->Update();
this->UpdateProgress(0.0);
this->UpdateProgress(1.0);
return input->GetScalarPointer();
}
//----------------------------------------------------------------------------
void* vtkImageExport::GetCallbackUserData()
{
return this;
}
vtkImageExport::UpdateInformationCallbackType
vtkImageExport::GetUpdateInformationCallback() const
{
return &vtkImageExport::UpdateInformationCallbackFunction;
}
vtkImageExport::PipelineModifiedCallbackType
vtkImageExport::GetPipelineModifiedCallback() const
{
return &vtkImageExport::PipelineModifiedCallbackFunction;
}
vtkImageExport::WholeExtentCallbackType
vtkImageExport::GetWholeExtentCallback() const
{
return &vtkImageExport::WholeExtentCallbackFunction;
}
vtkImageExport::SpacingCallbackType
vtkImageExport::GetSpacingCallback() const
{
return &vtkImageExport::SpacingCallbackFunction;
}
vtkImageExport::OriginCallbackType
vtkImageExport::GetOriginCallback() const
{
return &vtkImageExport::OriginCallbackFunction;
}
vtkImageExport::ScalarTypeCallbackType
vtkImageExport::GetScalarTypeCallback() const
{
return &vtkImageExport::ScalarTypeCallbackFunction;
}
vtkImageExport::NumberOfComponentsCallbackType
vtkImageExport::GetNumberOfComponentsCallback() const
{
return &vtkImageExport::NumberOfComponentsCallbackFunction;
}
vtkImageExport::PropagateUpdateExtentCallbackType
vtkImageExport::GetPropagateUpdateExtentCallback() const
{
return &vtkImageExport::PropagateUpdateExtentCallbackFunction;
}
vtkImageExport::UpdateDataCallbackType
vtkImageExport::GetUpdateDataCallback() const
{
return &vtkImageExport::UpdateDataCallbackFunction;
}
vtkImageExport::DataExtentCallbackType
vtkImageExport::GetDataExtentCallback() const
{
return &vtkImageExport::DataExtentCallbackFunction;
}
vtkImageExport::BufferPointerCallbackType
vtkImageExport::GetBufferPointerCallback() const
{
return &vtkImageExport::BufferPointerCallbackFunction;
}
//----------------------------------------------------------------------------
void vtkImageExport::UpdateInformationCallbackFunction(void* userData)
{
static_cast<vtkImageExport*>(userData)->
UpdateInformationCallback();
}
int vtkImageExport::PipelineModifiedCallbackFunction(void* userData)
{
return static_cast<vtkImageExport*>(userData)->
PipelineModifiedCallback();
}
int* vtkImageExport::WholeExtentCallbackFunction(void* userData)
{
return static_cast<vtkImageExport*>(userData)->
WholeExtentCallback();
}
double* vtkImageExport::SpacingCallbackFunction(void* userData)
{
return static_cast<vtkImageExport*>(userData)->
SpacingCallback();
}
double* vtkImageExport::OriginCallbackFunction(void* userData)
{
return static_cast<vtkImageExport*>(userData)->
OriginCallback();
}
const char* vtkImageExport::ScalarTypeCallbackFunction(void* userData)
{
return static_cast<vtkImageExport*>(userData)->
ScalarTypeCallback();
}
int vtkImageExport::NumberOfComponentsCallbackFunction(void* userData)
{
return static_cast<vtkImageExport*>(userData)->
NumberOfComponentsCallback();
}
void vtkImageExport::PropagateUpdateExtentCallbackFunction(void* userData,
int* extent)
{
static_cast<vtkImageExport*>(userData)->
PropagateUpdateExtentCallback(extent);
}
void vtkImageExport::UpdateDataCallbackFunction(void* userData)
{
static_cast<vtkImageExport*>(userData)->
UpdateDataCallback();
}
int* vtkImageExport::DataExtentCallbackFunction(void* userData)
{
return static_cast<vtkImageExport*>(userData)->
DataExtentCallback();
}
void* vtkImageExport::BufferPointerCallbackFunction(void* userData)
{
return static_cast<vtkImageExport*>(userData)->
BufferPointerCallback();
}
//----------------------------------------------------------------------------
void vtkImageExport::UpdateInformationCallback()
{
if (this->GetInput())
{
this->GetInput()->UpdateInformation();
}
}
int vtkImageExport::PipelineModifiedCallback()
{
if (!this->GetInput())
{
return 0;
}
unsigned long mtime = this->GetInput()->GetPipelineMTime();
if(mtime > this->LastPipelineMTime)
{
this->LastPipelineMTime = mtime;
return 1;
}
return 0;
}
int* vtkImageExport::WholeExtentCallback()
{
static int defaultextent[6] = {0,0,0,0,0,0};
if (!this->GetInput())
{
return defaultextent;
}
else
{
return this->GetInput()->GetWholeExtent();
}
}
double* vtkImageExport::SpacingCallback()
{
static double defaultspacing[6] = {0.0,0.0,0.0};
if (!this->GetInput())
{
return defaultspacing;
}
else
{
return this->GetInput()->GetSpacing();
}
}
double* vtkImageExport::OriginCallback()
{
static double defaultorigin[3] = {0.0,0.0,0.0};
if (!this->GetInput())
{
return defaultorigin;
}
else
{
return this->GetInput()->GetOrigin();
}
}
const char* vtkImageExport::ScalarTypeCallback()
{
if (!this->GetInput())
{
return "unsigned char";
}
switch (this->GetInput()->GetScalarType())
{
case VTK_DOUBLE:
{ return "double"; }
case VTK_FLOAT:
{ return "float"; }
case VTK_LONG:
{ return "long"; }
case VTK_UNSIGNED_LONG:
{ return "unsigned long"; }
case VTK_INT:
{ return "int"; }
case VTK_UNSIGNED_INT:
{ return "unsigned int"; }
case VTK_SHORT:
{ return "short"; }
case VTK_UNSIGNED_SHORT:
{ return "unsigned short"; }
case VTK_CHAR:
{ return "char"; }
case VTK_UNSIGNED_CHAR:
{ return "unsigned char"; }
default:
{ return "<unsupported>"; }
}
}
int vtkImageExport::NumberOfComponentsCallback()
{
if (!this->GetInput())
{
return 1;
}
else
{
return this->GetInput()->GetNumberOfScalarComponents();
}
}
void vtkImageExport::PropagateUpdateExtentCallback(int* extent)
{
if (this->GetInput())
{
this->GetInput()->SetUpdateExtent(extent);
}
}
void vtkImageExport::UpdateDataCallback()
{
if (this->GetInput())
{
this->GetInput()->Update();
}
}
int* vtkImageExport::DataExtentCallback()
{
static int defaultextent[6] = {0,0,0,0,0,0};
if (!this->GetInput())
{
return defaultextent;
}
else
{
return this->GetInput()->GetExtent();
}
}
void* vtkImageExport::BufferPointerCallback()
{
if (!this->GetInput())
{
return (void*)NULL;
}
else
{
return this->GetInput()->GetScalarPointer();
}
}
int vtkImageExport::GetDataNumberOfScalarComponents()
{
if (this->GetInput() == NULL)
{
return 1;
}
this->GetInput()->UpdateInformation();
return this->GetInput()->GetNumberOfScalarComponents();
}
int vtkImageExport::GetDataScalarType()
{
if (this->GetInput() == NULL)
{
return VTK_UNSIGNED_CHAR;
}
this->GetInput()->UpdateInformation();
return this->GetInput()->GetScalarType();
}
int *vtkImageExport::GetDataExtent()
{
static int defaultextent[6] = {0, 0, 0, 0, 0, 0};
if (this->GetInput() == NULL) { return defaultextent; }
this->GetInput()->UpdateInformation();
return this->GetInput()->GetWholeExtent();
}
void vtkImageExport::GetDataExtent(int *ptr)
{
if (this->GetInput() == NULL) {
ptr[0] = ptr[1] = ptr[2] = ptr[3] = ptr[4] = ptr[5] = 0; return; }
this->GetInput()->UpdateInformation();
this->GetInput()->GetWholeExtent(ptr);
}
double *vtkImageExport::GetDataSpacing()
{
static double defaultspacing[3] = {1, 1, 1};
if (this->GetInput() == NULL) { return defaultspacing; }
this->GetInput()->UpdateInformation();
return this->GetInput()->GetSpacing();
}
void vtkImageExport::GetDataSpacing(double *ptr)
{
if (this->GetInput() == NULL) { ptr[0] = ptr[1] = ptr[2] = 0.0; return; }
this->GetInput()->UpdateInformation();
this->GetInput()->GetSpacing(ptr);
}
double *vtkImageExport::GetDataOrigin()
{
static double defaultorigin[3] = {0, 0, 0};
if (this->GetInput() == NULL) { return defaultorigin; }
this->GetInput()->UpdateInformation();
return this->GetInput()->GetOrigin();
}
void vtkImageExport::GetDataOrigin(double *ptr)
{
if (this->GetInput() == NULL) { ptr[0] = ptr[1] = ptr[2] = 0.0; return; }
this->GetInput()->UpdateInformation();
this->GetInput()->GetOrigin(ptr);
}