Mercurial > hg > Applications > TightVNC_orginal
diff src/main/java/com/glavsoft/rfb/encoding/decoder/TightDecoder.java @ 52:472a9bcacb21 draft default tip
TightVNC 2.7.1.0
author | you@cr.ie.u-ryukyu.ac.jp |
---|---|
date | Wed, 07 Aug 2013 19:01:17 +0900 |
parents | 4689cc86d6cb |
children |
line wrap: on
line diff
--- a/src/main/java/com/glavsoft/rfb/encoding/decoder/TightDecoder.java Tue Jul 03 13:20:49 2012 +0900 +++ b/src/main/java/com/glavsoft/rfb/encoding/decoder/TightDecoder.java Wed Aug 07 19:01:17 2013 +0900 @@ -1,4 +1,4 @@ -// Copyright (C) 2010, 2011 GlavSoft LLC. +// Copyright (C) 2010, 2011, 2012, 2013 GlavSoft LLC. // All rights reserved. // //------------------------------------------------------------------------- @@ -24,15 +24,15 @@ package com.glavsoft.rfb.encoding.decoder; -import java.util.logging.Logger; -import java.util.zip.DataFormatException; -import java.util.zip.Inflater; - import com.glavsoft.drawing.ColorDecoder; import com.glavsoft.drawing.Renderer; import com.glavsoft.exceptions.TransportException; import com.glavsoft.transport.Reader; +import java.util.logging.Logger; +import java.util.zip.DataFormatException; +import java.util.zip.Inflater; + /** * Tight protocol extention decoder */ @@ -54,17 +54,16 @@ Inflater[] decoders; private int decoderId; + private int[] palette; - final static int tightZlibBufferSize = 512; - - public TightDecoder() { + public TightDecoder() { reset(); } @Override public void decode(Reader reader, Renderer renderer, FramebufferUpdateRectangle rect) throws TransportException { - int bytesPerPixel = renderer.getBytesPerPixelSignificant(); + int bytesPerPixel = renderer.getBytesPerPixelTight(); /** * bits @@ -88,19 +87,12 @@ renderer.fillRect(color, rect); break; case JPEG_TYPE: - if (bytesPerPixel != 3) { -// throw new EncodingException( -// "Tight doesn't support JPEG subencoding while depth not equal to 24bpp is used"); - } + assert 3 == bytesPerPixel : "Tight doesn't support JPEG subencoding while depth not equal to 24bpp is used"; processJpegType(reader, renderer, rect); break; default: - if (compType > JPEG_TYPE) { -// throw new EncodingException( -// "Compression control byte is incorrect!"); - } else { - processBasicType(compControl, reader, renderer, rect); - } + assert compType <= JPEG_TYPE : "Compression control byte is incorrect!"; + processBasicType(compControl, reader, renderer, rect); } } @@ -112,7 +104,7 @@ if ((compControl & FILTER_ID_MASK) > 0) { // filter byte presence filterId = reader.readUInt8(); } - int bytesPerCPixel = renderer.getBytesPerPixelSignificant(); + int bytesPerCPixel = renderer.getBytesPerPixelTight(); int lengthCurrentbpp = bytesPerCPixel * rect.width * rect.height; byte [] buffer; switch (filterId) { @@ -122,12 +114,12 @@ break; case PALETTE_FILTER: int paletteSize = reader.readUInt8() + 1; - int[] palette = readPalette(paletteSize, reader, renderer); + completePalette(paletteSize, reader, renderer); int dataLength = paletteSize == 2 ? rect.height * ((rect.width + 7) / 8) : rect.width * rect.height; buffer = readTightData(dataLength, reader); - renderer.drawBytesWithPalette(buffer, rect, palette); + renderer.drawBytesWithPalette(buffer, rect, palette, paletteSize); break; case GRADIENT_FILTER: /* @@ -182,20 +174,19 @@ } /** - * Read palette from reader + * Complete palette from reader */ - private int[] readPalette(int paletteSize, Reader reader, Renderer renderer) throws TransportException { + private void completePalette(int paletteSize, Reader reader, Renderer renderer) throws TransportException { /** * When bytesPerPixel == 1 && paletteSize == 2 read 2 bytes of palette * When bytesPerPixel == 1 && paletteSize != 2 - error * When bytesPerPixel == 3 (4) read (paletteSize * 3) bytes of palette * so use renderer.readPixelColor */ - int[] palette = new int[paletteSize]; - for (int i = 0; i < palette.length; ++i) { + if (null == palette) palette = new int[256]; + for (int i = 0; i < paletteSize; ++i) { palette[i] = renderer.readTightPixelColor(reader); } - return palette; } /** @@ -203,7 +194,7 @@ * uncompressed data. When compressed decompresses it. * * @param expectedLength expected data length in bytes - * @param reader + * @param reader data source * @return result data * @throws TransportException */ @@ -224,7 +215,7 @@ * which need to be ignored. Use only first expectedLength bytes. * * @param expectedLength expected data length - * @param reader + * @param reader data source * @return decompressed data (length == expectedLength) / + followed raw data (ignore, please) * @throws TransportException */ @@ -262,7 +253,7 @@ * Lower 7 bit of each byte contains significant data. Max bytes = 3. * Less significant bytes first order. * - * @param reader + * @param reader data source * @return int value * @throws TransportException */ @@ -281,7 +272,7 @@ /** * Flush (reset) zlib decoders when bits 3, 2, 1, 0 of compControl is set - * @param compControl + * @param compControl control flags */ private void resetDecoders(int compControl) { for (int i=0; i < DECODERS_NUM; ++i) {