38 using namespace ROOT::Experimental;
 
   39 namespace REX = ROOT::Experimental;
 
   46 TObjArray* REX::REveUtil::fgDefaultColors = 
nullptr;
 
   55 void ChompTailAndDir(TString& s, 
char c=
'.')
 
   61    Ssiz_t ls = s.Last(
'/');
 
   70 Bool_t REveUtil::CheckMacro(
const char* mac)
 
   78    TString foo(mac); ChompTailAndDir(foo);
 
   79    if (gROOT->GetGlobalFunction(foo.Data(), 0, kFALSE) != 0)
 
   82       return (gROOT->GetGlobalFunction(foo.Data(), 0, kTRUE) != 0);
 
   88 void REveUtil::AssertMacro(
const char* mac)
 
   90    if( CheckMacro(mac) == kFALSE) {
 
   98 void REveUtil::Macro(
const char* mac)
 
  100    if (CheckMacro(mac) == kFALSE) {
 
  101       gROOT->LoadMacro(mac);
 
  103    TString foo(mac); ChompTailAndDir(foo); foo += 
"()";
 
  104    gROOT->ProcessLine(foo.Data());
 
  110 void REveUtil::LoadMacro(
const char* mac)
 
  112    if (CheckMacro(mac) == kFALSE) {
 
  113       gROOT->LoadMacro(mac);
 
  122 void REveUtil::ColorFromIdx(Color_t ci, UChar_t col[4], Bool_t alpha)
 
  124    TColor* c = gROOT->GetColor(ci);
 
  127       col[0] = (UChar_t)(255*c->GetRed());
 
  128       col[1] = (UChar_t)(255*c->GetGreen());
 
  129       col[2] = (UChar_t)(255*c->GetBlue());
 
  130       if (alpha) col[3] = 255;
 
  135       col[0] = 255; col[1] = 0; col[2] = 255;
 
  136       if (alpha) col[3] = 255;
 
  145 void REveUtil::ColorFromIdx(Color_t ci, UChar_t col[4], Char_t transparency)
 
  147    UChar_t alpha = (255*(100 - transparency))/100;
 
  149    TColor* c = gROOT->GetColor(ci);
 
  152       col[0] = (UChar_t)(255*c->GetRed());
 
  153       col[1] = (UChar_t)(255*c->GetGreen());
 
  154       col[2] = (UChar_t)(255*c->GetBlue());
 
  160       col[0] = 255; col[1] = 0; col[2] = 255; col[3] = alpha;
 
  170 void REveUtil::ColorFromIdx(Float_t f1, Color_t c1, Float_t f2, Color_t c2,
 
  171                             UChar_t col[4], Bool_t alpha)
 
  173    TColor* t1 = gROOT->GetColor(c1);
 
  174    TColor* t2 = gROOT->GetColor(c2);
 
  176       col[0] = (UChar_t)(255*(f1*t1->GetRed()   + f2*t2->GetRed()));
 
  177       col[1] = (UChar_t)(255*(f1*t1->GetGreen() + f2*t2->GetGreen()));
 
  178       col[2] = (UChar_t)(255*(f1*t1->GetBlue()  + f2*t2->GetBlue()));
 
  179       if (alpha) col[3] = 255;
 
  191 Color_t* REveUtil::FindColorVar(TObject* obj, 
const char* varname)
 
  193    static const REveException eh(
"REveUtil::FindColorVar");
 
  195    Int_t off = obj->IsA()->GetDataMemberOffset(varname);
 
  197       throw(eh + 
"could not find member '" + varname + 
"' in class " + obj->IsA()->GetName() + 
".");
 
  198    return (Color_t*) (((
char*)obj) + off);
 
  210 void REveUtil::SetColorBrightness(Float_t value, Bool_t full_redraw)
 
  212    if (value < -2.5 || value > 2.5)
 
  214       Error(
"REveUtil::SetColorBrightness", 
"value '%f' out of range [-0.5, 0.5].", value);
 
  218    TObjArray *colors = (TObjArray*) gROOT->GetListOfColors();
 
  220    if (fgDefaultColors == 0)
 
  222       const Int_t n_col = colors->GetEntriesFast();
 
  223       fgDefaultColors = 
new TObjArray(n_col);
 
  224       for (Int_t i = 0; i < n_col; ++i)
 
  226          TColor* c = (TColor*) colors->At(i);
 
  228             fgDefaultColors->AddAt(
new TColor(*c), i);
 
  232    const Int_t n_col = fgDefaultColors->GetEntriesFast();
 
  233    for (Int_t i = 0; i < n_col; ++i)
 
  235       TColor* cdef = (TColor*) fgDefaultColors->At(i);
 
  238          TColor* croot = (TColor*) colors->At(i);
 
  241             croot = 
new TColor(*cdef);
 
  242             colors->AddAt(croot, i);
 
  250          croot->GetRGB(r, g, b);
 
  251          r = TMath::Power( r, (2.5 - value)/2.5);
 
  252          g = TMath::Power(g, (2.5 - value)/2.5);
 
  253          b = TMath::Power(b, (2.5 - value)/2.5);
 
  255          r = TMath::Min(r, 1.0f);
 
  256          g = TMath::Min(g, 1.0f);
 
  257          b = TMath::Min(b, 1.0f);
 
  259          croot->SetRGB(r, g, b);
 
  263          delete colors->RemoveAt(i);
 
  267    if (full_redraw && REX::gEve)
 
  268       REX::gEve->FullRedraw3D();
 
  276 Bool_t REveUtil::IsU1IntervalContainedByMinMax(Float_t minM, Float_t maxM,
 
  277                                                Float_t minQ, Float_t maxQ)
 
  279    using namespace TMath;
 
  283       minQ += TwoPi(); maxQ += TwoPi();
 
  285    else if (minQ > maxM)
 
  287       minQ -= TwoPi(); maxQ -= TwoPi();
 
  289    return minQ >= minM && maxQ <= maxM;
 
  297 Bool_t REveUtil::IsU1IntervalOverlappingByMinMax(Float_t minM, Float_t maxM,
 
  298                                                  Float_t minQ, Float_t maxQ)
 
  300    using namespace TMath;
 
  304       minQ += TwoPi(); maxQ += TwoPi();
 
  306    else if (minQ > maxM)
 
  308       minQ -= TwoPi(); maxQ -= TwoPi();
 
  310    return maxQ >= minM && minQ <= maxM;
 
  316 Float_t REveUtil::GetFraction(Float_t minM, Float_t maxM, Float_t minQ, Float_t maxQ)
 
  318    if (minQ>=minM && maxQ<=maxM)
 
  321    else if (minQ<minM && maxQ>maxM)
 
  322       return (maxM-minM)/(maxQ-minQ);
 
  324    else if (minQ>=minM && maxQ>maxM)
 
  325       return (maxM-minQ)/(maxQ-minQ);
 
  327    else if (minQ<minM && maxQ<=maxM)
 
  328       return (maxQ-minM)/(maxQ-minQ);
 
  346 REveGeoManagerHolder::REveGeoManagerHolder(TGeoManager* new_gmgr, Int_t n_seg) :
 
  347    fManager   (gGeoManager),
 
  350    gGeoManager = new_gmgr;
 
  352       gGeoIdentity = (TGeoIdentity *)gGeoManager->GetListOfMatrices()->At(0);
 
  354          fNSegments = gGeoManager->GetNsegments();
 
  355          gGeoManager->SetNsegments(n_seg);
 
  358       gGeoIdentity = 
nullptr;
 
  365 REveGeoManagerHolder::~REveGeoManagerHolder()
 
  367    if (gGeoManager && fNSegments > 2) {
 
  368       gGeoManager->SetNsegments(fNSegments);
 
  370    gGeoManager = fManager;
 
  372       gGeoIdentity = (TGeoIdentity *)gGeoManager->GetListOfMatrices()->At(0);
 
  374       gGeoIdentity = 
nullptr;
 
  393 REveRefBackPtr::REveRefBackPtr() :
 
  402 REveRefBackPtr::~REveRefBackPtr()
 
  411 REveRefBackPtr::REveRefBackPtr(
const REveRefBackPtr&) :
 
  422 REveRefBackPtr& REveRefBackPtr::operator=(
const REveRefBackPtr&)
 
  430 void REveRefBackPtr::IncRefCount(REveElement* re)
 
  432    REveRefCnt::IncRefCount();
 
  439 void REveRefBackPtr::DecRefCount(REveElement *re)
 
  441    auto i = fBackRefs.find(re);
 
  442    if (i != fBackRefs.end()) {
 
  443       if (--(i->second) <= 0)
 
  445       REveRefCnt::DecRefCount();
 
  447       Warning(
"REveRefBackPtr::DecRefCount", 
"element '%s' not found in back-refs.", re->GetCName());
 
  454 void REveRefBackPtr::StampBackPtrElements(UChar_t stamps)
 
  456    for (
auto &i: fBackRefs)
 
  457       i.first->AddStamp(stamps);