RE: [ROOT] gVirtualX->PutImage and TCanvas

From: Thomas Bretz (Thomas_Bretz@ph.tum.de)
Date: Tue May 04 2004 - 19:26:43 MEST


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