示例#1
0
 public override void Decode(Rectangle r)
 {
     for (int y = 0; y < r.Height; y++)
     {
         int z = r.X + (y + r.Y) * Framebuffer.Width;
         for (int x = 0; x < r.Width; x++)
         {
             Framebuffer.PixelData[x + z] = PixelReader.ReadPixel();
         }
     }
 }
示例#2
0
        private void ReadZrlePlainRLEPixels(int tw, int th, int[] tileBuffer)
        {
            var ptr = 0;
            var end = ptr + tw * th;

            while (ptr < end)
            {
                var pix = PixelReader.ReadPixel();
                var len = 1;
                int b;
                do
                {
                    b    = _DSerializer.ReadByte();
                    len += b;
                } while (b == byte.MaxValue);

                while (len-- > 0)
                {
                    tileBuffer[ptr++] = pix;
                }
            }
        }
示例#3
0
        public override void Decode(Rectangle r)
        {
            FillBuffer();

            for (var ty = 0; ty < r.Height; ty += TileHeight)
            {
                var th = Math.Min(r.Height - ty, TileHeight);

                for (var tx = 0; tx < r.Width; tx += TileWidth)
                {
                    var tw = Math.Min(r.Width - tx, TileWidth);

                    var subencoding = _DSerializer.ReadByte();

                    if (subencoding >= 17 && subencoding <= 127 || subencoding == 129)
                    {
                        throw new VncException("Invalid subencoding value");
                    }

                    var isRLE       = (subencoding & 128) != 0;
                    var paletteSize = subencoding & 127;

                    var tileRect = new Rectangle(tx, ty, tw, th);
                    var destRect = new Rectangle(tx + r.X, ty + r.Y, tw, th);

                    // Fill palette
                    for (var i = 0; i < paletteSize; i++)
                    {
                        _Palette[i] = PixelReader.ReadPixel();
                    }

                    if (paletteSize == 1)
                    {
                        FillRect(destRect, _Palette[0]);
                        continue;
                    }

                    if (!isRLE)
                    {
                        if (paletteSize == 0)
                        {
                            _RawDecoder.Decode(destRect); // Raw Pixel
                        }
                        else
                        {
                            ReadZrlePackedPixels(tw, th, _Palette, paletteSize, _TileBuffer);  // Packed palette
                        }
                    }
                    else
                    {
                        if (paletteSize == 0)
                        {
                            ReadZrlePlainRLEPixels(tw, th, _TileBuffer); // Plain RLE
                        }
                        else
                        {
                            ReadZrlePackedRLEPixels(tw, th, _Palette, _TileBuffer);  // Packed RLE palette
                        }
                    }

                    CopyTile(_TileBuffer, destRect);
                }
            }
        }