Mercurial > hg > Members > riono > TreeVNC_ja_comment
annotate src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEDecoder.java @ 540:b86d445685c7
fix latest ZRLEDecoder
author | e165729 <e165729@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 10 Sep 2019 17:03:16 +0900 |
parents | 0d11471e0b5b |
children | 2840e75d2fd7 |
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; |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
41 private int[] decodedBitmap; |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
42 private int[] palette; |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
43 |
540 | 44 // TileLoopクラス 複数の関数持ち |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
45 class TileLoop { |
535 | 46 private final boolean blocking; |
47 private final int half; | |
540 | 48 private int deflate_size = 65507; // 圧縮サイズ |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
49 private ByteBuffer c1; // パケット? |
532 | 50 private int width; // phase2 length |
528 | 51 private FramebufferUpdateRectangle c1rect; |
52 private int c1headerPos; | |
53 private int prevLineOffset; | |
54 private int prevC1Offset; | |
55 private int prevoffset; | |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
56 private Deflater deflater; // 圧縮クラス |
529 | 57 private int rectPos; |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
58 private int ztileInLine; |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
59 private int hwidth; |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
60 private int hc1width; |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
61 private int hoffset; |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
62 private int hc1offset; |
535 | 63 private int discard; |
528 | 64 |
65 /** | |
66 * Multicast framebufferUpdate to children. | |
67 * read FrameBuffferUpdate. If it is ZLE, make it ZLEE which is self contained compressed packet. | |
68 * put the packet to the multicastqueue. Then normal rendering engine read the same stream using is.reset(). | |
69 * | |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
70 * framebufferUpdateを子nodeに送信する際に、ZLEを辞書をつけてZLEEのパケットに変換する |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
71 * multicast queueに入れる。普通のレンダリングではis.reset()を使って同じストリームを読み込む |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
72 * |
528 | 73 * Haeder |
74 * messageID ( FrameBuffer Update | |
75 * 1 byte padding | |
76 * 2 byte numberofrectangle | |
77 * 2 - U16 - x-position | |
78 * 2 - U16 - y-position | |
79 * 2 - U16 - width | |
80 * 2 - U16 - height | |
81 * 4 - S32 - encoding-type | |
82 * 4 byte datalengths | |
83 * datalengths databyte | |
84 * | |
85 * @throws TransportException | |
86 * @throws UnsupportedEncodingException | |
87 */ | |
88 | |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
89 // コンストラクタ |
533 | 90 public TileLoop(int offset) { |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
91 prevoffset = prevLineOffset = prevC1Offset = offset; // オフセット記憶群に代入 |
535 | 92 if (offset < deflate_size+spanGap) { |
93 // packet size fit in broadcast send it all at once | |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
94 // ブロードキャストに適合するパケットサイズで一斉に送信 |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
95 // 十分に小さいのでブロッキングせずに送信 |
535 | 96 blocking = false; |
97 } else | |
98 blocking = true; | |
99 discard = 0; half = 0; | |
533 | 100 } |
528 | 101 |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
102 // ?: ブロッキングしたものをc1に渡している? |
535 | 103 private void zrleeBlocking(TreeRFBProto rfb, ByteBuffer header, FramebufferUpdateRectangle rect, byte bytes[]) { |
528 | 104 // dump32(inputs); |
540 | 105 deflater = rfb.deflater; // TreeRFBProtでoverrideしたdeflater(圧縮クラス)を使用 |
532 | 106 newMulticastPacket(rfb, rect); |
540 | 107 c1.put(header.get(0)); // headerの0番目をc1に入れる |
108 c1rect = new FramebufferUpdateRectangle(rect.x, rect.y, 0, 0); // rectangleのインスタンス生成 | |
535 | 109 if (!blocking) { |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
110 deflater.setInput(bytes,0,prevoffset); // bytesを圧縮データとして0からprevoffsetまでをdeflater内部にセットする |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
111 deflater.deflate(c1); // setInputで入力したデータを圧縮してc1に入れる |
535 | 112 flushMuticast(rfb); |
113 } | |
532 | 114 return; |
115 } | |
116 | |
540 | 117 // ?: c1を初期化? 要: TreeRFBProto読み |
532 | 118 private void newMulticastPacket(TreeRFBProto rfb, FramebufferUpdateRectangle rect) { |
540 | 119 c1 = rfb.multicastqueue.allocate(deflate_size); // ByteBufferのallocateと同等 容量確保 |
120 if (rfb.addSerialNum) // 有効時 | |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
121 c1.putLong(rfb.counter++); // 現在のByteBufferにlongの値を書き込み |
540 | 122 if (rfb.checkDelay) // 有効時 |
528 | 123 CheckDelay.checkDelay(c1, rect.x, rect.y, rect.width, rect.height, System.currentTimeMillis(), EncodingType.CHECK_DELAY); |
540 | 124 c1headerPos = c1.position(); // c1の今の読み込み位置がどこにあるかを記憶 headerの位置 |
125 // c1の初期化 | |
532 | 126 c1.put((byte) 0); |
127 c1.put((byte) 0); | |
128 c1.putShort((short) 0); | |
129 c1.position(c1.position()+16); | |
130 c1.putInt(0); // should be data length | |
131 width = 0; | |
132 rectPos = 4; | |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
133 ztileInLine = 0; |
528 | 134 } |
531
13d3c4341d14
remove .idea modules fix for loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
529
diff
changeset
|
135 |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
136 // oh... フィールド変数です... |
528 | 137 int spanGap = 128; |
138 /** | |
139 * | |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
140 * 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
|
141 * rectangle boundaries. |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
142 * |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
143 * tileは最大3つの長方形に分けられる |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
144 * をSYNC_FLUSH(パケットへ書き込み)する際は長方形の区切りの部分(境界部分)である必要がある |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
145 * |
532 | 146 * +----+ |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
147 * | | | phase 0 |
532 | 148 * +---------------+ |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
149 * | | | phase 1 |
532 | 150 * +----+----------+ |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
151 * | | | phase 2 |
532 | 152 * +----+ |
153 * | |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
154 * Broadcast packet have to less than 64kbytes |
535 | 155 * A tile 64x64x3 11288byte, a packet can contain 5 raw tiles, when these are |
156 * 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
|
157 * 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
|
158 * 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
|
159 * |
535 | 160 * We'll try 512 tiles before SYNC_FLUSH in a phase, if it fails try flush former 256 tiles. |
161 * If it will failed again, flush the previous line and do flush 512 tiles in new Packet. | |
162 * If it failed again try former 256 tiles flushed, if this failes again dicard the former half. | |
163 * The last case cannot happen but former 256 tiles have to be flushed, because the next 256 lines | |
164 * may failed again and restart the from this point. | |
165 * 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
|
166 * |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
167 * ブロードキャストパケットは64KB以内である必要がある |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
168 * タイルは64(縦)x64(横)x3(RGB)= 11288Byteであり、圧縮しない場合だと5tile分をパケットに含めることができる |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
169 * tileを圧縮すると10~100タイルを含めることができる。しかし、どのくらい圧縮できるかは予想不可能 |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
170 * 圧縮容量はDeflate.needsInputs()で確認することができる |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
171 * SYNC_FLUSHした時にneedsInputs()がfalseだった場合、書き込みを少なくする必要がある→パケットの容量不足、書き込み量を減らす |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
172 * |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
173 * あるphaseでSYNC_FLUSHをする前に512tileの書き込みを試す |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
174 * 失敗した場合半分の256tileで試す |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
175 * 更に失敗した場合は前の行までで書き込みを行い、新しいパケットで512tileを試す |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
176 * 更に更に失敗した場合は前半分の256タイルで書き込みを試す |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
177 * それでも失敗した場合は前半分の256タイルを破棄する?? |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
178 * 最後の場合は起こりえないが、次の256タイル(後半部256タイル)が失敗して一つ前の段階(前半部256タイル)から再開する可能性があるため |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
179 * 前半部を書き込む必要がある |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
180 * 次のパケットは、後の256タイルがいっぱいになってフラッシュされた状態で始まります。(次のパケットは後半部の256タイルが書き込まれていない状態で始まる?) |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
181 * |
528 | 182 * @param rfb |
183 * @param last | |
184 * @param rect | |
185 * @param bytes | |
186 * @param offset | |
187 * @param tileW | |
188 * @param tileH | |
189 */ | |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
190 |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
191 int MAX_ZTILE = 512; // 一つのパケットで圧縮を試す、最大のタイル数 |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
192 |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
193 // フェーズ分けして、ブロッキングを行なっている部分 |
531
13d3c4341d14
remove .idea modules fix for loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
529
diff
changeset
|
194 public void multicastPut(TreeRFBProto rfb, boolean last, FramebufferUpdateRectangle rect, byte[] bytes, int offset, int tileW, int tileH) { |
535 | 195 if (!blocking) return; |
540 | 196 int span = offset - prevoffset; // 一つ前のオフセットと現在のオフセットの差を出す |
197 deflater.setInput(bytes,prevoffset,span); // prevoffsetからspanまでに圧縮データを入れる | |
198 prevoffset = offset; // prevoffsetの更新 | |
199 c1rect.width += tileW; width += tileW; // prevoffsetが更新されたのでwidthもタイル一つ分更新? | |
200 if (c1rect.x > rect.x) { // phase 0 引数の場所よりも容量が大きい場合 = 行の途中から始まって行の最後までの間 | |
532 | 201 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
|
202 compressAndCheckFlush(rfb, rect, bytes, offset,false, last); |
532 | 203 } else { |
204 c1rect.width = rect.x+rect.width-c1rect.x ; | |
205 c1rect.height += tileH; | |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
206 compressAndCheckFlush(rfb,rect,bytes,offset,true, last); |
528 | 207 } |
540 | 208 } else { // phase 1 |
532 | 209 if (width >= rect.width) { |
210 c1rect.width = rect.width; | |
211 width = 0; | |
212 c1rect.height += tileH; | |
531
13d3c4341d14
remove .idea modules fix for loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
529
diff
changeset
|
213 prevLineOffset = offset; |
13d3c4341d14
remove .idea modules fix for loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
529
diff
changeset
|
214 prevC1Offset = c1.position(); |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
215 compressAndCheckFlush(rfb,rect,bytes,offset,true, last); |
533 | 216 } else { |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
217 compressAndCheckFlush(rfb,rect,bytes,offset,false, last); |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
218 } |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
219 } |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
220 } |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
221 |
540 | 222 |
223 // 圧縮とパケットへの書き込み | |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
224 private void compressAndCheckFlush(TreeRFBProto rfb, FramebufferUpdateRectangle rect, byte[] bytes, int offset, boolean flush, boolean last) { |
535 | 225 ztileInLine++; |
540 | 226 deflater.deflate(c1, Deflater.NO_FLUSH); |
227 int headerLength = 20; | |
228 if (!deflater.needsInput()) { | |
229 deflater.finish(); | |
230 if (offset != prevLineOffset) { // phase 2 | |
231 c1.limit(c1.limit() + headerLength); | |
232 // to make rectangle header shift last bytes | |
233 for (int i = 0; i < c1.position() - prevC1Offset; i++) { | |
234 c1.array()[prevC1Offset + headerLength - i] = c1.array()[prevC1Offset - i]; | |
235 } | |
236 c1.putShort(prevC1Offset + 1, (short) c1rect.x); | |
237 c1.putShort(rectPos + 3, (short) c1rect.y); | |
238 c1.putShort(rectPos + 5, (short) c1rect.width); | |
239 c1.putShort(rectPos + 7, (short) c1rect.height); | |
240 c1.putInt(rectPos + 9, EncodingType.ZRLEE.getId()); | |
241 c1.putInt(rectPos + 13, c1.position() - rectPos - 12); // data length | |
242 c1.putShort(2, (short) (c1.getShort(2) + 1)); // increment rectangle count | |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
243 } |
540 | 244 flushMuticast(rfb); |
245 newMulticastPacket(rfb, rect); | |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
246 deflater.deflate(c1, Deflater.NO_FLUSH); |
528 | 247 } |
540 | 248 nextRectangle(rect); |
528 | 249 } |
250 | |
251 /** | |
252 * fix rectangle header | |
253 * create next rectangle header | |
254 * update position paramater | |
255 * send muticast pacate if nessesally | |
256 */ | |
532 | 257 private void flushRectangle(FramebufferUpdateRectangle rect) { |
529 | 258 c1.putShort(rectPos + 0, (short)c1rect.x); |
259 c1.putShort(rectPos + 2, (short)c1rect.y); | |
260 c1.putShort(rectPos + 4, (short)c1rect.width); | |
261 c1.putShort(rectPos + 6, (short)c1rect.height); | |
262 c1.putInt(rectPos + 8,EncodingType.ZRLEE.getId()); | |
532 | 263 c1.putInt(rectPos + 12, c1.position()-rectPos-12); // data length |
529 | 264 rectPos = c1.position(); |
532 | 265 c1.putShort(2,(short)(c1.getShort(2)+1)); // increment rectangle count |
266 nextRectangle(rect); | |
534
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
267 ztileInLine = 0; |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
268 } |
a3d0ba67e8cf
try 512 tiles / 256 tiles flush
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
533
diff
changeset
|
269 |
532 | 270 private void nextRectangle(FramebufferUpdateRectangle rect) { |
271 if (c1rect.x+c1rect.width < rect.x+rect.width) { | |
272 c1rect.x = c1rect.width; // next rectangle is phase 1 | |
273 } else { | |
274 c1rect.x = rect.x; | |
275 c1rect.y += c1rect.height; | |
276 } | |
277 width = 0; | |
531
13d3c4341d14
remove .idea modules fix for loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
529
diff
changeset
|
278 c1rect.width = 0; |
13d3c4341d14
remove .idea modules fix for loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
529
diff
changeset
|
279 c1rect.height = 0; |
528 | 280 } |
281 | |
531
13d3c4341d14
remove .idea modules fix for loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
529
diff
changeset
|
282 private void flushMuticast(TreeRFBProto rfb) { |
528 | 283 c1.flip(); |
284 //System.out.println("multicastPut: " + c1rect + " length: " + (c1.remaining()-c1headerPos-header.limit())); | |
285 try { | |
529 | 286 deflater.reset(); |
287 | |
288 LinkedList<ByteBuffer> bufs = new LinkedList<ByteBuffer>(); | |
289 bufs.add(c1); | |
290 if (rfb.isTreeManager() && rfb.connectionPresenter.isUseMulticast()) { | |
291 for (ByteBuffer buf : bufs) | |
292 rfb.getViewer().getRfbBroadcastListener().multicastUpdateRectangle(buf); | |
293 } else { | |
294 rfb.multicastqueue.waitput(bufs); | |
295 } | |
528 | 296 } catch (InterruptedException e) { |
297 e.printStackTrace(); | |
298 } | |
299 } | |
300 } | |
526 | 301 |
302 @Override | |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
303 public void decode(Reader reader, Renderer renderer, |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
304 FramebufferUpdateRectangle rect) throws TransportException { |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
305 int zippedLength = (int) reader.readUInt32(); |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
306 if (0 == zippedLength) return; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
307 int length = rect.width * rect.height * renderer.getBytesPerPixel(); |
3 | 308 byte[] bytes = unzip(reader, zippedLength, length, rect.getEncodingType()); |
526 | 309 decode1(renderer, null, rect, bytes, zippedLength, null); |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
310 } |
533 | 311 |
312 | |
313 public void multicastDecode(Reader reader, Renderer renderer, | |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
314 FramebufferUpdateRectangle rect, TreeRFBProto rfb) throws TransportException { |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
315 ByteBuffer header = ByteBuffer.allocate(16); |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
316 reader.read(header.array()); |
533 | 317 int zippedLength = (int) reader.readUInt32(); |
318 if (0 == zippedLength) return; | |
319 int length = rect.width * rect.height * renderer.getBytesPerPixel(); | |
320 byte[] bytes = unzip(reader, zippedLength, length, rect.getEncodingType()); | |
321 decode1(renderer, header, rect, bytes, zippedLength, rfb); | |
322 } | |
323 | |
526 | 324 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
|
325 int offset = zippedLength; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
326 int maxX = rect.x + rect.width; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
327 int maxY = rect.y + rect.height; |
528 | 328 |
533 | 329 TileLoop tileloop = new TileLoop(zippedLength); |
501 | 330 //System.out.println("decode1: "+rect); |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
331 if (null == palette) { |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
332 palette = new int [128]; |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
333 } |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
334 if (null == decodedBitmap) { |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
335 decodedBitmap = new int[MAX_TILE_SIZE * MAX_TILE_SIZE]; |
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
336 } |
526 | 337 |
338 if (rfbProto.multicastBlocking) { | |
535 | 339 tileloop.zrleeBlocking(rfbProto, header, rect,bytes); |
526 | 340 } |
57
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
341 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
|
342 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
|
343 |
57
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
344 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
|
345 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
|
346 int subencoding = bytes[offset++] & 0x0ff; |
63 | 347 if(subencoding!=0) |
348 System.out.println("----------------"+subencoding); | |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
349 // 128 -plain RLE, 130-255 - Palette RLE |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
350 boolean isRle = (subencoding & 128) != 0; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
351 // 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
|
352 int paletteSize = subencoding & 127; |
57
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
353 offset += readPalette(bytes, offset, renderer, paletteSize); |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
354 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
|
355 renderer.fillRect(palette[0], tileX, tileY, tileWidth, tileHeight); |
500 | 356 } else if (isRle) { |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
357 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
|
358 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
|
359 } else { |
57
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
360 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
|
361 } |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
362 } else { |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
363 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
|
364 offset += decodeRaw(bytes, offset, renderer, tileX, tileY, tileWidth, tileHeight); |
63 | 365 // System.out.println("offset:"+offset); |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
366 } else { |
57
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
367 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
|
368 } |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
369 } |
531
13d3c4341d14
remove .idea modules fix for loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
529
diff
changeset
|
370 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
|
371 } |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
372 } |
531
13d3c4341d14
remove .idea modules fix for loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
529
diff
changeset
|
373 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
|
374 } |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
375 |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
376 private int decodePlainRle(byte[] bytes, int offset, Renderer renderer, |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
377 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
|
378 int bytesPerCPixel = renderer.getBytesPerCPixel(); |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
379 int decodedOffset = 0; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
380 int decodedEnd = tileWidth * tileHeight; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
381 int index = offset; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
382 while (decodedOffset < decodedEnd) { |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
383 int color = renderer.getCompactPixelColor(bytes, index); |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
384 index += bytesPerCPixel; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
385 int rlength = 1; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
386 do { |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
387 rlength += bytes[index] & 0x0ff; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
388 } while ((bytes[index++] & 0x0ff) == 255); |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
389 assert rlength <= decodedEnd - decodedOffset; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
390 renderer.fillColorBitmapWithColor(decodedBitmap, decodedOffset, rlength, color); |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
391 decodedOffset += rlength; |
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 renderer.drawColoredBitmap(decodedBitmap, tileX, tileY, tileWidth, tileHeight); |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
394 return index - offset; |
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 decodePaletteRle(byte[] bytes, int offset, Renderer renderer, |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
398 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
|
399 int decodedOffset = 0; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
400 int decodedEnd = tileWidth * tileHeight; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
401 int index = offset; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
402 while (decodedOffset < decodedEnd) { |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
403 int colorIndex = bytes[index++]; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
404 int color = palette[colorIndex & 127]; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
405 int rlength = 1; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
406 if ((colorIndex & 128) != 0) { |
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++] == (byte) 255); |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
410 } |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
411 assert rlength <= decodedEnd - decodedOffset; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
412 renderer.fillColorBitmapWithColor(decodedBitmap, decodedOffset, rlength, color); |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
413 decodedOffset += rlength; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
414 } |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
415 renderer.drawColoredBitmap(decodedBitmap, tileX, tileY, tileWidth, tileHeight); |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
416 return index - offset; |
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 |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
419 private int decodePacked(byte[] bytes, int offset, Renderer renderer, |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
420 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
|
421 int bitsPerPalletedPixel = paletteSize > 16 ? 8 : paletteSize > 4 ? 4 |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
422 : paletteSize > 2 ? 2 : 1; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
423 int packedOffset = offset; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
424 int decodedOffset = 0; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
425 for (int i = 0; i < tileHeight; ++i) { |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
426 int decodedRowEnd = decodedOffset + tileWidth; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
427 int byteProcessed = 0; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
428 int bitsRemain = 0; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
429 |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
430 while (decodedOffset < decodedRowEnd) { |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
431 if (bitsRemain == 0) { |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
432 byteProcessed = bytes[packedOffset++]; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
433 bitsRemain = 8; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
434 } |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
435 bitsRemain -= bitsPerPalletedPixel; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
436 int index = byteProcessed >> bitsRemain & (1 << bitsPerPalletedPixel) - 1 & 127; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
437 int color = palette[index]; |
57
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
438 renderer.fillColorBitmapWithColor(decodedBitmap, decodedOffset, 1, color); |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
439 ++decodedOffset; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
440 } |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
441 } |
57
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
442 renderer.drawColoredBitmap(decodedBitmap, tileX, tileY, tileWidth, tileHeight); |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
443 return packedOffset - offset; |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
444 } |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
445 |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
446 private int decodeRaw(byte[] bytes, int offset, Renderer renderer, |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
447 int tileX, int tileY, int tileWidth, int tileHeight) throws TransportException { |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
448 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
|
449 } |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
450 |
57
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
451 private int readPalette(byte[] bytes, int offset, Renderer renderer, int paletteSize) { |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
452 final int bytesPerCPixel = renderer.getBytesPerCPixel(); |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
453 for (int i=0; i<paletteSize; ++i) { |
539
0d11471e0b5b
add comment ZRLEDecoder
e165729 <e165729@ie.u-ryukyu.ac.jp>
parents:
538
diff
changeset
|
454 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
|
455 } |
57
17b702648079
version2.7.2 original version.
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
456 return paletteSize * bytesPerCPixel; |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
457 } |
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
458 |
526 | 459 |
460 | |
0
4689cc86d6cb
create TreeViewer2 Repository
Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
461 } |