Refactor processing to allow hextile processing.
With hextile you can't know how many bytes are pending. So restructure so that all the received data so far is passed to the processsing routines.
This commit is contained in:
parent
f761808540
commit
0f62806499
74
vnc.js
74
vnc.js
|
@ -44,6 +44,7 @@ Array.prototype.shiftBytes = function (len) {
|
||||||
var FBU = {
|
var FBU = {
|
||||||
rects : 0,
|
rects : 0,
|
||||||
subrects : 0,
|
subrects : 0,
|
||||||
|
tiles : 0,
|
||||||
bytes : 0,
|
bytes : 0,
|
||||||
x : 0,
|
x : 0,
|
||||||
y : 0,
|
y : 0,
|
||||||
|
@ -208,7 +209,7 @@ display_raw: function () {
|
||||||
debug(">> display_raw");
|
debug(">> display_raw");
|
||||||
Canvas.rfbImage(FBU.x, FBU.y, FBU.width, FBU.height, FBU.arr);
|
Canvas.rfbImage(FBU.x, FBU.y, FBU.width, FBU.height, FBU.arr);
|
||||||
FBU.rects --;
|
FBU.rects --;
|
||||||
FBU.arr = [];
|
FBU.arr.splice(0, FBU.width * FBU.height * RFB.fb_Bpp);
|
||||||
},
|
},
|
||||||
|
|
||||||
display_copy_rect: function () {
|
display_copy_rect: function () {
|
||||||
|
@ -217,7 +218,6 @@ display_copy_rect: function () {
|
||||||
var old_y = FBU.arr.shift16();
|
var old_y = FBU.arr.shift16();
|
||||||
Canvas.copyImage(old_x, old_y, FBU.x, FBU.y, FBU.width, FBU.height);
|
Canvas.copyImage(old_x, old_y, FBU.x, FBU.y, FBU.width, FBU.height);
|
||||||
FBU.rects --;
|
FBU.rects --;
|
||||||
FBU.arr = [];
|
|
||||||
},
|
},
|
||||||
|
|
||||||
display_rre: function () {
|
display_rre: function () {
|
||||||
|
@ -228,7 +228,7 @@ display_rre: function () {
|
||||||
var color = FBU.arr.shiftBytes(RFB.fb_Bpp); // Background
|
var color = FBU.arr.shiftBytes(RFB.fb_Bpp); // Background
|
||||||
Canvas.rfbRect(FBU.x, FBU.y, FBU.width, FBU.height, color);
|
Canvas.rfbRect(FBU.x, FBU.y, FBU.width, FBU.height, color);
|
||||||
}
|
}
|
||||||
while (FBU.arr.length > 0) {
|
while ((FBU.subrects > 0) && (FBU.arr.length >= (RFB.fb_Bpp + 8))) {
|
||||||
FBU.subrects --;
|
FBU.subrects --;
|
||||||
var color = FBU.arr.shiftBytes(RFB.fb_Bpp);
|
var color = FBU.arr.shiftBytes(RFB.fb_Bpp);
|
||||||
var x = FBU.arr.shift16();
|
var x = FBU.arr.shift16();
|
||||||
|
@ -237,18 +237,25 @@ display_rre: function () {
|
||||||
var height = FBU.arr.shift16();
|
var height = FBU.arr.shift16();
|
||||||
Canvas.rfbRect(FBU.x + x, FBU.y + y, width, height, color);
|
Canvas.rfbRect(FBU.x + x, FBU.y + y, width, height, color);
|
||||||
}
|
}
|
||||||
//debug("rects: " + FBU.rects + ", FBU.subrects: " + FBU.subrects);
|
//debug(" display_rre: rects: " + FBU.rects + ", FBU.subrects: " + FBU.subrects);
|
||||||
|
|
||||||
if (FBU.subrects > 0) {
|
if (FBU.subrects > 0) {
|
||||||
var chunk = Math.min(RFB.rre_chunk, FBU.subrects);
|
var chunk = Math.min(RFB.rre_chunk, FBU.subrects);
|
||||||
FBU.bytes = (RFB.fb_Bpp + 8) * chunk;
|
FBU.bytes = (RFB.fb_Bpp + 8) * chunk;
|
||||||
} else {
|
} else {
|
||||||
FBU.rects --;
|
FBU.rects --;
|
||||||
FBU.arr = [];
|
|
||||||
}
|
}
|
||||||
//debug("<< display_rre, FBU.bytes: " + FBU.bytes);
|
//debug("<< display_rre, FBU.bytes: " + FBU.bytes);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
display_hextile: function() {
|
||||||
|
if (FBU.tiles == 0) {
|
||||||
|
FBU.tiles = (Math.ceiling(FBU.width/16.0)) * (Math.ceiling(FBU.height/16.0));
|
||||||
|
}
|
||||||
|
|
||||||
|
while (FBU.arr.length) {};
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
/* Normal RFB/VNC messages */
|
/* Normal RFB/VNC messages */
|
||||||
normal_msg: function (data) {
|
normal_msg: function (data) {
|
||||||
|
@ -270,14 +277,17 @@ normal_msg: function (data) {
|
||||||
//debug("FramebufferUpdate continuation");
|
//debug("FramebufferUpdate continuation");
|
||||||
}
|
}
|
||||||
|
|
||||||
while (data.length > 0) {
|
if (data.length > 0 ) {
|
||||||
//debug("data.length: " + data.length + ", FBU.bytes: " + FBU.bytes);
|
FBU.arr = FBU.arr.concat(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (FBU.arr.length > 0) {
|
||||||
if (FBU.bytes == 0) {
|
if (FBU.bytes == 0) {
|
||||||
FBU.x = data.shift16();
|
FBU.x = FBU.arr.shift16();
|
||||||
FBU.y = data.shift16();
|
FBU.y = FBU.arr.shift16();
|
||||||
FBU.width = data.shift16();
|
FBU.width = FBU.arr.shift16();
|
||||||
FBU.height = data.shift16();
|
FBU.height = FBU.arr.shift16();
|
||||||
FBU.encoding = parseInt(data.shift32(), 10);
|
FBU.encoding = parseInt(FBU.arr.shift32(), 10);
|
||||||
debug("encoding: " + FBU.encoding);
|
debug("encoding: " + FBU.encoding);
|
||||||
switch (FBU.encoding) {
|
switch (FBU.encoding) {
|
||||||
case 0: // Raw
|
case 0: // Raw
|
||||||
|
@ -289,28 +299,30 @@ normal_msg: function (data) {
|
||||||
case 2: // RRE
|
case 2: // RRE
|
||||||
FBU.bytes = 4 + RFB.fb_Bpp;
|
FBU.bytes = 4 + RFB.fb_Bpp;
|
||||||
break;
|
break;
|
||||||
}
|
case 5: // hextile
|
||||||
} else {
|
FBU.bytes = 1; // No header; get it started
|
||||||
if (data.length >= FBU.bytes) {
|
break;
|
||||||
//debug('Done rect:');
|
|
||||||
FBU.arr = FBU.arr.concat(data.shiftBytes(FBU.bytes))
|
|
||||||
FBU.bytes = 0;
|
|
||||||
|
|
||||||
switch (FBU.encoding) {
|
|
||||||
case 0: RFB.display_raw(); break; // Raw
|
|
||||||
case 1: RFB.display_copy_rect(); break; // Copy-Rect
|
|
||||||
case 2: RFB.display_rre(); break; // RRE
|
|
||||||
}
|
|
||||||
|
|
||||||
FBU.arr = [];
|
|
||||||
} else {
|
|
||||||
FBU.bytes = FBU.bytes - data.length;
|
|
||||||
FBU.arr = FBU.arr.concat(data.shiftBytes(data.length))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//debug("FBU.arr.length: " + FBU.arr.length + ", FBU.bytes: " + FBU.bytes);
|
||||||
|
|
||||||
//debug("Bytes remaining: " + FBU.bytes);
|
if (FBU.arr.length >= FBU.bytes) {
|
||||||
|
//debug('Done rect:');
|
||||||
|
FBU.bytes = 0;
|
||||||
|
|
||||||
|
switch (FBU.encoding) {
|
||||||
|
case 0: RFB.display_raw(); break; // Raw
|
||||||
|
case 1: RFB.display_copy_rect(); break; // Copy-Rect
|
||||||
|
case 2: RFB.display_rre(); break; // RRE
|
||||||
|
case 5: RFB.display_hextile(); break; // hextile
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* We don't have enough yet */
|
||||||
|
FBU.bytes = FBU.bytes - data.length;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//debug("Finished frame buffer update");
|
//debug("Finished frame buffer update");
|
||||||
break;
|
break;
|
||||||
case 1: // SetColourMapEntries
|
case 1: // SetColourMapEntries
|
||||||
|
@ -367,6 +379,8 @@ setEncodings: function () {
|
||||||
var arr = [2]; // msg-type
|
var arr = [2]; // msg-type
|
||||||
arr.push8(0); // padding
|
arr.push8(0); // padding
|
||||||
arr.push16(3); // encoding count
|
arr.push16(3); // encoding count
|
||||||
|
//arr.push16(4); // encoding count
|
||||||
|
//arr.push32(5); // hextile encoding
|
||||||
arr.push32(2); // RRE encoding
|
arr.push32(2); // RRE encoding
|
||||||
arr.push32(1); // copy-rect encoding
|
arr.push32(1); // copy-rect encoding
|
||||||
arr.push32(0); // raw encoding
|
arr.push32(0); // raw encoding
|
||||||
|
|
Loading…
Reference in New Issue