From: Pierre Ossman Date: Fri, 6 Feb 2015 12:51:35 +0000 (+0100) Subject: Optimise fillRect() X-Git-Tag: v1.4.90~47^2~4 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=a43a3f4e0e1ae9faa389a91ad9a38db4af4c54c8;p=tigervnc.git Optimise fillRect() It had regressed in performance compared to 1.3. This brings it back up to the same speed. --- diff --git a/common/rfb/PixelBuffer.cxx b/common/rfb/PixelBuffer.cxx index b1359c2e..b03af1af 100644 --- a/common/rfb/PixelBuffer.cxx +++ b/common/rfb/PixelBuffer.cxx @@ -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);