diff options
author | Pierre Ossman <ossman@cendio.se> | 2015-02-06 13:51:35 +0100 |
---|---|---|
committer | Pierre Ossman <ossman@cendio.se> | 2015-02-13 11:13:53 +0100 |
commit | a43a3f4e0e1ae9faa389a91ad9a38db4af4c54c8 (patch) | |
tree | b963f0f359e8b0eccd4c2400677d9223670cfea7 /common/rfb/PixelBuffer.cxx | |
parent | 8ac31113cc6c0327b40bb40770d83a544f84e8b5 (diff) | |
download | tigervnc-a43a3f4e0e1ae9faa389a91ad9a38db4af4c54c8.tar.gz tigervnc-a43a3f4e0e1ae9faa389a91ad9a38db4af4c54c8.zip |
Optimise fillRect()
It had regressed in performance compared to 1.3. This brings it back
up to the same speed.
Diffstat (limited to 'common/rfb/PixelBuffer.cxx')
-rw-r--r-- | common/rfb/PixelBuffer.cxx | 32 |
1 files changed, 26 insertions, 6 deletions
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); |