Add fast paths for RGB to 16-bit and 8-bit true	color conversion


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4764 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/common/rfb/PixelFormat.cxx b/common/rfb/PixelFormat.cxx
index f707322..a2e9496 100644
--- a/common/rfb/PixelFormat.cxx
+++ b/common/rfb/PixelFormat.cxx
@@ -224,6 +224,24 @@
   }
 }
 
+#define trueColorBufferFromRGB(BPP) {  \
+  rdr::U8 r, g, b;  \
+  int dstPad = pitch - w * BPP / 8;  \
+  while (h > 0) {  \
+    rdr::U8 *dstEndOfRow = (rdr::U8 *)dst + w * BPP / 8;  \
+    while (dst < dstEndOfRow) {  \
+      r = *(src++);  \
+      g = *(src++);  \
+      b = *(src++);  \
+      *(rdr::U##BPP *)dst = (((r * redMax + 127) / 255) << redShift)  \
+                          | (((g * greenMax + 127) / 255) << greenShift)  \
+                          | (((b * blueMax + 127) / 255) << blueShift);  \
+      dst += BPP / 8;  \
+    }  \
+    dst += dstPad;  \
+    h--;  \
+  }  \
+}
 
 void PixelFormat::bufferFromRGB(rdr::U8 *dst, const rdr::U8* src,
                                 int w, int pitch, int h, ColourMap* cm) const
@@ -254,6 +272,10 @@
       dst += dstPad;
       h--;
     }
+  } else if (!cm && bpp == 16) {
+    trueColorBufferFromRGB(16);
+  } else if (!cm && bpp == 8) {
+    trueColorBufferFromRGB(8);
   } else {
     // Generic code
     Pixel p;