| package com.tigervnc.decoder; |
| |
| import com.tigervnc.vncviewer.RfbInputStream; |
| import java.awt.Graphics; |
| import java.io.IOException; |
| import java.util.zip.DataFormatException; |
| import java.util.zip.Inflater; |
| |
| // |
| // Class that used for decoding ZLib encoded data. |
| // |
| |
| public class ZlibDecoder extends RawDecoder { |
| |
| final static int EncodingZlib = 6; |
| |
| public ZlibDecoder(Graphics g, RfbInputStream is) { |
| super(g, is); |
| } |
| |
| public ZlibDecoder(Graphics g, RfbInputStream is, int frameBufferW, |
| int frameBufferH) { |
| super(g, is, frameBufferW, frameBufferH); |
| } |
| |
| // |
| // Override handleRect method to decode ZLib 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. |
| // Remark: we forced changed encoding from zlib to raw |
| // cause at this moment we cannot save data in zlib encoding. |
| // |
| |
| if (dos != null) { |
| dos.writeInt(RawDecoder.EncodingRaw); |
| } |
| |
| int nBytes = rfbis.readU32(); |
| |
| if (zlibBuf == null || zlibBufLen < nBytes) { |
| zlibBufLen = nBytes * 2; |
| zlibBuf = new byte[zlibBufLen]; |
| } |
| |
| rfbis.readFully(zlibBuf, 0, nBytes); |
| |
| if (zlibInflater == null) { |
| zlibInflater = new Inflater(); |
| } |
| zlibInflater.setInput(zlibBuf, 0, nBytes); |
| |
| try { |
| if (bytesPerPixel == 1) { |
| for (int dy = y; dy < y + h; dy++) { |
| zlibInflater.inflate(pixels8, dy * framebufferWidth + x, w); |
| |
| // |
| // Save decoded raw data to data output stream |
| // |
| |
| if (dos != null) |
| dos.write(pixels8, dy * framebufferWidth + x, w); |
| } |
| } else { |
| byte[] buf = new byte[w * 4]; |
| int i, offset; |
| for (int dy = y; dy < y + h; dy++) { |
| zlibInflater.inflate(buf); |
| offset = dy * framebufferWidth + x; |
| for (i = 0; i < w; i++) { |
| RawDecoder.pixels24[offset + i] = |
| (buf[i * 4 + 2] & 0xFF) << 16 | |
| (buf[i * 4 + 1] & 0xFF) << 8 | |
| (buf[i * 4] & 0xFF); |
| } |
| |
| // |
| // Save decoded raw data to data output stream |
| // |
| |
| if (dos != null) |
| dos.write(buf); |
| } |
| } |
| } catch (DataFormatException ex) { |
| ex.printStackTrace(); |
| } |
| handleUpdatedPixels(x, y, w, h); |
| } |
| |
| // |
| // Zlib encoder's data. |
| // |
| |
| protected byte[] zlibBuf; |
| protected int zlibBufLen = 0; |
| protected Inflater zlibInflater; |
| } |