]> source.dussan.org Git - tigervnc.git/commitdiff
Optimise the common pixel format conversion RGB24 to RGB32.
authorPierre Ossman <ossman@cendio.se>
Tue, 31 Mar 2009 14:06:53 +0000 (14:06 +0000)
committerPierre Ossman <ossman@cendio.se>
Tue, 31 Mar 2009 14:06:53 +0000 (14:06 +0000)
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@3730 3789f03b-4d11-0410-bbf8-ca57d06f2519

common/rfb/PixelFormat.cxx
common/rfb/PixelFormat.h
common/rfb/PixelFormat.inl
common/rfb/tightDecode.h

index e8cb1a2128a5d3df8340e0333e0e12e90b62031b..b00bc8235a6ff7972497334b84bc040bd1f73a70 100644 (file)
@@ -180,6 +180,44 @@ Pixel PixelFormat::pixelFromRGB(rdr::U8 red, rdr::U8 green, rdr::U8 blue,
 }
 
 
+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;
index 7daa6e7d49f14e827589bb9435c94a5f44416932..8adbf911052b179542666c822a34352c52c6f0ee 100644 (file)
@@ -46,10 +46,13 @@ namespace rfb {
     bool isLittleEndian(void) const;
 
     inline Pixel pixelFromBuffer(const rdr::U8* buffer) const;
+    inline void bufferFromPixel(rdr::U8* buffer, Pixel pixel) const;
 
     Pixel pixelFromRGB(rdr::U16 red, rdr::U16 green, rdr::U16 blue, ColourMap* cm=0) const;
     Pixel pixelFromRGB(rdr::U8 red, rdr::U8 green, rdr::U8 blue, ColourMap* cm=0) const;
 
+    void bufferFromRGB(rdr::U8 *dst, const rdr::U8* src, int pixels, ColourMap* cm=0) const;
+
     void rgbFromPixel(Pixel pix, ColourMap* cm, Colour* rgb) const;
     inline void rgbFromPixel(Pixel pix, ColourMap* cm, rdr::U16 *r, rdr::U16 *g, rdr::U16 *b) const;
     inline void rgbFromPixel(Pixel pix, ColourMap* cm, rdr::U8 *r, rdr::U8 *g, rdr::U8 *b) const;
index d5edfa5501490c8ae2f2715a0977b8c0feafd9a7..90d8e6da9de7b25112c696cd369e7435f7e7ee85 100644 (file)
@@ -50,6 +50,31 @@ inline Pixel PixelFormat::pixelFromBuffer(const rdr::U8* buffer) const
 }
 
 
+inline void PixelFormat::bufferFromPixel(rdr::U8* buffer, Pixel p) const
+{
+  if (bigEndian) {
+    switch (bpp) {
+    case 32:
+      *(buffer++) = (p >> 24) & 0xff;
+      *(buffer++) = (p >> 16) & 0xff;
+    case 16:
+      *(buffer++) = (p >>  8) & 0xff;
+    case 8:
+      *(buffer++) = (p >>  0) & 0xff;
+    }
+  } else {
+    buffer[0] = (p >>  0) & 0xff;
+    if (bpp >= 16) {
+      buffer[1] = (p >>  8) & 0xff;
+      if (bpp == 32) {
+        buffer[2] = (p >> 16) & 0xff;
+        buffer[3] = (p >> 24) & 0xff;
+      }
+    }
+  }
+}
+
+
 inline void PixelFormat::rgbFromPixel(Pixel p, ColourMap* cm, rdr::U16 *r, rdr::U16 *g, rdr::U16 *b) const
 {
   if (trueColour) {
index 9cf234d0e2cb7cb60bb4f27c2233af456df7954c..9679dd781f39747bdbafb23cda7f995f2b0977a2 100644 (file)
@@ -267,10 +267,8 @@ DecompressJpegRect(const Rect& r, rdr::InStream* is,
       break;
     }
 
-    for (int dx = 0; dx < r.width(); dx++) {
-      *pixelPtr++ = 
-       myFormat.pixelFromRGB(scanline[dx*3], scanline[dx*3+1], scanline[dx*3+2]);
-    }
+    myFormat.bufferFromRGB((rdr::U8*)pixelPtr, (const rdr::U8*)scanline, r.width());
+    pixelPtr += r.width();
   }
 
   IMAGE_RECT(r, buf);