#include "TEveRGBAPalette.h"
#include "TColor.h"
#include "TStyle.h"
#include "TMath.h"
ClassImp(TEveRGBAPalette)
TEveRGBAPalette::TEveRGBAPalette() :
TObject(), TQObject(),
TEveRefCnt(),
fLowLimit(0), fHighLimit(0), fMinVal(0), fMaxVal(0),
fInterpolate (kTRUE),
fShowDefValue (kTRUE),
fFixColorRange (kFALSE),
fUnderflowAction (kLA_Cut),
fOverflowAction (kLA_Clip),
fDefaultColor(-1),
fUnderColor (-1),
fOverColor (-1),
fNBins(0), fCAMin(0), fCAMax(0), fColorArray(0)
{
SetLimits(0, 1024);
SetMinMax(0, 512);
SetDefaultColor(0);
SetUnderColor(1);
SetOverColor(2);
}
TEveRGBAPalette::TEveRGBAPalette(Int_t min, Int_t max, Bool_t interp,
Bool_t showdef, Bool_t fixcolrng) :
TObject(), TQObject(),
TEveRefCnt(),
fLowLimit(0), fHighLimit(0), fMinVal(0), fMaxVal(0),
fInterpolate (interp),
fShowDefValue (showdef),
fFixColorRange (fixcolrng),
fUnderflowAction (kLA_Cut),
fOverflowAction (kLA_Clip),
fDefaultColor(-1),
fUnderColor (-1),
fOverColor (-1),
fNBins(0), fCAMin(0), fCAMax(0), fColorArray(0)
{
SetLimits(min, max);
SetMinMax(min, max);
SetDefaultColor(0);
SetUnderColor(1);
SetOverColor(2);
}
TEveRGBAPalette::~TEveRGBAPalette()
{
delete [] fColorArray;
}
void TEveRGBAPalette::SetupColor(Int_t val, UChar_t* pixel) const
{
using namespace TMath;
Float_t div = Max(1, fCAMax - fCAMin);
Int_t nCol = gStyle->GetNumberOfColors();
Float_t f;
if (val >= fCAMax) f = nCol - 1;
else if (val <= fCAMin) f = 0;
else f = (val - fCAMin)/div*(nCol - 1);
if (fInterpolate) {
Int_t bin = (Int_t) f;
Float_t f1 = f - bin, f2 = 1.0f - f1;
TEveUtil::ColorFromIdx(f1, gStyle->GetColorPalette(bin),
f2, gStyle->GetColorPalette(Min(bin + 1, nCol - 1)),
pixel);
} else {
TEveUtil::ColorFromIdx(gStyle->GetColorPalette((Int_t) Nint(f)), pixel);
}
}
void TEveRGBAPalette::SetupColorArray() const
{
if (fColorArray)
delete [] fColorArray;
if (fFixColorRange) {
fCAMin = fLowLimit; fCAMax = fHighLimit;
} else {
fCAMin = fMinVal; fCAMax = fMaxVal;
}
fNBins = fCAMax - fCAMin + 1;
fColorArray = new UChar_t [4 * fNBins];
UChar_t* p = fColorArray;
for(Int_t v = fCAMin; v <= fCAMax; ++v, p+=4)
SetupColor(v, p);
}
void TEveRGBAPalette::ClearColorArray()
{
if (fColorArray) {
delete [] fColorArray;
fColorArray = 0;
fNBins = fCAMin = fCAMax = 0;
}
}
void TEveRGBAPalette::SetLimits(Int_t low, Int_t high)
{
fLowLimit = low;
fHighLimit = high;
if (fMaxVal < fLowLimit) SetMax(fLowLimit);
if (fMinVal < fLowLimit) SetMin(fLowLimit);
if (fMinVal > fHighLimit) SetMin(fHighLimit);
if (fMaxVal > fHighLimit) SetMax(fHighLimit);
ClearColorArray();
}
void TEveRGBAPalette::SetLimitsScaleMinMax(Int_t low, Int_t high)
{
Float_t rng_old = fHighLimit - fLowLimit;
Float_t rng_new = high - low;
fMinVal = TMath::Nint(low + (fMinVal - fLowLimit)*rng_new/rng_old);
fMaxVal = TMath::Nint(low + (fMaxVal - fLowLimit)*rng_new/rng_old);
fLowLimit = low;
fHighLimit = high;
ClearColorArray();
}
void TEveRGBAPalette::SetMin(Int_t min)
{
fMinVal = TMath::Min(min, fMaxVal);
ClearColorArray();
}
void TEveRGBAPalette::SetMax(Int_t max)
{
fMaxVal = TMath::Max(max, fMinVal);
ClearColorArray();
}
void TEveRGBAPalette::SetMinMax(Int_t min, Int_t max)
{
fMinVal = min;
fMaxVal = max;
ClearColorArray();
}
void TEveRGBAPalette::SetInterpolate(Bool_t b)
{
fInterpolate = b;
ClearColorArray();
}
void TEveRGBAPalette::SetFixColorRange(Bool_t v)
{
fFixColorRange = v;
ClearColorArray();
}
void TEveRGBAPalette::SetDefaultColor(Color_t ci)
{
fDefaultColor = ci;
TEveUtil::ColorFromIdx(ci, fDefaultRGBA, kTRUE);
}
void TEveRGBAPalette::SetDefaultColorPixel(Pixel_t pix)
{
SetDefaultColor(Color_t(TColor::GetColor(pix)));
}
void TEveRGBAPalette::SetDefaultColorRGBA(UChar_t r, UChar_t g, UChar_t b, UChar_t a)
{
fDefaultColor = Color_t(TColor::GetColor(r, g, b));
fDefaultRGBA[0] = r;
fDefaultRGBA[1] = g;
fDefaultRGBA[2] = b;
fDefaultRGBA[3] = a;
}
void TEveRGBAPalette::SetUnderColor(Color_t ci)
{
fUnderColor = ci;
TEveUtil::ColorFromIdx(ci, fUnderRGBA, kTRUE);
}
void TEveRGBAPalette::SetUnderColorPixel(Pixel_t pix)
{
SetUnderColor(Color_t(TColor::GetColor(pix)));
}
void TEveRGBAPalette::SetUnderColorRGBA(UChar_t r, UChar_t g, UChar_t b, UChar_t a)
{
fUnderColor = Color_t(TColor::GetColor(r, g, b));
fUnderRGBA[0] = r;
fUnderRGBA[1] = g;
fUnderRGBA[2] = b;
fUnderRGBA[3] = a;
}
void TEveRGBAPalette::SetOverColor(Color_t ci)
{
fOverColor = ci;
TEveUtil::ColorFromIdx(ci, fOverRGBA, kTRUE);
}
void TEveRGBAPalette::SetOverColorPixel(Pixel_t pix)
{
SetOverColor(Color_t(TColor::GetColor(pix)));
}
void TEveRGBAPalette::SetOverColorRGBA(UChar_t r, UChar_t g, UChar_t b, UChar_t a)
{
fOverColor = Color_t(TColor::GetColor(r, g, b));
fOverRGBA[0] = r;
fOverRGBA[1] = g;
fOverRGBA[2] = b;
fOverRGBA[3] = a;
}
void TEveRGBAPalette::MinMaxValChanged()
{
Emit("MinMaxValChanged()");
}