diff -Nru LibVNCServer-0.9.1/libvncserver/rfbregion.c x11vnc-0.9.5/libvncserver/rfbregion.c
--- LibVNCServer-0.9.1/libvncserver/rfbregion.c	2005-05-15 16:57:53.000000000 +0200
+++ x11vnc-0.9.5/libvncserver/rfbregion.c	2008-05-08 02:54:27.000000000 +0200
@@ -620,8 +620,8 @@
 sraRgnPopRect(sraRegion *rgn, sraRect *rect, unsigned long flags) {
   sraSpan *vcurr, *hcurr;
   sraSpan *vend, *hend;
-  rfbBool right2left = flags & 2;
-  rfbBool bottom2top = flags & 1;
+  rfbBool right2left = (flags & 2) == 2;
+  rfbBool bottom2top = (flags & 1) == 1;
 
   /* - Pick correct order */
   if (bottom2top) {
diff -Nru LibVNCServer-0.9.1/libvncserver/rfbserver.c x11vnc-0.9.5/libvncserver/rfbserver.c
--- LibVNCServer-0.9.1/libvncserver/rfbserver.c	2007-05-19 05:17:58.000000000 +0200
+++ x11vnc-0.9.5/libvncserver/rfbserver.c	2008-06-24 20:46:24.000000000 +0200
@@ -74,6 +74,8 @@
 #include <dirent.h>
 /* errno */
 #include <errno.h>
+/* strftime() */
+#include <time.h>
 
 #ifdef __MINGW32__
 static int compat_mkdir(const char *path, int mode)
@@ -367,9 +369,9 @@
       UNLOCK(rfbClientListMutex);
 
 #ifdef LIBVNCSERVER_HAVE_LIBZ
+      cl->tightQualityLevel = -1;
 #ifdef LIBVNCSERVER_HAVE_LIBJPEG
       cl->tightCompressLevel = TIGHT_DEFAULT_COMPRESSION;
-      cl->tightQualityLevel = -1;
       {
 	int i;
 	for (i = 0; i < 4; i++)
@@ -699,8 +701,10 @@
 rfbProcessClientInitMessage(rfbClientPtr cl)
 {
     rfbClientInitMsg ci;
-    char buf[256];
-    rfbServerInitMsg *si = (rfbServerInitMsg *)buf;
+    union {
+        char buf[256];
+        rfbServerInitMsg si;
+    } u;
     int len, n;
     rfbClientIteratorPtr iterator;
     rfbClientPtr otherCl;
@@ -715,20 +719,20 @@
         return;
     }
 
-    memset(buf,0,sizeof(buf));
+    memset(u.buf,0,sizeof(u.buf));
 
-    si->framebufferWidth = Swap16IfLE(cl->screen->width);
-    si->framebufferHeight = Swap16IfLE(cl->screen->height);
-    si->format = cl->screen->serverFormat;
-    si->format.redMax = Swap16IfLE(si->format.redMax);
-    si->format.greenMax = Swap16IfLE(si->format.greenMax);
-    si->format.blueMax = Swap16IfLE(si->format.blueMax);
-
-    strncpy(buf + sz_rfbServerInitMsg, cl->screen->desktopName, 127);
-    len = strlen(buf + sz_rfbServerInitMsg);
-    si->nameLength = Swap32IfLE(len);
+    u.si.framebufferWidth = Swap16IfLE(cl->screen->width);
+    u.si.framebufferHeight = Swap16IfLE(cl->screen->height);
+    u.si.format = cl->screen->serverFormat;
+    u.si.format.redMax = Swap16IfLE(u.si.format.redMax);
+    u.si.format.greenMax = Swap16IfLE(u.si.format.greenMax);
+    u.si.format.blueMax = Swap16IfLE(u.si.format.blueMax);
+
+    strncpy(u.buf + sz_rfbServerInitMsg, cl->screen->desktopName, 127);
+    len = strlen(u.buf + sz_rfbServerInitMsg);
+    u.si.nameLength = Swap32IfLE(len);
 
-    if (rfbWriteExact(cl, buf, sz_rfbServerInitMsg + len) < 0) {
+    if (rfbWriteExact(cl, u.buf, sz_rfbServerInitMsg + len) < 0) {
         rfbLogPerror("rfbProcessClientInitMessage: write");
         rfbCloseClient(cl);
         return;
@@ -903,15 +907,6 @@
 
 
 
-static void rfbSendSupporteddEncodings_SendEncoding(rfbClientPtr cl, uint32_t enc)
-{
-    uint32_t nSwapped=0;
-    nSwapped = Swap32IfLE(enc);
-    memcpy(&cl->updateBuf[cl->ublen], (char *)&nSwapped, sizeof(nSwapped));
-    cl->ublen+=sizeof(nSwapped);
-}
-
-
 /*
  * Send rfbEncodingSupportedEncodings.
  */
@@ -920,21 +915,38 @@
 rfbSendSupportedEncodings(rfbClientPtr cl)
 {
     rfbFramebufferUpdateRectHeader rect;
-    uint16_t nEncodings=0;
-    
-    /* think rfbSetEncodingsMsg */
-
-    /* TODO: dynamic way of doing this */
-    nEncodings=16;
+    static uint32_t supported[] = {
+        rfbEncodingRaw,
+	rfbEncodingCopyRect,
+	rfbEncodingRRE,
+	rfbEncodingCoRRE,
+	rfbEncodingHextile,
 #ifdef LIBVNCSERVER_HAVE_LIBZ
-    nEncodings += 2;
+	rfbEncodingZlib,
+	rfbEncodingZRLE,
+	rfbEncodingZYWRLE,
 #endif
-#ifdef LIBVNCSERVER_HAVE_LIBZ
-    nEncodings++;
+#ifdef LIBVNCSERVER_HAVE_LIBJPEG
+	rfbEncodingTight,
 #endif
+	rfbEncodingUltra,
+	rfbEncodingUltraZip,
+	rfbEncodingXCursor,
+	rfbEncodingRichCursor,
+	rfbEncodingPointerPos,
+	rfbEncodingLastRect,
+	rfbEncodingNewFBSize,
+	rfbEncodingKeyboardLedState,
+	rfbEncodingSupportedMessages,
+	rfbEncodingSupportedEncodings,
+	rfbEncodingServerIdentity,
+    };
+    uint32_t nEncodings = sizeof(supported) / sizeof(supported[0]), i;
+
+    /* think rfbSetEncodingsMsg */
 
     if (cl->ublen + sz_rfbFramebufferUpdateRectHeader
-                  + (nEncodings*sizeof(uint32_t)) > UPDATE_BUF_SIZE) {
+                  + (nEncodings * sizeof(uint32_t)) > UPDATE_BUF_SIZE) {
         if (!rfbSendUpdateBuf(cl))
             return FALSE;
     }
@@ -949,29 +961,11 @@
         sz_rfbFramebufferUpdateRectHeader);
     cl->ublen += sz_rfbFramebufferUpdateRectHeader;
 
-    rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingRaw);
-    rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingCopyRect);
-    rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingRRE);
-    rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingCoRRE);
-    rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingHextile);
-#ifdef LIBVNCSERVER_HAVE_LIBZ
-    rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingZlib);
-    rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingTight);
-#endif
-#ifdef LIBVNCSERVER_HAVE_LIBZ
-    rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingZRLE);
-#endif
-    rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingUltra);
-    rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingUltraZip);
-    rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingXCursor);
-    rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingRichCursor);
-    rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingPointerPos);
-    rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingLastRect);
-    rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingNewFBSize);
-    rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingKeyboardLedState);
-    rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingSupportedMessages);
-    rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingSupportedEncodings);
-    rfbSendSupporteddEncodings_SendEncoding(cl, rfbEncodingServerIdentity);
+    for (i = 0; i < nEncodings; i++) {
+        uint32_t encoding = Swap32IfLE(supported[i]);
+	memcpy(&cl->updateBuf[cl->ublen], (char *)&encoding, sizeof(encoding));
+	cl->ublen += sizeof(encoding);
+    }
 
     rfbStatRecordEncodingSent(cl, rfbEncodingSupportedEncodings,
         sz_rfbFramebufferUpdateRectHeader+(nEncodings * sizeof(uint32_t)),
@@ -1906,6 +1900,7 @@
 #ifdef LIBVNCSERVER_HAVE_LIBZ
 	    case rfbEncodingZlib:
             case rfbEncodingZRLE:
+            case rfbEncodingZYWRLE:
 #ifdef LIBVNCSERVER_HAVE_LIBJPEG
 	    case rfbEncodingTight:
 #endif
@@ -1998,12 +1993,12 @@
 		    cl->tightCompressLevel = enc & 0x0F;
 		    rfbLog("Using compression level %d for client %s\n",
 			   cl->tightCompressLevel, cl->host);
+#endif
 		} else if ( enc >= (uint32_t)rfbEncodingQualityLevel0 &&
 			    enc <= (uint32_t)rfbEncodingQualityLevel9 ) {
 		    cl->tightQualityLevel = enc & 0x0F;
 		    rfbLog("Using image quality level %d for client %s\n",
 			   cl->tightQualityLevel, cl->host);
-#endif
 		} else
 #endif
 		{
@@ -2636,7 +2631,7 @@
 	    rows = (h-1)/cl->correMaxHeight+1;
 	    nUpdateRegionRects += rectsPerRow*rows;
         }
-	sraRgnReleaseIterator(i);
+	sraRgnReleaseIterator(i); i=NULL;
     } else if (cl->preferredEncoding == rfbEncodingUltra) {
         nUpdateRegionRects = 0;
         
@@ -2650,7 +2645,7 @@
                 rfbScaledCorrection(cl->screen, cl->scaledScreen, &x, &y, &w, &h, "rfbSendFramebufferUpdate");
             nUpdateRegionRects += (((h-1) / (ULTRA_MAX_SIZE( w ) / w)) + 1);
           }
-        sraRgnReleaseIterator(i);
+        sraRgnReleaseIterator(i); i=NULL;
 #ifdef LIBVNCSERVER_HAVE_LIBZ
     } else if (cl->preferredEncoding == rfbEncodingZlib) {
 	nUpdateRegionRects = 0;
@@ -2665,7 +2660,7 @@
                 rfbScaledCorrection(cl->screen, cl->scaledScreen, &x, &y, &w, &h, "rfbSendFramebufferUpdate");
 	    nUpdateRegionRects += (((h-1) / (ZLIB_MAX_SIZE( w ) / w)) + 1);
 	}
-	sraRgnReleaseIterator(i);
+	sraRgnReleaseIterator(i); i=NULL;
 #ifdef LIBVNCSERVER_HAVE_LIBJPEG
     } else if (cl->preferredEncoding == rfbEncodingTight) {
 	nUpdateRegionRects = 0;
@@ -2686,7 +2681,7 @@
 	    }
 	    nUpdateRegionRects += n;
 	}
-	sraRgnReleaseIterator(i);
+	sraRgnReleaseIterator(i); i=NULL;
 #endif
 #endif
     } else {
@@ -2804,12 +2799,17 @@
 #endif
 #ifdef LIBVNCSERVER_HAVE_LIBZ
        case rfbEncodingZRLE:
+       case rfbEncodingZYWRLE:
            if (!rfbSendRectEncodingZRLE(cl, x, y, w, h))
 	       goto updateFailed;
            break;
 #endif
         }
     }
+    if (i) {
+        sraRgnReleaseIterator(i);
+        i = NULL;
+    }
 
     if ( nUpdateRegionRects == 0xFFFF &&
 	 !rfbSendLastRectMarker(cl) )
@@ -3066,12 +3066,20 @@
                            int nColours)
 {
     char buf[sz_rfbSetColourMapEntriesMsg + 256 * 3 * 2];
-    rfbSetColourMapEntriesMsg *scme = (rfbSetColourMapEntriesMsg *)buf;
-    uint16_t *rgb = (uint16_t *)(&buf[sz_rfbSetColourMapEntriesMsg]);
+    char *wbuf = buf;
+    rfbSetColourMapEntriesMsg *scme;
+    uint16_t *rgb;
     rfbColourMap* cm = &cl->screen->colourMap;
-    
     int i, len;
 
+    if (nColours > 256) {
+	/* some rare hardware has, e.g., 4096 colors cells: PseudoColor:12 */
+    	wbuf = (char *) malloc(sz_rfbSetColourMapEntriesMsg + nColours * 3 * 2);
+    }
+
+    scme = (rfbSetColourMapEntriesMsg *)wbuf;
+    rgb = (uint16_t *)(&wbuf[sz_rfbSetColourMapEntriesMsg]);
+
     scme->type = rfbSetColourMapEntries;
 
     scme->firstColour = Swap16IfLE(firstColour);
@@ -3086,22 +3094,24 @@
 	  rgb[i*3+1] = Swap16IfLE(cm->data.shorts[i*3+1]);
 	  rgb[i*3+2] = Swap16IfLE(cm->data.shorts[i*3+2]);
 	} else {
-	  rgb[i*3] = Swap16IfLE(cm->data.bytes[i*3]);
-	  rgb[i*3+1] = Swap16IfLE(cm->data.bytes[i*3+1]);
-	  rgb[i*3+2] = Swap16IfLE(cm->data.bytes[i*3+2]);
+	  rgb[i*3] = Swap16IfLE((unsigned short)cm->data.bytes[i*3]);
+	  rgb[i*3+1] = Swap16IfLE((unsigned short)cm->data.bytes[i*3+1]);
+	  rgb[i*3+2] = Swap16IfLE((unsigned short)cm->data.bytes[i*3+2]);
 	}
       }
     }
 
     len += nColours * 3 * 2;
 
-    if (rfbWriteExact(cl, buf, len) < 0) {
+    if (rfbWriteExact(cl, wbuf, len) < 0) {
 	rfbLogPerror("rfbSendSetColourMapEntries: write");
 	rfbCloseClient(cl);
+        if (wbuf != buf) free(wbuf);
 	return FALSE;
     }
 
     rfbStatRecordMessageSent(cl, rfbSetColourMapEntries, len, len);
+    if (wbuf != buf) free(wbuf);
     return TRUE;
 }
 
diff -Nru LibVNCServer-0.9.1/libvncserver/scale.c x11vnc-0.9.5/libvncserver/scale.c
--- LibVNCServer-0.9.1/libvncserver/scale.c	2006-05-15 07:37:39.000000000 +0200
+++ x11vnc-0.9.5/libvncserver/scale.c	2008-01-29 12:50:16.000000000 +0100
@@ -151,6 +151,10 @@
     h1 = h0;
 
     rfbScaledCorrection(screen, ptr, &x1, &y1, &w1, &h1, "rfbScaledScreenUpdateRect");
+    x0 = ScaleX(ptr, screen, x1);
+    y0 = ScaleY(ptr, screen, y1);
+    w0 = ScaleX(ptr, screen, w1);
+    h0 = ScaleY(ptr, screen, h1);
 
     bitsPerPixel = screen->bitsPerPixel;
     bytesPerPixel = bitsPerPixel / 8;
@@ -197,8 +201,8 @@
          /* Get the totals for rgb from the source grid... */
          for (w = 0; w < areaX; w++) {
            for (v = 0; v < areaY; v++) {
-             srcptr2 = &srcptr[(((x * areaX) + v) * bytesPerPixel) +
-                               (w * screen->paddedWidthInBytes)];
+             srcptr2 = &srcptr[(((x * areaX) + w) * bytesPerPixel) +
+                               (v * screen->paddedWidthInBytes)];
              pixel_value = 0;
 
 
diff -Nru LibVNCServer-0.9.1/libvncserver/stats.c x11vnc-0.9.5/libvncserver/stats.c
--- LibVNCServer-0.9.1/libvncserver/stats.c	2006-05-16 21:35:17.000000000 +0200
+++ x11vnc-0.9.5/libvncserver/stats.c	2008-02-01 15:12:07.000000000 +0100
@@ -103,6 +103,7 @@
     case rfbEncodingZlibHex:            snprintf(buf, len, "zlibhex");     break;
     case rfbEncodingUltra:              snprintf(buf, len, "ultra");       break;
     case rfbEncodingZRLE:               snprintf(buf, len, "ZRLE");        break;
+    case rfbEncodingZYWRLE:             snprintf(buf, len, "ZYWRLE");      break;
     case rfbEncodingCache:              snprintf(buf, len, "cache");       break;
     case rfbEncodingCacheEnable:        snprintf(buf, len, "cacheEnable"); break;
     case rfbEncodingXOR_Zlib:           snprintf(buf, len, "xorZlib");     break;
diff -Nru LibVNCServer-0.9.1/libvncserver/zrle.c x11vnc-0.9.5/libvncserver/zrle.c
--- LibVNCServer-0.9.1/libvncserver/zrle.c	2006-05-15 07:37:39.000000000 +0200
+++ x11vnc-0.9.5/libvncserver/zrle.c	2008-01-30 21:38:51.000000000 +0100
@@ -40,18 +40,50 @@
 
 #define EXTRA_ARGS , rfbClientPtr cl
 
+#define ENDIAN_LITTLE 0
+#define ENDIAN_BIG 1
+#define ENDIAN_NO 2
 #define BPP 8
+#define ZYWRLE_ENDIAN ENDIAN_NO
+#include <zrleencodetemplate.c>
+#undef BPP
+#define BPP 15
+#undef ZYWRLE_ENDIAN
+#define ZYWRLE_ENDIAN ENDIAN_LITTLE
+#include <zrleencodetemplate.c>
+#undef ZYWRLE_ENDIAN
+#define ZYWRLE_ENDIAN ENDIAN_BIG
 #include <zrleencodetemplate.c>
 #undef BPP
 #define BPP 16
+#undef ZYWRLE_ENDIAN
+#define ZYWRLE_ENDIAN ENDIAN_LITTLE
+#include <zrleencodetemplate.c>
+#undef ZYWRLE_ENDIAN
+#define ZYWRLE_ENDIAN ENDIAN_BIG
 #include <zrleencodetemplate.c>
 #undef BPP
 #define BPP 32
+#undef ZYWRLE_ENDIAN
+#define ZYWRLE_ENDIAN ENDIAN_LITTLE
+#include <zrleencodetemplate.c>
+#undef ZYWRLE_ENDIAN
+#define ZYWRLE_ENDIAN ENDIAN_BIG
 #include <zrleencodetemplate.c>
 #define CPIXEL 24A
+#undef ZYWRLE_ENDIAN
+#define ZYWRLE_ENDIAN ENDIAN_LITTLE
+#include <zrleencodetemplate.c>
+#undef ZYWRLE_ENDIAN
+#define ZYWRLE_ENDIAN ENDIAN_BIG
 #include <zrleencodetemplate.c>
 #undef CPIXEL
 #define CPIXEL 24B
+#undef ZYWRLE_ENDIAN
+#define ZYWRLE_ENDIAN ENDIAN_LITTLE
+#include <zrleencodetemplate.c>
+#undef ZYWRLE_ENDIAN
+#define ZYWRLE_ENDIAN ENDIAN_BIG
 #include <zrleencodetemplate.c>
 #undef CPIXEL
 #undef BPP
@@ -64,6 +96,7 @@
  * data.
  */
 
+/* TODO: put into rfbClient struct */
 static char zrleBeforeBuf[rfbZRLETileWidth * rfbZRLETileHeight * 4 + 4];
 
 
@@ -80,6 +113,19 @@
   rfbZRLEHeader hdr;
   int i;
 
+  if (cl->preferredEncoding == rfbEncodingZYWRLE) {
+	  if (cl->tightQualityLevel < 0) {
+		  cl->zywrleLevel = 1;
+	  } else if (cl->tightQualityLevel < 3) {
+		  cl->zywrleLevel = 3;
+	  } else if (cl->tightQualityLevel < 6) {
+		  cl->zywrleLevel = 2;
+	  } else {
+		  cl->zywrleLevel = 1;
+	  }
+  } else
+	  cl->zywrleLevel = 0;
+
   if (!cl->zrleData)
     cl->zrleData = zrleOutStreamNew();
   zos = cl->zrleData;
@@ -89,11 +135,21 @@
   switch (cl->format.bitsPerPixel) {
 
   case 8:
-    zrleEncode8( x, y, w, h, zos, zrleBeforeBuf, cl);
+    zrleEncode8NE(x, y, w, h, zos, zrleBeforeBuf, cl);
     break;
 
   case 16:
-    zrleEncode16(x, y, w, h, zos, zrleBeforeBuf, cl);
+	if (cl->format.greenMax > 0x1F) {
+		if (cl->format.bigEndian)
+		  zrleEncode16BE(x, y, w, h, zos, zrleBeforeBuf, cl);
+		else
+		  zrleEncode16LE(x, y, w, h, zos, zrleBeforeBuf, cl);
+	} else {
+		if (cl->format.bigEndian)
+		  zrleEncode15BE(x, y, w, h, zos, zrleBeforeBuf, cl);
+		else
+		  zrleEncode15LE(x, y, w, h, zos, zrleBeforeBuf, cl);
+	}
     break;
 
   case 32: {
@@ -107,18 +163,24 @@
                            cl->format.blueShift  > 7);
 
     if ((fitsInLS3Bytes && !cl->format.bigEndian) ||
-        (fitsInMS3Bytes && cl->format.bigEndian))
-    {
-      zrleEncode24A(x, y, w, h, zos, zrleBeforeBuf, cl);
+        (fitsInMS3Bytes && cl->format.bigEndian)) {
+	if (cl->format.bigEndian)
+		zrleEncode24ABE(x, y, w, h, zos, zrleBeforeBuf, cl);
+	else
+		zrleEncode24ALE(x, y, w, h, zos, zrleBeforeBuf, cl);
     }
     else if ((fitsInLS3Bytes && cl->format.bigEndian) ||
-             (fitsInMS3Bytes && !cl->format.bigEndian))
-    {
-      zrleEncode24B(x, y, w, h, zos, zrleBeforeBuf, cl);
-    }
-    else
-    {
-      zrleEncode32(x, y, w, h, zos, zrleBeforeBuf, cl);
+             (fitsInMS3Bytes && !cl->format.bigEndian)) {
+	if (cl->format.bigEndian)
+		zrleEncode24BBE(x, y, w, h, zos, zrleBeforeBuf, cl);
+	else
+		zrleEncode24BLE(x, y, w, h, zos, zrleBeforeBuf, cl);
+    }
+    else {
+	if (cl->format.bigEndian)
+		zrleEncode32BE(x, y, w, h, zos, zrleBeforeBuf, cl);
+	else
+		zrleEncode32LE(x, y, w, h, zos, zrleBeforeBuf, cl);
     }
   }
     break;
@@ -138,7 +200,7 @@
   rect.r.y = Swap16IfLE(y);
   rect.r.w = Swap16IfLE(w);
   rect.r.h = Swap16IfLE(h);
-  rect.encoding = Swap32IfLE(rfbEncodingZRLE);
+  rect.encoding = Swap32IfLE(cl->preferredEncoding);
 
   memcpy(cl->updateBuf+cl->ublen, (char *)&rect,
          sz_rfbFramebufferUpdateRectHeader);
diff -Nru LibVNCServer-0.9.1/libvncserver/zrleencodetemplate.c x11vnc-0.9.5/libvncserver/zrleencodetemplate.c
--- LibVNCServer-0.9.1/libvncserver/zrleencodetemplate.c	2005-05-15 16:57:54.000000000 +0200
+++ x11vnc-0.9.5/libvncserver/zrleencodetemplate.c	2008-01-30 21:38:51.000000000 +0100
@@ -43,17 +43,37 @@
 #define __RFB_CONCAT2E(a,b) __RFB_CONCAT2(a,b)
 #endif
 
+#ifndef __RFB_CONCAT3E
+#define __RFB_CONCAT3(a,b,c) a##b##c
+#define __RFB_CONCAT3E(a,b,c) __RFB_CONCAT3(a,b,c)
+#endif
+
+#undef END_FIX
+#if ZYWRLE_ENDIAN == ENDIAN_LITTLE
+#  define END_FIX LE
+#elif ZYWRLE_ENDIAN == ENDIAN_BIG
+#  define END_FIX BE
+#else
+#  define END_FIX NE
+#endif
+
 #ifdef CPIXEL
 #define PIXEL_T __RFB_CONCAT2E(zrle_U,BPP)
 #define zrleOutStreamWRITE_PIXEL __RFB_CONCAT2E(zrleOutStreamWriteOpaque,CPIXEL)
-#define ZRLE_ENCODE __RFB_CONCAT2E(zrleEncode,CPIXEL)
-#define ZRLE_ENCODE_TILE __RFB_CONCAT2E(zrleEncodeTile,CPIXEL)
+#define ZRLE_ENCODE __RFB_CONCAT3E(zrleEncode,CPIXEL,END_FIX)
+#define ZRLE_ENCODE_TILE __RFB_CONCAT3E(zrleEncodeTile,CPIXEL,END_FIX)
 #define BPPOUT 24
+#elif BPP==15
+#define PIXEL_T __RFB_CONCAT2E(zrle_U,16)
+#define zrleOutStreamWRITE_PIXEL __RFB_CONCAT2E(zrleOutStreamWriteOpaque,16)
+#define ZRLE_ENCODE __RFB_CONCAT3E(zrleEncode,BPP,END_FIX)
+#define ZRLE_ENCODE_TILE __RFB_CONCAT3E(zrleEncodeTile,BPP,END_FIX)
+#define BPPOUT 16
 #else
 #define PIXEL_T __RFB_CONCAT2E(zrle_U,BPP)
 #define zrleOutStreamWRITE_PIXEL __RFB_CONCAT2E(zrleOutStreamWriteOpaque,BPP)
-#define ZRLE_ENCODE __RFB_CONCAT2E(zrleEncode,BPP)
-#define ZRLE_ENCODE_TILE __RFB_CONCAT2E(zrleEncodeTile,BPP)
+#define ZRLE_ENCODE __RFB_CONCAT3E(zrleEncode,BPP,END_FIX)
+#define ZRLE_ENCODE_TILE __RFB_CONCAT3E(zrleEncodeTile,BPP,END_FIX)
 #define BPPOUT BPP
 #endif
 
@@ -68,7 +88,13 @@
 
 #endif /* ZRLE_ONCE */
 
-void ZRLE_ENCODE_TILE (PIXEL_T* data, int w, int h, zrleOutStream* os);
+void ZRLE_ENCODE_TILE (PIXEL_T* data, int w, int h, zrleOutStream* os,
+		int zywrle_level, int *zywrleBuf);
+
+#if BPP!=8
+#define ZYWRLE_ENCODE
+#include "zywrletemplate.c"
+#endif
 
 static void ZRLE_ENCODE (int x, int y, int w, int h,
 		  zrleOutStream* os, void* buf
@@ -85,14 +111,16 @@
 
       GET_IMAGE_INTO_BUF(tx,ty,tw,th,buf);
 
-      ZRLE_ENCODE_TILE((PIXEL_T*)buf, tw, th, os);
+      ZRLE_ENCODE_TILE((PIXEL_T*)buf, tw, th, os,
+		      cl->zywrleLevel, cl->zywrleBuf);
     }
   }
   zrleOutStreamFlush(os);
 }
 
 
-void ZRLE_ENCODE_TILE (PIXEL_T* data, int w, int h, zrleOutStream* os)
+void ZRLE_ENCODE_TILE(PIXEL_T* data, int w, int h, zrleOutStream* os,
+	int zywrle_level, int *zywrleBuf)
 {
   /* First find the palette and the number of runs */
 
@@ -144,6 +172,11 @@
 
   estimatedBytes = w * h * (BPPOUT/8); /* start assuming raw */
 
+#if BPP!=8
+  if (zywrle_level > 0 && !(zywrle_level & 0x80))
+	  estimatedBytes >>= zywrle_level;
+#endif
+
   plainRleBytes = ((BPPOUT/8)+1) * (runs + singlePixels);
 
   if (plainRleBytes < estimatedBytes) {
@@ -253,14 +286,22 @@
 
       /* raw */
 
-#ifdef CPIXEL
-      PIXEL_T *ptr;
-      for (ptr = data; ptr < data+w*h; ptr++) {
-        zrleOutStreamWRITE_PIXEL(os, *ptr);
+#if BPP!=8
+      if (zywrle_level > 0 && !(zywrle_level & 0x80)) {
+        ZYWRLE_ANALYZE(data, data, w, h, w, zywrle_level, zywrleBuf);
+	ZRLE_ENCODE_TILE(data, w, h, os, zywrle_level | 0x80, zywrleBuf);
       }
+      else
+#endif
+      {
+#ifdef CPIXEL
+        PIXEL_T *ptr;
+        for (ptr = data; ptr < data+w*h; ptr++)
+          zrleOutStreamWRITE_PIXEL(os, *ptr);
 #else
-      zrleOutStreamWriteBytes(os, (zrle_U8 *)data, w*h*(BPP/8));
+        zrleOutStreamWriteBytes(os, (zrle_U8 *)data, w*h*(BPP/8));
 #endif
+      }
     }
   }
 }
@@ -269,4 +310,5 @@
 #undef zrleOutStreamWRITE_PIXEL
 #undef ZRLE_ENCODE
 #undef ZRLE_ENCODE_TILE
+#undef ZYWRLE_ENCODE_TILE
 #undef BPPOUT
diff -Nru LibVNCServer-0.9.1/libvncserver/zywrletemplate.c x11vnc-0.9.5/libvncserver/zywrletemplate.c
--- LibVNCServer-0.9.1/libvncserver/zywrletemplate.c	1970-01-01 01:00:00.000000000 +0100
+++ x11vnc-0.9.5/libvncserver/zywrletemplate.c	2008-02-18 05:10:45.000000000 +0100
@@ -0,0 +1,824 @@
+
+/********************************************************************
+ *                                                                  *
+ * THIS FILE IS PART OF THE 'ZYWRLE' VNC CODEC SOURCE CODE.         *
+ *                                                                  *
+ * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
+ * GOVERNED BY A FOLLOWING BSD-STYLE SOURCE LICENSE.                *
+ * PLEASE READ THESE TERMS BEFORE DISTRIBUTING.                     *
+ *                                                                  *
+ * THE 'ZYWRLE' VNC CODEC SOURCE CODE IS (C) COPYRIGHT 2006         *
+ * BY Hitachi Systems & Services, Ltd.                              *
+ * (Noriaki Yamazaki, Research & Developement Center)               *                                                                 *
+ *                                                                  *
+ ********************************************************************
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+- Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+- Neither the name of the Hitachi Systems & Services, Ltd. nor
+the names of its contributors may be used to endorse or promote
+products derived from this software without specific prior written
+permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION
+OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ********************************************************************/
+
+/* Change Log:
+     V0.02 : 2008/02/04 : Fix mis encode/decode when width != scanline
+	                     (Thanks Johannes Schindelin, author of LibVNC
+						  Server/Client)
+     V0.01 : 2007/02/06 : Initial release
+*/
+
+/* #define ZYWRLE_ENCODE */
+/* #define ZYWRLE_DECODE */
+#define ZYWRLE_QUANTIZE
+
+/*
+[References]
+ PLHarr:
+   Senecal, J. G., P. Lindstrom, M. A. Duchaineau, and K. I. Joy, "An Improved N-Bit to N-Bit Reversible Haar-Like Transform," Pacific Graphics 2004, October 2004, pp. 371-380.
+ EZW:
+   Shapiro, JM: Embedded Image Coding Using Zerotrees of Wavelet Coefficients, IEEE Trans. Signal. Process., Vol.41, pp.3445-3462 (1993).
+*/
+
+
+/* Template Macro stuffs. */
+#undef ZYWRLE_ANALYZE
+#undef ZYWRLE_SYNTHESIZE
+#define ZYWRLE_ANALYZE __RFB_CONCAT3E(zywrleAnalyze,BPP,END_FIX)
+#define ZYWRLE_SYNTHESIZE __RFB_CONCAT3E(zywrleSynthesize,BPP,END_FIX)
+
+#define ZYWRLE_RGBYUV __RFB_CONCAT3E(zywrleRGBYUV,BPP,END_FIX)
+#define ZYWRLE_YUVRGB __RFB_CONCAT3E(zywrleYUVRGB,BPP,END_FIX)
+#define ZYWRLE_YMASK __RFB_CONCAT2E(ZYWRLE_YMASK,BPP)
+#define ZYWRLE_UVMASK __RFB_CONCAT2E(ZYWRLE_UVMASK,BPP)
+#define ZYWRLE_LOAD_PIXEL __RFB_CONCAT2E(ZYWRLE_LOAD_PIXEL,BPP)
+#define ZYWRLE_SAVE_PIXEL __RFB_CONCAT2E(ZYWRLE_SAVE_PIXEL,BPP)
+
+/* Packing/Unpacking pixel stuffs.
+   Endian conversion stuffs. */
+#undef S_0
+#undef S_1
+#undef L_0
+#undef L_1
+#undef L_2
+#if ZYWRLE_ENDIAN == ENDIAN_BIG
+#  define S_0	1
+#  define S_1	0
+#  define L_0	3
+#  define L_1	2
+#  define L_2	1
+#else
+#  define S_0	0
+#  define S_1	1
+#  define L_0	0
+#  define L_1	1
+#  define L_2	2
+#endif
+
+/*   Load/Save pixel stuffs. */
+#define ZYWRLE_YMASK15  0xFFFFFFF8
+#define ZYWRLE_UVMASK15 0xFFFFFFF8
+#define ZYWRLE_LOAD_PIXEL15(pSrc,R,G,B) { \
+	R =  (((unsigned char*)pSrc)[S_1]<< 1)& 0xF8;	\
+	G = ((((unsigned char*)pSrc)[S_1]<< 6)|(((unsigned char*)pSrc)[S_0]>> 2))& 0xF8;	\
+	B =  (((unsigned char*)pSrc)[S_0]<< 3)& 0xF8;	\
+}
+#define ZYWRLE_SAVE_PIXEL15(pDst,R,G,B) { \
+	R &= 0xF8;	\
+	G &= 0xF8;	\
+	B &= 0xF8;	\
+	((unsigned char*)pDst)[S_1] = (unsigned char)( (R>>1)|(G>>6)       );	\
+	((unsigned char*)pDst)[S_0] = (unsigned char)(((B>>3)|(G<<2))& 0xFF);	\
+}
+#define ZYWRLE_YMASK16  0xFFFFFFFC
+#define ZYWRLE_UVMASK16 0xFFFFFFF8
+#define ZYWRLE_LOAD_PIXEL16(pSrc,R,G,B) { \
+	R =   ((unsigned char*)pSrc)[S_1]     & 0xF8;	\
+	G = ((((unsigned char*)pSrc)[S_1]<< 5)|(((unsigned char*)pSrc)[S_0]>> 3))& 0xFC;	\
+	B =  (((unsigned char*)pSrc)[S_0]<< 3)& 0xF8;	\
+}
+#define ZYWRLE_SAVE_PIXEL16(pDst,R,G,B) { \
+	R &= 0xF8;	\
+	G &= 0xFC;	\
+	B &= 0xF8;	\
+	((unsigned char*)pDst)[S_1] = (unsigned char)(  R    |(G>>5)       );	\
+	((unsigned char*)pDst)[S_0] = (unsigned char)(((B>>3)|(G<<3))& 0xFF);	\
+}
+#define ZYWRLE_YMASK32  0xFFFFFFFF
+#define ZYWRLE_UVMASK32 0xFFFFFFFF
+#define ZYWRLE_LOAD_PIXEL32(pSrc,R,G,B) { \
+	R = ((unsigned char*)pSrc)[L_2];	\
+	G = ((unsigned char*)pSrc)[L_1];	\
+	B = ((unsigned char*)pSrc)[L_0];	\
+}
+#define ZYWRLE_SAVE_PIXEL32(pDst,R,G,B) { \
+	((unsigned char*)pDst)[L_2] = (unsigned char)R;	\
+	((unsigned char*)pDst)[L_1] = (unsigned char)G;	\
+	((unsigned char*)pDst)[L_0] = (unsigned char)B;	\
+}
+
+#ifndef ZYWRLE_ONCE
+#define ZYWRLE_ONCE
+
+#ifdef WIN32
+#define InlineX __inline
+#else
+#define InlineX inline
+#endif
+
+#ifdef ZYWRLE_ENCODE
+/* Tables for Coefficients filtering. */
+#  ifndef ZYWRLE_QUANTIZE
+/* Type A:lower bit omitting of EZW style. */
+const static unsigned int zywrleParam[3][3]={
+	{0x0000F000,0x00000000,0x00000000},
+	{0x0000C000,0x00F0F0F0,0x00000000},
+	{0x0000C000,0x00C0C0C0,0x00F0F0F0},
+/*	{0x0000FF00,0x00000000,0x00000000},
+	{0x0000FF00,0x00FFFFFF,0x00000000},
+	{0x0000FF00,0x00FFFFFF,0x00FFFFFF}, */
+};
+#  else
+/* Type B:Non liner quantization filter. */
+static const signed char zywrleConv[4][256]={
+{	/* bi=5, bo=5 r=0.0:PSNR=24.849 */
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+},
+{	/* bi=5, bo=5 r=2.0:PSNR=74.031 */
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 32,
+	32, 32, 32, 32, 32, 32, 32, 32,
+	32, 32, 32, 32, 32, 32, 32, 32,
+	48, 48, 48, 48, 48, 48, 48, 48,
+	48, 48, 48, 56, 56, 56, 56, 56,
+	56, 56, 56, 56, 64, 64, 64, 64,
+	64, 64, 64, 64, 72, 72, 72, 72,
+	72, 72, 72, 72, 80, 80, 80, 80,
+	80, 80, 88, 88, 88, 88, 88, 88,
+	88, 88, 88, 88, 88, 88, 96, 96,
+	96, 96, 96, 104, 104, 104, 104, 104,
+	104, 104, 104, 104, 104, 112, 112, 112,
+	112, 112, 112, 112, 112, 112, 120, 120,
+	120, 120, 120, 120, 120, 120, 120, 120,
+	0, -120, -120, -120, -120, -120, -120, -120,
+	-120, -120, -120, -112, -112, -112, -112, -112,
+	-112, -112, -112, -112, -104, -104, -104, -104,
+	-104, -104, -104, -104, -104, -104, -96, -96,
+	-96, -96, -96, -88, -88, -88, -88, -88,
+	-88, -88, -88, -88, -88, -88, -88, -80,
+	-80, -80, -80, -80, -80, -72, -72, -72,
+	-72, -72, -72, -72, -72, -64, -64, -64,
+	-64, -64, -64, -64, -64, -56, -56, -56,
+	-56, -56, -56, -56, -56, -56, -48, -48,
+	-48, -48, -48, -48, -48, -48, -48, -48,
+	-48, -32, -32, -32, -32, -32, -32, -32,
+	-32, -32, -32, -32, -32, -32, -32, -32,
+	-32, -32, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+},
+{	/* bi=5, bo=4 r=2.0:PSNR=64.441 */
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	48, 48, 48, 48, 48, 48, 48, 48,
+	48, 48, 48, 48, 48, 48, 48, 48,
+	48, 48, 48, 48, 48, 48, 48, 48,
+	64, 64, 64, 64, 64, 64, 64, 64,
+	64, 64, 64, 64, 64, 64, 64, 64,
+	80, 80, 80, 80, 80, 80, 80, 80,
+	80, 80, 80, 80, 80, 88, 88, 88,
+	88, 88, 88, 88, 88, 88, 88, 88,
+	104, 104, 104, 104, 104, 104, 104, 104,
+	104, 104, 104, 112, 112, 112, 112, 112,
+	112, 112, 112, 112, 120, 120, 120, 120,
+	120, 120, 120, 120, 120, 120, 120, 120,
+	0, -120, -120, -120, -120, -120, -120, -120,
+	-120, -120, -120, -120, -120, -112, -112, -112,
+	-112, -112, -112, -112, -112, -112, -104, -104,
+	-104, -104, -104, -104, -104, -104, -104, -104,
+	-104, -88, -88, -88, -88, -88, -88, -88,
+	-88, -88, -88, -88, -80, -80, -80, -80,
+	-80, -80, -80, -80, -80, -80, -80, -80,
+	-80, -64, -64, -64, -64, -64, -64, -64,
+	-64, -64, -64, -64, -64, -64, -64, -64,
+	-64, -48, -48, -48, -48, -48, -48, -48,
+	-48, -48, -48, -48, -48, -48, -48, -48,
+	-48, -48, -48, -48, -48, -48, -48, -48,
+	-48, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+},
+{	/* bi=5, bo=2 r=2.0:PSNR=43.175 */
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	88, 88, 88, 88, 88, 88, 88, 88,
+	88, 88, 88, 88, 88, 88, 88, 88,
+	88, 88, 88, 88, 88, 88, 88, 88,
+	88, 88, 88, 88, 88, 88, 88, 88,
+	88, 88, 88, 88, 88, 88, 88, 88,
+	88, 88, 88, 88, 88, 88, 88, 88,
+	88, 88, 88, 88, 88, 88, 88, 88,
+	88, 88, 88, 88, 88, 88, 88, 88,
+	0, -88, -88, -88, -88, -88, -88, -88,
+	-88, -88, -88, -88, -88, -88, -88, -88,
+	-88, -88, -88, -88, -88, -88, -88, -88,
+	-88, -88, -88, -88, -88, -88, -88, -88,
+	-88, -88, -88, -88, -88, -88, -88, -88,
+	-88, -88, -88, -88, -88, -88, -88, -88,
+	-88, -88, -88, -88, -88, -88, -88, -88,
+	-88, -88, -88, -88, -88, -88, -88, -88,
+	-88, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+}
+};
+const static signed char* zywrleParam[3][3][3]={
+	{{zywrleConv[0],zywrleConv[2],zywrleConv[0]},{zywrleConv[0],zywrleConv[0],zywrleConv[0]},{zywrleConv[0],zywrleConv[0],zywrleConv[0]}},
+	{{zywrleConv[0],zywrleConv[3],zywrleConv[0]},{zywrleConv[1],zywrleConv[1],zywrleConv[1]},{zywrleConv[0],zywrleConv[0],zywrleConv[0]}},
+	{{zywrleConv[0],zywrleConv[3],zywrleConv[0]},{zywrleConv[2],zywrleConv[2],zywrleConv[2]},{zywrleConv[1],zywrleConv[1],zywrleConv[1]}},
+};
+#  endif
+#endif
+
+static InlineX void Harr(signed char* pX0, signed char* pX1)
+{
+	/* Piecewise-Linear Harr(PLHarr) */
+	int X0 = (int)*pX0, X1 = (int)*pX1;
+	int orgX0 = X0, orgX1 = X1;
+	if ((X0 ^ X1) & 0x80) {
+		/* differ sign */
+		X1 += X0;
+		if (((X1^orgX1)&0x80)==0) {
+			/* |X1| > |X0| */
+			X0 -= X1;	/* H = -B */
+		}
+	} else {
+		/* same sign */
+		X0 -= X1;
+		if (((X0 ^ orgX0) & 0x80) == 0) {
+			/* |X0| > |X1| */
+			X1 += X0;	/* L = A */
+		}
+	}
+	*pX0 = (signed char)X1;
+	*pX1 = (signed char)X0;
+}
+/*
+ 1D-Wavelet transform.
+
+ In coefficients array, the famous 'pyramid' decomposition is well used.
+
+ 1D Model:
+   |L0L0L0L0|L0L0L0L0|H0H0H0H0|H0H0H0H0| : level 0
+   |L1L1L1L1|H1H1H1H1|H0H0H0H0|H0H0H0H0| : level 1
+
+ But this method needs line buffer because H/L is different position from X0/X1.
+ So, I used 'interleave' decomposition instead of it.
+
+ 1D Model:
+   |L0H0L0H0|L0H0L0H0|L0H0L0H0|L0H0L0H0| : level 0
+   |L1H0H1H0|L1H0H1H0|L1H0H1H0|L1H0H1H0| : level 1
+
+ In this method, H/L and X0/X1 is always same position.
+ This lead us to more speed and less memory.
+ Of cause, the result of both method is quite same
+ because it's only difference that coefficient position.
+*/
+static InlineX void WaveletLevel(int* data, int size, int l, int SkipPixel)
+{
+	int s, ofs;
+	signed char* pX0;
+	signed char* end;
+
+	pX0 = (signed char*)data;
+	s = (8<<l)*SkipPixel;
+	end = pX0+(size>>(l+1))*s;
+	s -= 2;
+	ofs = (4<<l)*SkipPixel;
+	while (pX0 < end) {
+		Harr(pX0, pX0+ofs);
+		pX0++;
+		Harr(pX0, pX0+ofs);
+		pX0++;
+		Harr(pX0, pX0+ofs);
+		pX0 += s;
+	}
+}
+#define InvWaveletLevel(d,s,l,pix) WaveletLevel(d,s,l,pix)
+
+#ifdef ZYWRLE_ENCODE
+#  ifndef ZYWRLE_QUANTIZE
+/* Type A:lower bit omitting of EZW style. */
+static InlineX void FilterWaveletSquare(int* pBuf, int width, int height, int level, int l)
+{
+	int r, s;
+	int x, y;
+	int* pH;
+	const unsigned int* pM;
+
+	pM = &(zywrleParam[level-1][l]);
+	s = 2<<l;
+	for (r = 1; r < 4; r++) {
+		pH   = pBuf;
+		if (r & 0x01)
+			pH +=  s>>1;
+		if (r & 0x02)
+			pH += (s>>1)*width;
+		for (y = 0; y < height / s; y++) {
+			for (x = 0; x < width / s; x++) {
+				/*
+				 these are same following code.
+				     pH[x] = pH[x] / (~pM[x]+1) * (~pM[x]+1);
+				     ( round pH[x] with pM[x] bit )
+				 '&' operator isn't 'round' but is 'floor'.
+				 So, we must offset when pH[x] is negative.
+				*/
+				if (((signed char*)pH)[0] & 0x80)
+					((signed char*)pH)[0] += ~((signed char*)pM)[0];
+				if (((signed char*)pH)[1] & 0x80)
+					((signed char*)pH)[1] += ~((signed char*)pM)[1];
+				if (((signed char*)pH)[2] & 0x80)
+					((signed char*)pH)[2] += ~((signed char*)pM)[2];
+				*pH &= *pM;
+				pH += s;
+			}
+			pH += (s-1)*width;
+		}
+	}
+}
+#  else
+/*
+ Type B:Non liner quantization filter.
+
+ Coefficients have Gaussian curve and smaller value which is
+ large part of coefficients isn't more important than larger value.
+ So, I use filter of Non liner quantize/dequantize table.
+ In general, Non liner quantize formula is explained as following.
+
+    y=f(x)   = sign(x)*round( ((abs(x)/(2^7))^ r   )* 2^(bo-1) )*2^(8-bo)
+    x=f-1(y) = sign(y)*round( ((abs(y)/(2^7))^(1/r))* 2^(bi-1) )*2^(8-bi)
+ ( r:power coefficient  bi:effective MSB in input  bo:effective MSB in output )
+
+   r < 1.0 : Smaller value is more important than larger value.
+   r > 1.0 : Larger value is more important than smaller value.
+   r = 1.0 : Liner quantization which is same with EZW style.
+
+ r = 0.75 is famous non liner quantization used in MP3 audio codec.
+ In contrast to audio data, larger value is important in wavelet coefficients.
+ So, I select r = 2.0 table( quantize is x^2, dequantize sqrt(x) ).
+
+ As compared with EZW style liner quantization, this filter tended to be
+ more sharp edge and be more compression rate but be more blocking noise and be less quality.
+ Especially, the surface of graphic objects has distinguishable noise in middle quality mode.
+
+ We need only quantized-dequantized(filtered) value rather than quantized value itself
+ because all values are packed or palette-lized in later ZRLE section.
+ This lead us not to need to modify client decoder when we change
+ the filtering procedure in future.
+ Client only decodes coefficients given by encoder.
+*/
+static InlineX void FilterWaveletSquare(int* pBuf, int width, int height, int level, int l)
+{
+	int r, s;
+	int x, y;
+	int* pH;
+	const signed char** pM;
+
+	pM = zywrleParam[level-1][l];
+	s = 2<<l;
+	for (r = 1; r < 4; r++) {
+		pH   = pBuf;
+		if (r & 0x01)
+			pH +=  s>>1;
+		if (r & 0x02)
+			pH += (s>>1)*width;
+		for (y = 0; y < height / s; y++) {
+			for (x = 0; x < width / s; x++) {
+				((signed char*)pH)[0] = pM[0][((unsigned char*)pH)[0]];
+				((signed char*)pH)[1] = pM[1][((unsigned char*)pH)[1]];
+				((signed char*)pH)[2] = pM[2][((unsigned char*)pH)[2]];
+				pH += s;
+			}
+			pH += (s-1)*width;
+		}
+	}
+}
+#  endif
+
+static InlineX void Wavelet(int* pBuf, int width, int height, int level)
+{
+	int l, s;
+	int* pTop;
+	int* pEnd;
+
+	for (l = 0; l < level; l++) {
+		pTop = pBuf;
+		pEnd = pBuf+height*width;
+		s = width<<l;
+		while (pTop < pEnd) {
+			WaveletLevel(pTop, width, l, 1);
+			pTop += s;
+		}
+		pTop = pBuf;
+		pEnd = pBuf+width;
+		s = 1<<l;
+		while (pTop < pEnd) {
+			WaveletLevel(pTop, height,l, width);
+			pTop += s;
+		}
+		FilterWaveletSquare(pBuf, width, height, level, l);
+	}
+}
+#endif
+#ifdef ZYWRLE_DECODE
+static InlineX void InvWavelet(int* pBuf, int width, int height, int level)
+{
+	int l, s;
+	int* pTop;
+	int* pEnd;
+
+	for (l = level - 1; l >= 0; l--) {
+		pTop = pBuf;
+		pEnd = pBuf+width;
+		s = 1<<l;
+		while (pTop < pEnd) {
+			InvWaveletLevel(pTop, height,l, width);
+			pTop += s;
+		}
+		pTop = pBuf;
+		pEnd = pBuf+height*width;
+		s = width<<l;
+		while (pTop < pEnd) {
+			InvWaveletLevel(pTop, width, l, 1);
+			pTop += s;
+		}
+	}
+}
+#endif
+
+/* Load/Save coefficients stuffs.
+ Coefficients manages as 24 bits little-endian pixel. */
+#define ZYWRLE_LOAD_COEFF(pSrc,R,G,B) { \
+	R = ((signed char*)pSrc)[2];	\
+	G = ((signed char*)pSrc)[1];	\
+	B = ((signed char*)pSrc)[0];	\
+}
+#define ZYWRLE_SAVE_COEFF(pDst,R,G,B) { \
+	((signed char*)pDst)[2] = (signed char)R;	\
+	((signed char*)pDst)[1] = (signed char)G;	\
+	((signed char*)pDst)[0] = (signed char)B;	\
+}
+
+/*
+ RGB <=> YUV conversion stuffs.
+ YUV coversion is explained as following formula in strict meaning:
+   Y =  0.299R + 0.587G + 0.114B (   0<=Y<=255)
+   U = -0.169R - 0.331G + 0.500B (-128<=U<=127)
+   V =  0.500R - 0.419G - 0.081B (-128<=V<=127)
+
+ I use simple conversion RCT(reversible color transform) which is described
+ in JPEG-2000 specification.
+   Y = (R + 2G + B)/4 (   0<=Y<=255)
+   U = B-G (-256<=U<=255)
+   V = R-G (-256<=V<=255)
+*/
+#define ROUND(x) (((x)<0)?0:(((x)>255)?255:(x)))
+	/* RCT is N-bit RGB to N-bit Y and N+1-bit UV.
+	 For make Same N-bit, UV is lossy.
+	 More exact PLHarr, we reduce to odd range(-127<=x<=127). */
+#define ZYWRLE_RGBYUV1(R,G,B,Y,U,V,ymask,uvmask) { \
+	Y = (R+(G<<1)+B)>>2;	\
+	U =  B-G;	\
+	V =  R-G;	\
+	Y -= 128;	\
+	U >>= 1;	\
+	V >>= 1;	\
+	Y &= ymask;	\
+	U &= uvmask;	\
+	V &= uvmask;	\
+	if (Y == -128)	\
+		Y += (0xFFFFFFFF-ymask+1);	\
+	if (U == -128)	\
+		U += (0xFFFFFFFF-uvmask+1);	\
+	if (V == -128)	\
+		V += (0xFFFFFFFF-uvmask+1);	\
+}
+#define ZYWRLE_YUVRGB1(R,G,B,Y,U,V) { \
+	Y += 128;	\
+	U <<= 1;	\
+	V <<= 1;	\
+	G = Y-((U+V)>>2);	\
+	B = U+G;	\
+	R = V+G;	\
+	G = ROUND(G);	\
+	B = ROUND(B);	\
+	R = ROUND(R);	\
+}
+
+/*
+ coefficient packing/unpacking stuffs.
+ Wavelet transform makes 4 sub coefficient image from 1 original image.
+
+ model with pyramid decomposition:
+   +------+------+
+   |      |      |
+   |  L   |  Hx  |
+   |      |      |
+   +------+------+
+   |      |      |
+   |  H   |  Hxy |
+   |      |      |
+   +------+------+
+
+ So, we must transfer each sub images individually in strict meaning.
+ But at least ZRLE meaning, following one decompositon image is same as
+ avobe individual sub image. I use this format.
+ (Strictly saying, transfer order is reverse(Hxy->Hy->Hx->L)
+  for simplified procedure for any wavelet level.)
+
+   +------+------+
+   |      L      |
+   +------+------+
+   |      Hx     |
+   +------+------+
+   |      Hy     |
+   +------+------+
+   |      Hxy    |
+   +------+------+
+*/
+#define INC_PTR(data) \
+	data++;	\
+	if( data-pData >= (w+uw) ){	\
+		data += scanline-(w+uw);	\
+		pData = data;	\
+	}
+
+#define ZYWRLE_TRANSFER_COEFF(pBuf,data,r,w,h,scanline,level,TRANS)	\
+	pH = pBuf;	\
+	s = 2<<level;	\
+	if (r & 0x01)	\
+		pH +=  s>>1;	\
+	if (r & 0x02)	\
+		pH += (s>>1)*w;	\
+	pEnd = pH+h*w;	\
+	while (pH < pEnd) {	\
+		pLine = pH+w;	\
+		while (pH < pLine) {	\
+			TRANS	\
+			INC_PTR(data)	\
+			pH += s;	\
+		}	\
+		pH += (s-1)*w;	\
+	}
+
+#define ZYWRLE_PACK_COEFF(pBuf,data,r,width,height,scanline,level)	\
+	ZYWRLE_TRANSFER_COEFF(pBuf,data,r,width,height,scanline,level,ZYWRLE_LOAD_COEFF(pH,R,G,B);ZYWRLE_SAVE_PIXEL(data,R,G,B);)
+
+#define ZYWRLE_UNPACK_COEFF(pBuf,data,r,width,height,scanline,level)	\
+	ZYWRLE_TRANSFER_COEFF(pBuf,data,r,width,height,scanline,level,ZYWRLE_LOAD_PIXEL(data,R,G,B);ZYWRLE_SAVE_COEFF(pH,R,G,B);)
+
+#define ZYWRLE_SAVE_UNALIGN(data,TRANS)	\
+	pTop = pBuf+w*h;	\
+	pEnd = pBuf + (w+uw)*(h+uh);	\
+	while (pTop < pEnd) {	\
+		TRANS	\
+		INC_PTR(data)	\
+		pTop++;	\
+	}
+
+#define ZYWRLE_LOAD_UNALIGN(data,TRANS)	\
+	pTop = pBuf+w*h;	\
+	if (uw) {	\
+		pData=         data + w;	\
+		pEnd = (int*)(pData+ h*scanline);	\
+		while (pData < (PIXEL_T*)pEnd) {	\
+			pLine = (int*)(pData + uw);	\
+			while (pData < (PIXEL_T*)pLine) {	\
+				TRANS	\
+				pData++;	\
+				pTop++;	\
+			}	\
+			pData += scanline-uw;	\
+		}	\
+	}	\
+	if (uh) {	\
+		pData=         data +  h*scanline;	\
+		pEnd = (int*)(pData+ uh*scanline);	\
+		while (pData < (PIXEL_T*)pEnd) {	\
+			pLine = (int*)(pData + w);	\
+			while (pData < (PIXEL_T*)pLine) {	\
+				TRANS	\
+				pData++;	\
+				pTop++;	\
+			}	\
+			pData += scanline-w;	\
+		}	\
+	}	\
+	if (uw && uh) {	\
+		pData=         data + w+ h*scanline;	\
+		pEnd = (int*)(pData+   uh*scanline);	\
+		while (pData < (PIXEL_T*)pEnd) {	\
+			pLine = (int*)(pData + uw);	\
+			while (pData < (PIXEL_T*)pLine) {	\
+				TRANS	\
+				pData++;	\
+				pTop++;	\
+			}	\
+			pData += scanline-uw;	\
+		}	\
+	}
+
+static InlineX void zywrleCalcSize(int* pW, int* pH, int level)
+{
+	*pW &= ~((1<<level)-1);
+	*pH &= ~((1<<level)-1);
+}
+
+#endif /* ZYWRLE_ONCE */
+
+#ifndef CPIXEL
+#ifdef ZYWRLE_ENCODE
+static InlineX void ZYWRLE_RGBYUV(int* pBuf, PIXEL_T* data, int width, int height, int scanline)
+{
+	int R, G, B;
+	int Y, U, V;
+	int* pLine;
+	int* pEnd;
+	pEnd = pBuf+height*width;
+	while (pBuf < pEnd) {
+		pLine = pBuf+width;
+		while (pBuf < pLine) {
+			ZYWRLE_LOAD_PIXEL(data,R,G,B);
+			ZYWRLE_RGBYUV1(R,G,B,Y,U,V,ZYWRLE_YMASK,ZYWRLE_UVMASK);
+			ZYWRLE_SAVE_COEFF(pBuf,V,Y,U);
+			pBuf++;
+			data++;
+		}
+		data += scanline-width;
+	}
+}
+#endif
+#ifdef ZYWRLE_DECODE
+static InlineX void ZYWRLE_YUVRGB(int* pBuf, PIXEL_T* data, int width, int height, int scanline) {
+	int R, G, B;
+	int Y, U, V;
+	int* pLine;
+	int* pEnd;
+	pEnd = pBuf+height*width;
+	while (pBuf < pEnd) {
+		pLine = pBuf+width;
+		while (pBuf < pLine) {
+			ZYWRLE_LOAD_COEFF(pBuf,V,Y,U);
+			ZYWRLE_YUVRGB1(R,G,B,Y,U,V);
+			ZYWRLE_SAVE_PIXEL(data,R,G,B);
+			pBuf++;
+			data++;
+		}
+		data += scanline-width;
+	}
+}
+#endif
+
+#ifdef ZYWRLE_ENCODE
+PIXEL_T* ZYWRLE_ANALYZE(PIXEL_T* dst, PIXEL_T* src, int w, int h, int scanline, int level, int* pBuf) {
+	int l;
+	int uw = w;
+	int uh = h;
+	int* pTop;
+	int* pEnd;
+	int* pLine;
+	PIXEL_T* pData;
+	int R, G, B;
+	int s;
+	int* pH;
+
+	zywrleCalcSize(&w, &h, level);
+	if (w == 0 || h == 0)
+		return NULL;
+	uw -= w;
+	uh -= h;
+
+	pData = dst;
+	ZYWRLE_LOAD_UNALIGN(src,*(PIXEL_T*)pTop=*pData;)
+	ZYWRLE_RGBYUV(pBuf, src, w, h, scanline);
+	Wavelet(pBuf, w, h, level);
+	for (l = 0; l < level; l++) {
+		ZYWRLE_PACK_COEFF(pBuf, dst, 3, w, h, scanline, l);
+		ZYWRLE_PACK_COEFF(pBuf, dst, 2, w, h, scanline, l);
+		ZYWRLE_PACK_COEFF(pBuf, dst, 1, w, h, scanline, l);
+		if (l == level - 1) {
+			ZYWRLE_PACK_COEFF(pBuf, dst, 0, w, h, scanline, l);
+		}
+	}
+	ZYWRLE_SAVE_UNALIGN(dst,*dst=*(PIXEL_T*)pTop;)
+	return dst;
+}
+#endif
+#ifdef ZYWRLE_DECODE
+PIXEL_T* ZYWRLE_SYNTHESIZE(PIXEL_T* dst, PIXEL_T* src, int w, int h, int scanline, int level, int* pBuf)
+{
+	int l;
+	int uw = w;
+	int uh = h;
+	int* pTop;
+	int* pEnd;
+	int* pLine;
+	PIXEL_T* pData;
+	int R, G, B;
+	int s;
+	int* pH;
+
+	zywrleCalcSize(&w, &h, level);
+	if (w == 0 || h == 0)
+		return NULL;
+	uw -= w;
+	uh -= h;
+
+	pData = src;
+	for (l = 0; l < level; l++) {
+		ZYWRLE_UNPACK_COEFF(pBuf, src, 3, w, h, scanline, l);
+		ZYWRLE_UNPACK_COEFF(pBuf, src, 2, w, h, scanline, l);
+		ZYWRLE_UNPACK_COEFF(pBuf, src, 1, w, h, scanline, l);
+		if (l == level - 1) {
+			ZYWRLE_UNPACK_COEFF(pBuf, src, 0, w, h, scanline, l);
+		}
+	}
+	ZYWRLE_SAVE_UNALIGN(src,*(PIXEL_T*)pTop=*src;)
+	InvWavelet(pBuf, w, h, level);
+	ZYWRLE_YUVRGB(pBuf, dst, w, h, scanline);
+	ZYWRLE_LOAD_UNALIGN(dst,*pData=*(PIXEL_T*)pTop;)
+	return src;
+}
+#endif
+#endif  /* CPIXEL */
+
+#undef ZYWRLE_RGBYUV
+#undef ZYWRLE_YUVRGB
+#undef ZYWRLE_LOAD_PIXEL
+#undef ZYWRLE_SAVE_PIXEL
diff -Nru LibVNCServer-0.9.1/rfb/rfbclient.h x11vnc-0.9.5/rfb/rfbclient.h
--- LibVNCServer-0.9.1/rfb/rfbclient.h	2007-04-06 11:04:15.000000000 +0200
+++ x11vnc-0.9.5/rfb/rfbclient.h	2008-05-08 02:53:26.000000000 +0200
@@ -177,7 +177,6 @@
 
 
 #ifdef LIBVNCSERVER_HAVE_LIBZ
-#ifdef LIBVNCSERVER_HAVE_LIBJPEG
 	/*
 	 * Variables for the ``tight'' encoding implementation.
 	 */
@@ -196,6 +195,7 @@
 	char tightPalette[256*4];
 	uint8_t tightPrevRow[2048*3*sizeof(uint16_t)];
 
+#ifdef LIBVNCSERVER_HAVE_LIBJPEG
 	/* JPEG decoder state. */
 	rfbBool jpegError;
 
diff -Nru LibVNCServer-0.9.1/rfb/rfbconfig.h x11vnc-0.9.5/rfb/rfbconfig.h
--- LibVNCServer-0.9.1/rfb/rfbconfig.h	2007-05-27 17:16:21.000000000 +0200
+++ x11vnc-0.9.5/rfb/rfbconfig.h	2008-10-20 01:45:33.000000000 +0200
@@ -28,15 +28,15 @@
 /* #undef LIBVNCSERVER_HAVE_CRYPT */
 
 /* Define to 1 if you have the <dlfcn.h> header file. */
-#ifndef LIBVNCSERVER_HAVE_DLFCN_H 
-#define LIBVNCSERVER_HAVE_DLFCN_H  1 
-#endif
+/* #undef LIBVNCSERVER_HAVE_DLFCN_H */
 
 /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
 /* #undef LIBVNCSERVER_HAVE_DOPRNT */
 
 /* DPMS extension build environment present */
-/* #undef LIBVNCSERVER_HAVE_DPMS */
+#ifndef LIBVNCSERVER_HAVE_DPMS 
+#define LIBVNCSERVER_HAVE_DPMS  1 
+#endif
 
 /* FBPM extension build environment present */
 /* #undef LIBVNCSERVER_HAVE_FBPM */
@@ -57,7 +57,9 @@
 #endif
 
 /* Define to 1 if you have the `geteuid' function. */
-/* #undef LIBVNCSERVER_HAVE_GETEUID */
+#ifndef LIBVNCSERVER_HAVE_GETEUID 
+#define LIBVNCSERVER_HAVE_GETEUID  1 
+#endif
 
 /* Define to 1 if you have the `gethostbyname' function. */
 #ifndef LIBVNCSERVER_HAVE_GETHOSTBYNAME 
@@ -70,13 +72,19 @@
 #endif
 
 /* Define to 1 if you have the `getpwnam' function. */
-/* #undef LIBVNCSERVER_HAVE_GETPWNAM */
+#ifndef LIBVNCSERVER_HAVE_GETPWNAM 
+#define LIBVNCSERVER_HAVE_GETPWNAM  1 
+#endif
 
 /* Define to 1 if you have the `getpwuid' function. */
-/* #undef LIBVNCSERVER_HAVE_GETPWUID */
+#ifndef LIBVNCSERVER_HAVE_GETPWUID 
+#define LIBVNCSERVER_HAVE_GETPWUID  1 
+#endif
 
 /* Define to 1 if you have the `getspnam' function. */
-/* #undef LIBVNCSERVER_HAVE_GETSPNAM */
+#ifndef LIBVNCSERVER_HAVE_GETSPNAM 
+#define LIBVNCSERVER_HAVE_GETSPNAM  1 
+#endif
 
 /* Define to 1 if you have the `gettimeofday' function. */
 #ifndef LIBVNCSERVER_HAVE_GETTIMEOFDAY 
@@ -84,10 +92,14 @@
 #endif
 
 /* Define to 1 if you have the `getuid' function. */
-/* #undef LIBVNCSERVER_HAVE_GETUID */
+#ifndef LIBVNCSERVER_HAVE_GETUID 
+#define LIBVNCSERVER_HAVE_GETUID  1 
+#endif
 
 /* Define to 1 if you have the `grantpt' function. */
-/* #undef LIBVNCSERVER_HAVE_GRANTPT */
+#ifndef LIBVNCSERVER_HAVE_GRANTPT 
+#define LIBVNCSERVER_HAVE_GRANTPT  1 
+#endif
 
 /* Define to 1 if you have the `inet_ntoa' function. */
 #ifndef LIBVNCSERVER_HAVE_INET_NTOA 
@@ -95,7 +107,9 @@
 #endif
 
 /* Define to 1 if you have the `initgroups' function. */
-/* #undef LIBVNCSERVER_HAVE_INITGROUPS */
+#ifndef LIBVNCSERVER_HAVE_INITGROUPS 
+#define LIBVNCSERVER_HAVE_INITGROUPS  1 
+#endif
 
 /* Define to 1 if you have the <inttypes.h> header file. */
 #ifndef LIBVNCSERVER_HAVE_INTTYPES_H 
@@ -106,10 +120,14 @@
 /* #undef LIBVNCSERVER_HAVE_IRIX_XREADDISPLAY */
 
 /* libcrypt library present */
-/* #undef LIBVNCSERVER_HAVE_LIBCRYPT */
+#ifndef LIBVNCSERVER_HAVE_LIBCRYPT 
+#define LIBVNCSERVER_HAVE_LIBCRYPT  1 
+#endif
 
 /* openssl libcrypto library present */
-/* #undef LIBVNCSERVER_HAVE_LIBCRYPTO */
+#ifndef LIBVNCSERVER_HAVE_LIBCRYPTO 
+#define LIBVNCSERVER_HAVE_LIBCRYPTO  1 
+#endif
 
 /* Define to 1 if you have the `cygipc' library (-lcygipc). */
 /* #undef LIBVNCSERVER_HAVE_LIBCYGIPC */
@@ -133,7 +151,9 @@
 /* #undef LIBVNCSERVER_HAVE_LIBSOCKET */
 
 /* openssl libssl library present */
-/* #undef LIBVNCSERVER_HAVE_LIBSSL */
+#ifndef LIBVNCSERVER_HAVE_LIBSSL 
+#define LIBVNCSERVER_HAVE_LIBSSL  1 
+#endif
 
 /* XDAMAGE extension build environment present */
 /* #undef LIBVNCSERVER_HAVE_LIBXDAMAGE */
@@ -142,10 +162,14 @@
 /* #undef LIBVNCSERVER_HAVE_LIBXFIXES */
 
 /* XINERAMA extension build environment present */
-/* #undef LIBVNCSERVER_HAVE_LIBXINERAMA */
+#ifndef LIBVNCSERVER_HAVE_LIBXINERAMA 
+#define LIBVNCSERVER_HAVE_LIBXINERAMA  1 
+#endif
 
 /* XRANDR extension build environment present */
-/* #undef LIBVNCSERVER_HAVE_LIBXRANDR */
+#ifndef LIBVNCSERVER_HAVE_LIBXRANDR 
+#define LIBVNCSERVER_HAVE_LIBXRANDR  1 
+#endif
 
 /* DEC-XTRAP extension build environment present */
 /* #undef LIBVNCSERVER_HAVE_LIBXTRAP */
@@ -156,19 +180,29 @@
 #endif
 
 /* linux fb device build environment present */
-/* #undef LIBVNCSERVER_HAVE_LINUX_FB_H */
+#ifndef LIBVNCSERVER_HAVE_LINUX_FB_H 
+#define LIBVNCSERVER_HAVE_LINUX_FB_H  1 
+#endif
 
 /* linux/input.h present */
-/* #undef LIBVNCSERVER_HAVE_LINUX_INPUT_H */
+#ifndef LIBVNCSERVER_HAVE_LINUX_INPUT_H 
+#define LIBVNCSERVER_HAVE_LINUX_INPUT_H  1 
+#endif
 
 /* linux uinput device build environment present */
-/* #undef LIBVNCSERVER_HAVE_LINUX_UINPUT_H */
+#ifndef LIBVNCSERVER_HAVE_LINUX_UINPUT_H 
+#define LIBVNCSERVER_HAVE_LINUX_UINPUT_H  1 
+#endif
 
 /* video4linux build environment present */
-/* #undef LIBVNCSERVER_HAVE_LINUX_VIDEODEV_H */
+#ifndef LIBVNCSERVER_HAVE_LINUX_VIDEODEV_H 
+#define LIBVNCSERVER_HAVE_LINUX_VIDEODEV_H  1 
+#endif
 
 /* build MacOS X native display support */
-/* #undef LIBVNCSERVER_HAVE_MACOSX_NATIVE_DISPLAY */
+#ifndef LIBVNCSERVER_HAVE_MACOSX_NATIVE_DISPLAY 
+#define LIBVNCSERVER_HAVE_MACOSX_NATIVE_DISPLAY  1 
+#endif
 
 /* Define to 1 if you have the `memmove' function. */
 #ifndef LIBVNCSERVER_HAVE_MEMMOVE 
@@ -206,10 +240,14 @@
 #endif
 
 /* Define to 1 if you have the <pwd.h> header file. */
-/* #undef LIBVNCSERVER_HAVE_PWD_H */
+#ifndef LIBVNCSERVER_HAVE_PWD_H 
+#define LIBVNCSERVER_HAVE_PWD_H  1 
+#endif
 
 /* RECORD extension build environment present */
-/* #undef LIBVNCSERVER_HAVE_RECORD */
+#ifndef LIBVNCSERVER_HAVE_RECORD 
+#define LIBVNCSERVER_HAVE_RECORD  1 
+#endif
 
 /* Define to 1 if you have the `select' function. */
 #ifndef LIBVNCSERVER_HAVE_SELECT 
@@ -217,25 +255,39 @@
 #endif
 
 /* Define to 1 if you have the `setegid' function. */
-/* #undef LIBVNCSERVER_HAVE_SETEGID */
+#ifndef LIBVNCSERVER_HAVE_SETEGID 
+#define LIBVNCSERVER_HAVE_SETEGID  1 
+#endif
 
 /* Define to 1 if you have the `seteuid' function. */
-/* #undef LIBVNCSERVER_HAVE_SETEUID */
+#ifndef LIBVNCSERVER_HAVE_SETEUID 
+#define LIBVNCSERVER_HAVE_SETEUID  1 
+#endif
 
 /* Define to 1 if you have the `setgid' function. */
-/* #undef LIBVNCSERVER_HAVE_SETGID */
+#ifndef LIBVNCSERVER_HAVE_SETGID 
+#define LIBVNCSERVER_HAVE_SETGID  1 
+#endif
 
 /* Define to 1 if you have the `setpgrp' function. */
-/* #undef LIBVNCSERVER_HAVE_SETPGRP */
+#ifndef LIBVNCSERVER_HAVE_SETPGRP 
+#define LIBVNCSERVER_HAVE_SETPGRP  1 
+#endif
 
 /* Define to 1 if you have the `setsid' function. */
-/* #undef LIBVNCSERVER_HAVE_SETSID */
+#ifndef LIBVNCSERVER_HAVE_SETSID 
+#define LIBVNCSERVER_HAVE_SETSID  1 
+#endif
 
 /* Define to 1 if you have the `setuid' function. */
-/* #undef LIBVNCSERVER_HAVE_SETUID */
+#ifndef LIBVNCSERVER_HAVE_SETUID 
+#define LIBVNCSERVER_HAVE_SETUID  1 
+#endif
 
 /* Define to 1 if you have the `setutxent' function. */
-/* #undef LIBVNCSERVER_HAVE_SETUTXENT */
+#ifndef LIBVNCSERVER_HAVE_SETUTXENT 
+#define LIBVNCSERVER_HAVE_SETUTXENT  1 
+#endif
 
 /* Define to 1 if you have the `socket' function. */
 #ifndef LIBVNCSERVER_HAVE_SOCKET 
@@ -308,7 +360,9 @@
 /* #undef LIBVNCSERVER_HAVE_SYSTEM_LIBVNCSERVER */
 
 /* Define to 1 if you have the <sys/ioctl.h> header file. */
-/* #undef LIBVNCSERVER_HAVE_SYS_IOCTL_H */
+#ifndef LIBVNCSERVER_HAVE_SYS_IOCTL_H 
+#define LIBVNCSERVER_HAVE_SYS_IOCTL_H  1 
+#endif
 
 /* Define to 1 if you have the <sys/socket.h> header file. */
 #ifndef LIBVNCSERVER_HAVE_SYS_SOCKET_H 
@@ -321,7 +375,9 @@
 #endif
 
 /* Define to 1 if you have the <sys/stropts.h> header file. */
-/* #undef LIBVNCSERVER_HAVE_SYS_STROPTS_H */
+#ifndef LIBVNCSERVER_HAVE_SYS_STROPTS_H 
+#define LIBVNCSERVER_HAVE_SYS_STROPTS_H  1 
+#endif
 
 /* Define to 1 if you have the <sys/timeb.h> header file. */
 #ifndef LIBVNCSERVER_HAVE_SYS_TIMEB_H 
@@ -344,7 +400,9 @@
 #endif
 
 /* Define to 1 if you have the <termios.h> header file. */
-/* #undef LIBVNCSERVER_HAVE_TERMIOS_H */
+#ifndef LIBVNCSERVER_HAVE_TERMIOS_H 
+#define LIBVNCSERVER_HAVE_TERMIOS_H  1 
+#endif
 
 /* Define to 1 if you have the <unistd.h> header file. */
 #ifndef LIBVNCSERVER_HAVE_UNISTD_H 
@@ -352,7 +410,9 @@
 #endif
 
 /* Define to 1 if you have the <utmpx.h> header file. */
-/* #undef LIBVNCSERVER_HAVE_UTMPX_H */
+#ifndef LIBVNCSERVER_HAVE_UTMPX_H 
+#define LIBVNCSERVER_HAVE_UTMPX_H  1 
+#endif
 
 /* Define to 1 if you have the `vfork' function. */
 #ifndef LIBVNCSERVER_HAVE_VFORK 
@@ -368,7 +428,9 @@
 #endif
 
 /* Define to 1 if you have the `waitpid' function. */
-/* #undef LIBVNCSERVER_HAVE_WAITPID */
+#ifndef LIBVNCSERVER_HAVE_WAITPID 
+#define LIBVNCSERVER_HAVE_WAITPID  1 
+#endif
 
 /* Define to 1 if `fork' works. */
 #ifndef LIBVNCSERVER_HAVE_WORKING_FORK 
@@ -385,17 +447,30 @@
 #define LIBVNCSERVER_HAVE_X11  1 
 #endif
 
+/* open ssl X509_print_ex_fp available */
+#ifndef LIBVNCSERVER_HAVE_X509_PRINT_EX_FP 
+#define LIBVNCSERVER_HAVE_X509_PRINT_EX_FP  1 
+#endif
+
 /* XKEYBOARD extension build environment present */
-/* #undef LIBVNCSERVER_HAVE_XKEYBOARD */
+#ifndef LIBVNCSERVER_HAVE_XKEYBOARD 
+#define LIBVNCSERVER_HAVE_XKEYBOARD  1 
+#endif
 
 /* MIT-SHM extension build environment present */
-/* #undef LIBVNCSERVER_HAVE_XSHM */
+#ifndef LIBVNCSERVER_HAVE_XSHM 
+#define LIBVNCSERVER_HAVE_XSHM  1 
+#endif
 
 /* XTEST extension build environment present */
-/* #undef LIBVNCSERVER_HAVE_XTEST */
+#ifndef LIBVNCSERVER_HAVE_XTEST 
+#define LIBVNCSERVER_HAVE_XTEST  1 
+#endif
 
 /* XTEST extension has XTestGrabControl */
-/* #undef LIBVNCSERVER_HAVE_XTESTGRABCONTROL */
+#ifndef LIBVNCSERVER_HAVE_XTESTGRABCONTROL 
+#define LIBVNCSERVER_HAVE_XTESTGRABCONTROL  1 
+#endif
 
 /* Define to 1 if `lstat' dereferences a symlink specified with a trailing
    slash. */
@@ -408,7 +483,7 @@
 
 /* Name of package */
 #ifndef LIBVNCSERVER_PACKAGE 
-#define LIBVNCSERVER_PACKAGE  "LibVNCServer" 
+#define LIBVNCSERVER_PACKAGE  "x11vnc" 
 #endif
 
 /* Define to the address where bug reports for this package should be sent. */
@@ -418,22 +493,22 @@
 
 /* Define to the full name of this package. */
 #ifndef LIBVNCSERVER_PACKAGE_NAME 
-#define LIBVNCSERVER_PACKAGE_NAME  "LibVNCServer" 
+#define LIBVNCSERVER_PACKAGE_NAME  "x11vnc" 
 #endif
 
 /* Define to the full name and version of this package. */
 #ifndef LIBVNCSERVER_PACKAGE_STRING 
-#define LIBVNCSERVER_PACKAGE_STRING  "LibVNCServer 0.9.1" 
+#define LIBVNCSERVER_PACKAGE_STRING  "x11vnc 0.9.5" 
 #endif
 
 /* Define to the one symbol short name of this package. */
 #ifndef LIBVNCSERVER_PACKAGE_TARNAME 
-#define LIBVNCSERVER_PACKAGE_TARNAME  "libvncserver" 
+#define LIBVNCSERVER_PACKAGE_TARNAME  "x11vnc" 
 #endif
 
 /* Define to the version of this package. */
 #ifndef LIBVNCSERVER_PACKAGE_VERSION 
-#define LIBVNCSERVER_PACKAGE_VERSION  "0.9.1" 
+#define LIBVNCSERVER_PACKAGE_VERSION  "0.9.5" 
 #endif
 
 /* The number of bytes in type char */
@@ -463,7 +538,7 @@
 
 /* Version number of package */
 #ifndef LIBVNCSERVER_VERSION 
-#define LIBVNCSERVER_VERSION  "0.9.1" 
+#define LIBVNCSERVER_VERSION  "0.9.5" 
 #endif
 
 /* Disable TightVNCFileTransfer protocol */
diff -Nru LibVNCServer-0.9.1/rfb/rfb.h x11vnc-0.9.5/rfb/rfb.h
--- LibVNCServer-0.9.1/rfb/rfb.h	2007-04-06 10:58:30.000000000 +0200
+++ x11vnc-0.9.5/rfb/rfb.h	2008-01-31 12:52:28.000000000 +0100
@@ -525,6 +525,8 @@
     struct z_stream_s compStream;
     rfbBool compStreamInited;
     uint32_t zlibCompressLevel;
+    /* the quality level is also used by ZYWRLE */
+    int tightQualityLevel;
 
 #ifdef LIBVNCSERVER_HAVE_LIBJPEG
     /* tight encoding -- preserve zlib streams' state for each client */
@@ -532,7 +534,6 @@
     rfbBool zsActive[4];
     int zsLevel[4];
     int tightCompressLevel;
-    int tightQualityLevel;
 #endif
 #endif
 
@@ -579,6 +580,8 @@
 
 #ifdef LIBVNCSERVER_HAVE_LIBZ
     void* zrleData;
+    int zywrleLevel;
+    int zywrleBuf[rfbZRLETileWidth * rfbZRLETileHeight];
 #endif
 
     /* if progressive updating is on, this variable holds the current
diff -Nru LibVNCServer-0.9.1/rfb/rfbproto.h x11vnc-0.9.5/rfb/rfbproto.h
--- LibVNCServer-0.9.1/rfb/rfbproto.h	2006-12-16 16:06:31.000000000 +0100
+++ x11vnc-0.9.5/rfb/rfbproto.h	2008-01-29 12:50:17.000000000 +0100
@@ -403,6 +403,7 @@
 #define rfbEncodingZlibHex 8
 #define rfbEncodingUltra 9
 #define rfbEncodingZRLE 16
+#define rfbEncodingZYWRLE 17
 
 /* Cache & XOR-Zlib - rdv@2002 */
 #define rfbEncodingCache                 0xFFFF0000