コード例 #1
0
ファイル: MainScreenData.cs プロジェクト: VulpesSARL/Fox-SDC
        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
    }
コード例 #2
0
ファイル: MainScreenData.cs プロジェクト: VulpesSARL/Fox-SDC
        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);
        }
コード例 #3
0
ファイル: MainScreenData.cs プロジェクト: VulpesSARL/Fox-SDC
        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));
        }
コード例 #4
0
ファイル: MainScreenData.cs プロジェクト: VulpesSARL/Fox-SDC
        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);
        }
コード例 #5
0
        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
        }
コード例 #6
0
ファイル: MainScreenData.cs プロジェクト: VulpesSARL/Fox-SDC
        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);
        }
コード例 #7
0
        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());
            }
        }
コード例 #8
0
        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;
                    }
                }
            }
        }