Mercurial > hg > Applications > TreeVNC
diff src/main/java/com/glavsoft/rfb/encoding/decoder/HextileDecoder.java @ 0:4689cc86d6cb
create TreeViewer2 Repository
author | Yu Taninari <you@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 03 Jul 2012 13:20:49 +0900 |
parents | |
children | 17b702648079 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/com/glavsoft/rfb/encoding/decoder/HextileDecoder.java Tue Jul 03 13:20:49 2012 +0900 @@ -0,0 +1,110 @@ +// Copyright (C) 2010, 2011 GlavSoft LLC. +// All rights reserved. +// +//------------------------------------------------------------------------- +// This file is part of the TightVNC software. Please visit our Web site: +// +// http://www.tightvnc.com/ +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//------------------------------------------------------------------------- +// + +package com.glavsoft.rfb.encoding.decoder; + +import com.glavsoft.drawing.Renderer; +import com.glavsoft.exceptions.TransportException; +import com.glavsoft.transport.Reader; + + +public class HextileDecoder extends Decoder { + private static final int DEFAULT_TILE_SIZE = 16; + private static final int RAW_MASK = 1; + private static final int BACKGROUND_SPECIFIED_MASK = 2; + private static final int FOREGROUND_SPECIFIED_MASK = 4; + private static final int ANY_SUBRECTS_MASK = 8; + private static final int SUBRECTS_COLOURED_MASK = 16; + private static final int FG_COLOR_INDEX = 0; + private static final int BG_COLOR_INDEX = 1; + + @Override + public void decode(Reader reader, Renderer renderer, + FramebufferUpdateRectangle rect) throws TransportException { + if (rect.width == 0 || rect.height == 0) return; + int[] colors = new int[] {-1, -1}; + int maxX = rect.x + rect.width; + int maxY = rect.y + rect.height; + for (int tileY = rect.y; tileY < maxY; + tileY += DEFAULT_TILE_SIZE) { + int tileHeight = Math.min(maxY - tileY, DEFAULT_TILE_SIZE); + for (int tileX = rect.x; tileX < maxX; + tileX += DEFAULT_TILE_SIZE) { + int tileWidth = Math.min(maxX - tileX, DEFAULT_TILE_SIZE); + decodeHextileSubrectangle(reader, renderer, colors, tileX, + tileY, tileWidth, tileHeight); + } + } + + } + + private void decodeHextileSubrectangle(Reader reader, + Renderer renderer, int[] colors, + int tileX, int tileY, int tileWidth, int tileHeight) + throws TransportException { + + int subencoding = reader.readUInt8(); + + if ((subencoding & RAW_MASK) != 0) { + RawDecoder.getInstance().decode(reader, renderer, + tileX, tileY, tileWidth, tileHeight); + return; + } + + if ((subencoding & BACKGROUND_SPECIFIED_MASK) != 0) { + colors[BG_COLOR_INDEX] = renderer.readPixelColor(reader); + } + assert colors[BG_COLOR_INDEX] != -1; + renderer.fillRect(colors[BG_COLOR_INDEX], + tileX, tileY, tileWidth, tileHeight); + + if ((subencoding & FOREGROUND_SPECIFIED_MASK) != 0) { + colors[FG_COLOR_INDEX] = renderer.readPixelColor(reader); + } + + if ((subencoding & ANY_SUBRECTS_MASK) == 0) + return; + + int numberOfSubrectangles = reader.readUInt8(); + boolean colorSpecified = + (subencoding & SUBRECTS_COLOURED_MASK) != 0; + for (int i = 0; i < numberOfSubrectangles; ++i) { + if (colorSpecified) { + colors[FG_COLOR_INDEX] = renderer.readPixelColor(reader); + } + byte dimensions = reader.readByte(); // bits 7-4 for x, bits 3-0 for y + int subtileX = dimensions >> 4 & 0x0f; + int subtileY = dimensions & 0x0f; + dimensions = reader.readByte(); // bits 7-4 for w, bits 3-0 for h + int subtileWidth = 1 + (dimensions >> 4 & 0x0f); + int subtileHeight = 1 + (dimensions & 0x0f); + assert colors[FG_COLOR_INDEX] != -1; + renderer.fillRect(colors[FG_COLOR_INDEX], + tileX + subtileX, tileY + subtileY, + subtileWidth, subtileHeight); + } + } + + +}