summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRamon de Klein <mail@ramondeklein.nl>2014-11-06 13:11:46 +0100
committerSolly Ross <sross@redhat.com>2014-11-17 20:05:56 -0500
commit3d625a7361dc1e124c2cf828b2d3388ac1ff218b (patch)
tree217bfbb82264e60b999a3b55f5d6fa51b285505d
parent6cea5ca88928fad5db18c1e903afa608afa2f7e0 (diff)
downloadnovnc-3d625a7361dc1e124c2cf828b2d3388ac1ff218b.tar.gz
Backport: Don't draw "blank" HEXTILE tiles with random data
Previously, if a HEXTILE tiles was received with a subencoding of 0x00, it would draw a rectangle using data from the render queue, which would result in random colored blocks when using the HEXTILE encoding. This is the result of a miscopy during the refactoring. It now has the correct functionality according to the RFB protocol specification, which is to draw a rectangle with the last set background color. Closes #411 (cherry picked from commit 40ac6f0ab605d4adf8c05bc3dcbc2fce2442d5c4)
-rw-r--r--include/rfb.js3
-rw-r--r--tests/test.rfb.js26
2 files changed, 27 insertions, 2 deletions
diff --git a/include/rfb.js b/include/rfb.js
index 0afe656..f2f7079 100644
--- a/include/rfb.js
+++ b/include/rfb.js
@@ -1496,8 +1496,7 @@ var RFB;
// Weird: ignore blanks are RAW
Util.Debug(" Ignoring blank after RAW");
} else {
- this._display.fillRect(x, y, w, h, rQ, rQi);
- rQi += this._FBU.bytes - 1;
+ this._display.fillRect(x, y, w, h, FBU.background);
}
} else if (this._FBU.subencoding & 0x01) { // Raw
this._display.blitImage(x, y, w, h, rQ, rQi);
diff --git a/tests/test.rfb.js b/tests/test.rfb.js
index fb32af0..fdfb539 100644
--- a/tests/test.rfb.js
+++ b/tests/test.rfb.js
@@ -1312,6 +1312,32 @@ describe('Remote Frame Buffer Protocol Client', function() {
expect(client._display).to.have.displayed(new Uint8Array(expected));
});
+ it('should handle a tile with only bg specified and an empty frame afterwards', function () {
+ // set the width so we can have two tiles
+ client._fb_width = 8;
+ client._display._fb_width = 8;
+ client._display._viewportLoc.w = 8;
+
+ var info = [{ x: 0, y: 0, width: 8, height: 4, encoding: 0x05 }];
+
+ var rect = [];
+
+ // send a bg frame
+ rect.push(0x02);
+ rect.push32(0xff00ff); // becomes 00ff00ff --> #00FF00 bg color
+
+ // send an empty frame
+ rect.push(0x00);
+
+ send_fbu_msg(info, [rect], client);
+
+ var expected = [];
+ var i;
+ for (i = 0; i < 16; i++) { expected.push32(0xff00ff); } // rect 1: solid
+ for (i = 0; i < 16; i++) { expected.push32(0xff00ff); } // rect 2: same bkground color
+ expect(client._display).to.have.displayed(new Uint8Array(expected));
+ });
+
it('should handle a tile with bg and coloured subrects', function () {
var info = [{ x: 0, y: 0, width: 4, height: 4, encoding: 0x05 }];
var rect = [];