# HG changeset patch # User Shinji KONO # Date 1581512280 -32400 # Node ID 3accb09e430c725162e819720040d94b49a718dd # Parent ef5033b06019cc245a178f529d9a9c32d52b2888# Parent 11ae87fed30d49f21fefc94769aa95b785a7f55f merge diff -r ef5033b06019 -r 3accb09e430c src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEDecoder.java --- 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) diff -r ef5033b06019 -r 3accb09e430c src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java --- 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();