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(); } } }
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; } } }
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); } } }