Hi Valeri, great, that's doing the job. What is the disadvantage of disabling the double buffering? Thomas. On Tue, 4 May 2004, Valeri Fine wrote: > 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!" > > > ----- 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