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
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:44 MET