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) {
diff --git a/common/rfb/PixelBuffer.h b/common/rfb/PixelBuffer.h
index fc35a7d..d721fa2 100644
--- a/common/rfb/PixelBuffer.h
+++ b/common/rfb/PixelBuffer.h
@@ -141,6 +141,7 @@
 
   protected:
     FullFramePixelBuffer();
+    void (*fillRectFn)(rdr::U8 *, int, const Rect&, Pixel);
   };
 
   // -=- Managed pixel buffer class
diff --git a/common/rfb/tightDecode.h b/common/rfb/tightDecode.h
index 4ea18a9..32bb4f1 100644
--- a/common/rfb/tightDecode.h
+++ b/common/rfb/tightDecode.h
@@ -46,7 +46,6 @@
 #define TIGHT_DECODE TightDecoder::CONCAT2E(tightDecode,BPP)
 #define DECOMPRESS_JPEG_RECT TightDecoder::CONCAT2E(DecompressJpegRect,BPP)
 #define FILTER_GRADIENT TightDecoder::CONCAT2E(FilterGradient,BPP)
-#define DIRECT_FILL_RECT TightDecoder::CONCAT2E(directFillRect,BPP)
 
 #define TIGHT_MIN_TO_COMPRESS 12
 
@@ -81,8 +80,7 @@
     } else {
       pix = is->READ_PIXEL();
     }
-    if (directDecode) DIRECT_FILL_RECT(r, pix);
-    else FILL_RECT(r, pix);
+    FILL_RECT(r, pix);
     return;
   }
 
@@ -377,37 +375,7 @@
   delete [] netbuf;
 }
 
-void
-DIRECT_FILL_RECT(const Rect& r, Pixel pix) {
-
-  int stride;
-  PIXEL_T *buf = (PIXEL_T *)handler->getRawPixelsRW(r, &stride);
-
-  int w = r.width(), h = r.height();
-  PIXEL_T *ptr = buf;
-#if BPP != 8
-  int pad = stride - w;
-#endif
-
-  while (h > 0) {
-#if BPP == 8
-    memset(ptr, pix, w);
-    ptr += stride;
-#else
-    PIXEL_T *endOfRow = ptr + w;
-    while (ptr < endOfRow) {
-      *ptr++ = pix;
-    }
-    ptr += pad;
-#endif
-    h--;
-  }
-
-  handler->releaseRawPixels(r);
-}
-
 #undef TIGHT_MIN_TO_COMPRESS
-#undef DIRECT_FILL_RECT
 #undef FILTER_GRADIENT
 #undef DECOMPRESS_JPEG_RECT
 #undef TIGHT_DECODE
