RE: [ROOT] gVirtualX->PutImage and TCanvas

From: Valeri Fine (fine@bnl.gov)
Date: Tue May 04 2004 - 19:47:55 MEST


O  I have realixe a typo in my message
  I wrote

 GetWindow

It should be GetWindowID() of course

http://root.cern.ch/root/htmldoc/src/TGX11.cxx.html#TGX11:GetWindowID 

It should help.


----
Best regards
                   Valeri


> -----Original Message-----
> From: Thomas Bretz [mailto:Thomas_Bretz@ph.tum.de]
> Sent: Tuesday, May 04, 2004 1:27 PM
> To: Valeri Fine
> Cc: 'Thomas Bretz'; roottalk@pcroot.cern.ch
> Subject: RE: [ROOT] gVirtualX->PutImage and TCanvas
> 
> Hi Valeri,
> 
> thanks a lot for the fast help, I'll try it and report. However I'll
> copy my code to this eMail that you can have a look.
> 
> class MImage2 : public TObject
> {
>     XImage *fImage;
> 
>     GContext_t fDefGC;
> 
>     Int_t  fId;
>     UInt_t fWidth;
>     UInt_t fHeight;
> 
>     void DrawImg24(char *d, char *s, char *e);
> 
> public:
>     MImage2(UInt_t w, UInt_t h);
>     ~MImage2();
> 
>     void Paint(Option_t *o);
> 
>     void DrawImg(const byte *buffer);
> 
>     ClassDef(MImage2, 0)
> };
> MImage2::MImage2(UInt_t w, UInt_t h)
>     : fId(gClient->GetRoot()->GetId()), fWidth(w), fHeight(h)
> {
>     // p = pointer to MainFrame (not owner)
>     // w = width of frame
>     // h = width of frame
> 
>     fDefGC  = gVirtualX->CreateGC(fId, 0);
>     fImage  = (XImage*)gVirtualX->CreateImage(fWidth, fHeight);
> 
>     cout << "Detected Color Depth: " << gVirtualX->GetDepth() << endl;
>     if (gVirtualX->GetDepth()!=24)
>         cout << "WARNING this class only works with 24bit color
depth!" <<
> endl;
> }
> 
> MImage2::~MImage2()
> {
>     gVirtualX->DeleteGC(fDefGC);
>     gVirtualX->DeleteImage((Drawable_t)fImage);
> }
> 
> void MImage2::Paint(Option_t *o)
> {
>     gVirtualX->PutImage(fId, fDefGC, (Drawable_t)fImage, 0, 0, 0, 0,
> fWidth, fHeight);
> }
> 
> void MImage2::DrawImg24(char *d, char *s, char *e)
> {
>     // d=destination, s=source, e=end
>     // rrrrrrrr gggggggg bbbbbbbb aaaaaaaa
>     //
>     while (s<e)
>     {
>         *d++ = *s;
>         *d++ = *s;
>         *d++ = *s++;
>         d++;
>     }
> }
> 
> void MImage2::DrawImg(const byte *buffer)
> {
>     DrawImg24(fImage->data, (char*)buffer,
> (char*)(buffer+fWidth*fHeight));
> }
> void test()
> {
>     TCanvas *c=new TCanvas;
> 
>     MImage2 *i = new MImage2(100, 100);
> 
>     byte buf[100*100];
> 
>     for (int j=0; j<100*100; j++)
>         buf[j]=j;
> 
>     i->DrawImg(buf);
>     i->Draw();
> }
> 
> Thomas,.
> 
> 
> On Tue, 4 May 2004,
> Valeri Fine wrote:
> 
> >
> > Hello Thomas.
> >
> >   It is hard to advice without your code and running example.
> >  ( I did not see your source so I am still guessing :-)
> >
> >  Anyway in your Paint method you may try to do something like this
> >
> > void MImage::Paint( . . . ) {
> >
> >     Window_t fid = gVitualX->GetWindow(gPad->GetPixmaID());
> >     gVirtualX->PutImage(fid, <  . . . other PutImage parameters  . .
. >
> > )
> >
> > }
> > If you still need speed you may regard to disable the double
buffering
> > to paint the TCanvas screen directly replacing
> >
> >  gPad->GetPixmapID()
> >
> > http://root.cern.ch/root/htmldoc/TPad.html#TPad:GetPixmapID
> >
> > with gpad->GetCanvasID();
> >
> > http://root.cern.ch/root/htmldoc/TPad.html#TPad:GetCanvasID
> > http://root.cern.ch/root/htmldoc/TCanvas.html#TCanvas:GetCanvasID
> > abd applying
> > http://root.cern.ch/root/htmldoc/TGX11.html#TGX11:SetDoubleBuffer
> > method.
> >
> >
> > Hope this helps.
> >                         Valeri
> >
> > > -----Original Message-----
> > > From: Thomas Bretz [mailto:Thomas_Bretz@ph.tum.de]
> > > Sent: Monday, May 03, 2004 10:04 PM
> > > To: Valeri Fine
> > > Cc: roottalk@pcroot.cern.ch
> > > Subject: RE: [ROOT] gVirtualX->PutImage and TCanvas
> > >
> > > Hi Valeri,
> > >
> > > > Did I understand correctly that you tried to use
> > > >
http://root.cern.ch/root/htmldoc/TVirtualX.html#TVirtualX:PutImage
> > > > method to paint TCanvas ?
> > >
> > > Yes, you are right.
> > >
> > > > I am afraid this method can not be used to paint TCanvas / TPad
> > > > To do that you have to provide the "Drawable_t id" for TPad.
> > > > As soon as I know there is no method to do that.
> > > > One can get the "Drawable_t" for the parent widget of TCanvas.
> > > > However it is not the TCanvas itself.
> > > >
> > > > With TCanvas the best thing you can do, you can draw the parent
> > widget
> > > > using PutImage method, but then ROOT will paint the real and
empty
> > > > TCanvas/TPad over.
> > >
> > > That exactly seems to be my problem.
> > >
> > > > To do what you want you should regard using the TGFrame object
> > rather
> > > > TCanvas/TPad. Then you can apply PutImage method to paint it.
> > > > (see:
> > > >
> >
http://root.cern.ch/root/htmldoc/src/TGColorPick.cxx.html#TGColorPick:Do
> > > > Redraw
> > > > for example)
> > >
> > > I know. This is exactly where my problem comes from. I have a
> > > sky-coordinate system grid which is painted using TLine - which
> > becuase of
> > > the nice features of TPad is necessary. In a different application
I
> > > readout a CCD camera of a sky image and I want to underlay this
CCD
> > image
> > > (768x576x8bit, 25fps) This must be done with less than 1% CPU on a
> > 1.5GHz
> > > linux machine. I know that the algorithm (with PutImage) is
working
> > very
> > > fast and well in my TGFrame application, but now I want to have
both.
> > The
> > > nice and fast PutImage and the powerfull class drawing the grid.
> > >
> > > > Another way to manage thing is to provide your own
implementation of
> > > > TImage abstract ROOT class using the existent TASImage
> > implementation as
> > > > a pattern
> > > >
> >
> > > > With the mixed Qt/ROOT env you can just apply the class
> > > > http://doc.trolltech.com/3.3/qmovie.html to paint the TCanvas
/TPad
> > as
> > > > well.
> > >
> > > I have two classes already available which servs for different
> > > necessarities. I think developing a new class would not make
sense.
> > I'm
> > > just triing to write a simple interface to merge the display of
both.
> > >
> > > Best regards
> > > Thomas.
> > >
> > > > > -----Original Message-----
> > > > > From: owner-roottalk@pcroot.cern.ch
> > > > [mailto:owner-roottalk@pcroot.cern.ch] On
> > > > > Behalf Of Thomas Bretz
> > > > > Sent: Monday, May 03, 2004 4:36 PM
> > > > > To: Valeriy Onuchin
> > > > > Cc: roottalk@pcroot.cern.ch
> > > > > Subject: Re: [ROOT] gVirtualX->PutImage and TCanvas
> > > > >
> > > > > Hi,
> > > > > sorry, I don't know what happened. I hope this time they are
> > complete.
> > > > > Thomas.
> > > > > On
> > > > > Mon, 3 May 2004, Valeriy Onuchin wrote:
> > > > > > Hi Thomas,
> > > > > > two files in attachment are empty.
> > > > > >
> > > > > > Regards. Valeriy
> > > > > >
> > > > > > ----- Original Message -----
> > > > > > From: "Thomas Bretz" <Thomas_Bretz@ph.tum.de>
> > > > > > To: <roottalk@pcroot.cern.ch>
> > > > > > Sent: Monday, May 03, 2004 6:45 PM
> > > > > > Subject: [ROOT] gVirtualX->PutImage and TCanvas
> > > > > >
> > > > > >
> > > > > > > Hi,
> > > > > > >
> > > > > > > with the (very simple) attached class I try to display a
gray
> > > > scaled
> > > > > > > bitmap in a canvas. It doesn't work. Can somebody explain
me,
> > what
> > > > I'm
> > > > > > > doing wrong?
> > > > > > >
> > > > > > > (I'm developing this class, because I need a really fast
> > access to
> > > > the
> > > > > > > screen - 25fps - which I think I won't get with the big
> > overgead
> > > > of
> > > > > > > TASImage)
> > > > > > >
> > > > > > > Thanks in advance,
> > > > > > > Thomas.
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > >
> >
------------------------------------------------------------------------
> > > > ------
> > > > > --
> > > > > >
> > > > > >
> > > > > > > void test()
> > > > > > > {
> > > > > > >     TCanvas *c=new TCanvas;
> > > > > > >
> > > > > > >     MImage2 *i = new MImage2(100, 100);
> > > > > > >
> > > > > > >     byte buf[100*100];
> > > > > > >
> > > > > > >     for (int j=0; j<100*100; j++)
> > > > > > >         buf[j]=j;
> > > > > > >
> > > > > > >     i->DrawImg(buf);
> > > > > > >     i->Draw();
> > > > > > > }
> > > > > > >
> > > > > >
> > > > > -----
> > > > > Würden Sie Windows 95 die Kontrolle eines AKWs überlassen?
> > > > > Hiroshima '45...! Tschernobyl '86...!! Windows 95...!!!
> > > > > Unix ist benutzerfreundlich - es ist nur etwas wählerisch..."
> > (Walter
> > > > Misar)
> > > > > Was sagt ein arbeitsloser Physiker zu einem Physiker mit
Arbeit?
> > > > >  - "Eine Currywurst mit Pommes bitte!"
> > > >
> > > >
> > > >
> > > >
> > >
> > > -----
> > > Würden Sie Windows 95 die Kontrolle eines AKWs überlassen?
> > > Hiroshima '45...! Tschernobyl '86...!! Windows 95...!!!
> > > Unix ist benutzerfreundlich - es ist nur etwas wählerisch..."
(Walter
> > Misar)
> > > Was sagt ein arbeitsloser Physiker zu einem Physiker mit Arbeit?
> > >  - "Eine Currywurst mit Pommes bitte!"
> >
> >
> >
> 
> -----
> Würden Sie Windows 95 die Kontrolle eines AKWs überlassen?
> Hiroshima '45...! Tschernobyl '86...!! Windows 95...!!!
> Unix ist benutzerfreundlich - es ist nur etwas wählerisch..." (Walter
Misar)
> Was sagt ein arbeitsloser Physiker zu einem Physiker mit Arbeit?
>  - "Eine Currywurst mit Pommes bitte!"



This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:07 MET