# HG changeset patch # User riono # Date 1581172688 -32400 # Node ID 2fe1be5476a641d817137da29b87e603d790daa1 # Parent f01eef88010f5276de0ab4d1d286d55a4c9db0d3 fix rectangle diff -r f01eef88010f -r 2fe1be5476a6 src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEDecoder.java --- 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)