From ccf6e7cdccb908dcef90ae046027affb9dde5386 Mon Sep 17 00:00:00 2001 From: enikey Date: Fri, 19 Dec 2008 06:00:18 +0000 Subject: [PATCH] [Developement] Added RREDecoder body (overrided handleRect method and constructors). git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@3419 3789f03b-4d11-0410-bbf8-ca57d06f2519 --- java/src/com/tightvnc/decoder/RREDecoder.java | 71 ++++++++++++++++++- java/src/com/tightvnc/decoder/RawDecoder.java | 1 + 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/java/src/com/tightvnc/decoder/RREDecoder.java b/java/src/com/tightvnc/decoder/RREDecoder.java index 82ddb2ec..ce70606d 100644 --- a/java/src/com/tightvnc/decoder/RREDecoder.java +++ b/java/src/com/tightvnc/decoder/RREDecoder.java @@ -1,5 +1,74 @@ package com.tightvnc.decoder; -public class RREDecoder { +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 { + + 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 { + 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 RecordInterface + // + if (rec.canWrite()) { + rec.writeIntBE(nSubrects); + rec.write(bg_buf); + rec.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); + } + } } diff --git a/java/src/com/tightvnc/decoder/RawDecoder.java b/java/src/com/tightvnc/decoder/RawDecoder.java index ad0cfac7..f2442107 100644 --- a/java/src/com/tightvnc/decoder/RawDecoder.java +++ b/java/src/com/tightvnc/decoder/RawDecoder.java @@ -15,6 +15,7 @@ import java.awt.Toolkit; // This is base decoder class. // Other classes will be childs of RawDecoder. // + public class RawDecoder { public RawDecoder(Graphics g, RfbInputStream is) { -- 2.39.5