nanogui: Patch to support MWPF_PALETTE pixtype with VNC Server


Previous by date: 18 Feb 2006 18:56:09 +0000 Re: Where can I find the game source code based on the Microwindows?, Greg Haerr
Next by date: 18 Feb 2006 18:56:09 +0000 Differences in FLTK1.1.7 / FLTK2.0 - was : FLTK2 - Colors mixed up / Keyboard, oliver.schlenker.smmotioncontrol.de
Previous in thread:
Next in thread:

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 )

Previous by date: 18 Feb 2006 18:56:09 +0000 Re: Where can I find the game source code based on the Microwindows?, Greg Haerr
Next by date: 18 Feb 2006 18:56:09 +0000 Differences in FLTK1.1.7 / FLTK2.0 - was : FLTK2 - Colors mixed up / Keyboard, oliver.schlenker.smmotioncontrol.de
Previous in thread:
Next in thread:


Powered by ezmlm-browse 0.20.