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 )