static public byte[] GetDeltaScreen2Debug() { PushScreenData b; if (CheckConnection() == false) { b = new PushScreenData() { FailedCode = 0x52, X = 0, Y = 0 } } ; try { b = Pipe.Pipe2.GetDeltaScreenDebug(); } catch { b = new PushScreenData() { FailedCode = 0x53, X = 0, Y = 0 }; } return(ProcessPushScreenData(b)); } #endif }
public static byte[] ProcessPushScreenData(PushScreenData b) { PushScreenData2 b2 = new PushScreenData2(); b2.Header1 = 0x46; b2.Header2 = 0x52; b2.Header3 = 0x53; b2.Header4 = 0x1; b2.BlockX = b.BlockX; b2.BlockY = b.BlockY; b2.CursorX = b.CursorX; b2.CursorY = b.CursorY; b2.DataSZ = b.Data == null ? 0 : b.Data.LongLength; b2.DataType = b.DataType; b2.FailedCode = b.FailedCode; b2.NumChangedBlocks = b.ChangedBlocks == null ? 0 : b.ChangedBlocks.Count; b2.X = b.X; b2.Y = b.Y; byte[] data = CommonUtilities.Combine(CommonUtilities.Serialize <PushScreenData2>(b2), b.Data == null ? new byte[0] : b.Data, b.ChangedBlocks == null ? new byte[0] : ConvertListInt64ToByte(b.ChangedBlocks)); return(data); }
static public byte[] GetFullscreen2() { PushScreenData b; if (CheckConnection() == false) { b = new PushScreenData() { FailedCode = 0x50, X = 0, Y = 0 } } ; try { b = Pipe.Pipe2.GetFullscreen(); } catch (Exception ee) { Debug.WriteLine(ee.ToString()); b = new PushScreenData() { FailedCode = 0x51, X = 0, Y = 0 }; } return(ProcessPushScreenData(b)); }
public PushScreenData GetFullscreen() { MainScreenSystemClient.LastCalled = DateTime.Now; PushScreenData data = new PushScreenData(); CPPFrameBufferData screen = ProgramAgent.CPP.GetFrameBufferData(); if (screen == null) { data.X = data.Y = 0; data.FailedCode = -1; return(data); } if (screen.Failed == true) { Debug.WriteLine("Screendata failed @ " + screen.FailedAt.ToString() + " 0x" + screen.Win32Error.ToString("X")); data.X = data.Y = 0; data.FailedCode = screen.FailedAt; return(data); } data.X = screen.X; data.Y = screen.Y; data.CursorX = screen.CursorX; data.CursorY = screen.CursorY; data.DataType = 0; lock (ScreenLock) { ScreenX = screen.X; ScreenY = screen.Y; ScreenRawBytes = screen.Data; } try { Bitmap bmp = new Bitmap(screen.X, screen.Y, 4 * screen.X, PixelFormat.Format32bppArgb, Marshal.UnsafeAddrOfPinnedArrayElement(screen.Data, 0)); MemoryStream mem = new MemoryStream(); ImageCodecInfo codec = GetEncoder(ImageFormat.Jpeg); EncoderParameters myEncoderParameters = new EncoderParameters(1); myEncoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 50L); bmp.Save(mem, codec, myEncoderParameters); mem.Seek(0, SeekOrigin.Begin); data.Data = new byte[mem.Length]; mem.Read(data.Data, 0, (int)mem.Length); } catch (Exception ee) { Debug.WriteLine(ee.ToString()); data.X = data.Y = 0; data.FailedCode = -2; return(data); } return(data); }
public void TestGetDeltaScreen() { #if DEBUG if (Directory.Exists(PipeScreenData.Framebufferpath) == false) { Assert.Inconclusive("Cannot find " + PipeScreenData.Framebufferpath); return; } List <string> FileList = Directory.EnumerateFiles(PipeScreenData.Framebufferpath, "*.png", SearchOption.TopDirectoryOnly).ToList(); if (FileList == null || FileList.Count == 0) { Assert.Inconclusive("No PNG files in " + PipeScreenData.Framebufferpath); return; } PipeScreenData psd = new PipeScreenData(); decimal sz = 0; decimal tz = 0; for (int i = 0; i < FileList.Count; i++) { Stopwatch st = new Stopwatch(); st.Start(); PushScreenData s = psd.GetDeltaScreenDebug(); byte[] d = MainScreenSystem.ProcessPushScreenData(s); st.Stop(); tz += st.ElapsedMilliseconds; sz += d.Length; } sz /= (decimal)FileList.Count; tz /= (decimal)FileList.Count; Console.WriteLine("Pictures: " + FileList.Count + " - AVG SZ=" + sz.ToString("0.00") + " bytes - AVG TZ= " + tz.ToString("0.0000") + " ms"); Assert.AreEqual(0, 0); #else Assert.Inconclusive("Unavalible in Release"); #endif }
PushScreenData GetDeltaScreen(GetFrameBufferDataDG GetFBData) { MainScreenSystemClient.LastCalled = DateTime.Now; PushScreenData data = new PushScreenData(); CPPFrameBufferData screen = GetFBData(); if (screen == null) { data.X = data.Y = 0; data.FailedCode = -1; return(data); } if (screen.Failed == true) { Debug.WriteLine("Screendata failed @ " + screen.FailedAt.ToString() + " 0x" + screen.Win32Error.ToString("X")); data.X = data.Y = 0; data.FailedCode = screen.FailedAt; return(data); } lock (ScreenLock) { if (screen.X != ScreenX || screen.Y != ScreenY) { ScreenX = screen.X; ScreenY = screen.Y; ScreenRawBytes = screen.Data; try { Bitmap bmp = new Bitmap(screen.X, screen.Y, 4 * screen.X, PixelFormat.Format32bppArgb, Marshal.UnsafeAddrOfPinnedArrayElement(screen.Data, 0)); MemoryStream mem = new MemoryStream(); ImageCodecInfo codec = GetEncoder(ImageFormat.Jpeg); EncoderParameters myEncoderParameters = new EncoderParameters(1); myEncoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 50L); bmp.Save(mem, codec, myEncoderParameters); mem.Seek(0, SeekOrigin.Begin); data.Data = new byte[mem.Length]; mem.Read(data.Data, 0, (int)mem.Length); data.CursorX = screen.CursorX; data.CursorY = screen.CursorY; return(data); } catch (Exception ee) { Debug.WriteLine(ee.ToString()); data.X = data.Y = 0; data.FailedCode = -2; return(data); } } } int BlockX = 64; int BlockY = 64; int VScreenX = screen.X + (BlockX - (screen.X % BlockX)); int VScreenY = screen.Y + (BlockY - (screen.Y % BlockY)); byte[] deltadata = new byte[screen.Data.Length]; int XSZ = screen.X * 4; data.ChangedBlocks = new List <long>(); data.DataType = 1; data.BlockX = BlockX; data.BlockY = BlockY; data.X = screen.X; data.Y = screen.Y; lock (ScreenLock) { for (int y = 0; y < VScreenY; y += BlockY) { for (int x = 0; x < VScreenX; x += BlockX) { bool Changed = false; for (int by = 0; by < BlockY; by++) { for (int bx = 0; bx < BlockX; bx++) { int pos = ((by + y) * XSZ) + ((bx + x) * 4); if (pos >= screen.Data.Length) { continue; } if (BitConverter.ToInt32(screen.Data, pos) != BitConverter.ToInt32(ScreenRawBytes, pos)) { Changed = true; break; } } if (Changed == true) { break; } } if (Changed == true) { for (int by = 0; by < BlockY; by++) { for (int bx = 0; bx < BlockX; bx++) { int pos = ((by + y) * XSZ) + ((bx + x) * 4); if (pos >= screen.Data.Length) { continue; } deltadata[pos + 0] = screen.Data[pos + 0]; deltadata[pos + 1] = screen.Data[pos + 1]; deltadata[pos + 2] = screen.Data[pos + 2]; deltadata[pos + 3] = screen.Data[pos + 3]; } } data.ChangedBlocks.Add(((Int64)x << 32) | (Int64)y); } } } } try { Bitmap bmp = new Bitmap(screen.X, screen.Y, 4 * screen.X, PixelFormat.Format32bppArgb, Marshal.UnsafeAddrOfPinnedArrayElement(deltadata, 0)); MemoryStream mem = new MemoryStream(); ImageCodecInfo codec = GetEncoder(ImageFormat.Jpeg); EncoderParameters myEncoderParameters = new EncoderParameters(1); myEncoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 50L); bmp.Save(mem, codec, myEncoderParameters); mem.Seek(0, SeekOrigin.Begin); data.Data = new byte[mem.Length]; mem.Read(data.Data, 0, (int)mem.Length); //string Filename = "C:\\Temp\\SSDCSC-" + DateTime.Now.ToString("yyyyddMMHHmmss") + ".jpg"; //File.WriteAllBytes(Filename, data.Data); } catch (Exception ee) { Debug.WriteLine(ee.ToString()); data.X = data.Y = 0; data.FailedCode = -2; return(data); } lock (ScreenLock) { ScreenX = screen.X; ScreenY = screen.Y; ScreenRawBytes = screen.Data; } data.CursorX = screen.CursorX; data.CursorY = screen.CursorY; return(data); }
void UpdateScreen(PushScreenData screen) { if (this.InvokeRequired == true) { this.BeginInvoke(new UpdateScreenDG(UpdateScreen), screen); return; } if (screen == null) { return; } if (screen.X == 0 || screen.Y == 0) { return; } if (screen.FailedCode != 0) { return; } if (screen.Data == null) { return; } if (screen.ChangedBlocks == null && screen.DataType == 1) { return; } try { switch (screen.DataType) { case 0: { Bitmap bmp = new Bitmap(new MemoryStream(screen.Data)); bmp.RotateFlip(RotateFlipType.RotateNoneFlipY); ScreenData = bmp; UpdatePic(bmp, screen.CursorX, screen.CursorY); picDisplay.Refresh(); break; } case 1: { if (screen.ChangedBlocks == null || screen.ChangedBlocks.Count == 0) { //at least ... update the cursor! UpdatePic(ScreenData, screen.CursorX, screen.CursorY); return; } Bitmap bmpdelta = new Bitmap(new MemoryStream(screen.Data)); bmpdelta.RotateFlip(RotateFlipType.RotateNoneFlipY); Graphics graa = Graphics.FromImage(ScreenData); foreach (Int64 Blocks in screen.ChangedBlocks) { int X = (int)((Blocks >> 32) & 0x7FFFFFFF); int Y = (int)(Blocks & 0x7FFFFFFF); Y = screen.Y - Y; graa.DrawImage(bmpdelta, new Rectangle(X, Y - screen.BlockY, screen.BlockX, screen.BlockY), new Rectangle(X, Y - screen.BlockY, screen.BlockX, screen.BlockY), GraphicsUnit.Pixel); } UpdatePic(ScreenData, screen.CursorX, screen.CursorY); break; } } } catch (Exception ee) { Debug.WriteLine(ee.ToString()); } }
private void Ws_OnMessage(object sender, MessageEventArgs e) { lock (Ws_OnMessageLocker) { try { lock (ScreenLocker) { Ws_OnMessageRunning = true; } List <byte> Recv = new List <byte>(e.RawData); while (Recv.Count > 0) { Recheck: switch (RecvMode) { case 0: #if DEBUG UpdateText("Ws_OnMessage 0"); #endif if (RecvBaseData == null) { RecvBaseData = new List <byte>(); } while (Recv.Count > 0) { RecvBaseData.Add(Recv[0]); Recv.RemoveAt(0); #region Header Test if (RecvBaseData.Count == 1) { if (RecvBaseData[0] != 0x46) { RecvBaseData = null; continue; } } if (RecvBaseData.Count == 2) { if (RecvBaseData[1] != 0x52) { RecvBaseData = null; continue; } } if (RecvBaseData.Count == 3) { if (RecvBaseData[2] != 0x53) { RecvBaseData = null; continue; } } if (RecvBaseData.Count == 4) { if (RecvBaseData[3] != 0x1) { RecvBaseData = null; continue; } } #endregion if (RecvBaseData.Count == PushScreenData2SZ) { RecvPushScreenData = CommonUtilities.Deserialize <PushScreenData2>(RecvBaseData.ToArray()); RecvMode = 1; //Debug.WriteLine("Ws_OnMessage() DataSZ=" + RecvPushScreenData.DataSZ.ToString() + " NumChangedBlocks=" + RecvPushScreenData.NumChangedBlocks.ToString()); RecvScreenData = null; RecvBlocksData = null; goto Recheck; } } break; case 1: #if DEBUG UpdateText("Ws_OnMessage 1"); #endif if (RecvPushScreenData.DataSZ == 0) { RecvMode = 2; goto Recheck; } if (RecvScreenData == null) { RecvScreenData = new List <byte>(); } while (Recv.Count > 0) { RecvScreenData.Add(Recv[0]); Recv.RemoveAt(0); if (RecvScreenData.Count == RecvPushScreenData.DataSZ) { RecvMode = 2; goto Recheck; } } break; case 2: #if DEBUG UpdateText("Ws_OnMessage 2"); #endif if (RecvPushScreenData.NumChangedBlocks == 0) { RecvMode = 3; goto Recheck; } if (RecvBlocksData == null) { RecvBlocksData = new List <byte>(); } while (Recv.Count > 0) { RecvBlocksData.Add(Recv[0]); Recv.RemoveAt(0); if (RecvBlocksData.Count == RecvPushScreenData.NumChangedBlocks * 8) { RecvMode = 3; goto Recheck; } } break; case 3: #if DEBUG UpdateText("Ws_OnMessage 3"); #endif //Debug.WriteLine("Ws_OnMessage() Complete!"); try { PushScreenData pd = new PushScreenData(); pd.BlockX = RecvPushScreenData.BlockX; pd.BlockY = RecvPushScreenData.BlockY; pd.CursorX = RecvPushScreenData.CursorX; pd.CursorY = RecvPushScreenData.CursorY; pd.Data = RecvScreenData.ToArray(); pd.DataType = RecvPushScreenData.DataType; pd.FailedCode = RecvPushScreenData.FailedCode; pd.X = RecvPushScreenData.X; pd.Y = RecvPushScreenData.Y; if (RecvBlocksData != null && RecvBlocksData.Count > 0) { pd.ChangedBlocks = new List <long>(); for (int i = 0; i < RecvBlocksData.Count; i += 8) { pd.ChangedBlocks.Add(BitConverter.ToInt64(RecvBlocksData.ToArray(), i)); } } UpdateScreen(pd); } catch (Exception ee) { Debug.WriteLine(ee.ToString()); } RecvMode = 0; RecvBaseData = null; RecvScreenData = null; RecvBlocksData = null; break; } } } catch (Exception ee) { Debug.WriteLine(ee.ToString()); } finally { lock (ScreenLocker) { Ws_OnMessageRunning = false; } } } }