Optimise the common pixel format conversion RGB24 to RGB32.


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@3730 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/common/rfb/PixelFormat.cxx b/common/rfb/PixelFormat.cxx
index e8cb1a2..b00bc82 100644
--- a/common/rfb/PixelFormat.cxx
+++ b/common/rfb/PixelFormat.cxx
@@ -180,6 +180,44 @@
 }
 
 
+void PixelFormat::bufferFromRGB(rdr::U8 *dst, const rdr::U8* src,
+                                int pixels, ColourMap* cm) const
+{
+  if (is888()) {
+    // Optimised common case
+    rdr::U8 *r, *g, *b;
+
+    r = dst + redShift/8;
+    g = dst + greenShift/8;
+    b = dst + blueShift/8;
+
+    while (pixels--) {
+      *r = *(src++);
+      *g = *(src++);
+      *b = *(src++);
+      r += 4;
+      g += 4;
+      b += 4;
+    }
+  } else {
+    // Generic code
+    Pixel p;
+    rdr::U8 r, g, b;
+
+    while (pixels--) {
+      r = *(src++);
+      g = *(src++);
+      b = *(src++);
+
+      p = pixelFromRGB(r, g, b, cm);
+
+      bufferFromPixel(dst, p);
+      dst += bpp/8;
+    }
+  }
+}
+
+
 void PixelFormat::rgbFromPixel(Pixel p, ColourMap* cm, Colour* rgb) const
 {
   rdr::U16 r, g, b;