changeset 590:3accb09e430c

merge
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 12 Feb 2020 21:58:00 +0900
parents ef5033b06019 (current diff) 11ae87fed30d (diff)
children 665d58cc7f1a
files src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEDecoder.java src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java
diffstat 2 files changed, 15 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEDecoder.java	Wed Feb 12 21:54:40 2020 +0900
+++ b/src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEDecoder.java	Wed Feb 12 21:58:00 2020 +0900
@@ -156,12 +156,16 @@
 			if (!blocking) return;
 			int span = offset - prevoffset;
 			deflater.setInput(bytes, prevoffset, span);
+			width += tileW;
 			do {
-				deflater.deflate(c1, Deflater. SYNC_FLUSH);
+				deflater.deflate(c1, Deflater.SYNC_FLUSH);
 				if (!deflater.needsInput()) {
 					// packet full
 					flushDeflator();
-					prevoffset = flushOffset+(int)deflater.getBytesRead();
+					int bytesRead = (int)deflater.getBytesRead();
+					ReceiverTask.dump("get bytesRead ",bytes, flushOffset+bytesRead - 8, 20);
+					System.out.println();
+					prevoffset = flushOffset+bytesRead;
 					assert(prevoffset==offset);
 					System.out.println("od prevOffset = "+prevoffset+" span = "+(prevoffset-flushOffset));
 					if (c0rect!=null) { flushRectangle(c0rect); moveNext(); } // finish pahse 1
@@ -189,31 +193,28 @@
 				flushMuticast(rfb, bytes);
 				return;
 			}
-			width += tileW;
 			if (c1rect.height==0) c1rect.height = tileH;
 			if (c1rect.x > rect.x) {  // phase 0
 				assert(c0rect==null);
-				if (c1rect.x + c1rect.width < rect.x + rect.width) {
-					c1rect.x += tileW;
-				} else {   // end of phase 0
+				if (c1rect.x + c1rect.width >= rect.x + rect.width) {  // end of phase 0
+					deflater.deflate(c1,Deflater.FULL_FLUSH);
 					flushRectangle(c1rect);
 					c1.position((c1.position()+16)); // make next header space
 					c1rect = new FramebufferUpdateRectangle(rect.x,c1rect.y+tileH,0,0);
 				}
 			} else {  // phase 1
 				if (width >= rect.width) { // next line
-					deflater.deflate(c1,Deflater.FULL_FLUSH);
 					prevC1LineOffset = c1.position();
 					c1rect.width = rect.width;
+					width = tileH;
 					if (c0rect!=null) { // extend phase 1
 						c0rect.height += tileH;
+						c0rect.width += tileW;
 						c1rect = new FramebufferUpdateRectangle(rect.x, c0rect.y+c0rect.height,0,0);
 					} else { // first phase 1 case
-						c1rect.height = tileH;
 						c0rect = c1rect;
-						c1rect = new FramebufferUpdateRectangle(rect.x, c1rect.y+c1rect.height,0,0);
+						c1rect = new FramebufferUpdateRectangle(rect.x, c1rect.y, width, tileH);
 					}
-					width = 0;
 					prevLineOffset = offset;
 				}
 			}
@@ -228,6 +229,7 @@
 		private void flushDeflator() {
 			c1.limit(c1.limit() + MARGIN);
 			deflater.deflate(c1, Deflater.FULL_FLUSH);
+			deflater.getBytesRead();
 			if (c1.remaining()==0) {
 				System.out.println("Multicast packet overrun.");
 			}
@@ -315,8 +317,9 @@
 		try {
 			for (int tileY = rect.y; tileY < maxY; tileY += MAX_TILE_SIZE) {
 				int tileHeight = Math.min(maxY - tileY, MAX_TILE_SIZE);
-				if (tileloop.blocking)
+				if (tileloop.blocking) {
 					tileloop.c1rect.height += tileHeight;
+				}
 				for (int tileX = rect.x; tileX < maxX; tileX += MAX_TILE_SIZE) {
 					int tileWidth = Math.min(maxX - tileX, MAX_TILE_SIZE);
 					if (tileloop.blocking && tileloop.c1rect.x + tileloop.c1rect.width < rect.x + rect.width)
--- a/src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java	Wed Feb 12 21:54:40 2020 +0900
+++ b/src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java	Wed Feb 12 21:58:00 2020 +0900
@@ -416,7 +416,7 @@
         }else {
             System.out.println("Bytes is not equal length "+buf.remaining()+" - "+span + " = " + (buf.remaining() - span));
         }
-        dump("in  ",bytes,flushOffset,8); dump("... ",bytes,flushEnd-8,8);
+        dump("in  ",bytes,flushOffset,8); dump("... ",bytes,flushEnd-20,40);
         System.out.println();
         dump("out ",buf.array(),buf.position(),8); dump("... ",buf.array(),buf.limit()-8,8);
         System.out.println();