Browse Source

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.
Joel Martin 15 years ago
parent
commit
0f62806499
1 changed files with 44 additions and 30 deletions
  1. 44 30
      vnc.js

+ 44 - 30
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) {
-            //debug("data.length: " + data.length + ", FBU.bytes: " + FBU.bytes);
+        if (data.length > 0 ) {
+            FBU.arr = FBU.arr.concat(data);
+        }
+
+        while (FBU.arr.length > 0) {
             if (FBU.bytes == 0) {
             if (FBU.bytes == 0) {
-                FBU.x      = data.shift16();
-                FBU.y      = data.shift16();
-                FBU.width  = data.shift16();
-                FBU.height = data.shift16();
-                FBU.encoding = parseInt(data.shift32(), 10);
+                FBU.x      = FBU.arr.shift16();
+                FBU.y      = FBU.arr.shift16();
+                FBU.width  = FBU.arr.shift16();
+                FBU.height = FBU.arr.shift16();
+                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;
-                }
-            } else {
-                if (data.length >= FBU.bytes) {
-                    //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))
+                    case 5:  // hextile
+                        FBU.bytes = 1;  // No header; get it started
+                        break;
                 }
                 }
             }
             }
+            //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