ROOT  6.07/01
Reference Guide
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
gradients.C
Go to the documentation of this file.
1 //Author: Timur Pocheptsov, 19/03/2014
2 //This macro requires OpenGL, you can:
3 //1) call gStyle->SetCanvasPreferGL(kTRUE) before a canvas is created or
4 //2) set OpenGL.CanvasPreferGL to 1 in a $ROOTSYS/etc/system.rootrc.
5 
6 //Features:
7 //1. Radial and linear gradients
8 //2. Transparent/semitransparent colours.
9 
10 
11 //Includes for ACLiC:
12 #include "TColorGradient.h"
13 #include "TCanvas.h"
14 #include "TError.h"
15 #include "TStyle.h"
16 #include "TText.h"
17 #include "TPie.h"
18 
19 //Cocoa aux. functions.
20 #include "customcolorgl.h"
21 
22 void gradients()
23 {
24  //Find free colour indices in the ROOT's palette for:
25  //1. A radial gradient for TPie;
26  //2. A linear gradient for TCanvas
27  //3. A fully transparent fill color for a nested pad.
28 
29  Color_t colorIndices[3] = {};
30  if (ROOT::GLTutorials::FindFreeCustomColorIndices(colorIndices) != 3) {
31  ::Error("gradients", "failed to create new custom colors");
32  return;
33  }
34 
35  //Better names:
36  const Color_t &radialFill = colorIndices[0];
37  const Color_t &linearFill = colorIndices[1];
38  const Color_t &transparentFill = colorIndices[2];
39 
41 
42  TCanvas * const c = new TCanvas("cpie","Gradient colours demo", 700, 700);
43  //Before we allocated any new colour or created any object:
44  if (!c->UseGL()) {
45  ::Error("gradients", "This macro requires OpenGL");
46  delete c;
47  return;
48  }
49 
50  //Linear gradient is defined by: 1) colors (to interpolate between them),
51  //2) coordinates for these colors along the gradient axis [0., 1.] (must be sorted!).
52  //3) Start and end points for a gradient, you specify them in some NDC rect ([0,0 - 1,1]),
53  //and this rect is either: bounding rect of your polygon/object to fill
54  //(gradient->SetCoordinateMode(TColorGradient::kObjectBoundingMode))
55  //or bounding rect of a pad (gradient->SetCoordinateMode(TColorGradient::kPadMode)).
56  //kObjectBoundingMode is the default one.
57 
58 
59  //Colour positions in the gradient's palette (here I place colors at the
60  //ends of 0-1):
61  const Double_t locations[] = {0., 1.};
62 
63  //Linear gradient fill (with an axis angle == 45):
64  const Double_t rgbaData1[] = {0.2, 0.2, 0.2, 1.,/*gray*/
65  0.8, 1., 0.9, 1. /*pale green*/};
66  TLinearGradient * const gradientFill1 = new TLinearGradient(linearFill, 2, locations, rgbaData1);
67  //45 degrees:
68  gradientFill1->SetStartEnd(TColorGradient::Point(0., 0.), TColorGradient::Point(1., 1.));
69  //Set as a background color in the canvas:
70  c->SetFillColor(linearFill);
71 
72  //Draw a text in the canvas (the object above the text will be
73  //semi-transparent):
74  TText * const t = new TText(0.05, 0.7, "Can you see the text?");
75  t->Draw();
76 
77  //We create a nested pad on top to render a TPie in,
78  //this way we still have a text (below) + TPie with
79  //a fancy colour on top.
80  TPad * const pad = new TPad("p", "p", 0., 0., 1., 1.);
81 
82  //TPad itself is fully transparent:
83  new TColor(transparentFill, 1., 1., 1., "transparent_fill_color", 0.);
84  pad->SetFillColor(transparentFill);
85  //Add our pad into the canvas:
86  pad->Draw();
87  pad->cd();
88 
89 
90  //Radial gradient fill for a TPie object:
91  const Double_t rgbaData2[] = {/*opaque orange at the start:*/1., 0.8, 0., 1.,
92  /*transparent red at the end:*/1., 0.2, 0., 0.65};
93 
94  TRadialGradient * const gradientFill2 = new TRadialGradient(radialFill, 2,
95  locations, rgbaData2);
96  //Parameters for a gradient fill:
97  //the gradient is 'pad-related' - we calculate everything in a pad's
98  //space and consider it as a NDC (so pad's rect is (0,0), (1,1)).
100 
101  //'Simple' radial gradient (center and radius):
102  gradientFill2->SetRadialGradient(TColorGradient::Point(0.5, 0.5), 0.4);
103 
104 
105  const UInt_t nSlices = 5;
106  //Values for a TPie (non-const, that's how TPie's ctor is declared):
107  Double_t values[nSlices] = {0.8, 1.2, 1.2, 0.8, 1.};
108  Int_t colors[nSlices] = {radialFill, radialFill, radialFill,
109  radialFill, radialFill};
110 
111  TPie * const pie = new TPie("pie", "TPie:", nSlices, values, colors);
112  //One slice is slightly shifted:
113  pie->SetEntryRadiusOffset(2, 0.05);
114  //Move labels to the center (to fit the pad's space):
115  pie->SetLabelsOffset(-0.08);
116  //
117  pie->SetRadius(0.4);
118  pie->Draw("rsc");
119 }
unsigned FindFreeCustomColorIndices(T(&indices)[N])
Definition: customcolorgl.h:44
Bool_t UseGL() const
Definition: TCanvas.h:242
return c
R__EXTERN TStyle * gStyle
Definition: TStyle.h:423
std::vector< double > values
Definition: TwoHistoFit2D.C:32
int Int_t
Definition: RtypesCore.h:41
virtual void Draw(Option_t *option="")
Default Draw method for all objects.
Definition: TObject.cxx:254
void SetRadialGradient(const Point &center, Double_t radius)
Set radial gradient.
Define a radial color gradient.
TVirtualPad * cd(Int_t subpadnumber=0)
Set Current pad.
Definition: TPad.cxx:514
void gradients()
Definition: gradients.C:22
void SetEntryRadiusOffset(Int_t, Double_t)
Set the distance, in the direction of the radius of the slice.
Definition: TPie.cxx:1268
void SetCoordinateMode(ECoordinateMode mode)
Set coordinate mode.
Base class for several text objects.
Definition: TText.h:42
virtual void Draw(Option_t *option="")
Draw Pad in Current pad (re-parent pad if necessary).
Definition: TPad.cxx:1192
void Error(const char *location, const char *msgfmt,...)
short Color_t
Definition: RtypesCore.h:79
void SetCanvasPreferGL(Bool_t prefer=kTRUE)
Definition: TStyle.h:337
TThread * t[5]
Definition: threadsh1.C:13
virtual void SetFillColor(Color_t fcolor)
Definition: TAttFill.h:50
unsigned int UInt_t
Definition: RtypesCore.h:42
The most important graphics class in the ROOT system.
Definition: TPad.h:46
tuple pad
Definition: first.py:38
Define a linear color gradient.
Color * colors
Definition: X3DBuffer.c:19
The Canvas class.
Definition: TCanvas.h:48
void SetRadius(Double_t)
Set the pie chart's radius' value.
Definition: TPie.cxx:1367
double Double_t
Definition: RtypesCore.h:55
Draw a Pie Chart,.
Definition: TPie.h:31
The color creation and management class.
Definition: TColor.h:47
void SetLabelsOffset(Float_t)
Set the distance between the label end the external line of the TPie.
Definition: TPie.cxx:1351
void SetStartEnd(const Point &p1, const Point &p2)
Set end and start.
virtual void Draw(Option_t *option="l")
Draw the pie chart.
Definition: TPie.cxx:274
const Bool_t kTRUE
Definition: Rtypes.h:91