private void GetScreen() { lock (LOCK) { try { Rectangle bounds = Rectangle.Empty; interruptGrabbing = false; while (!interruptGrabbing) { nextScreen = screenGrabber.GetScreenShot(); if (nextScreen == null) { break; } bounds = LdpScreenProcessingUtils.GetBoundingBoxForChanges(nextScreen, prevScreen); if (bounds != Rectangle.Empty) { interruptGrabbing = true; CheckRectangleBounds(ref bounds); difference = LdpScreenProcessingUtils.CopyRegion(nextScreen, bounds); origData = LdpScreenProcessingUtils.ImageToByteArray(difference); baseLenght = origData.Length; compressed = LZ4Codec.Encode(origData, 0, baseLenght); rect = LdpRectangle.CreateBuilder(); rect.Left = bounds.Left; rect.Top = bounds.Top; rect.Right = bounds.Right; rect.Bottom = bounds.Bottom; SendScreenResponse(compressed, baseLenght, rect); difference.Dispose(); difference = null; rect = null; origData = null; compressed = null; } prevScreen = nextScreen; } } catch (Exception ex) { LdpLog.Error("GetScreen thrown:\n" + ex.Message); } } }
private void SendScreenResponse(byte[] compr, int len, LdpRectangle.Builder r) { screenResponse = null; responsePacket = null; screenResponse = packetFactory.SetScreenResponse(compr, len, r); responsePacket = packetFactory.BuildPacket(screenResponse); serverHandler.GetSenderChannel.Send(responsePacket); }
public LdpScreenResponse SetScreenResponse(byte[] compressed, int baseLenght, LdpRectangle.Builder rect) { var response = LdpScreenResponse.CreateBuilder(); ByteString bytes = ByteString.CopyFrom(compressed); response.CompressedScreen = bytes; response.BaseLenght = baseLenght; response.SetRect(rect); return response.Build(); }