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.
 
 
 
 
 
 

283 lines
8.0 KiB

/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkScalarsToColors.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 "vtkScalarsToColors.h"
#include "vtkUnsignedCharArray.h"
#include <math.h>
vtkCxxRevisionMacro(vtkScalarsToColors, "$Revision: 1.25 $");
//----------------------------------------------------------------------------
vtkScalarsToColors::vtkScalarsToColors()
{
this->Alpha = 1.0;
this->VectorComponent = 0;
this->VectorMode = vtkScalarsToColors::COMPONENT;
this->UseMagnitude = 0;
}
//----------------------------------------------------------------------------
void vtkScalarsToColors::SetVectorModeToComponent()
{
this->SetVectorMode(vtkScalarsToColors::COMPONENT);
}
//----------------------------------------------------------------------------
void vtkScalarsToColors::SetVectorModeToMagnitude()
{
this->SetVectorMode(vtkScalarsToColors::MAGNITUDE);
}
//----------------------------------------------------------------------------
// do not use SetMacro() because we do not want the table to rebuild.
void vtkScalarsToColors::SetAlpha(double alpha)
{
this->Alpha = (alpha < 0.0 ? 0.0 : (alpha > 1.0 ? 1.0 : alpha));
}
//----------------------------------------------------------------------------
vtkUnsignedCharArray *vtkScalarsToColors::MapScalars(vtkDataArray *scalars,
int colorMode, int comp)
{
vtkUnsignedCharArray *newColors;
vtkUnsignedCharArray *colors;
// map scalars through lookup table only if needed
if ( colorMode == VTK_COLOR_MODE_DEFAULT &&
(colors=vtkUnsignedCharArray::SafeDownCast(scalars)) != NULL )
{
newColors = this->
ConvertUnsignedCharToRGBA(colors, colors->GetNumberOfComponents(),
scalars->GetNumberOfTuples());
}
else
{
newColors = vtkUnsignedCharArray::New();
newColors->SetNumberOfComponents(4);
newColors->SetNumberOfTuples(scalars->GetNumberOfTuples());
// If mapper did not specify a component, use our mode.
this->UseMagnitude = 0;
if (comp < 0 && this->VectorMode == vtkScalarsToColors::COMPONENT)
{
comp = this->VectorComponent;
}
if (comp < 0 && this->VectorMode == vtkScalarsToColors::MAGNITUDE)
{
comp = 0;
this->UseMagnitude = 1;
}
// Just some error checking.
if (comp < 0)
{
comp = 0;
}
if (comp >= scalars->GetNumberOfComponents())
{
comp = scalars->GetNumberOfComponents()-1;
}
// Fill in the colors.
this->MapScalarsThroughTable2(scalars->GetVoidPointer(comp),
newColors->GetPointer(0),
scalars->GetDataType(),
scalars->GetNumberOfTuples(),
scalars->GetNumberOfComponents(),
VTK_RGBA);
}//need to map
// Here is a bit of a hack.
// It is much faster to render RGB instead of RGBA when possible.
// I do not want to create a 3 component color array because
// it would be another condition. Give the mapper a hint that
// the colors have no alpha by setting the name.
// When the mapper can handle 3 component color array,
// I will change this logic to use NumberOfComponents as
// an indicator of opacity.
unsigned char* alphaPtr = newColors->GetPointer(0) + 3;
vtkIdType idx, num;
int opaque = 1;
num = newColors->GetNumberOfTuples();
for (idx = 0; idx < num; ++idx)
{
if (*alphaPtr < 255)
{
opaque = 0;
}
alphaPtr += 4;
}
if (opaque)
{
newColors->SetName("Opaque Colors");
}
return newColors;
}
//----------------------------------------------------------------------------
// Map a set of scalar values through the table
void vtkScalarsToColors::MapScalarsThroughTable(vtkDataArray *scalars,
unsigned char *output,
int outputFormat)
{
switch (outputFormat)
{
case VTK_RGBA:
case VTK_RGB:
case VTK_LUMINANCE_ALPHA:
case VTK_LUMINANCE:
break;
default:
vtkErrorMacro(<< "MapScalarsThroughTable: unrecognized color format");
break;
}
this->MapScalarsThroughTable2(scalars->GetVoidPointer(0),
output,
scalars->GetDataType(),
scalars->GetNumberOfTuples(),
scalars->GetNumberOfComponents(),
outputFormat);
}
//----------------------------------------------------------------------------
vtkUnsignedCharArray *vtkScalarsToColors::ConvertUnsignedCharToRGBA(
vtkUnsignedCharArray *colors, int numComp, int numTuples)
{
if ( numComp == 4 && this->Alpha >= 1.0 )
{
colors->Register(this);
return colors;
}
unsigned char *cptr = colors->GetPointer(0);
vtkUnsignedCharArray *newColors = vtkUnsignedCharArray::New();
newColors->SetNumberOfComponents(4);
newColors->SetNumberOfTuples(numTuples);
unsigned char *nptr = newColors->GetPointer(0);
int i;
if ( this->Alpha >= 1.0 )
{
switch (numComp)
{
case 1:
for (i=0; i<numTuples; i++)
{
*nptr++ = *cptr;
*nptr++ = *cptr;
*nptr++ = *cptr++;
*nptr++ = 255;
}
break;
case 2:
for (i=0; i<numTuples; i++)
{
*nptr++ = *cptr;
*nptr++ = *cptr;
*nptr++ = *cptr++;
*nptr++ = *cptr++;
}
break;
case 3:
for (i=0; i<numTuples; i++)
{
*nptr++ = *cptr++;
*nptr++ = *cptr++;
*nptr++ = *cptr++;
*nptr++ = 255;
}
break;
default:
vtkErrorMacro(<<"Cannot convert colors");
return NULL;
}
}
else //blending required
{
unsigned char alpha;
switch (numComp)
{
case 1:
alpha = static_cast<unsigned char>(this->Alpha*255);
for (i=0; i<numTuples; i++)
{
*nptr++ = *cptr;
*nptr++ = *cptr;
*nptr++ = *cptr++;
*nptr++ = alpha;
}
break;
case 2:
for (i=0; i<numTuples; i++)
{
*nptr++ = *cptr;
*nptr++ = *cptr;
*nptr++ = *cptr++;
*nptr++ = static_cast<unsigned char>((*cptr)*this->Alpha); cptr++;
}
break;
case 3:
alpha = static_cast<unsigned char>(this->Alpha*255);
for (i=0; i<numTuples; i++)
{
*nptr++ = *cptr++;
*nptr++ = *cptr++;
*nptr++ = *cptr++;
*nptr++ = alpha;
}
break;
case 4:
for (i=0; i<numTuples; i++)
{
*nptr++ = *cptr++;
*nptr++ = *cptr++;
*nptr++ = *cptr++;
*nptr++ = static_cast<unsigned char>((*cptr)*this->Alpha); cptr++;
}
break;
default:
vtkErrorMacro(<<"Cannot convert colors");
return NULL;
}
}
return newColors;
}
//----------------------------------------------------------------------------
void vtkScalarsToColors::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os,indent);
os << indent << "Alpha: " << this->Alpha << endl;
if (this->VectorMode == vtkScalarsToColors::MAGNITUDE)
{
os << indent << "VectorMode: Magnitude\n";
}
else
{
os << indent << "VectorMode: Component\n";
os << indent << "VectorComponent: " << this->VectorComponent << endl;
}
}