ROOT logo
// $Id: RGBAPalette.h 2694 2012-03-11 04:55:04Z matevz $

#ifndef Geom1_RGBAPalette_H
#define Geom1_RGBAPalette_H

#include <Glasses/ZGlass.h>
#include <Stones/ZColorMark.h>

class RGBAPalette : public ZGlass
{
  MAC_RNR_FRIENDS(RGBAPalette);

public:
  enum LimitAction_e { LA_Cut, LA_Mark, LA_Clip, LA_Wrap };

private:
  void _init();

protected:
  Int_t     mMinInt;  // X{GET} 7 Value(-range=>[-1e6, 1e6, 1], -join=>1)
  Int_t     mMaxInt;  // X{GET} 7 Value(-range=>[-1e6, 1e6, 1])
  Float_t   mMinFlt;  // X{GST} 7 Value(-range=>[-1e6, 1e6, 1, 1000], -join=>1)
  Float_t   mMaxFlt;  // X{GST} 7 Value(-range=>[-1e6, 1e6, 1, 1000])

  Bool_t    bInterpolate;  // X{GST} R{ClearCA} 7 Bool(-join=>1)
  Bool_t    mShowDefValue; // X{GST} R{ClearCA} 7 Bool()

  LimitAction_e  mUnderflowAction; // X{GS} 7 PhonyEnum(-join=>1)
  LimitAction_e  mOverflowAction;  // X{GS} 7 PhonyEnum()

  ZColor    mDefaultColor;   // X{PGST} R{RecolDCUO} 7 ColorButt(-width=>8, -join=>1)
  ZColor    mCutColor;       // X{PGST} R{RecolDCUO} 7 ColorButt(-width=>8)
  ZColor    mUnderColor;     // X{PGST} R{RecolDCUO} 7 ColorButt(-width=>8, -join=>1)
  ZColor    mOverColor;      // X{PGST} R{RecolDCUO} 7 ColorButt(-width=>8)

  UChar_t   mDefaultRGBA[4]; //!
  UChar_t   mCutRGBA[4];     //!
  UChar_t   mUnderRGBA[4];   //!
  UChar_t   mOverRGBA[4];    //!

  mutable Int_t                mNBins;
  mutable std::vector<UChar_t> mColorArray;

  vector<ZColorMark> mColorMarks;

public:
  RGBAPalette(const Text_t* n="RGBAPalette", const Text_t* t=0);
  virtual ~RGBAPalette();

  void ClearColorArray();

  void EmitClearCARay() { ClearColorArray(); }
  void EmitRecolDCUORay();

  void SetMinInt(Int_t min);
  void SetMaxInt(Int_t max);

  // --------------------------------

  void SetupColorArray() const;

  void SetMarksFromgStyle();                         // X{E} 7 MCWButt(-join=>1)
  void SetMarksFromPOVFile(const Text_t* file_name); // X{E} 7 MCWButt()

  void PrintMarks() const; //! X{E} 7 MButt(-join=>1)
  void PrintArray() const; //! X{E} 7 MButt()

  // --------------------------------

  Bool_t   WithinVisibleRange(Int_t val) const;
  const UChar_t* ColorFromValue(Int_t val) const;
  const UChar_t* ColorFromValue(Int_t val, Int_t def_val) const;
  void     ColorFromValue(Int_t val, UChar_t* pix, Bool_t alpha=true) const;
  Bool_t   ColorFromValue(Int_t val, Int_t def_val, UChar_t* pix, Bool_t alpha=true) const;

  const UChar_t* ColorFromValue(Float_t val) const;
  void  ColorFromValue(Float_t val, UChar_t* pix, Bool_t alpha=true) const;

  ZColor MarkToCol(Float_t mark);

  // ================================================================

  static void ColorFromIdx(Short_t ci, UChar_t* col, Bool_t alpha=true);
  static void ColorFromIdx(Float_t f1, Short_t c1, Float_t f2, Short_t c2,
                           UChar_t* col, Bool_t alpha=true);

#include "RGBAPalette.h7"
  ClassDef(RGBAPalette, 1);
}; // endclass RGBAPalette


/**************************************************************************/
// Inlines for RGBAPalette
/**************************************************************************/

inline Bool_t RGBAPalette::WithinVisibleRange(Int_t val) const
{
  if ((val < mMinInt && mUnderflowAction == LA_Cut) ||
      (val > mMaxInt && mOverflowAction  == LA_Cut))
    return false;
  else
    return true;
}

inline const UChar_t* RGBAPalette::ColorFromValue(Int_t val) const
{
  // Here we expect that LA_Cut has been checked; we further check
  // for LA_Wrap and LA_Clip otherwise we proceed as for LA_Mark.

  if (mColorArray.empty())  SetupColorArray();
  if (val < mMinInt)
  {
    if (mUnderflowAction == LA_Wrap)
      val = (val+1-mMinInt)%mNBins + mMaxInt;
    else if (mUnderflowAction == LA_Clip)
      val = mMinInt;
    else
      return mUnderRGBA;
  }
  else if (val > mMaxInt)
  {
    if (mOverflowAction == LA_Wrap)
      val = (val-1-mMaxInt)%mNBins + mMinInt;
    else if (mOverflowAction == LA_Clip)
      val = mMaxInt;
    else
      return mOverRGBA;
  }
  return &mColorArray[4 * (val - mMinInt)];
}

inline const UChar_t* RGBAPalette::ColorFromValue(Int_t val, Int_t def_val) const
{
  if (val == def_val && mShowDefValue)
    return mDefaultRGBA;
  else
    return ColorFromValue(val);
}

inline void RGBAPalette::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 RGBAPalette::ColorFromValue(Int_t val, Int_t def_val, UChar_t* pix, Bool_t alpha) const
{
  if (val == def_val)
  {
    if (mShowDefValue) {
      pix[0] = mDefaultRGBA[0];
      pix[1] = mDefaultRGBA[1];
      pix[2] = mDefaultRGBA[2];
      if (alpha) pix[3] = mDefaultRGBA[3];
      return true;
    } else {
      return false;
    }
  }

  if (WithinVisibleRange(val))
  {
    ColorFromValue(val, pix, alpha);
    return true;
  }
  else
  {
    return false;
  }
}

inline const UChar_t* RGBAPalette::ColorFromValue(Float_t val) const
{
  Int_t vint = mMinInt +
    (Int_t) ((mMaxInt - mMinInt)*(val - mMinFlt)/(mMaxFlt - mMinFlt));
  return ColorFromValue(vint);
}

inline void RGBAPalette::ColorFromValue(Float_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 ZColor RGBAPalette::MarkToCol(Float_t mark)
{
  // The old version from ZRibbon - should at least use binary search.

  if (mColorMarks.empty()) return ZColor();
  vector<ZColorMark>::iterator i = mColorMarks.begin();
  if (mark < i->m()) return ZColor(mColorMarks.front());
  ++i;
  while (i != mColorMarks.end() && mark > i->m()) ++i;
  if (i == mColorMarks.end()) return ZColor(mColorMarks.back());
  vector<ZColorMark>::iterator j = i;
  --j;
  if (j == mColorMarks.end()) return ZColor(mColorMarks.back());
  Float_t fi = (mark - j->m())/(i->m() - j->m());
  return fi * ZColor(*i) + (1 - fi) * ZColor(*j);
}

#endif
 RGBAPalette.h:1
 RGBAPalette.h:2
 RGBAPalette.h:3
 RGBAPalette.h:4
 RGBAPalette.h:5
 RGBAPalette.h:6
 RGBAPalette.h:7
 RGBAPalette.h:8
 RGBAPalette.h:9
 RGBAPalette.h:10
 RGBAPalette.h:11
 RGBAPalette.h:12
 RGBAPalette.h:13
 RGBAPalette.h:14
 RGBAPalette.h:15
 RGBAPalette.h:16
 RGBAPalette.h:17
 RGBAPalette.h:18
 RGBAPalette.h:19
 RGBAPalette.h:20
 RGBAPalette.h:21
 RGBAPalette.h:22
 RGBAPalette.h:23
 RGBAPalette.h:24
 RGBAPalette.h:25
 RGBAPalette.h:26
 RGBAPalette.h:27
 RGBAPalette.h:28
 RGBAPalette.h:29
 RGBAPalette.h:30
 RGBAPalette.h:31
 RGBAPalette.h:32
 RGBAPalette.h:33
 RGBAPalette.h:34
 RGBAPalette.h:35
 RGBAPalette.h:36
 RGBAPalette.h:37
 RGBAPalette.h:38
 RGBAPalette.h:39
 RGBAPalette.h:40
 RGBAPalette.h:41
 RGBAPalette.h:42
 RGBAPalette.h:43
 RGBAPalette.h:44
 RGBAPalette.h:45
 RGBAPalette.h:46
 RGBAPalette.h:47
 RGBAPalette.h:48
 RGBAPalette.h:49
 RGBAPalette.h:50
 RGBAPalette.h:51
 RGBAPalette.h:52
 RGBAPalette.h:53
 RGBAPalette.h:54
 RGBAPalette.h:55
 RGBAPalette.h:56
 RGBAPalette.h:57
 RGBAPalette.h:58
 RGBAPalette.h:59
 RGBAPalette.h:60
 RGBAPalette.h:61
 RGBAPalette.h:62
 RGBAPalette.h:63
 RGBAPalette.h:64
 RGBAPalette.h:65
 RGBAPalette.h:66
 RGBAPalette.h:67
 RGBAPalette.h:68
 RGBAPalette.h:69
 RGBAPalette.h:70
 RGBAPalette.h:71
 RGBAPalette.h:72
 RGBAPalette.h:73
 RGBAPalette.h:74
 RGBAPalette.h:75
 RGBAPalette.h:76
 RGBAPalette.h:77
 RGBAPalette.h:78
 RGBAPalette.h:79
 RGBAPalette.h:80
 RGBAPalette.h:81
 RGBAPalette.h:82
 RGBAPalette.h:83
 RGBAPalette.h:84
 RGBAPalette.h:85
 RGBAPalette.h:86
 RGBAPalette.h:87
 RGBAPalette.h:88
 RGBAPalette.h:89
 RGBAPalette.h:90
 RGBAPalette.h:91
 RGBAPalette.h:92
 RGBAPalette.h:93
 RGBAPalette.h:94
 RGBAPalette.h:95
 RGBAPalette.h:96
 RGBAPalette.h:97
 RGBAPalette.h:98
 RGBAPalette.h:99
 RGBAPalette.h:100
 RGBAPalette.h:101
 RGBAPalette.h:102
 RGBAPalette.h:103
 RGBAPalette.h:104
 RGBAPalette.h:105
 RGBAPalette.h:106
 RGBAPalette.h:107
 RGBAPalette.h:108
 RGBAPalette.h:109
 RGBAPalette.h:110
 RGBAPalette.h:111
 RGBAPalette.h:112
 RGBAPalette.h:113
 RGBAPalette.h:114
 RGBAPalette.h:115
 RGBAPalette.h:116
 RGBAPalette.h:117
 RGBAPalette.h:118
 RGBAPalette.h:119
 RGBAPalette.h:120
 RGBAPalette.h:121
 RGBAPalette.h:122
 RGBAPalette.h:123
 RGBAPalette.h:124
 RGBAPalette.h:125
 RGBAPalette.h:126
 RGBAPalette.h:127
 RGBAPalette.h:128
 RGBAPalette.h:129
 RGBAPalette.h:130
 RGBAPalette.h:131
 RGBAPalette.h:132
 RGBAPalette.h:133
 RGBAPalette.h:134
 RGBAPalette.h:135
 RGBAPalette.h:136
 RGBAPalette.h:137
 RGBAPalette.h:138
 RGBAPalette.h:139
 RGBAPalette.h:140
 RGBAPalette.h:141
 RGBAPalette.h:142
 RGBAPalette.h:143
 RGBAPalette.h:144
 RGBAPalette.h:145
 RGBAPalette.h:146
 RGBAPalette.h:147
 RGBAPalette.h:148
 RGBAPalette.h:149
 RGBAPalette.h:150
 RGBAPalette.h:151
 RGBAPalette.h:152
 RGBAPalette.h:153
 RGBAPalette.h:154
 RGBAPalette.h:155
 RGBAPalette.h:156
 RGBAPalette.h:157
 RGBAPalette.h:158
 RGBAPalette.h:159
 RGBAPalette.h:160
 RGBAPalette.h:161
 RGBAPalette.h:162
 RGBAPalette.h:163
 RGBAPalette.h:164
 RGBAPalette.h:165
 RGBAPalette.h:166
 RGBAPalette.h:167
 RGBAPalette.h:168
 RGBAPalette.h:169
 RGBAPalette.h:170
 RGBAPalette.h:171
 RGBAPalette.h:172
 RGBAPalette.h:173
 RGBAPalette.h:174
 RGBAPalette.h:175
 RGBAPalette.h:176
 RGBAPalette.h:177
 RGBAPalette.h:178
 RGBAPalette.h:179
 RGBAPalette.h:180
 RGBAPalette.h:181
 RGBAPalette.h:182
 RGBAPalette.h:183
 RGBAPalette.h:184
 RGBAPalette.h:185
 RGBAPalette.h:186
 RGBAPalette.h:187
 RGBAPalette.h:188
 RGBAPalette.h:189
 RGBAPalette.h:190
 RGBAPalette.h:191
 RGBAPalette.h:192
 RGBAPalette.h:193
 RGBAPalette.h:194
 RGBAPalette.h:195
 RGBAPalette.h:196
 RGBAPalette.h:197
 RGBAPalette.h:198
 RGBAPalette.h:199
 RGBAPalette.h:200
 RGBAPalette.h:201
 RGBAPalette.h:202
 RGBAPalette.h:203
 RGBAPalette.h:204