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.
223 lines
7.7 KiB
223 lines
7.7 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: vtkWindowLevelLookupTable.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 "vtkWindowLevelLookupTable.h"
|
|
#include "vtkObjectFactory.h"
|
|
|
|
#include <math.h>
|
|
|
|
vtkCxxRevisionMacro(vtkWindowLevelLookupTable, "$Revision: 1.24.4.1 $");
|
|
vtkStandardNewMacro(vtkWindowLevelLookupTable);
|
|
|
|
//----------------------------------------------------------------------------
|
|
vtkWindowLevelLookupTable::vtkWindowLevelLookupTable(int sze, int ext)
|
|
: vtkLookupTable(sze, ext)
|
|
{
|
|
this->Level = (this->TableRange[0] + this->TableRange[1])/2;
|
|
this->Window = (this->TableRange[1] - this->TableRange[0]);
|
|
|
|
this->InverseVideo = 0;
|
|
|
|
this->MinimumTableValue[0] = 0.0;
|
|
this->MinimumTableValue[1] = 0.0;
|
|
this->MinimumTableValue[2] = 0.0;
|
|
this->MinimumTableValue[3] = 1.0;
|
|
|
|
this->MaximumTableValue[0] = 1.0;
|
|
this->MaximumTableValue[1] = 1.0;
|
|
this->MaximumTableValue[2] = 1.0;
|
|
this->MaximumTableValue[3] = 1.0;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Table is built as a linear ramp between MinimumTableValue and
|
|
// MaximumTableValue.
|
|
void vtkWindowLevelLookupTable::Build()
|
|
{
|
|
if (this->Table->GetNumberOfTuples() < 1 ||
|
|
(this->GetMTime() > this->BuildTime &&
|
|
this->InsertTime < this->BuildTime))
|
|
{
|
|
int i, j;
|
|
unsigned char *rgba;
|
|
double start[4], incr[4];
|
|
|
|
for (j = 0; j < 4; j++)
|
|
{
|
|
start[j] = this->MinimumTableValue[j]*255;
|
|
incr[j] = ((this->MaximumTableValue[j]-this->MinimumTableValue[j]) /
|
|
(this->NumberOfColors - 1) * 255);
|
|
}
|
|
|
|
if (this->InverseVideo)
|
|
{
|
|
for (i = 0; i < this->NumberOfColors; i++)
|
|
{
|
|
rgba = this->Table->WritePointer(4*i,4);
|
|
for (j = 0; j < 4; j++)
|
|
{
|
|
rgba[j] = (unsigned char) \
|
|
(start[j] + (this->NumberOfColors - i - 1)*incr[j] + 0.5);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (i = 0; i < this->NumberOfColors; i++)
|
|
{
|
|
rgba = this->Table->WritePointer(4*i,4);
|
|
for (j = 0; j < 4; j++)
|
|
{
|
|
rgba[j] = (unsigned char)(start[j] + i*incr[j] + 0.5);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
this->BuildTime.Modified();
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Reverse the color table (don't rebuild in case someone has
|
|
// been adjusting the table values by hand)
|
|
// This is a little ugly ... it might be best to remove
|
|
// SetInverseVideo altogether and just use a negative Window.
|
|
void vtkWindowLevelLookupTable::SetInverseVideo(int iv)
|
|
{
|
|
if (this->InverseVideo == iv)
|
|
{
|
|
return;
|
|
}
|
|
|
|
this->InverseVideo = iv;
|
|
|
|
if (this->Table->GetNumberOfTuples() < 1)
|
|
{
|
|
return;
|
|
}
|
|
|
|
unsigned char *rgba, *rgba2;
|
|
unsigned char tmp[4];
|
|
int i;
|
|
int n = this->NumberOfColors-1;
|
|
|
|
for (i = 0; i < this->NumberOfColors/2; i++)
|
|
{
|
|
rgba = this->Table->WritePointer(4*i,4);
|
|
rgba2 = this->Table->WritePointer(4*(n-i),4);
|
|
tmp[0]=rgba[0]; tmp[1]=rgba[1]; tmp[2]=rgba[2]; tmp[3]=rgba[3];
|
|
rgba[0]=rgba2[0]; rgba[1]=rgba2[1]; rgba[2]=rgba2[2]; rgba[3]=rgba2[3];
|
|
rgba2[0]=tmp[0]; rgba2[1]=tmp[1]; rgba2[2]=tmp[2]; rgba2[3]=tmp[3];
|
|
}
|
|
this->Modified();
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void vtkWindowLevelLookupTable::PrintSelf(ostream& os, vtkIndent indent)
|
|
{
|
|
this->Superclass::PrintSelf(os,indent);
|
|
|
|
os << indent << "Window: " << this->Window << "\n";
|
|
os << indent << "Level: " << this->Level << "\n";
|
|
os << indent << "InverseVideo: "
|
|
<< (this->InverseVideo ? "On\n" : "Off\n");
|
|
os << indent << "MinimumTableValue : ("
|
|
<< this->MinimumTableValue[0] << ", "
|
|
<< this->MinimumTableValue[1] << ", "
|
|
<< this->MinimumTableValue[2] << ", "
|
|
<< this->MinimumTableValue[3] << ")\n";
|
|
os << indent << "MaximumTableValue : ("
|
|
<< this->MaximumTableValue[0] << ", "
|
|
<< this->MaximumTableValue[1] << ", "
|
|
<< this->MaximumTableValue[2] << ", "
|
|
<< this->MaximumTableValue[3] << ")\n";
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Deprecated methods:
|
|
|
|
#ifndef VTK_LEGACY_REMOVE
|
|
void vtkWindowLevelLookupTable::SetMinimumColor(int r, int g, int b, int a)
|
|
{
|
|
VTK_LEGACY_REPLACED_BODY(vtkWindowLevelLookupTable::SetMinimumColor, "VTK 5.0",
|
|
vtkWindowLevelLookupTable::SetMinimumTableValue);
|
|
this->SetMinimumTableValue(r*255.0,g*255.0,b*255.0,a*255.0);
|
|
}
|
|
|
|
void vtkWindowLevelLookupTable::SetMinimumColor(const unsigned char rgba[4])
|
|
{
|
|
VTK_LEGACY_REPLACED_BODY(vtkWindowLevelLookupTable::SetMinimumColor, "VTK 5.0",
|
|
vtkWindowLevelLookupTable::SetMinimumTableValue);
|
|
this->SetMinimumTableValue(rgba[0]*255,rgba[1]*255,rgba[2]*255,rgba[3]*255);
|
|
}
|
|
|
|
void vtkWindowLevelLookupTable::GetMinimumColor(unsigned char rgba[4])
|
|
{
|
|
VTK_LEGACY_REPLACED_BODY(vtkWindowLevelLookupTable::GetMinimumColor, "VTK 5.0",
|
|
vtkWindowLevelLookupTable::GetMinimumTableValue);
|
|
rgba[0] = int(this->MinimumTableValue[0]*255);
|
|
rgba[1] = int(this->MinimumTableValue[1]*255);
|
|
rgba[2] = int(this->MinimumTableValue[2]*255);
|
|
rgba[3] = int(this->MinimumTableValue[3]*255);
|
|
}
|
|
|
|
unsigned char *vtkWindowLevelLookupTable::GetMinimumColor()
|
|
{
|
|
VTK_LEGACY_REPLACED_BODY(vtkWindowLevelLookupTable::GetMinimumColor, "VTK 5.0",
|
|
vtkWindowLevelLookupTable::GetMinimumTableValue);
|
|
static unsigned char minimumcolor[4];
|
|
minimumcolor[0] = int(this->MinimumTableValue[0]*255);
|
|
minimumcolor[1] = int(this->MinimumTableValue[1]*255);
|
|
minimumcolor[2] = int(this->MinimumTableValue[2]*255);
|
|
minimumcolor[3] = int(this->MinimumTableValue[3]*255);
|
|
return minimumcolor;
|
|
}
|
|
|
|
void vtkWindowLevelLookupTable::SetMaximumColor(int r, int g, int b, int a)
|
|
{
|
|
VTK_LEGACY_REPLACED_BODY(vtkWindowLevelLookupTable::SetMaximumColor, "VTK 5.0",
|
|
vtkWindowLevelLookupTable::SetMaximumTableValue);
|
|
this->SetMaximumTableValue(r*255.0,g*255.0,b*255.0,a*255.0);
|
|
}
|
|
|
|
void vtkWindowLevelLookupTable::SetMaximumColor(const unsigned char rgba[4])
|
|
{
|
|
VTK_LEGACY_REPLACED_BODY(vtkWindowLevelLookupTable::SetMaximumColor, "VTK 5.0",
|
|
vtkWindowLevelLookupTable::SetMaximumTableValue);
|
|
this->SetMaximumTableValue(rgba[0]*255,rgba[1]*255,rgba[2]*255,rgba[3]*255);
|
|
}
|
|
|
|
void vtkWindowLevelLookupTable::GetMaximumColor(unsigned char rgba[4])
|
|
{
|
|
VTK_LEGACY_REPLACED_BODY(vtkWindowLevelLookupTable::GetMaximumColor, "VTK 5.0",
|
|
vtkWindowLevelLookupTable::GetMaximumTableValue);
|
|
rgba[0] = int(this->MaximumTableValue[0]*255);
|
|
rgba[1] = int(this->MaximumTableValue[1]*255);
|
|
rgba[2] = int(this->MaximumTableValue[2]*255);
|
|
rgba[3] = int(this->MaximumTableValue[3]*255);
|
|
}
|
|
|
|
unsigned char *vtkWindowLevelLookupTable::GetMaximumColor()
|
|
{
|
|
VTK_LEGACY_REPLACED_BODY(vtkWindowLevelLookupTable::GetMaximumColor, "VTK 5.0",
|
|
vtkWindowLevelLookupTable::GetMaximumTableValue);
|
|
static unsigned char maximumcolor[4];
|
|
maximumcolor[0] = int(this->MaximumTableValue[0]*255);
|
|
maximumcolor[1] = int(this->MaximumTableValue[1]*255);
|
|
maximumcolor[2] = int(this->MaximumTableValue[2]*255);
|
|
maximumcolor[3] = int(this->MaximumTableValue[3]*255);
|
|
return maximumcolor;
|
|
}
|
|
|
|
#endif
|
|
|