From $ROOTSYS/tutorials/gl/radialgradients.C

//Author: Timur Pocheptsov, 25/03/2014.
//This tutorial demonstrates how to use radial gradients,
//custom colors, transparency.
//Requires OpenGL: either set OpenGL.CanvasPreferGL to 1
//in the $ROOTSYS/etc/system.rootrc,
//or use gStyle->SetCanvasPreferGL(kTRUE).


//Includes for ACLiC:
#include <cassert>
#include <cstdlib>

#include "TColorGradient.h"
#include "TEllipse.h"
#include "TRandom.h"
#include "TCanvas.h"
#include "TStyle.h"

#include "TError.h"

//Aux. functions.
#include "customcolorgl.h"

namespace {

//Just some colors (rgba) to build our
//fancy gradients from.
const Double_t basicColors[][4] =
{
{1., 0.,  0., 1.},
{1., 0.3, 0., 1.},
{0., 0.,  1., 1.},
{1., 1.,  0., 1.},
{1., 0.,  1., 1.},
{0., 1.,  1., 1.},
{0., 1.,  0., 1.},
{0., 0.5,  0., 1.},
//transparent colors:
{1., 0.,  0., 0.5},
{1., 0.3, 0., 0.5},
{0., 0.,  1., 0.5},
{1., 1.,  0., 0.5},
{1., 0.,  1., 0.5},
{0., 1.,  1., 0.5},
{0., 1.,  0., 0.5},
{0., 0.5,  0., 0.5},
//and even more transparent:
{1., 0.,  0., 0.2},
{1., 0.3, 0., 0.2},
{0., 0.,  1., 0.2},
{1., 1.,  0., 0.2},
{1., 0.,  1., 0.2},
{0., 1.,  1., 0.2},
{0., 1.,  0., 0.2},
{0., 0.5,  0., 0.2}
};

const unsigned nBasicColors = sizeof basicColors / sizeof basicColors[0];

//______________________________________________________________________
Color_t CreateRandomGradientFill()
{
   const Double_t * const fromRGBA = basicColors[(std::rand() % (nBasicColors / 2))];
   //With odd number of colors the last one is never selected :)
   const Double_t * const toRGBA = basicColors[nBasicColors / 2 + (std::rand() % (nBasicColors / 2))];

   const Double_t locations[] = {0., 1.};
   const Double_t rgbas[] = {fromRGBA[0], fromRGBA[1], fromRGBA[2], fromRGBA[3],
                             toRGBA[0], toRGBA[1], toRGBA[2], toRGBA[3]};

   Color_t idx[1] = {};
   if (ROOT::GLTutorials::FindFreeCustomColorIndices(idx) != 1)
      return -1;

   TRadialGradient * const grad = new TRadialGradient(idx[0], 2, locations, rgbas);
   //
   grad->SetRadialGradient(TColorGradient::Point(0.5, 0.5), 0.5);

   return idx[0];
}

//______________________________________________________________________
bool add_ellipse(const Double_t xC, const Double_t yC, const Double_t r)
{
   assert(gPad != nullptr && "add_ellipse, no pad to add ellipse");

   const Color_t newColor = CreateRandomGradientFill();
   if (newColor == -1) {
      ::Error("add_ellipse", "failed to find a new color index for a gradient fill");
      return false;
   }

   TEllipse * const newEllipse = new TEllipse(xC, yC, r, r);
   newEllipse->SetFillColor(newColor);
   newEllipse->Draw();

   return true;
}

}

//______________________________________________________________________
void radialgradients()
{
   gRandom->SetSeed(4357);//;)

   gStyle->SetCanvasPreferGL(kTRUE);

   TCanvas * const cnv = new TCanvas("radial gradients", "radial gradients", 800, 800);
   if (!cnv->UseGL()) {
      ::Error("radialgradients", "this demo OpenGL");
      delete cnv;
      return;
   }

   for (unsigned i = 0; i < 100; ++i)
      if (!add_ellipse(gRandom->Rndm(), gRandom->Rndm(), 0.5 * gRandom->Rndm()))
         break;

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