Since fillRect() operates directly on the framebuffer, optimize it and remove the separate version in TightDecoder.


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4762 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/common/rfb/PixelBuffer.cxx b/common/rfb/PixelBuffer.cxx
index a48e735..106b42b 100644
--- a/common/rfb/PixelBuffer.cxx
+++ b/common/rfb/PixelBuffer.cxx
@@ -78,10 +78,74 @@
 */
 
 
+static void fillRect8(U8 *buf, int stride, const Rect& r, Pixel pix)
+{
+  U8* ptr = buf;
+  int w = r.width(), h = r.height();
+
+  while (h > 0) {
+    memset(ptr, pix, w);
+    ptr += stride;
+    h--;
+  }
+}
+
+static void fillRect16(U8 *buf, int stride, const Rect& r, Pixel pix)
+{
+  U16* ptr = (U16 *)buf;
+  int w = r.width(), h = r.height(), wBytes = w * 2;
+
+  while (w > 0) {
+    *ptr++ = pix;  w--;
+  }
+  h--;
+
+  ptr = (U16 *)buf;
+
+  while (h > 0) {
+    U16 *oldptr = ptr;
+    memcpy(ptr += stride, oldptr, wBytes);
+    h--;
+  }
+}
+
+static void fillRect32(U8 *buf, int stride, const Rect& r, Pixel pix)
+{
+  U32* ptr = (U32 *)buf;
+  int w = r.width(), h = r.height(), wBytes = w * 4;
+
+  while (w > 0) {
+    *ptr++ = pix;  w--;
+  }
+  h--;
+
+  ptr = (U32 *)buf;
+
+  while (h > 0) {
+    U32 *oldptr = ptr;
+    memcpy(ptr += stride, oldptr, wBytes);
+    h--;
+  }
+}
+
+
 FullFramePixelBuffer::FullFramePixelBuffer(const PixelFormat& pf, int w, int h,
                                            rdr::U8* data_, ColourMap* cm)
   : PixelBuffer(pf, w, h, cm), data(data_)
 {
+  switch(pf.bpp) {
+  case 8:
+    fillRectFn = fillRect8;
+    break;
+  case 16:
+    fillRectFn = fillRect16;
+    break;
+  case 32:
+    fillRectFn = fillRect32;
+    break;
+  default:
+    throw Exception("rfb::FullFramePixelBuffer - Unsupported pixel format");
+  }
 }
 
 FullFramePixelBuffer::FullFramePixelBuffer() : data(0) {}
@@ -100,36 +164,8 @@
 
 void FullFramePixelBuffer::fillRect(const Rect& r, Pixel pix) {
   int stride;
-  U8* data = getPixelsRW(r, &stride);
-  int bytesPerPixel = getPF().bpp/8;
-  int bytesPerRow = bytesPerPixel * stride;
-  int bytesPerFill = bytesPerPixel * r.width();
-
-  U8* end = data + (bytesPerRow * r.height());
-  while (data < end) {
-    switch (bytesPerPixel) {
-    case 1:
-      memset(data, pix, bytesPerFill);
-      break;
-    case 2:
-      {
-        U16* optr = (U16*)data;
-        U16* eol = optr + r.width();
-        while (optr < eol)
-          *optr++ = pix;
-      }
-      break;
-    case 4:
-      {
-        U32* optr = (U32*)data;
-        U32* eol = optr + r.width();
-        while (optr < eol)
-          *optr++ = pix;
-      }
-      break;
-    }
-    data += bytesPerRow;
-  }
+  U8 *buf = getPixelsRW(r, &stride);
+  fillRectFn(buf, stride, r, pix);
 }
 
 void FullFramePixelBuffer::imageRect(const Rect& r, const void* pixels, int srcStride) {