Re: [ROOT] Painting...?

From: Rene Brun (Rene.Brun@cern.ch)
Date: Mon Jun 23 2003 - 09:51:11 MEST


Hi Paolo,

TPad::CopyPixmaps is automatically called when a pad needs to be repaint.
The pad is repaint when calling TPad::Update and the pad declared modified.
In your case, you declare the top level to be modified and not the subpads.
Root repaints only the pads declared modified to improve the speed
in case only one out of amny pads needs to be repaint.

Rene Brun

Paolo ADRAGNA wrote:
> 
> Hi all,
> 
> I would like to hear your opinion about the following ideas.
> 
> In my program I built a Display Window which is essentially composed by a
> matrix of TRootEmbeddedCanvas. In every Embedded Canvas is painted an
> histogram. Now I would like to fill completely the picture in memory to
> display it only when it is needed: the effect should be of a "ready to see"
> picture appearing on the screen. I know that TRootEmbeddedCanvas creates a
> TGCanvas in which a TCanvas is created, and that a TCanvas is built using
> "double buffer" tecnique, but I can't figure out how I can achieve the
> "ready to see" effect (perhaps using TPad::CopyPixmaps()?).
> 
> Just for example I attach my present code.
> Thanks,
> 
>                                         Paolo
> 
> /***************************************************************************
>                           TC_ScrollingTabFrame.cpp  -  description
>                              -------------------
>     begin                : Thu May 8 2003
>     copyright            : (C) 2003 by Paolo ADRAGNA
>     email                : paolo.adragna@pi.infn.it
>  ***************************************************************************/
> 
> /***************************************************************************
>  *                                                                         *
>  *   This program is free software; you can redistribute it and/or modify  *
>  *   it under the terms of the GNU General Public License as published by  *
>  *   the Free Software Foundation; either version 2 of the License, or     *
>  *   (at your option) any later version.                                   *
>  *                                                                         *
>  ***************************************************************************/
> 
> #include "TC_ScrollingTabFrame.h"
> #include "TC_CanvasUpdateAsynch.h"
> 
> ClassImp(TC_ScrollingTabFrame)
> 
> TC_ScrollingTabFrame::TC_ScrollingTabFrame() : TGCanvas(GetViewPort(),700,650)
> {}
> 
> TC_ScrollingTabFrame::TC_ScrollingTabFrame(TGTab * tab, char *grp, char * nam,
> Int_t id_, Int_t nhs, TH1 *hist[], char *options[], char *Poptions[]) :
> TGCanvas(tab,550,650)
> {
> 
>   status  = 0;
>   group   = new TString(grp);
>   name    = new TString(nam);
>   id      = id_;
> 
>   // Make a new tab explicitly building it, instead of calling Add in order to
> add a ScrollingTabFrame
>   tab->AddFrame(new TGTabElement(tab, new TGString(nam), 50, 20,
>                                  tab->GetDefaultGC().GetGC(),
>                                  tab->GetDefaultFontStruct()),
>                     0);
> 
>   fFrame = new TGCompositeFrame(GetViewPort(), 60, 20);
>   fFrame->SetLayoutManager(new TGMatrixLayout(fFrame,0,2,10));
>   SetContainer(fFrame);
> 
>   TStyle *myStyle = (TStyle*) gROOT->FindObject("Plain1");
>   if(myStyle)
>     {
>       myStyle->cd();
>     }
>   else
>     {
>       printf("Warning. Style Plain1 not founded\n");
>     }
> 
>   int i;
>   for (i=0;i<nhs;i++)
>     {
>       char *s = new char[30];
>       sprintf(s,"%s_%i",nam,i);
>       TRootEmbeddedCanvas *fECanvas = new
> TRootEmbeddedCanvas(s,fFrame,300,250);
>       ecanvas.push_back(fECanvas);
>       TCanvas *c = fECanvas->GetCanvas();
>       if(strcmp(Poptions[i],"Logy") == 0) c->SetLogy();
>       c->cd();
>       c->AddExec("Popuppad","TC_ScrollingTabFrame::PopUpPad()");
>       hist[i]->Draw(options[i]);
>       AddFrame(fECanvas);
>   }
> 
> }
> 
> TC_ScrollingTabFrame::~TC_ScrollingTabFrame()
> {
>   for(int i=0; i<(int)ecanvas.size(); i++)
>     {
>       delete ecanvas[i];
>     }
>   delete fFrame;
> }
> 
> void TC_ScrollingTabFrame::PopUpPad()
> {
>   int event = gPad->GetEvent();
>   if(event == 61)
>     {
>       TObject *select = gPad->GetSelected();
>       if (!select) return;
>     // For a TH1 the selectd object is a TFrame, not the TH1
>     // So we must select it
>       if (!select->InheritsFrom("TH1"))
>         {
>           TList *primitives = gPad->GetListOfPrimitives();
>           TListIter next(primitives);
>           TObject *to;
>           while ((to=next()))
>             {
>               if(to->InheritsFrom("TH1")) {select = to;}
>             }
>         }
>       if (select->InheritsFrom("TH1"))
>         {
>           Int_t logy = gPad->GetLogy();
>           TH1 *h = (TH1*)gROOT->FindObject(select->GetName());
>           char *name = new char[100];
>           sprintf(name,"padCanvas%s",h->GetName());
>           TCanvas *canvas = new TCanvas(name,h->GetTitle(),600,400);
>           new TC_CanvasUpdateAsynch(canvas,(Long_t)2000);
>           sprintf(name,"padPad%s",h->GetName());
>           TPad *p = new TPad(name,h->GetTitle(),0.05,0.05,0.95,0.95);
>           if(logy) p->SetLogy();
>           p->Draw();
>           p->cd();
>           //TStyle *myStyle = new TStyle("Plain2","Generic");
>           //myStyle->SetTitleFont(42);
>           if(select->InheritsFrom("TH2F"))
>             {
>               //myStyle->SetOptStat(10);
>               TStyle *myStyle = (TStyle*) gROOT->FindObject("PlainPopup2");
>               if(myStyle)
>                 {
>                   myStyle->cd();
>                 }
>               else
>                 {
>                   printf("Warning. Style PlainPopup2 not founded\n");
>                 }
>               h->Draw("lego2");
>             }
>           else
>             {
>               //myStyle->SetOptStat(111111);
>               TStyle *myStyle = (TStyle*) gROOT->FindObject("PlainPopup1");
>               if(myStyle)
>                 {
>                   myStyle->cd();
>                 }
>               else
>                 {
>                   printf("Warning. Style PlainPopup1 not founded\n");
>                 }
>               h->Draw("hist");
>             }
> 
>         }
>     }
> }
> 
> void TC_ScrollingTabFrame::SetVisibleFlag(bool flag)
> {
>   status = GetSelectedFlag();
>   if (flag) { status = DW_SELECTED | DW_VISIBLE; }
> }
> 
> void TC_ScrollingTabFrame::SetSelectedFlag(bool flag)
> {
>   status = 0;
>   SetVisibleFlag(flag);
> }
> 
> Bool_t TC_ScrollingTabFrame::ProcessMessage(Long_t msg, Long_t parm1, Long_t
> parm2)
> {
>   return TGCanvas::ProcessMessage(msg,parm1,parm2);
> }
> 
> void TC_ScrollingTabFrame::Update()
> {
> 
>   if((!GetVisibleFlag()) || (ecanvas.size()<=0) ) {return;}
> 
>   TStyle *myStyle = (TStyle*) gROOT->FindObject("Plain1");
>   if(myStyle)
>     {
>       myStyle->cd();
>     }
>   else
>     {
>       printf("Warning. Style Plain1 not founded\n");
>     }
>   for(int i=0; i<(int)ecanvas.size(); i++)
>     {
>       TCanvas *c = ecanvas[i]->GetCanvas();
>       c->Modified();
>       c->Update();
>     }
> }



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:12 MET