]> source.dussan.org Git - tigervnc.git/commitdiff
Optimise fillRect()
authorPierre Ossman <ossman@cendio.se>
Fri, 6 Feb 2015 12:51:35 +0000 (13:51 +0100)
committerPierre Ossman <ossman@cendio.se>
Fri, 13 Feb 2015 10:13:53 +0000 (11:13 +0100)
It had regressed in performance compared to 1.3. This brings it back
up to the same speed.

common/rfb/PixelBuffer.cxx

index b1359c2edc15dc48ebba186f1418e7e29bfafebc..b03af1afe36905f6691128fbf605e014273cf79b 100644 (file)
@@ -99,23 +99,43 @@ ModifiablePixelBuffer::~ModifiablePixelBuffer()
 void ModifiablePixelBuffer::fillRect(const Rect& r, Pixel pix)
 {
   int stride;
-  U8 *buf, pixbuf[4];
+  U8 *buf;
   int w, h, b;
 
-  buf = getBufferRW(r, &stride);
   w = r.width();
   h = r.height();
   b = format.bpp/8;
 
-  format.bufferFromPixel(pixbuf, pix);
+  if (h == 0)
+    return;
+
+  buf = getBufferRW(r, &stride);
 
-  while (h--) {
-    int w_ = w;
-    while (w_--) {
+  if (b == 1) {
+    while (h--) {
+      memset(buf, pix, w);
+      buf += stride * b;
+    }
+  } else {
+    U8 pixbuf[4], *start;
+    int w1;
+
+    start = buf;
+
+    format.bufferFromPixel(pixbuf, pix);
+
+    w1 = w;
+    while (w1--) {
       memcpy(buf, pixbuf, b);
       buf += b;
     }
     buf += (stride - w) * b;
+    h--;
+
+    while (h--) {
+      memcpy(buf, start, w * b);
+      buf += stride * b;
+    }
   }
 
   commitBufferRW(r);