Re: [ROOT] Different color palettes within one canvas

From: Fons Rademakers (Fons.Rademakers@cern.ch)
Date: Tue Jul 17 2001 - 11:26:22 MEST


Hi Christian,

  now implemented along the lines you suggested. There are three new static
TColor methods:
  TColor::GetColor(Int_t r, Int_t g, Int_t b)  r,g,b in range [0,255]
  TColor::GetColor(Float_t r, Float_t g, Float_t b)  r,g,b in range [0,1]
  TColor::GetColor(const char *hexcolor)  hexcolor of the form "#rrggbb",
                                          eg "#c0c0c0".
These methods return the color number for the specified color.

See new tutorial greyscale.C for example usage, which also shows how
to set a TPad and TText to the default GUI background color (as was
asked for by Simon.


Cheers, Fons.


Christian Holm Christensen wrote:
> 
> Hi Rene et al,
> 
> On Thu, 10 May 2001 09:12:17 +0000
> Rene Brun <Rene.Brun@cern.ch> wrote
> concerning ": Re: [ROOT] Different color palettes within one canvas":
> > Hi Christian,
> >
> > I do not agree with your request of SetLineColor(r,g,b);
> > The TAttLine object must be as small as possible (currently 3 shorts).
> > Your request would imply to add 3 floats (or 3 doubles).
> > I do not see the interest to define the rgb on a per object basis.
> > You define the color once, then you reference the color.
> 
> Well, TAttLine needn't contain the three float, does it.  I could
> imagine having:
> 
>   TAttLine::SetLineColor(float r, float g, float b) {
>      // Get list of all defined colours.
>      TObjArray *colours = (TObjArray*)gROOT->GetListOfColors();
> 
>      // Dummy.
>      TColor* colour = 0;
> 
>      // Look for colour by name
>      if ((colour = (TColor*)colours->FindObject(Form("#%02x%02x%02x",
>                                                      255 * r, 255 * g,
>                                                      255 * b))) {
>        // We found the colour by name, so we use that right away
>        fLineColor = colour->GetNumber();
>        return;
>      }
> 
>      // Iterator
>      TIter next(colours);
> 
>      // Loop over all defined colours.
>      while((colour = (TColor*)next())) {
>        if (colour->GetRed() != r)
>          continue;
>        if (colour->GetGreen() != g)
>          continue;
>        if (colour->GetBlue() != b)
>          continue;
> 
>        // We found a matching colour in the colour table
>        fLineColor = colour->GetNumber();
>        return;
>      }
> 
>      // We didn't find a matching colour in the colour table, so we
>      // add it.  Note name is of the form "#rrggbb" where rr, etc are
>      // hexadecimal numbers.
>      colour = new TColor(colours->GetEntries(), r, g, b,
>                          Form("#%02x%02x%02x", 255 * r, 255 * g, 255 * b));
>      fLineColor = colour->GetNumber();
>   }
> 
> Perhaps a static method of TColor, say
> 
>   static int TColor::GetColor(float, float, float) {
>     // Get list of all defined colours.
>     TObjArray *colours = (TObjArray*)gROOT->GetListOfColors();
> 
>     // Dummy.
>     TColor* colour = 0;
> 
>     // Look for colour by name
>     if ((colour = (TColor*)colours->FindObject(Form("#%02x%02x%02x",
>                                                      255 * r, 255 * g,
>                                                      255 * b)))
>       // We found the colour by name, so we use that right away
>       return colour->GetNumber();
> 
>     // Iterator
>     TIter next(colours);
> 
>     // Loop over all defined colours.
>     while((colour = (TColor*)next())) {
>       if (colour->GetRed() != r)
>         continue;
>       if (colour->GetGreen() != g)
>         continue;
>       if (colour->GetBlue() != b)
>         continue;
> 
>       // We found a matching colour in the colour table
>       return colour->GetNumber();
>     }
> 
>     // We didn't find a matching colour in the colour table, so we
>     // add it.  Note name is of the form "#rrggbb" where rr, etc are
>     // hexadecimal numbers.
>     colour = new TColor(colours->GetEntries(), r, g, b,
>                         Form("#%02x%02x%02x", 255 * r, 255 * g, 255 * b));
>     return colour->GetNumber();
>   }
> 
> could provide this service for all T...Attr classes that need this.
> 
> Doing it like this, you don't need to have more members in the classes
> TAtt... or TColor, and you can get hold of such colours again, by
> requesting the colour by name, like
> 
>    TColor* colour =
>      (TColor*)gROOT->GetListOfColors->FindObject("#0f5086");
> 
> Perhaps, TColor objects should, if the user didn't give a name, have
> names of the form "#rrggbb", where rr is hexadecimal number.  I think
> that's better than the present "COLOR_...", since the format "#rrggbb"
> is widely used by a great deal of programs and formats (like HTML,
> LaTeX, and so on), and also "COLOR_..." doesn't really tell you
> anything about the actual colour, while "#rrggbb" does.
> 
> I hope you find this suggestion useful.
> 
> Yours,
> 
> Christian  -----------------------------------------------------------
> Holm Christensen                             Phone:  (+45) 35 35 96 91
>   Sankt Hansgade 23, 1. th.                  Office: (+45) 353  25 305
>   DK-2200 Copenhagen N                       Web:    www.nbi.dk/~cholm
>   Denmark                                    Email:       cholm@nbi.dk

-- 
Org:    CERN, European Laboratory for Particle Physics.
Mail:   1211 Geneve 23, Switzerland
E-Mail: Fons.Rademakers@cern.ch              Phone: +41 22 7679248
WWW:    http://root.cern.ch/~rdm/            Fax:   +41 22 7677910



This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:52 MET