changeset 583:2fe1be5476a6

fix rectangle
author riono <e165729@ie.u-ryukyu.ac.jp>
date Sat, 08 Feb 2020 23:38:08 +0900
parents f01eef88010f
children 583ee48d735b
files src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEDecoder.java
diffstat 1 files changed, 16 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEDecoder.java	Sat Feb 08 10:34:46 2020 +0900
+++ b/src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEDecoder.java	Sat Feb 08 23:38:08 2020 +0900
@@ -56,6 +56,7 @@
 		private int prevoffset;
 		private Deflater deflater;
 		private int flushOffset;
+		private int tileHeight;
 
 		/**
 		 * Multicast framebufferUpdate to children.
@@ -157,7 +158,7 @@
 			int span = offset - prevoffset;
 			deflater.setInput(bytes, prevoffset, span);
 			do {
-				deflater.deflate(c1, Deflater. SYNC_FLUSH);
+				int deflateSize = deflater.deflate(c1, Deflater. SYNC_FLUSH);
 				if (!deflater.needsInput()) {
 					// packet full
 					flushDeflator();
@@ -194,15 +195,16 @@
 			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
+					c1rect.height = c1rect.height - tileHeight;
 					flushRectangle(c1rect);
 					c1.position((c1.position()+16)); // make next header space
-					c1rect = new FramebufferUpdateRectangle(rect.x,c1rect.y+tileH,0,0);
+					c1rect = new FramebufferUpdateRectangle(rect.x,c1rect.y+tileHeight,0,0);
 				}
 			} else {  // phase 1
 				if (width >= rect.width) { // next line
-					deflater.deflate(c1,Deflater.FULL_FLUSH);
+					int detaSize = deflater.deflate(c1,Deflater.FULL_FLUSH);
 					prevC1LineOffset = c1.position();
 					c1rect.width = rect.width;
 					if (c0rect!=null) { // extend phase 1
@@ -227,12 +229,18 @@
 
 		private void flushDeflator() {
 			c1.limit(c1.limit() + MARGIN);
-			deflater.deflate(c1, Deflater.FULL_FLUSH);
+			//deflater.deflate(c1, Deflater.FULL_FLUSH);
+			deflater.deflate(c1, Deflater.SYNC_FLUSH);
+			long bytesRead = deflater.getBytesRead();
 			if (c1.remaining()==0) {
 				System.out.println("Multicast packet overrun.");
 			}
 		}
 
+		public void setTileHeight(int tileHeight) {
+			this.tileHeight = tileHeight;
+		}
+
 		private void bufdump(byte[] bytes,int beigin, int end) {
 			ReceiverTask.dump("in  ",bytes,beigin,8); ReceiverTask.dump("... ",bytes,end,8);
 			System.out.println();
@@ -315,8 +323,10 @@
 		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;
+					tileloop.setTileHeight(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)