]> source.dussan.org Git - tigervnc.git/commitdiff
A quick optimisation of the common 32-bit to 24-bit pixel conversion.
authorPierre Ossman <ossman@cendio.se>
Wed, 25 Mar 2009 12:26:41 +0000 (12:26 +0000)
committerPierre Ossman <ossman@cendio.se>
Wed, 25 Mar 2009 12:26:41 +0000 (12:26 +0000)
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@3719 3789f03b-4d11-0410-bbf8-ca57d06f2519

common/rfb/PixelFormat.cxx

index fa7064fe90e79f2b5205208c409fd2b6ca586942..4221e448861b284f7c34d20840b3da5627809443 100644 (file)
@@ -209,17 +209,36 @@ void PixelFormat::rgbFromBuffer(rdr::U16* dst, const rdr::U8* src, int pixels, C
 
 void PixelFormat::rgbFromBuffer(rdr::U8* dst, const rdr::U8* src, int pixels, ColourMap* cm) const
 {
-  Pixel p;
-  rdr::U8 r, g, b;
-
-  while (pixels--) {
-    p = pixelFromBuffer(src);
-    src += bpp/8;
-
-    rgbFromPixel(p, cm, &r, &g, &b);
-    *(dst++) = r;
-    *(dst++) = g;
-    *(dst++) = b;
+  if (is888()) {
+    // Optimised common case
+    const rdr::U8 *r, *g, *b;
+
+    r = src + redShift/8;
+    g = src + greenShift/8;
+    b = src + blueShift/8;
+
+    while (pixels--) {
+      *(dst++) = *r;
+      *(dst++) = *g;
+      *(dst++) = *b;
+      r += 4;
+      g += 4;
+      b += 4;
+    }
+  } else {
+    // Generic code
+    Pixel p;
+    rdr::U8 r, g, b;
+
+    while (pixels--) {
+      p = pixelFromBuffer(src);
+      src += bpp/8;
+
+      rgbFromPixel(p, cm, &r, &g, &b);
+      *(dst++) = r;
+      *(dst++) = g;
+      *(dst++) = b;
+    }
   }
 }