diff options
author | Adam Tkac <atkac@redhat.com> | 2009-03-13 13:11:51 +0000 |
---|---|---|
committer | Adam Tkac <atkac@redhat.com> | 2009-03-13 13:11:51 +0000 |
commit | d0e84634e0058af86d39f1609dff2089684247d7 (patch) | |
tree | c74c060f6cc64f5318f330e70861c2d7ce4e5b6f /java/src/com/tigervnc/decoder/RREDecoder.java | |
parent | b184fc81d62fab3c2f909e8a15961ec0ca491b99 (diff) | |
download | tigervnc-d0e84634e0058af86d39f1609dff2089684247d7.tar.gz tigervnc-d0e84634e0058af86d39f1609dff2089684247d7.zip |
Rename java/src/com/tightvnc to java/src/com/tigervnc.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@3672 3789f03b-4d11-0410-bbf8-ca57d06f2519
Diffstat (limited to 'java/src/com/tigervnc/decoder/RREDecoder.java')
-rw-r--r-- | java/src/com/tigervnc/decoder/RREDecoder.java | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/java/src/com/tigervnc/decoder/RREDecoder.java b/java/src/com/tigervnc/decoder/RREDecoder.java new file mode 100644 index 00000000..02eb513f --- /dev/null +++ b/java/src/com/tigervnc/decoder/RREDecoder.java @@ -0,0 +1,85 @@ +package com.tightvnc.decoder; + +import com.tightvnc.vncviewer.RfbInputStream; +import java.awt.Graphics; +import java.awt.Color; +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; + +// +// Class that used for decoding RRE encoded data. +// + +public class RREDecoder extends RawDecoder { + + final static int EncodingRRE = 2; + + public RREDecoder(Graphics g, RfbInputStream is) { + super(g, is); + } + + public RREDecoder(Graphics g, RfbInputStream is, int frameBufferW, + int frameBufferH) { + super(g, is, frameBufferW, frameBufferH); + } + + // + // Override handleRect method to decode RRE encoded data insted of + // raw pixel data. + // + + public void handleRect(int x, int y, int w, int h) throws IOException { + + // + // Write encoding ID to record output stream + // + + if (dos != null) { + dos.writeInt(RREDecoder.EncodingRRE); + } + + int nSubrects = rfbis.readU32(); + byte[] bg_buf = new byte[bytesPerPixel]; + rfbis.readFully(bg_buf); + Color pixel; + if (bytesPerPixel == 1) { + pixel = getColor256()[bg_buf[0] & 0xFF]; + } else { + pixel = new Color(bg_buf[2] & 0xFF, bg_buf[1] & 0xFF, bg_buf[0] & 0xFF); + } + graphics.setColor(pixel); + graphics.fillRect(x, y, w, h); + byte[] buf = new byte[nSubrects * (bytesPerPixel + 8)]; + rfbis.readFully(buf); + DataInputStream ds = new DataInputStream(new ByteArrayInputStream(buf)); + + // + // Save decoded data to data output stream + // + if (dos != null) { + dos.writeInt(nSubrects); + dos.write(bg_buf); + dos.write(buf); + } + + int sx, sy, sw, sh; + for (int j = 0; j < nSubrects; j++) { + if (bytesPerPixel == 1) { + pixel = getColor256()[ds.readUnsignedByte()]; + } else { + ds.skip(4); + pixel = new Color(buf[j*12+2] & 0xFF, + buf[j*12+1] & 0xFF, + buf[j*12] & 0xFF); + } + sx = x + ds.readUnsignedShort(); + sy = y + ds.readUnsignedShort(); + sw = ds.readUnsignedShort(); + sh = ds.readUnsignedShort(); + + graphics.setColor(pixel); + graphics.fillRect(sx, sy, sw, sh); + } + } +} |