]> source.dussan.org Git - tigervnc.git/commitdiff
We don't need a fillRect() that is this optimised
authorPierre Ossman <ossman@cendio.se>
Thu, 30 Jan 2014 15:59:14 +0000 (16:59 +0100)
committerPierre Ossman <ossman@cendio.se>
Mon, 7 Jul 2014 12:50:29 +0000 (14:50 +0200)
Keep things simple instead and allows us to remove the extra setPF()
methods.

common/rfb/PixelBuffer.cxx
common/rfb/PixelBuffer.h

index 7f4c34406ba6cf2bdfe2faf0815a9c165ca42172..ace0934d070ea0d10411739f6b3a6c2d2f4d8dd3 100644 (file)
@@ -60,63 +60,10 @@ PixelBuffer::getImage(void* imageBuf, const Rect& r, int outStride) {
 }
 
 
-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_)
   : PixelBuffer(pf, w, h), data(data_)
 {
-  // Called again to configure the fill function
-  setPF(pf);
 }
 
 FullFramePixelBuffer::FullFramePixelBuffer() : data(0) {}
@@ -124,29 +71,6 @@ FullFramePixelBuffer::FullFramePixelBuffer() : data(0) {}
 FullFramePixelBuffer::~FullFramePixelBuffer() {}
 
 
-void FullFramePixelBuffer::setPF(const PixelFormat &pf) {
-  // We have this as a separate method for ManagedPixelBuffer's
-  // sake. Direct users of FullFramePixelBuffer aren't allowed
-  // to call it.
-
-  PixelBuffer::setPF(pf);
-
-  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");
-  }
-}
-
-
 int FullFramePixelBuffer::getStride() const { return width(); }
 
 rdr::U8* FullFramePixelBuffer::getBufferRW(const Rect& r, int* stride)
@@ -158,8 +82,24 @@ rdr::U8* FullFramePixelBuffer::getBufferRW(const Rect& r, int* stride)
 
 void FullFramePixelBuffer::fillRect(const Rect& r, Pixel pix) {
   int stride;
-  U8 *buf = getBufferRW(r, &stride);
-  fillRectFn(buf, stride, r, pix);
+  U8 *buf, pixbuf[4];
+  int w, h, b;
+
+  buf = getBufferRW(r, &stride);
+  w = r.width();
+  h = r.height();
+  b = format.bpp/8;
+
+  format.bufferFromPixel(pixbuf, pix);
+
+  while (h--) {
+    int w_ = w;
+    while (w_--) {
+      memcpy(buf, pixbuf, b);
+      buf += b;
+    }
+    buf += (stride - w) * b;
+  }
 }
 
 void FullFramePixelBuffer::imageRect(const Rect& r, const void* pixels, int srcStride) {
@@ -327,7 +267,7 @@ ManagedPixelBuffer::~ManagedPixelBuffer() {
 
 void
 ManagedPixelBuffer::setPF(const PixelFormat &pf) {
-  FullFramePixelBuffer::setPF(pf); checkDataSize();
+  format = pf; checkDataSize();
 };
 void
 ManagedPixelBuffer::setSize(int w, int h) {
index ad30cf22cb6e48dc0c2b54b9745786d3a15df1a0..bff2802158579723076ae74548f3d95e4939a1cd 100644 (file)
@@ -83,8 +83,6 @@ namespace rfb {
     virtual void grabRegion(const Region& region) {}
 
   protected:
-    // Only for subclasses that support changing parameters
-    void setPF(const PixelFormat &pf) { format = pf; }
     PixelBuffer();
     PixelFormat format;
     int width_, height_;
@@ -136,9 +134,7 @@ namespace rfb {
     rdr::U8* data;
 
   protected:
-    void setPF(const PixelFormat &pf);
     FullFramePixelBuffer();
-    void (*fillRectFn)(rdr::U8 *, int, const Rect&, Pixel);
   };
 
   // -=- Managed pixel buffer class