[<<] [<] Page 1 of 1 [>] [>>] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Subject:
Patch to support MWPF_PALETTE pixtype with VNC Server
From: Pete Klemm ####@####.#### Date: 18 Feb 2006 18:56:09 +0000 Message-Id: <43F76DD0.30107@esysr.com> Attached is a patch with "diff -urN" against CVS source to get the correct colors on a remote VNC client and with snap_jpg when the local framebuffer has a pixtype of MWPF_PALETTE. I also made changes to compile with my ARM crosscompiler (gcc-4.0.1-glibc-2.3.2) and to link with the remote frame buffer protocol in libvncserver-0.8. Changes summary: src/drivers/vncserver.c, src/demos/nanox/snap_jpg.c Changes where made to support pixtype MWPF_PALETTE src/drivers/kbd_pipe.c, src/engine/devmouse.c Changes made to compile with GCC 4.0.1 with GLIBC 2.3.2 src/nanox/srvmain.c Changes made to compile and link with libvncserver-0.8 I hope this is of use! Pete Klemm --- microwin/src/demos/nanox/snap_jpg.c 2002-08-23 20:10:19.000000000 -0500 +++ microwin-svn/src/demos/nanox/snap_jpg.c 2006-02-18 11:54:26.000000000 -0600 @@ -25,7 +25,7 @@ int -save_image(unsigned char *fb, GR_WINDOW_FB_INFO * info, char *file) +save_image(unsigned char *fb, GR_WINDOW_FB_INFO * info, GR_PALETTE *pal, char *file) { int y; FILE *fp; @@ -67,8 +67,14 @@ for (x = 0; x < info->xres; x++) { switch (info->bpp) { case 8: - colorval = PIXEL332TOCOLORVAL(*ch); - break; + if (info->pixtype == MWPF_PALETTE) { + colorval = ((pal->palette[ch[0]].r << 0 ) | + (pal->palette[ch[0]].g << 8 ) | + (pal->palette[ch[0]].b << 16)); + } else { + colorval = PIXEL332TOCOLORVAL(*ch); + } + break; case 16: colorval = @@ -104,6 +110,7 @@ main(int argc, char **argv) { GR_WINDOW_FB_INFO fbinfo; + GR_PALETTE pal; unsigned char *fb; if (argc < 2) { @@ -127,8 +134,9 @@ } GrGetWindowFBInfo(GR_ROOT_WINDOW_ID, &fbinfo); + GrGetSystemPalette(&pal); - if (save_image(fb, &fbinfo, argv[1]) == -1) + if (save_image(fb, &fbinfo, &pal, argv[1]) == -1) printf("Error!\n"); else printf("Sucessfully saved [%s]\n", argv[1]); --- microwin/src/drivers/kbd_pipe.c 2001-06-21 01:32:41.000000000 -0500 +++ microwin-svn/src/drivers/kbd_pipe.c 2006-02-12 14:08:25.000000000 -0600 @@ -54,14 +54,14 @@ } if (mkfifo(KBD_NAMED_PIPE, 0600) < 0) { EPRINTF("mkfifo() error %d ('%s')\n", \ - errno, sys_errlist[errno]); + errno, strerror(errno)); return -1; } /* Open the named pipe */ if ((kbd_fd = open(KBD_NAMED_PIPE, O_RDONLY | O_NONBLOCK)) < 0) { EPRINTF("open() error %d ('%s')\n", \ - errno, sys_errlist[errno]); + errno, strerror(errno)); return -1; } --- microwin/src/drivers/vncserver.c 2005-06-15 11:38:19.000000000 -0500 +++ microwin-svn/src/drivers/vncserver.c 2006-02-18 12:10:11.000000000 -0600 @@ -45,6 +45,8 @@ #include "rfb/rfb.h" #include <assert.h> +extern MWPALENTRY gr_palette[256]; /* current palette*/ + rfbScreenInfoPtr rfbScreen; /* the RFB screen structure */ static int clients_connected = 0 ; /* # of clients connected */ @@ -204,7 +206,7 @@ } nfds = select( max(rfbScreen->httpSock,rfbScreen->httpListenSock) + 1, &fds, NULL, NULL, NULL ); - httpCheckFds( rfbScreen ); + rfbHttpCheckFds( rfbScreen ); } while ( nfds > 0 ); return 0; } @@ -231,7 +233,7 @@ awakeGsSelect(); } - defaultPtrAddEvent(buttonMask, x, y, cl); + rfbDefaultPtrAddEvent(buttonMask, x, y, cl); } @@ -547,6 +549,9 @@ int GdOpenVNC( PSD psd, int argc, char *argv[] ) { + rfbColourMap* cmap; + int i; + /* Save the actual FB screen driver drawing functions */ actualpsd = psd; @@ -580,68 +585,88 @@ /* NOW set bits x sample & samples x pixel */ switch(psd->pixtype) { + case MWPF_TRUECOLOR332: /* 8 bpp */ - - rfbScreen->rfbServerFormat.redMax = 7; - rfbScreen->rfbServerFormat.greenMax = 7; - rfbScreen->rfbServerFormat.blueMax = 3; - - rfbScreen->rfbServerFormat.redShift = 5; - rfbScreen->rfbServerFormat.greenShift = 2; - rfbScreen->rfbServerFormat.blueShift = 0; + rfbScreen->serverFormat.redMax = 7; + rfbScreen->serverFormat.greenMax = 7; + rfbScreen->serverFormat.blueMax = 3; + + rfbScreen->serverFormat.redShift = 5; + rfbScreen->serverFormat.greenShift = 2; + rfbScreen->serverFormat.blueShift = 0; break; - case MWPF_TRUECOLOR565: - rfbScreen->rfbServerFormat.greenMax = 63; - rfbScreen->rfbServerFormat.redShift = 11; + case MWPF_TRUECOLOR565: + rfbScreen->serverFormat.greenMax = 63; + rfbScreen->serverFormat.redShift = 11; goto skip555; case MWPF_TRUECOLOR555: /* 16 bpp */ - rfbScreen->rfbServerFormat.greenMax = 31; - rfbScreen->rfbServerFormat.redShift = 10; + rfbScreen->serverFormat.greenMax = 31; + rfbScreen->serverFormat.redShift = 10; skip555: - rfbScreen->rfbServerFormat.redMax = 31; - rfbScreen->rfbServerFormat.blueMax = 31; + rfbScreen->serverFormat.redMax = 31; + rfbScreen->serverFormat.blueMax = 31; - rfbScreen->rfbServerFormat.greenShift = 5; - rfbScreen->rfbServerFormat.blueShift = 0; + rfbScreen->serverFormat.greenShift = 5; + rfbScreen->serverFormat.blueShift = 0; break; + + case MWPF_PALETTE: + cmap = &(rfbScreen->colourMap); + rfbScreen->serverFormat.trueColour = FALSE; + cmap->count = psd->ncolors; + cmap->is16 = FALSE; + + if (cmap->data.bytes == 0) { + cmap->data.bytes=malloc(cmap->count*3); + } + + for (i=0; i<cmap->count; i++) { + cmap->data.bytes[3*i+0] = gr_palette[i].r; + cmap->data.bytes[3*i+1] = gr_palette[i].g; + cmap->data.bytes[3*i+2] = gr_palette[i].b; + } + /* Fall through to MWPF_TRUECOLOR888 */ + case MWPF_TRUECOLOR0888: /* 24/32 bpp */ case MWPF_TRUECOLOR888: - rfbScreen->rfbServerFormat.redMax = 255; - rfbScreen->rfbServerFormat.greenMax = 255; - rfbScreen->rfbServerFormat.blueMax = 255; - - rfbScreen->rfbServerFormat.redShift = 16; - rfbScreen->rfbServerFormat.greenShift = 8; - rfbScreen->rfbServerFormat.blueShift = 0; + rfbScreen->serverFormat.redMax = 255; + rfbScreen->serverFormat.greenMax = 255; + rfbScreen->serverFormat.blueMax = 255; + + rfbScreen->serverFormat.redShift = 16; + rfbScreen->serverFormat.greenShift = 8; + rfbScreen->serverFormat.blueShift = 0; break; default: + break; } /* Set bpp. If VNC does not support nano-X bpp, it will refuse connections, but nano-X will continue to run */ - rfbScreen->rfbServerFormat.bitsPerPixel = - rfbScreen->rfbServerFormat.depth = + rfbScreen->serverFormat.bitsPerPixel = + rfbScreen->serverFormat.depth = rfbScreen->bitsPerPixel = rfbScreen->depth = psd->bpp; rfbScreen->desktopName = "nano-X"; rfbScreen->frameBuffer = psd->addr; - rfbScreen->rfbAlwaysShared = TRUE; + rfbScreen->alwaysShared = TRUE; rfbScreen->ptrAddEvent = handle_pointer; rfbScreen->kbdAddEvent = handle_keyboard; rfbScreen->newClientHook = newclient; rfbScreen->dontSendFramebufferUpdate = FALSE; rfbScreen->cursor = NULL; + rfbScreen->httpPort = 5800; rfbScreen->httpDir = "/var/lib/httpd/"; - rfbScreen->rfbAuthPasswdData = "/etc/vncpasswd"; + rfbScreen->authPasswdData = "/etc/vncpasswd"; rfbScreen->paddedWidthInBytes = psd->linelen * (psd->bpp >> 3) ; @@ -652,7 +677,7 @@ pipe(fd); vnc_thread_fd = fd[0]; pthread_mutex_init( &eventMutex, NULL ); - rfbScreen->rfbDeferUpdateTime = 25; + rfbScreen->deferUpdateTime = 25; // rfbScreen->backgroundLoop = TRUE; rfbRunEventLoop( rfbScreen, 0, TRUE); pthread_create( &httpd_thread, 0, httpd_proc, 0 ); --- microwin/src/engine/devmouse.c 2005-06-23 00:00:00.000000000 -0500 +++ microwin-svn/src/engine/devmouse.c 2006-02-13 14:40:09.000000000 -0600 @@ -3,6 +3,8 @@ * Portions Copyright (c) 2002 by Koninklijke Philips Electronics N.V. * Copyright (C) 1999 Bradley D. LaRonde ####@####.#### * Copyright (c) 1991 David I. Bell + * Permission is granted to use, distribute, or modify this source, + * provided that this copyright notice remains intact. * * Device-independent top level mouse and cursor routines * @@ -53,6 +55,7 @@ static MWIMAGEBITS cursorcolor[MWMAX_CURSOR_BUFLEN]; extern int gr_mode; +extern MOUSEDEVICE mousedev; /* Advance declarations */ static int filter_relative(int, int, int, int *, int *, int, int); --- microwin/src/nanox/srvmain.c 2005-06-23 19:26:57.000000000 -0500 +++ microwin-svn/src/nanox/srvmain.c 2006-02-12 14:06:02.000000000 -0600 @@ -668,9 +668,9 @@ #else /* Add all VNC open sockets to nano-X select set */ - FD_SET( rfbScreen->rfbListenSock, &(rfds) ); - if ( rfbScreen->rfbListenSock > setsize ) - setsize = rfbScreen->rfbListenSock; + FD_SET( rfbScreen->listenSock, &(rfds) ); + if ( rfbScreen->listenSock > setsize ) + setsize = rfbScreen->listenSock; FD_SET( rfbScreen->httpListenSock, &(rfds) ); if ( rfbScreen->httpListenSock > setsize ) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[<<] [<] Page 1 of 1 [>] [>>] |