#ifndef ROOT_TEveRGBAPalette
#define ROOT_TEveRGBAPalette
#include "TEveUtil.h"
#include "TObject.h"
class TEveRGBAPalette : public TObject, public TEveRefCnt
{
   friend class TEveRGBAPaletteEditor;
   friend class TEveRGBAPaletteSubEditor;
public:
   enum ELimitAction_e { kLA_Cut, kLA_Mark, kLA_Clip, kLA_Wrap };
private:
   TEveRGBAPalette(const TEveRGBAPalette&);            
   TEveRGBAPalette& operator=(const TEveRGBAPalette&); 
protected:
   Int_t     fLowLimit;  
   Int_t     fHighLimit; 
   Int_t     fMinVal;
   Int_t     fMaxVal;
   Int_t     fNBins;
   Bool_t    fInterpolate;
   Bool_t    fShowDefValue;
   Int_t     fUnderflowAction;
   Int_t     fOverflowAction;
   Color_t   fDefaultColor;   
   UChar_t   fDefaultRGBA[4];
   Color_t   fUnderColor;     
   UChar_t   fUnderRGBA[4];
   Color_t   fOverColor;      
   UChar_t   fOverRGBA[4];
   mutable UChar_t* fColorArray; 
   void SetupColor(Int_t val, UChar_t* pix) const;
   static TEveRGBAPalette* fgDefaultPalette;
public:
   TEveRGBAPalette();
   TEveRGBAPalette(Int_t min, Int_t max, Bool_t interp=kFALSE, Bool_t showdef=kTRUE);
   virtual ~TEveRGBAPalette();
   void SetupColorArray() const;
   void ClearColorArray();
   Bool_t   WithinVisibleRange(Int_t val) const;
   const UChar_t* ColorFromValue(Int_t val) const;
   void     ColorFromValue(Int_t val, UChar_t* pix, Bool_t alpha=kTRUE) const;
   Bool_t   ColorFromValue(Int_t val, Int_t defVal, UChar_t* pix, Bool_t alpha=kTRUE) const;
   Int_t  GetMinVal() const { return fMinVal; }
   Int_t  GetMaxVal() const { return fMaxVal; }
   void   SetLimits(Int_t low, Int_t high);
   void   SetLimitsScaleMinMax(Int_t low, Int_t high);
   void   SetMinMax(Int_t min, Int_t max);
   void   SetMin(Int_t min);
   void   SetMax(Int_t max);
   Int_t  GetLowLimit()  const { return fLowLimit;  }
   Int_t  GetHighLimit() const { return fHighLimit; }
   
   Bool_t GetInterpolate() const { return fInterpolate; }
   void   SetInterpolate(Bool_t b);
   Bool_t GetShowDefValue() const { return fShowDefValue; }
   void   SetShowDefValue(Bool_t v) { fShowDefValue = v; }
   Int_t GetUnderflowAction() const  { return fUnderflowAction; }
   Int_t GetOverflowAction()  const  { return fOverflowAction;  }
   void  SetUnderflowAction(Int_t a) { fUnderflowAction = a;    }
   void  SetOverflowAction(Int_t a)  { fOverflowAction  = a;    }
   
   Color_t  GetDefaultColor() const { return fDefaultColor; }
   Color_t* PtrDefaultColor() { return &fDefaultColor; }
   UChar_t* GetDefaultRGBA()  { return fDefaultRGBA;  }
   const UChar_t* GetDefaultRGBA() const { return fDefaultRGBA;  }
   void   SetDefaultColor(Color_t ci);
   void   SetDefaultColor(Pixel_t pix);
   void   SetDefaultColor(UChar_t r, UChar_t g, UChar_t b, UChar_t a=255);
   
   Color_t  GetUnderColor() const { return fUnderColor; }
   Color_t* PtrUnderColor() { return &fUnderColor; }
   UChar_t* GetUnderRGBA()  { return fUnderRGBA;  }
   const UChar_t* GetUnderRGBA() const { return fUnderRGBA;  }
   void   SetUnderColor(Color_t ci);
   void   SetUnderColor(Pixel_t pix);
   void   SetUnderColor(UChar_t r, UChar_t g, UChar_t b, UChar_t a=255);
   
   Color_t  GetOverColor() const { return fOverColor; }
   Color_t* PtrOverColor() { return &fOverColor; }
   UChar_t* GetOverRGBA()  { return fOverRGBA;  }
   const UChar_t* GetOverRGBA() const { return fOverRGBA;  }
   void   SetOverColor(Color_t ci);
   void   SetOverColor(Pixel_t pix);
   void   SetOverColor(UChar_t r, UChar_t g, UChar_t b, UChar_t a=255);
   
   
   
   ClassDef(TEveRGBAPalette, 1); 
};
inline Bool_t TEveRGBAPalette::WithinVisibleRange(Int_t val) const
{
   if ((val < fMinVal && fUnderflowAction == kLA_Cut) ||
       (val > fMaxVal && fOverflowAction  == kLA_Cut))
      return kFALSE;
   else
      return kTRUE;
}
inline const UChar_t* TEveRGBAPalette::ColorFromValue(Int_t val) const
{
   
   
   if (!fColorArray)  SetupColorArray();
   if (val < fMinVal) {
      if (fUnderflowAction == kLA_Wrap)
         val = (val+1-fMinVal)%fNBins + fMaxVal;
      else if (fUnderflowAction == kLA_Clip)
         val = fMinVal;
      else
         return fUnderRGBA;
   }
   else if(val > fMaxVal) {
      if (fOverflowAction == kLA_Wrap)
         val = (val-1-fMaxVal)%fNBins + fMinVal;
      else if (fOverflowAction == kLA_Clip)
         val = fMaxVal;
      else
         return fOverRGBA;
   }
   return fColorArray + 4 * (val - fMinVal);
}
inline void TEveRGBAPalette::ColorFromValue(Int_t val, UChar_t* pix, Bool_t alpha) const
{
   const UChar_t* c = ColorFromValue(val);
   pix[0] = c[0]; pix[1] = c[1]; pix[2] = c[2];
   if (alpha) pix[3] = c[3];
}
inline Bool_t TEveRGBAPalette::ColorFromValue(Int_t val, Int_t defVal, UChar_t* pix, Bool_t alpha) const
{
   if (val == defVal) {
      if (fShowDefValue) {
         pix[0] = fDefaultRGBA[0];
         pix[1] = fDefaultRGBA[1];
         pix[2] = fDefaultRGBA[2];
         if (alpha) pix[3] = fDefaultRGBA[3];
         return kTRUE;
      } else {
         return kFALSE;
      }
   }
   if (WithinVisibleRange(val)) {
      ColorFromValue(val, pix, alpha);
      return kTRUE;
   } else {
      return kFALSE;
   }
}
#endif
Last update: Thu Jan 17 08:49:09 2008
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.