// @(#)root/base:$Id$
// Author: Rene Brun   12/12/94

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TColor
#define ROOT_TColor

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TColor                                                               //
//                                                                      //
// Color defined by RGB or HLS.                                         //
// At initialization time, a table of colors is generated. This linked  //
// list can be accessed from the ROOT object                            //
// (see TROOT::GetListOfColors()). When a color is defined in the range //
// of [1,50], two "companion" colors are also defined:                  //
//    - the dark version (color_index + 100)                            //
//    - the bright version (color_index + 150)                          //
// The dark and bright color are used to give 3-D effects when drawing  //
// various boxes (see TWbox, TPave, TPaveText, TPaveLabel,etc).         //
//                                                                      //
// This is the list of currently supported basic colors (here dark and  //
// bright colors are not shown).                                        //
//Begin_Html
/*
<img src="gif/colors.gif">
*/
//End_Html
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TNamed
#include "TNamed.h"
#endif
#ifndef ROOT_TArrayI
#include "TArrayI.h"
#endif


class TColor : public TNamed {
protected:
   Int_t          fNumber;        //Color number identifier
private:
   Float_t        fRed;           //Fraction of Red
   Float_t        fGreen;         //Fraction of Green
   Float_t        fBlue;          //Fraction of Blue
   Float_t        fHue;           //Hue
   Float_t        fLight;         //Light
   Float_t        fSaturation;    //Saturation
   Float_t        fAlpha;         //Alpha (transparency)
   static Bool_t  fgGrayscaleMode;//if set, GetColor will return grayscale
   static Bool_t  fgInitDone;     //kTRUE once ROOT colors have been initialized
   static TArrayI fgPalette;      //Color palette

   void           Allocate();
   static Float_t HLStoRGB1(Float_t rn1, Float_t rn2, Float_t huei);

public:
   TColor();
   TColor(Int_t color, Float_t r, Float_t g, Float_t b, const char *name="", Float_t a = 1);
   TColor(const TColor &color);
   virtual ~TColor();
   const char   *AsHexString() const;
   void          Copy(TObject &color) const;
   static void   CreateColorWheel();
   static void   CreateColorsGray();
   static void   CreateColorsCircle(Int_t offset, const char *name, UChar_t *rgb);
   static void   CreateColorsRectangle(Int_t offset, const char *name, UChar_t *rgb);
   static Int_t  CreateGradientColorTable(UInt_t Number, Double_t* Stops,
                    Double_t* Red, Double_t* Green, Double_t* Blue, UInt_t NColors, Float_t alpha=1.);
   static Int_t  GetColorPalette(Int_t i);
   static Int_t  GetNumberOfColors();
   virtual void  GetRGB(Float_t &r, Float_t &g, Float_t &b) const
                    { r=GetRed(); g=GetGreen(); b=GetBlue(); }
   virtual void  GetHLS(Float_t &h, Float_t &l, Float_t &s) const
                    { h=GetHue(); l=GetLight(); s=GetSaturation(); }
   Int_t         GetNumber() const { return fNumber; }
   ULong_t       GetPixel() const;
   Float_t       GetRed() const { return IsGrayscale() ? GetGrayscale() : fRed; }
   Float_t       GetGreen() const { return IsGrayscale() ? GetGrayscale() : fGreen; }
   Float_t       GetBlue() const { return IsGrayscale() ? GetGrayscale() : fBlue; }
   Float_t       GetHue() const { return fHue; }
   Float_t       GetLight() const { return fLight; }
   Float_t       GetSaturation() const { return IsGrayscale() ? 0 : fSaturation; }
   Float_t       GetAlpha() const { return fAlpha; }
   virtual Float_t GetGrayscale() const { /*ITU*/ return 0.299f*fRed + 0.587f*fGreen + 0.114f*fBlue; }
   virtual void  ls(Option_t *option="") const;
   virtual void  Print(Option_t *option="") const;
   virtual void  SetAlpha(Float_t a) { fAlpha = a; }
   virtual void  SetRGB(Float_t r, Float_t g, Float_t b);

   static void    InitializeColors();
   static void    HLS2RGB(Float_t h, Float_t l, Float_t s, Float_t &r, Float_t &g, Float_t &b);
   static void    HLS2RGB(Int_t h, Int_t l, Int_t s, Int_t &r, Int_t &g, Int_t &b);
   static void    HLStoRGB(Float_t h, Float_t l, Float_t s, Float_t &r, Float_t &g, Float_t &b)
                     { TColor::HLS2RGB(h, l, s, r, g, b); } // backward compatible
   static void    HSV2RGB(Float_t h, Float_t s, Float_t v, Float_t &r, Float_t &g, Float_t &b);
   static void    RGB2HLS(Float_t r, Float_t g, Float_t b, Float_t &h, Float_t &l, Float_t &s);
   static void    RGB2HLS(Int_t r, Int_t g, Int_t b, Int_t &h, Int_t &l, Int_t &s);
   static void    RGBtoHLS(Float_t r, Float_t g, Float_t b, Float_t &h, Float_t &l, Float_t &s)
                     { TColor::RGB2HLS(r, g, b, h, l, s); } // backward compatible
   static void    RGB2HSV(Float_t r, Float_t g, Float_t b, Float_t &h, Float_t &s, Float_t &v);
   static Int_t   GetColor(const char *hexcolor);
   static Int_t   GetColor(Float_t r, Float_t g, Float_t b);
   static Int_t   GetColor(Int_t r, Int_t g, Int_t b);
   static Int_t   GetColor(ULong_t pixel);
   static Int_t   GetColorBright(Int_t color);
   static Int_t   GetColorDark(Int_t color);
   static Int_t   GetColorTransparent(Int_t color, Float_t a);
   static ULong_t Number2Pixel(Int_t ci);
   static ULong_t RGB2Pixel(Int_t r, Int_t g, Int_t b);
   static ULong_t RGB2Pixel(Float_t r, Float_t g, Float_t b);
   static void    Pixel2RGB(ULong_t pixel, Int_t &r, Int_t &g, Int_t &b);
   static void    Pixel2RGB(ULong_t pixel, Float_t &r, Float_t &g, Float_t &b);
   static const char *PixelAsHexString(ULong_t pixel);
   static void    SaveColor(std::ostream &out, Int_t ci);
   static Bool_t  IsGrayscale();
   static void    SetGrayscale(Bool_t set = kTRUE);
   static void    SetPalette(Int_t ncolors, Int_t *colors,Float_t alpha=1.);

   ClassDef(TColor,2)  //Color defined by RGB or HLS
};

#endif

 TColor.h:1
 TColor.h:2
 TColor.h:3
 TColor.h:4
 TColor.h:5
 TColor.h:6
 TColor.h:7
 TColor.h:8
 TColor.h:9
 TColor.h:10
 TColor.h:11
 TColor.h:12
 TColor.h:13
 TColor.h:14
 TColor.h:15
 TColor.h:16
 TColor.h:17
 TColor.h:18
 TColor.h:19
 TColor.h:20
 TColor.h:21
 TColor.h:22
 TColor.h:23
 TColor.h:24
 TColor.h:25
 TColor.h:26
 TColor.h:27
 TColor.h:28
 TColor.h:29
 TColor.h:30
 TColor.h:31
 TColor.h:32
 TColor.h:33
 TColor.h:34
 TColor.h:35
 TColor.h:36
 TColor.h:37
 TColor.h:38
 TColor.h:39
 TColor.h:40
 TColor.h:41
 TColor.h:42
 TColor.h:43
 TColor.h:44
 TColor.h:45
 TColor.h:46
 TColor.h:47
 TColor.h:48
 TColor.h:49
 TColor.h:50
 TColor.h:51
 TColor.h:52
 TColor.h:53
 TColor.h:54
 TColor.h:55
 TColor.h:56
 TColor.h:57
 TColor.h:58
 TColor.h:59
 TColor.h:60
 TColor.h:61
 TColor.h:62
 TColor.h:63
 TColor.h:64
 TColor.h:65
 TColor.h:66
 TColor.h:67
 TColor.h:68
 TColor.h:69
 TColor.h:70
 TColor.h:71
 TColor.h:72
 TColor.h:73
 TColor.h:74
 TColor.h:75
 TColor.h:76
 TColor.h:77
 TColor.h:78
 TColor.h:79
 TColor.h:80
 TColor.h:81
 TColor.h:82
 TColor.h:83
 TColor.h:84
 TColor.h:85
 TColor.h:86
 TColor.h:87
 TColor.h:88
 TColor.h:89
 TColor.h:90
 TColor.h:91
 TColor.h:92
 TColor.h:93
 TColor.h:94
 TColor.h:95
 TColor.h:96
 TColor.h:97
 TColor.h:98
 TColor.h:99
 TColor.h:100
 TColor.h:101
 TColor.h:102
 TColor.h:103
 TColor.h:104
 TColor.h:105
 TColor.h:106
 TColor.h:107
 TColor.h:108
 TColor.h:109
 TColor.h:110
 TColor.h:111
 TColor.h:112
 TColor.h:113
 TColor.h:114
 TColor.h:115
 TColor.h:116
 TColor.h:117
 TColor.h:118
 TColor.h:119
 TColor.h:120
 TColor.h:121
 TColor.h:122
 TColor.h:123
 TColor.h:124
 TColor.h:125
 TColor.h:126
 TColor.h:127
 TColor.h:128
 TColor.h:129
 TColor.h:130
 TColor.h:131
 TColor.h:132