Mercurial > hg > Applications > TreeVNC
annotate src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEDecoder.java @ 535:17a2d0ea5c03
fix on ZRLEDecoder
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 08 May 2019 14:08:34 +0900 |
parents | a3d0ba67e8cf |
children | 6620e04f994c |
rev | line source |
---|---|
57
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1 // Copyright (C) 2010, 2011, 2012, 2013 GlavSoft LLC. |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 // All rights reserved. |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 // |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 //------------------------------------------------------------------------- |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5 // This file is part of the TightVNC software. Please visit our Web site: |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 // |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 // http://www.tightvnc.com/ |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 // |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9 // This program is free software; you can redistribute it and/or modify |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
10 // it under the terms of the GNU General Public License as published by |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11 // the Free Software Foundation; either version 2 of the License, or |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
12 // (at your option) any later version. |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
13 // |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
14 // This program is distributed in the hope that it will be useful, |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
17 // GNU General Public License for more details. |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
18 // |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
19 // You should have received a copy of the GNU General Public License along |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
20 // with this program; if not, write to the Free Software Foundation, Inc., |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
21 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
22 //------------------------------------------------------------------------- |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
23 // |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24 |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
25 package com.glavsoft.rfb.encoding.decoder; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
26 |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27 import com.glavsoft.drawing.Renderer; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
28 import com.glavsoft.exceptions.TransportException; |
526 | 29 import com.glavsoft.rfb.encoding.EncodingType; |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
30 import com.glavsoft.transport.Reader; |
526 | 31 import jp.ac.u_ryukyu.treevnc.CheckDelay; |
498 | 32 import jp.ac.u_ryukyu.treevnc.TreeRFBProto; |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
33 |
526 | 34 import java.io.UnsupportedEncodingException; |
35 import java.nio.ByteBuffer; | |
528 | 36 import java.util.LinkedList; |
526 | 37 import java.util.zip.Deflater; |
38 | |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
39 public class ZRLEDecoder extends ZlibDecoder { |
57
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
40 private static final int MAX_TILE_SIZE = 64; |
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
41 private int[] decodedBitmap; |
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
42 private int[] palette; |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
43 |
528 | 44 class TileLoop { |
535 | 45 private final boolean blocking; |
46 private final int half; | |
528 | 47 private int deflate_size = 65507; |
48 private ByteBuffer c1; | |
532 | 49 private int width; // phase2 length |
528 | 50 private FramebufferUpdateRectangle c1rect; |
51 private int c1headerPos; | |
52 private int prevLineOffset; | |
53 private int prevC1Offset; | |
54 private int prevoffset; | |
55 private Deflater deflater; | |
529 | 56 private int rectPos; |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
57 private int ztileInLine; |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
58 private int hwidth; |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
59 private int hc1width; |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
60 private int hoffset; |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
61 private int hc1offset; |
535 | 62 private int discard; |
528 | 63 |
64 /** | |
65 * Multicast framebufferUpdate to children. | |
66 * read FrameBuffferUpdate. If it is ZLE, make it ZLEE which is self contained compressed packet. | |
67 * put the packet to the multicastqueue. Then normal rendering engine read the same stream using is.reset(). | |
68 * | |
69 * Haeder | |
70 * messageID ( FrameBuffer Update | |
71 * 1 byte padding | |
72 * 2 byte numberofrectangle | |
73 * 2 - U16 - x-position | |
74 * 2 - U16 - y-position | |
75 * 2 - U16 - width | |
76 * 2 - U16 - height | |
77 * 4 - S32 - encoding-type | |
78 * 4 byte datalengths | |
79 * datalengths databyte | |
80 * | |
81 * @throws TransportException | |
82 * @throws UnsupportedEncodingException | |
83 */ | |
84 | |
533 | 85 public TileLoop(int offset) { |
86 prevoffset = prevLineOffset = prevC1Offset = offset; | |
535 | 87 if (offset < deflate_size+spanGap) { |
88 // packet size fit in broadcast send it all at once | |
89 blocking = false; | |
90 } else | |
91 blocking = true; | |
92 discard = 0; half = 0; | |
533 | 93 } |
528 | 94 |
535 | 95 private void zrleeBlocking(TreeRFBProto rfb, ByteBuffer header, FramebufferUpdateRectangle rect, byte bytes[]) { |
528 | 96 // dump32(inputs); |
97 deflater = rfb.deflater; | |
532 | 98 newMulticastPacket(rfb, rect); |
99 c1.put(header.get(0)); | |
100 c1rect = new FramebufferUpdateRectangle(rect.x, rect.y, 0, 0); | |
535 | 101 if (!blocking) { |
102 deflater.setInput(bytes,0,prevoffset); | |
103 deflater.deflate(c1); | |
104 flushMuticast(rfb); | |
105 } | |
532 | 106 return; |
107 } | |
108 | |
109 private void newMulticastPacket(TreeRFBProto rfb, FramebufferUpdateRectangle rect) { | |
528 | 110 c1 = rfb.multicastqueue.allocate(deflate_size); |
111 if (rfb.addSerialNum) | |
112 c1.putLong(rfb.counter++); | |
113 if (rfb.checkDelay) | |
114 CheckDelay.checkDelay(c1, rect.x, rect.y, rect.width, rect.height, System.currentTimeMillis(), EncodingType.CHECK_DELAY); | |
115 c1headerPos = c1.position(); | |
532 | 116 c1.put((byte) 0); |
117 c1.put((byte) 0); | |
118 c1.putShort((short) 0); | |
119 c1.position(c1.position()+16); | |
120 c1.putInt(0); // should be data length | |
121 width = 0; | |
122 rectPos = 4; | |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
123 ztileInLine = 0; |
528 | 124 } |
531
13d3c4341d14
remove .idea modules fix for loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
529
diff
changeset
|
125 |
528 | 126 int spanGap = 128; |
127 /** | |
128 * | |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
129 * Series of tiles compose at most three rectangles. SYNC_FLUSH is necessary on |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
130 * rectangle boundaries. |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
131 * |
532 | 132 * +----+ |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
133 * | | | phase 0 |
532 | 134 * +---------------+ |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
135 * | | | phase 1 |
532 | 136 * +----+----------+ |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
137 * | | | phase 2 |
532 | 138 * +----+ |
139 * | |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
140 * Broadcast packet have to less than 64kbytes |
535 | 141 * A tile 64x64x3 11288byte, a packet can contain 5 raw tiles, when these are |
142 * compressed 10 to 100 tiles can be stored. It is impossible to predict the | |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
143 * compression rate. To check the compressed capacity, Deflate.needsInputs() can |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
144 * be used. If needsInputs() is false on SYNC_FLUSH, smaller input is necessary. |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
145 * |
535 | 146 * We'll try 512 tiles before SYNC_FLUSH in a phase, if it fails try flush former 256 tiles. |
147 * If it will failed again, flush the previous line and do flush 512 tiles in new Packet. | |
148 * If it failed again try former 256 tiles flushed, if this failes again dicard the former half. | |
149 * The last case cannot happen but former 256 tiles have to be flushed, because the next 256 lines | |
150 * may failed again and restart the from this point. | |
151 * The next packet start with later 256 tiles filled and unflushed. | |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
152 * |
528 | 153 * @param rfb |
154 * @param last | |
155 * @param rect | |
156 * @param bytes | |
157 * @param offset | |
158 * @param tileW | |
159 * @param tileH | |
160 */ | |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
161 |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
162 int MAX_ZTILE = 512; |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
163 |
531
13d3c4341d14
remove .idea modules fix for loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
529
diff
changeset
|
164 public void multicastPut(TreeRFBProto rfb, boolean last, FramebufferUpdateRectangle rect, byte[] bytes, int offset, int tileW, int tileH) { |
535 | 165 if (!blocking) return; |
528 | 166 int span = offset - prevoffset; |
167 deflater.setInput(bytes,prevoffset,span); | |
168 prevoffset = offset; | |
532 | 169 c1rect.width += tileW; width += tileW; |
170 if (c1rect.x > rect.x) { // phase 0 | |
171 if (c1rect.x+c1rect.width < rect.x+rect.width) { | |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
172 compressAndCheckFlush(rfb, rect, bytes, offset,false, last); |
532 | 173 } else { |
174 c1rect.width = rect.x+rect.width-c1rect.x ; | |
175 c1rect.height += tileH; | |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
176 compressAndCheckFlush(rfb,rect,bytes,offset,true, last); |
528 | 177 } |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
178 } else if (!last && c1.remaining() > spanGap) { // phase 1 |
532 | 179 if (width >= rect.width) { |
180 c1rect.width = rect.width; | |
181 width = 0; | |
182 c1rect.height += tileH; | |
531
13d3c4341d14
remove .idea modules fix for loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
529
diff
changeset
|
183 prevLineOffset = offset; |
13d3c4341d14
remove .idea modules fix for loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
529
diff
changeset
|
184 prevC1Offset = c1.position(); |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
185 compressAndCheckFlush(rfb,rect,bytes,offset,true, last); |
533 | 186 } else { |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
187 compressAndCheckFlush(rfb,rect,bytes,offset,false, last); |
533 | 188 } |
531
13d3c4341d14
remove .idea modules fix for loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
529
diff
changeset
|
189 } else { // phase2 |
13d3c4341d14
remove .idea modules fix for loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
529
diff
changeset
|
190 // rewind to the last line finish phase 1 |
532 | 191 int savew = width; |
531
13d3c4341d14
remove .idea modules fix for loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
529
diff
changeset
|
192 c1.position(prevC1Offset); |
532 | 193 flushRectangle(rect); |
194 if (savew>0) { | |
195 // recompress overrun and flush phase 2 | |
196 c1rect.width = savew; | |
197 c1rect.height = tileH; | |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
198 compressAndCheckFlush(rfb,rect,bytes,offset,true, last); |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
199 } |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
200 } |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
201 } |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
202 |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
203 private void compressAndCheckFlush(TreeRFBProto rfb, FramebufferUpdateRectangle rect, byte[] bytes, int offset, boolean flush, boolean last) { |
535 | 204 ztileInLine++; |
205 if (!flush && ztileInLine < MAX_ZTILE) { | |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
206 if (ztileInLine == MAX_ZTILE/2) { |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
207 hwidth = width; hc1width = c1rect.width; hoffset = offset; hc1offset = c1.position(); |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
208 } |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
209 deflater.deflate(c1, Deflater.NO_FLUSH); |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
210 } else { |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
211 deflater.deflate(c1, Deflater.SYNC_FLUSH); |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
212 if (!deflater.needsInput()) { |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
213 // too large, try half line |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
214 width = hwidth; |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
215 c1rect.width = hc1width; |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
216 c1.position(hc1offset); |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
217 deflater.setInput(bytes, prevLineOffset, hoffset - prevC1Offset); |
532 | 218 deflater.deflate(c1, Deflater.SYNC_FLUSH); |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
219 int from, len; |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
220 if (!deflater.needsInput()) { |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
221 // flush previous line and start new packet |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
222 c1.position(prevC1Offset); |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
223 unputrectangle(); |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
224 flushMuticast(rfb); |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
225 newMulticastPacket(rfb, rect); |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
226 nextRectangle(rect); |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
227 // we already reached MIX_ZTILE do half of them, do compress right now |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
228 from = prevC1Offset; |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
229 len = offset - prevLineOffset; |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
230 deflater.setInput(bytes, from, len); |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
231 deflater.deflate(c1, Deflater.SYNC_FLUSH); |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
232 if (deflater.needsInput()) { |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
233 flushRectangle(rect); // we are the flushed last line |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
234 return; |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
235 } |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
236 // half size should always succeed |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
237 from = prevC1Offset; |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
238 len = hoffset - prevLineOffset; |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
239 deflater.setInput(bytes, from, len); |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
240 deflater.deflate(c1, Deflater.SYNC_FLUSH); |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
241 if (!deflater.needsInput()) { /* fatal error discard this line */ |
535 | 242 discard++; |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
243 if (!last) { |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
244 newMulticastPacket(rfb, rect); |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
245 nextRectangle(rect); |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
246 } |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
247 return; |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
248 } else |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
249 flushRectangle(rect); // normal case |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
250 // later half is remain continue |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
251 } else { |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
252 flushMuticast(rfb); |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
253 newMulticastPacket(rfb,rect); |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
254 nextRectangle(rect); |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
255 } |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
256 // do later half in new Packet |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
257 from = hoffset ; len = offset - hoffset; |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
258 deflater.setInput(bytes, from, len); |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
259 deflater.deflate(c1, Deflater.NO_FLUSH); |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
260 hwidth = width; |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
261 hoffset = offset; |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
262 hc1offset = c1.position(); |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
263 ztileInLine = MAX_ZTILE/2; |
531
13d3c4341d14
remove .idea modules fix for loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
529
diff
changeset
|
264 } |
528 | 265 } |
266 } | |
267 | |
268 /** | |
269 * fix rectangle header | |
270 * create next rectangle header | |
271 * update position paramater | |
272 * send muticast pacate if nessesally | |
273 */ | |
532 | 274 private void flushRectangle(FramebufferUpdateRectangle rect) { |
529 | 275 c1.putShort(rectPos + 0, (short)c1rect.x); |
276 c1.putShort(rectPos + 2, (short)c1rect.y); | |
277 c1.putShort(rectPos + 4, (short)c1rect.width); | |
278 c1.putShort(rectPos + 6, (short)c1rect.height); | |
279 c1.putInt(rectPos + 8,EncodingType.ZRLEE.getId()); | |
532 | 280 c1.putInt(rectPos + 12, c1.position()-rectPos-12); // data length |
529 | 281 rectPos = c1.position(); |
532 | 282 c1.putShort(2,(short)(c1.getShort(2)+1)); // increment rectangle count |
283 nextRectangle(rect); | |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
284 ztileInLine = 0; |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
285 } |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
286 |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
287 private void unputrectangle() { |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
288 c1.putShort(2,(short)(c1.getShort(2)-1)); // last rectangle is canceled |
532 | 289 } |
290 | |
291 private void nextRectangle(FramebufferUpdateRectangle rect) { | |
292 if (c1rect.x+c1rect.width < rect.x+rect.width) { | |
293 c1rect.x = c1rect.width; // next rectangle is phase 1 | |
294 } else { | |
295 c1rect.x = rect.x; | |
296 c1rect.y += c1rect.height; | |
297 } | |
298 width = 0; | |
531
13d3c4341d14
remove .idea modules fix for loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
529
diff
changeset
|
299 c1rect.width = 0; |
13d3c4341d14
remove .idea modules fix for loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
529
diff
changeset
|
300 c1rect.height = 0; |
528 | 301 } |
302 | |
531
13d3c4341d14
remove .idea modules fix for loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
529
diff
changeset
|
303 private void flushMuticast(TreeRFBProto rfb) { |
528 | 304 c1.flip(); |
305 //System.out.println("multicastPut: " + c1rect + " length: " + (c1.remaining()-c1headerPos-header.limit())); | |
306 try { | |
529 | 307 deflater.reset(); |
308 | |
309 LinkedList<ByteBuffer> bufs = new LinkedList<ByteBuffer>(); | |
310 bufs.add(c1); | |
311 if (rfb.isTreeManager() && rfb.connectionPresenter.isUseMulticast()) { | |
312 for (ByteBuffer buf : bufs) | |
313 rfb.getViewer().getRfbBroadcastListener().multicastUpdateRectangle(buf); | |
314 } else { | |
315 rfb.multicastqueue.waitput(bufs); | |
316 } | |
528 | 317 } catch (InterruptedException e) { |
318 e.printStackTrace(); | |
319 } | |
320 } | |
321 } | |
526 | 322 |
323 @Override | |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
324 public void decode(Reader reader, Renderer renderer, |
275 | 325 FramebufferUpdateRectangle rect) throws TransportException { |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
326 int zippedLength = (int) reader.readUInt32(); |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
327 if (0 == zippedLength) return; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
328 int length = rect.width * rect.height * renderer.getBytesPerPixel(); |
3 | 329 byte[] bytes = unzip(reader, zippedLength, length, rect.getEncodingType()); |
526 | 330 decode1(renderer, null, rect, bytes, zippedLength, null); |
182 | 331 } |
533 | 332 |
333 | |
334 public void multicastDecode(Reader reader, Renderer renderer, | |
335 FramebufferUpdateRectangle rect, TreeRFBProto rfb) throws TransportException { | |
336 ByteBuffer header = ByteBuffer.allocate(16); | |
337 reader.read(header.array()); | |
338 int zippedLength = (int) reader.readUInt32(); | |
339 if (0 == zippedLength) return; | |
340 int length = rect.width * rect.height * renderer.getBytesPerPixel(); | |
341 byte[] bytes = unzip(reader, zippedLength, length, rect.getEncodingType()); | |
342 decode1(renderer, header, rect, bytes, zippedLength, rfb); | |
343 } | |
344 | |
526 | 345 public void decode1(Renderer renderer, ByteBuffer header, FramebufferUpdateRectangle rect, byte[] bytes, int zippedLength, TreeRFBProto rfbProto) throws TransportException { |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
346 int offset = zippedLength; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
347 int maxX = rect.x + rect.width; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
348 int maxY = rect.y + rect.height; |
528 | 349 |
533 | 350 TileLoop tileloop = new TileLoop(zippedLength); |
501 | 351 //System.out.println("decode1: "+rect); |
57
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
352 if (null == palette) { |
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
353 palette = new int [128]; |
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
354 } |
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
355 if (null == decodedBitmap) { |
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
356 decodedBitmap = new int[MAX_TILE_SIZE * MAX_TILE_SIZE]; |
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
357 } |
526 | 358 |
359 if (rfbProto.multicastBlocking) { | |
535 | 360 tileloop.zrleeBlocking(rfbProto, header, rect,bytes); |
526 | 361 } |
57
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
362 for (int tileY = rect.y; tileY < maxY; tileY += MAX_TILE_SIZE) { |
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
363 int tileHeight = Math.min(maxY - tileY, MAX_TILE_SIZE); |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
364 |
57
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
365 for (int tileX = rect.x; tileX < maxX; tileX += MAX_TILE_SIZE) { |
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
366 int tileWidth = Math.min(maxX - tileX, MAX_TILE_SIZE); |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
367 int subencoding = bytes[offset++] & 0x0ff; |
63 | 368 if(subencoding!=0) |
369 System.out.println("----------------"+subencoding); | |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
370 // 128 -plain RLE, 130-255 - Palette RLE |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
371 boolean isRle = (subencoding & 128) != 0; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
372 // 2 to 16 for raw packed palette data, 130 to 255 for Palette RLE (subencoding - 128) |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
373 int paletteSize = subencoding & 127; |
57
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
374 offset += readPalette(bytes, offset, renderer, paletteSize); |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
375 if (1 == subencoding) { // A solid tile consisting of a single colour |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
376 renderer.fillRect(palette[0], tileX, tileY, tileWidth, tileHeight); |
500 | 377 } else if (isRle) { |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
378 if (0 == paletteSize) { // subencoding == 128 (or paletteSize == 0) - Plain RLE |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
379 offset += decodePlainRle(bytes, offset, renderer, tileX, tileY, tileWidth, tileHeight); |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
380 } else { |
57
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
381 offset += decodePaletteRle(bytes, offset, renderer, tileX, tileY, tileWidth, tileHeight); |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
382 } |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
383 } else { |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
384 if (0 == paletteSize) { // subencoding == 0 (or paletteSize == 0) - raw CPIXEL data |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
385 offset += decodeRaw(bytes, offset, renderer, tileX, tileY, tileWidth, tileHeight); |
63 | 386 // System.out.println("offset:"+offset); |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
387 } else { |
57
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
388 offset += decodePacked(bytes, offset, renderer, paletteSize, tileX, tileY, tileWidth, tileHeight); |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
389 } |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
390 } |
531
13d3c4341d14
remove .idea modules fix for loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
529
diff
changeset
|
391 if (rfbProto != null && rfbProto.multicastBlocking) tileloop.multicastPut(rfbProto, false, rect, bytes, offset, tileWidth, tileHeight); |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
392 } |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
393 } |
531
13d3c4341d14
remove .idea modules fix for loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
529
diff
changeset
|
394 if (rfbProto != null && rfbProto.multicastBlocking) tileloop.multicastPut(rfbProto, true, rect, bytes, offset, 0, 0); |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
395 } |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
396 |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
397 private int decodePlainRle(byte[] bytes, int offset, Renderer renderer, |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
398 int tileX, int tileY, int tileWidth, int tileHeight) { |
57
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
399 int bytesPerCPixel = renderer.getBytesPerCPixel(); |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
400 int decodedOffset = 0; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
401 int decodedEnd = tileWidth * tileHeight; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
402 int index = offset; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
403 while (decodedOffset < decodedEnd) { |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
404 int color = renderer.getCompactPixelColor(bytes, index); |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
405 index += bytesPerCPixel; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
406 int rlength = 1; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
407 do { |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
408 rlength += bytes[index] & 0x0ff; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
409 } while ((bytes[index++] & 0x0ff) == 255); |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
410 assert rlength <= decodedEnd - decodedOffset; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
411 renderer.fillColorBitmapWithColor(decodedBitmap, decodedOffset, rlength, color); |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
412 decodedOffset += rlength; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
413 } |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
414 renderer.drawColoredBitmap(decodedBitmap, tileX, tileY, tileWidth, tileHeight); |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
415 return index - offset; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
416 } |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
417 |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
418 private int decodePaletteRle(byte[] bytes, int offset, Renderer renderer, |
57
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
419 int tileX, int tileY, int tileWidth, int tileHeight) { |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
420 int decodedOffset = 0; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
421 int decodedEnd = tileWidth * tileHeight; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
422 int index = offset; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
423 while (decodedOffset < decodedEnd) { |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
424 int colorIndex = bytes[index++]; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
425 int color = palette[colorIndex & 127]; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
426 int rlength = 1; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
427 if ((colorIndex & 128) != 0) { |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
428 do { |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
429 rlength += bytes[index] & 0x0ff; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
430 } while (bytes[index++] == (byte) 255); |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
431 } |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
432 assert rlength <= decodedEnd - decodedOffset; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
433 renderer.fillColorBitmapWithColor(decodedBitmap, decodedOffset, rlength, color); |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
434 decodedOffset += rlength; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
435 } |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
436 renderer.drawColoredBitmap(decodedBitmap, tileX, tileY, tileWidth, tileHeight); |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
437 return index - offset; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
438 } |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
439 |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
440 private int decodePacked(byte[] bytes, int offset, Renderer renderer, |
57
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
441 int paletteSize, int tileX, int tileY, int tileWidth, int tileHeight) { |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
442 int bitsPerPalletedPixel = paletteSize > 16 ? 8 : paletteSize > 4 ? 4 |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
443 : paletteSize > 2 ? 2 : 1; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
444 int packedOffset = offset; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
445 int decodedOffset = 0; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
446 for (int i = 0; i < tileHeight; ++i) { |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
447 int decodedRowEnd = decodedOffset + tileWidth; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
448 int byteProcessed = 0; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
449 int bitsRemain = 0; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
450 |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
451 while (decodedOffset < decodedRowEnd) { |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
452 if (bitsRemain == 0) { |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
453 byteProcessed = bytes[packedOffset++]; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
454 bitsRemain = 8; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
455 } |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
456 bitsRemain -= bitsPerPalletedPixel; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
457 int index = byteProcessed >> bitsRemain & (1 << bitsPerPalletedPixel) - 1 & 127; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
458 int color = palette[index]; |
57
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
459 renderer.fillColorBitmapWithColor(decodedBitmap, decodedOffset, 1, color); |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
460 ++decodedOffset; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
461 } |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
462 } |
57
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
463 renderer.drawColoredBitmap(decodedBitmap, tileX, tileY, tileWidth, tileHeight); |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
464 return packedOffset - offset; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
465 } |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
466 |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
467 private int decodeRaw(byte[] bytes, int offset, Renderer renderer, |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
468 int tileX, int tileY, int tileWidth, int tileHeight) throws TransportException { |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
469 return renderer.drawCompactBytes(bytes, offset, tileX, tileY, tileWidth, tileHeight); |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
470 } |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
471 |
57
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
472 private int readPalette(byte[] bytes, int offset, Renderer renderer, int paletteSize) { |
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
473 final int bytesPerCPixel = renderer.getBytesPerCPixel(); |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
474 for (int i=0; i<paletteSize; ++i) { |
57
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
475 palette[i] = renderer.getCompactPixelColor(bytes, offset + i* bytesPerCPixel); |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
476 } |
57
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
477 return paletteSize * bytesPerCPixel; |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
478 } |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
479 |
526 | 480 |
481 | |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
482 } |