help, anybody?

P.S. forgot to mention that XShmPutImage always returns me -1, what's that?

P.P.S. please help me with the problem below


----- Original Message -----
From: Michael Zayats <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Friday, October 19, 2001 8:21 PM
Subject: XShmPutImage


> well now I am trying to switch to "regular" XShmPutImage, but it doesn't
> work for me
>
> a few comments to the code: my visual is 16bpp 565 RGB the following code
> misses smth, please spend two minutes in Draw function, put your attention
> that window is allocated in the other place, what I get on screen are two
> black windows :( may be I miss something, Should I handle Exposure event
in
> some special way in my event loop?
>
> class XVideoRenderer : public IVideoRenderer  {
> public:
>     XVideoRenderer();
>     virtual ~XVideoRenderer();
>
>     virtual int  Initialize(void *pWindowHandle);
>
>     virtual int Draw(unsigned char *pFrameBuffer,
>         long  nFrameBufferSize,
>         unsigned short    nWidth,
>         unsigned short nHeight,
>         unsigned short nBpp,
>         void *pLiveVideoWindow = 0,
>         bool  bUpdate  = false,
>         unsigned long dwFlags = 0);
>
>     virtual int Finalize();
> private:
>     int isInitialized; file://part of initialization performed on first
draw
>     Window win; file://X window handle
>     XWindowAttributes *win_attr;
>     GC gc; file://Graphic context
>     Display *dpy; file://X server connection
>
>     XImage  *x_image; file://shared memory based image
>     XShmSegmentInfo x_shminfo; file://shared memory info struct
>
>     int cur_width, cur_height; file://current height and width of win
>
>     void get_win_size(int *width, int *height); file://get the size of win
> from Xserver
> };
>
>
> int XVideoRenderer::Initialize(void *pWindowHandle)
> {
>     win = (Window)pWindowHandle;
>     dpy = XOpenDisplay(NULL);
>     win_attr = (XWindowAttributes *)malloc(sizeof(XWindowAttributes));
>     XGetWindowAttributes(dpy, win, win_attr);
>     gc = XCreateGC(dpy, win, 0, 0);
>
>     return 0;
> }
>
> int XVideoRenderer::Draw(unsigned char    *pFrameBuffer,
>      long nFrameBufferSize,
>      unsigned short    nWidth,
>      unsigned short nHeight,
>      unsigned short nBpp,
>      void *pLiveVideoWindow = 0,
>      bool  bUpdate  = false,
>      unsigned long dwFlags = 0)
> {
>     if (!isInitialized)
>     {
>         printf("Initalizing\n");
>         x_image = XShmCreateImage(dpy, win_attr->visual, win_attr->depth,
> ZPixmap, 0, &x_shminfo, nWidth,
> nHeight);
>         x_shminfo.shmid = shmget(IPC_PRIVATE, x_image->bytes_per_line *
> x_image->height, IPC_CREAT |
> 0777);
>         x_shminfo.shmaddr = x_image->data = (char *)shmat(x_shminfo.shmid,
> 0, 0);
>         x_shminfo.readOnly = False;
>         XShmAttach(dpy, &x_shminfo);
>         isInitialized = 1;
>     }
>
>
>     // check for window size
>      int new_width, new_height;
>      get_win_size(&new_width, &new_height);
>
>      if ((new_width != nWidth) || (new_height != nHeight))
>     {
>          XResizeWindow(dpy, win, nWidth, nHeight);
>     }
>
>     memcpy(x_image->data, pFrameBuffer, nWidth * nHeight * 2);
>
>
>     XShmPutImage(dpy, win, gc, x_image,
>        0, 0, x_image->width, x_image->height,
>        0, 0, False);
>
>     XFlush(dpy);
>
>     return 0;
> }
>
> thank you in advance,
>
> Michael
>
>
>
>

_______________________________________________
Xpert mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/xpert

Reply via email to