private void HandleFramebufferUpdateRequest() { var incremental = this.c.ReceiveByte() != 0; var region = this.c.ReceiveRectangle(); if (!incremental && this.ClientEncodings.Contains(VncEncoding.ExtendedDesktopSize) && this.fbSource.SupportsResizing) { List <Rectangle> rectangles = new List <Rectangle>(); rectangles.Add( this.GetExtendedDesktopSizeRectangle( ExtendedDesktopSizeReason.External, ExtendedDesktopSizeStatus.Success)); this.SendRectangles(rectangles); } lock (this.FramebufferUpdateRequestLock) { this.logger?.LogDebug($"Received a FramebufferUpdateRequest command for {region}"); region = VncRectangle.Intersect(region, new VncRectangle(0, 0, this.Framebuffer.Width, this.Framebuffer.Height)); if (region.IsEmpty) { return; } this.FramebufferUpdateRequest = new FramebufferUpdateRequest(incremental, region); this.FramebufferChanged(); } }
/// <inheritdoc/> public void FramebufferManualInvalidate(VncRectangle region) { var fb = this.Framebuffer; var cpf = this.clientPixelFormat; region = VncRectangle.Intersect(region, new VncRectangle(0, 0, this.clientWidth, this.clientHeight)); if (region.IsEmpty) { return; } int x = region.X, y = region.Y, w = region.Width, h = region.Height, bpp = cpf.BytesPerPixel; var contents = new byte[w * h * bpp]; VncPixelFormat.Copy( fb.GetBuffer(), fb.Width, fb.Stride, fb.PixelFormat, region, contents, w, w * bpp, cpf); this.AddRegion(region, VncEncoding.Raw, contents); }
/// <inheritdoc/> public void FramebufferManualInvalidate(VncRectangle region) { var fb = this.Framebuffer; var cpf = this.clientPixelFormat; region = VncRectangle.Intersect(region, new VncRectangle(0, 0, this.clientWidth, this.clientHeight)); if (region.IsEmpty) { return; } int x = region.X, y = region.Y, w = region.Width, h = region.Height, bpp = cpf.BytesPerPixel; var contents = new byte[w * h * bpp]; VncPixelFormat.Copy( fb.GetBuffer(), fb.Width, fb.Stride, fb.PixelFormat, region, contents, w, w * bpp, cpf); #if DEFLATESTREAM_FLUSH_WORKS if (_clientEncoding.Contains(VncEncoding.Zlib)) { _zlibMemoryStream.Position = 0; _zlibMemoryStream.SetLength(0); _zlibMemoryStream.Write(new byte[4], 0, 4); if (_zlibDeflater == null) { _zlibMemoryStream.Write(new[] { (byte)120, (byte)218 }, 0, 2); _zlibDeflater = new DeflateStream(_zlibMemoryStream, CompressionMode.Compress, false); } _zlibDeflater.Write(contents, 0, contents.Length); _zlibDeflater.Flush(); contents = _zlibMemoryStream.ToArray(); VncUtility.EncodeUInt32BE(contents, 0, (uint)(contents.Length - 4)); AddRegion(region, VncEncoding.Zlib, contents); } else #endif { this.AddRegion(region, VncEncoding.Raw, contents); } }
private void HandleFramebufferUpdateRequest() { var incremental = this.c.ReceiveByte() != 0; var region = this.c.ReceiveRectangle(); lock (this.FramebufferUpdateRequestLock) { this.logger?.Log(LogLevel.Info, () => $"Received a FramebufferUpdateRequest command for {region}"); region = VncRectangle.Intersect(region, new VncRectangle(0, 0, this.Framebuffer.Width, this.Framebuffer.Height)); if (region.IsEmpty) { return; } this.FramebufferUpdateRequest = new FramebufferUpdateRequest(incremental, region); this.FramebufferChanged(); } }
/// <inheritdoc/> public void FramebufferManualInvalidate(VncRectangle region) { var fb = this.Framebuffer; var cpf = this.clientPixelFormat; region = VncRectangle.Intersect(region, new VncRectangle(0, 0, this.clientWidth, this.clientHeight)); if (region.IsEmpty) { return; } int x = region.X, y = region.Y, w = region.Width, h = region.Height, bpp = cpf.BytesPerPixel; var contents = new byte[w * h * bpp]; VncPixelFormat.Copy( fb.GetBuffer(), fb.Width, fb.Stride, fb.PixelFormat, region, contents, w, w * bpp, cpf); if (clientEncoding.Contains(VncEncoding.Zlib)) { byte[] zlibContents = Compress(contents); var lenArray = new byte[4]; VncUtility.EncodeUInt32BE(lenArray, 0, (uint)(zlibContents.Length)); var finArray = Combine(lenArray, zlibContents); AddRegion(region, VncEncoding.Zlib, finArray); } else { this.AddRegion(region, VncEncoding.Raw, contents); } }