Support the RENDER extension.


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@185 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/xc/programs/Xserver/vnc/Xvnc/xvnc.cc b/xc/programs/Xserver/vnc/Xvnc/xvnc.cc
index 2d2dc78..f2da525 100644
--- a/xc/programs/Xserver/vnc/Xvnc/xvnc.cc
+++ b/xc/programs/Xserver/vnc/Xvnc/xvnc.cc
@@ -134,6 +134,7 @@
 static Bool vfbPixmapDepths[33];
 static char needswap = 0;
 static int lastScreen = -1;
+static Bool Render = TRUE;
 
 static bool displaySpecified = false;
 static bool wellKnownSocketsCreated = false;
@@ -218,6 +219,10 @@
            VENDOR_STRING);
     ErrorF("-screen scrn WxHxD     set screen's width, height, depth\n");
     ErrorF("-pixdepths list-of-int support given pixmap depths\n");
+#ifdef RENDER
+    ErrorF("+/-render		   turn on/off RENDER extension support"
+	   "(default on)\n");
+#endif
     ErrorF("-linebias n            adjust thin line pixelization\n");
     ErrorF("-blackpixel n          pixel value for black\n");
     ErrorF("-whitepixel n          pixel value for white\n");
@@ -314,6 +319,18 @@
     return ret;
   }
 
+  if (strcmp (argv[i], "+render") == 0)	/* +render */
+  {
+    Render = TRUE;
+    return 1;
+  }
+  
+  if (strcmp (argv[i], "-render") == 0)	/* -render */
+  {
+    Render = FALSE;
+    return 1;
+  }
+
   if (strcmp (argv[i], "-blackpixel") == 0)	/* -blackpixel n */
   {
     Pixel pix;
@@ -749,9 +766,15 @@
   defaultColorVisualClass
     = (pvfb->bitsPerPixel > 8) ? TrueColor : PseudoColor;
 
-  if (!fbScreenInit(pScreen, pbits, pvfb->width, pvfb->height,
-                    dpi, dpi, pvfb->paddedWidth, pvfb->bitsPerPixel))
-      return FALSE;
+  ret = fbScreenInit(pScreen, pbits, pvfb->width, pvfb->height,
+		     dpi, dpi, pvfb->paddedWidth, pvfb->bitsPerPixel);
+  
+#ifdef RENDER
+  if (ret && Render) 
+      fbPictureInit(pScreen, 0, 0); 
+#endif
+
+  if (!ret) return FALSE;
 
   pScreen->InstallColormap = vfbInstallColormap;
   pScreen->UninstallColormap = vfbUninstallColormap;
@@ -828,6 +851,17 @@
     vfbPixmapDepths[vfbScreens[i].depth] = TRUE;
   }
 
+  /* RENDER needs a good set of pixmaps. */
+  if (Render) {
+      vfbPixmapDepths[1] = TRUE;
+      vfbPixmapDepths[4] = TRUE;
+      vfbPixmapDepths[8] = TRUE;
+/*    vfbPixmapDepths[15] = TRUE; */
+      vfbPixmapDepths[16] = TRUE;
+      vfbPixmapDepths[24] = TRUE;
+      vfbPixmapDepths[32] = TRUE;
+  }
+
   for (i = 1; i <= 32; i++)
   {
     if (vfbPixmapDepths[i])