private void btnPrintPreview_Click(object sender, RoutedEventArgs e)
        {
            Screen screen = (Screen)cmbxScreenList.SelectedItem;

            Bitmap bmp = new Bitmap(txtbPreviewPath.Text);

            Point[] points = GraphicHelper.ComputeTargetPoints(new Size(800, 601), new Size(bmp.Width, bmp.Height), Rotation.DEG_0);

            Bitmap bmpResized = new Bitmap(800, 601);

            using (Graphics gr = Graphics.FromImage(bmpResized))
            {
                gr.DrawImage(bmp, points);
            }

            grayData = GrayScaleConverter.ConvertToGrayscale(bmpResized, GrayScaleConverter.ConvertionMethod.AverageBT601, 8);

            grayData = GrayScaleConverter.DitherSierraLight(grayData, 8, bmpResized.Width, bmpResized.Height);

            grayData = GrayScaleConverter.ReverseGrayScale(grayData, 8);

            grayData = GrayScaleConverter.CompactArray(grayData, 8);

            screen.SendImageBuffer(8, grayData);

            screen.DrawBuffer();
        }
        private void ScreenWriteBufferGrayScale()
        {
            Bitmap bmp = GrayScaleConverter.GrayToBitmap(DisplayedScreenBuffer, ScreenConnection.Screen.Width, ScreenConnection.Screen.Height, DisplayedGrayScaleDepth);

            this.Dispatcher.Invoke((Action)(() =>
            {
                imgScreenDispalyed.Source = BitmapToImageSource(bmp);
            }));
        }
Esempio n. 3
0
        private void BTN_GenAll_Click(object sender, EventArgs e)
        {
            Bitmap bmp = new Bitmap(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, LSTB_Files.SelectedItem.ToString()));

            int count = 1;

            if (!Directory.Exists(@".\out\"))
            {
                Directory.CreateDirectory(@".\out\");
            }

            foreach (int grayScale in new List <int>()
            {
                2, 4, 8, 16, 32, 64, 128, 256
            })
            {
                foreach (GrayScaleConverter.ConvertionMethod convValue in Enum.GetValues(typeof(GrayScaleConverter.ConvertionMethod)))
                {
                    foreach (GrayScaleConverter.DitheringMethod ditherValue in Enum.GetValues(typeof(GrayScaleConverter.DitheringMethod)))
                    {
                        foreach (bool serpentine in new List <bool>()
                        {
                            false, true
                        })
                        {
                            byte[] grayData = GrayScaleConverter.FromBitmap(bmp, convValue, ditherValue, serpentine, grayScale);

                            Bitmap grayBmp = GrayScaleConverter.GrayToBitmap(grayData, bmp.Width, bmp.Height, grayScale);

                            string convName   = Enum.GetName(typeof(GrayScaleConverter.ConvertionMethod), convValue);
                            string ditherName = Enum.GetName(typeof(GrayScaleConverter.DitheringMethod), ditherValue);

                            string strCount = count.ToString().PadLeft(3, '0');

                            grayBmp.Save(@".\out\" + LSTB_Files.SelectedItem.ToString() + "-" + strCount
                                         + "-" + grayScale
                                         + "-" + convName
                                         + "-" + ditherName
                                         + "-" + (serpentine ? "Serp" : "Regular")
                                         + ".png", ImageFormat.Png);

                            count++;
                        }
                    }
                }
            }
        }
Esempio n. 4
0
        private void render()
        {
            if (LSTB_Files.SelectedItem == null || String.IsNullOrWhiteSpace(LSTB_Files.SelectedItem.ToString()))
            {
                return;
            }

            Bitmap bmp = new Bitmap(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, LSTB_Files.SelectedItem.ToString()));

            int depth = int.Parse(CMBX_GrayScale.SelectedItem.ToString());

            GrayScaleConverter.ConvertionMethod method    = (GrayScaleConverter.ConvertionMethod)Enum.Parse(typeof(GrayScaleConverter.ConvertionMethod), CMBX_Method.SelectedItem.ToString());
            GrayScaleConverter.DitheringMethod  dithering = (GrayScaleConverter.DitheringMethod)Enum.Parse(typeof(GrayScaleConverter.DitheringMethod), CMBX_Dithering.SelectedItem.ToString());
            bool serpentine = CHKB_Serpentine.Checked;


            byte[] grayData = GrayScaleConverter.FromBitmap(bmp, method, dithering, serpentine, depth);

            Bitmap grayBmp = GrayScaleConverter.GrayToBitmap(grayData, bmp.Width, bmp.Height, depth);

            PCBX_Output.Image = grayBmp;
        }
        private async void BtnEcho_OnClick(object sender, RoutedEventArgs e)
        {
            Bitmap bmp = new Bitmap(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "mlp.jpg"));

            Bitmap newImage = new Bitmap(800, 601);

            using (Graphics gr = Graphics.FromImage(newImage))
            {
                gr.SmoothingMode     = SmoothingMode.HighQuality;
                gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
                gr.PixelOffsetMode   = PixelOffsetMode.HighQuality;
                gr.DrawImage(bmp, new Rectangle(0, 0, 800, 601));

                gr.Save();
            }

            byte[] grayData = GrayScaleConverter.FromBitmap(newImage, GrayScaleConverter.ConvertionMethod.Desaturation, GrayScaleConverter.DitheringMethod.Atkinson, false, 8);

            grayData = GrayScaleConverter.ReverseGrayScale(grayData, 8);

            //await Connector.testImage("", grayData);
        }
        private void loadImage(string path)
        {
            //Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "mlp.png")
            Bitmap bmp = new Bitmap(path);

            Bitmap bmpResized = new Bitmap(bmp, 800, 601);


            int depth = 8;

            GrayScaleConverter.ConvertionMethod method    = GrayScaleConverter.ConvertionMethod.DecompositionMax;
            GrayScaleConverter.DitheringMethod  dithering = GrayScaleConverter.DitheringMethod.Atkinson;
            bool serpentine = false;


            grayData = GrayScaleConverter.FromBitmap(bmpResized, method, dithering, serpentine, depth);

            Bitmap grayBmp = GrayScaleConverter.GrayToBitmap(grayData, bmpResized.Width, bmpResized.Height, depth);

            grayData = GrayScaleConverter.ReverseGrayScale(grayData, depth);

            imgPreview.Source = bitmapToImageSource(grayBmp);
        }
        public void ProcessRequest(TcpClient client, byte actionId, List <byte> data)
        {
            log("Start of processing request");
            log("Simulating latency of 10ms");
            Thread.Sleep(10);
            switch (actionId)
            {
            // -- 01 : Ping --
            case 1:
            {
                timeAction("01 : Ping");
                log("Server requested Ping");
                Write(client, "Pong");
                break;
            }

            // -- 02 : Echo --
            case 2:
            {
                timeAction("02 : Echo");
                log("Server requested Echo");
                Write(client, data.ToArray());
                break;
            }

            // -- 03 : GetIp --
            case 3:
            {
                timeAction("03 : GetIp");
                log("Server requested IP");
                Write(client, Screen.Ip);
                break;
            }

            // -- 04 : GetMac --
            case 4:
            {
                timeAction("04 : GetMac");
                log("Server requested MAC");
                Write(client, Screen.Mac);
                break;
            }

            // -- 07 : Diagnostic Screen --
            case 7:
            {
                timeAction("07 : Diag");
                log("Server requested Diag Screen");

                // Todo : screen debug draw

                break;
            }

            // -- 08 : Test Debit --
            case 8:
            {
                timeAction("08 : Throughtput");
                log("Server requested Throughtput test");
                Write(client, "OK");
                break;
            }

            // -- 11 : GetId --
            case 11:
            {
                timeAction("11 : GetId");
                log("Server requested ID");
                Write(client, Screen.Id);
                break;
            }

            // -- 12 : SetId --
            case 12:
            {
                timeAction("12 : SetId");
                string newId = System.Text.Encoding.ASCII.GetString(data.ToArray());
                log("Server defined ID to \"" + newId + "\"");
                Screen.Id = newId;
                break;
            }

            // -- 13 : ResetId --
            case 13:
            {
                timeAction("13 : ResetId");
                log("Server requested ID reset \"" + Screen.Mac + "\"");
                Screen.Id = Screen.Mac;
                break;
            }

            // -- 14 : Reboot --
            case 14:
            {
                timeAction("14 : Reboot");
                log("Server requested Reboot");
                break;
            }

            // -- 15 : Shutdown --
            case 15:
            {
                timeAction("15 : Shutdown");
                log("Server requested Shutdown");
                break;
            }

            // -- 21 : GetAllRegisters --
            case 21:
            {
                timeAction("21 : GetAllRegisters");
                log("Server requested All Registers");
                Write(client, Enumerable.Repeat <byte>(0, 18).ToArray());
                break;
            }

            // -- 22 : SetAllRegisters (17 bytes) --
            case 22:
            {
                timeAction("22 : SetAllRegisters");
                log("Server requested setting All Registers");
                Write(client, Enumerable.Repeat <byte>(0, 18).ToArray());
                break;
            }

            // -- 23 : GetRegister (1 byte address) --
            case 23:
            {
                timeAction("23 : GetRegister");
                log("Server requested Registers " + data[0].ToString("X"));
                Write(client, new byte[] { 0 });
                break;
            }

            // -- 24 : SetRegister (1 byte address, 1 byte value) --
            case 24:
            {
                timeAction("24 : SetRegister");
                log("Server requested setting Registers " + data[0].ToString("X") + " to " + data[1].ToString("X"));
                Write(client, new byte[] { 0 });
                break;
            }

            // ==== 3X : Power Function ====
            // -- 31 : Get Status --
            case 31:
            {
                timeAction("31 : Get Status");
                log("Server requested power status");

                Write(client, new byte[] { 0 });
                break;
            }

            // -- 32 : Power On --
            case 32:
            {
                timeAction("32 : Power On");
                log("Server requested power on");

                break;
            }

            // -- 33 : Power Off --
            case 33:
            {
                timeAction("33 : Power Off");
                log("Server requested power Off");

                break;
            }

            // -- 34 : Toggle Power --
            case 34:
            {
                timeAction("34 : Toggle Power");
                log("Server requested power toggle");

                break;
            }

            // ==== 4X : Power Adjust ====
            // -- 41 : Get VCOM --
            case 41:
            {
                timeAction("41 : Get VCOM");
                log("Server requested VCOM");
                Write(client, new byte[] { 0 });

                break;
            }

            // -- 42 : Set VCOM --
            case 42:
            {
                timeAction("42 : Set VCOM");
                log("Server requested setting VCOM to " + data[0]);

                break;
            }

            // -- 43 : Get VADJ --
            case 43:
            {
                timeAction("43 : Get VADJ");
                log("Server requested VADJ");
                Write(client, BitConverter.GetBytes(15000 - (1 - 3) * 250));

                break;
            }

            // -- 44 : Set VADJ --
            case 44:
            {
                timeAction("44 : Set VADJ");
                log("Server requested setting VADJ to " + BitConverter.ToInt32(data.ToArray(), 0));

                break;
            }

            // ==== 5X : Temperature function ====
            // -- 51 : Get Temperature --
            case 51:
            {
                timeAction("51 : Get Temperature");
                log("Server requested teperature");
                Write(client, new byte[] { 0 });

                break;
            }

            // -- 52 : Get TCOLD --
            case 52:
            {
                timeAction("52 : Get TCOLD");
                log("Server requested TCOLD");
                Write(client, BitConverter.GetBytes(-7));

                break;
            }

            // -- 53 : Set TCOLD --
            case 53:
            {
                timeAction("53 : Set TCOLD");
                log("Server requested setting TCOLD to " + BitConverter.ToInt32(data.ToArray(), 0));

                break;
            }

            // -- 54 : Get THOT --
            case 54:
            {
                timeAction("54 : Get THOT");
                log("Server requested THOT");
                Write(client, BitConverter.GetBytes(42));

                break;
            }

            // -- 55 : Set THOT --
            case 55:
            {
                timeAction("55 : Get THOT");
                log("Server requested setting TCOLD to " + BitConverter.ToInt32(data.ToArray(), 0));

                break;
            }

            // ==== 6X : Power Up/Down Sequence & Timing ====
            // -- 61 : Get Power Up Sequence --
            case 61:
            {
                timeAction("61 : Get Power Up Sequence");
                log("Server requested Power Up Sequence");
                Write(client, new byte[] { 0, 0, 0, 0 });

                break;
            }

            // -- 62 : Set Power Up Sequence --
            case 62:
            {
                timeAction("62 : Set Power Up Sequence");
                log("Server requested setting Power Up Sequence to " + String.Join(" ", data.Select(item => item.ToString("X2"))));

                break;
            }

            // -- 63 : Get Power Down Sequence --
            case 63:
            {
                timeAction("63 : Get Power Down Sequence");
                log("Server requested Power Down Sequence");
                Write(client, new byte[] { 0, 0, 0, 0 });
                break;
            }

            // -- 64 : Set Power Down Sequence --
            case 64:
            {
                timeAction("64 : Set Power Down Sequence");
                log("Server requested setting Power Down Sequence to " + String.Join(" ", data.Select(item => item.ToString("X2"))));

                break;
            }

            // -- 65 : Get Power Up Timing --
            case 65:
            {
                timeAction("65 : Get Power Up Timing");
                log("Server requested Power Up Timing");
                Write(client, new byte[] { 3, 3, 3, 3 });
                break;
            }

            // -- 66 : Set Power Up Timing --
            case 66:
            {
                timeAction("66 : Set Power Up Timing");
                log("Server requested setting Up Timing to " + String.Join(" ", data.Select(item => item.ToString("X2"))));

                break;
            }

            // -- 67 : Get Power Down Timing --
            case 67:
            {
                timeAction("67 : Get Power Down Timing");
                log("Server requested Power Down Timing");
                Write(client, new byte[] { 3, 6, 6, 6, 16 });

                break;
            }

            // -- 68 : Set Power Down Timing --
            case 68:
            {
                timeAction("68 : Set Power Down Timing");
                log("Server requested setting Down Timing to " + String.Join(" ", data.Select(item => item.ToString("X2"))));

                break;
            }

            // ==== 10X : Test Screens ====
            // -- 101 : White --
            case 101:
            {
                timeAction("101 : Test White");
                log("Server requested Test screen White");

                ReadyScreenBuffer = Enumerable.Repeat <byte>(0, ReadyScreenBuffer.Length).ToArray();

                MigrateBuffer();
                ScreenWriteBufferBW();
                break;
            }

            // -- 102 : Black --
            case 102:
            {
                timeAction("102 : Test Black");
                log("Server requested Test screen Black");

                ReadyScreenBuffer = Enumerable.Repeat <byte>(1, ReadyScreenBuffer.Length).ToArray();

                MigrateBuffer();
                ScreenWriteBufferBW();

                break;
            }

            // -- 103 : White / Black / White --
            case 103:
            {
                timeAction("103 : Test White / Black / White");
                log("Server requested Test screen Black");

                ReadyScreenBuffer = Enumerable.Repeat <byte>(0, ReadyScreenBuffer.Length).ToArray();

                MigrateBuffer();
                ScreenWriteBufferBW();

                ReadyScreenBuffer = Enumerable.Repeat <byte>(1, ReadyScreenBuffer.Length).ToArray();

                MigrateBuffer();
                ScreenWriteBufferBW();

                ReadyScreenBuffer = Enumerable.Repeat <byte>(0, ReadyScreenBuffer.Length).ToArray();

                MigrateBuffer();
                ScreenWriteBufferBW();

                break;
            }

            // -- 104 : line --
            case 104:
            {
                timeAction("104 : Test Ligne");
                log("Server requested Test screen Ligne");

                int lineSize;

                if (data.Count == 0)
                {
                    lineSize = 0;
                }
                else
                {
                    lineSize = data[0];
                }

                if (lineSize == 0)
                {
                    lineSize = 5;
                }

                int offset = 0;

                ReadyScreenBuffer = Enumerable.Repeat <byte>(0, ReadyScreenBuffer.Length).ToArray();

                for (int i = 0; i < ScreenConnection.ScreenBase.Height; i++)
                {
                    int  lineCount = 0;
                    bool lineVal   = false;
                    for (int j = 0; j < ScreenConnection.ScreenBase.Width; j++)
                    {
                        ReadyScreenBuffer[offset++] = (byte)(lineVal ? 1 : 0);

                        lineCount++;
                        if (lineCount >= lineSize)
                        {
                            lineCount = 0;
                            lineVal   = !lineVal;
                        }
                    }
                }

                MigrateBuffer();
                ScreenWriteBufferBW();

                break;
            }

            // -- 105 : Col --
            case 105:
            {
                timeAction("105 : Test Col");
                log("Server requested Test screen Col");

                int colSize;

                if (data.Count == 0)
                {
                    colSize = 0;
                }
                else
                {
                    colSize = data[0];
                }

                if (colSize == 0)
                {
                    colSize = 5;
                }

                int offset = 0;

                ReadyScreenBuffer = Enumerable.Repeat <byte>(0, ReadyScreenBuffer.Length).ToArray();

                int  colCount = 0;
                bool colVal   = false;

                for (int i = 0; i < ScreenConnection.ScreenBase.Height; i++)
                {
                    for (int j = 0; j < ScreenConnection.ScreenBase.Width; j++)
                    {
                        ReadyScreenBuffer[offset++] = (byte)(colVal ? 1 : 0);
                    }

                    colCount++;
                    if (colCount >= colSize)
                    {
                        colCount = 0;
                        colVal   = !colVal;
                    }
                }

                MigrateBuffer();
                ScreenWriteBufferBW();

                break;
            }

            // -- 106 : square --
            case 106:
            {
                timeAction("106 : Test square");
                log("Server requested Test screen square");

                int squareSize;

                if (data.Count == 0)
                {
                    squareSize = 0;
                }
                else
                {
                    squareSize = data[0];
                }

                if (squareSize == 0)
                {
                    squareSize = 5;
                }

                int offset = 0;

                ReadyScreenBuffer = Enumerable.Repeat <byte>(0, ReadyScreenBuffer.Length).ToArray();

                int  colCount = 0;
                bool colVal   = false;

                for (int i = 0; i < ScreenConnection.ScreenBase.Height; i++)
                {
                    int  lineCount = 0;
                    bool lineVal   = false;

                    for (int j = 0; j < ScreenConnection.ScreenBase.Width; j++)
                    {
                        ReadyScreenBuffer[offset++] = (byte)(!lineVal != !colVal ? 1 : 0);

                        lineCount++;
                        if (lineCount >= squareSize)
                        {
                            lineCount = 0;
                            lineVal   = !lineVal;
                        }
                    }

                    colCount++;
                    if (colCount >= squareSize)
                    {
                        colCount = 0;
                        colVal   = !colVal;
                    }
                }

                MigrateBuffer();
                ScreenWriteBufferBW();

                break;
            }

            // -- 107 : rand --
            case 107:
            {
                timeAction("107 : Test rand");
                log("Server requested Test screen rand");

                ReadyScreenBuffer = Enumerable.Repeat <byte>(0, ReadyScreenBuffer.Length).ToArray();

                Random rnd = new Random();

                for (int i = 0; i < ReadyScreenBuffer.Length; i++)
                {
                    ReadyScreenBuffer[i] = (byte)rnd.Next(0, 2);
                }

                MigrateBuffer();
                ScreenWriteBufferBW();

                break;
            }

            // -- 108 : scale --
            case 108:
            {
                timeAction("108 : Test scale");
                log("Server requested Test screen scale");

                ReadyScreenBuffer   = Enumerable.Repeat <byte>(0, ReadyScreenBuffer.Length).ToArray();
                ReadyGrayScaleDepth = 2;

                int offset = 0;

                for (int i = 0; i < 300; i++)
                {
                    for (int j = 0; j < ScreenConnection.ScreenBase.Width; j++)
                    {
                        ReadyScreenBuffer[offset++] = (byte)(j - 21 <= i * 2 && j > 20 ? 1 : 0);
                    }
                }

                for (int i = 0; i < 301; i++)
                {
                    for (int j = 0; j < ScreenConnection.ScreenBase.Width; j++)
                    {
                        ReadyScreenBuffer[offset++] = (byte)(j - 21 <= i * 2 && j > 20 ? 1 : 0);
                    }
                }

                MigrateBuffer();
                ScreenWriteBufferBW();

                break;
            }

            // -- 109 : Grayscale Test --
            case 109:
            {
                timeAction("109 : Test Grayscale");
                log("Server requested Test screen Grayscale");

                ReadyScreenBuffer = Enumerable.Repeat <byte>(0, ReadyScreenBuffer.Length).ToArray();

                if (data.Count == 0)
                {
                    ReadyGrayScaleDepth = 8;
                }
                else
                {
                    ReadyGrayScaleDepth = data[0];
                }

                int offset = 0;

                for (int i = 0; i < ScreenConnection.ScreenBase.Height; i++)
                {
                    int colVal = (i - 2) / (600 / ReadyGrayScaleDepth);
                    for (int j = 0; j < ScreenConnection.ScreenBase.Width; j++)
                    {
                        ReadyScreenBuffer[offset++] = (byte)colVal;
                    }
                }

                ScreenWriteBufferGrayScale();

                break;
            }

            // ==== 15X : Prints ====
            // -- 151 : Send Image Buffer --
            case 151:
            {
                timeAction("151 : Receive Buffer Grayscale");
                log("Server uploaded buffer");

                this.Dispatcher.Invoke((Action)(() =>
                    {
                        ReadyGrayScaleDepth = data[0];
                        ReadyScreenBuffer = GrayScaleConverter.DecompactArray(data.Skip(1).ToArray(), ReadyGrayScaleDepth, (int)(ScreenBase.Width * ScreenBase.Height));
                        ScreenWriteBufferReadyGrayScale();
                    }));



                break;
            }

            // -- 155 : Print Buffer --
            case 155:
            {
                timeAction("155 : Draw");
                log("Server Started draw");

                MigrateBuffer();
                ScreenWriteBufferGrayScale();

                break;
            }
            }

            EndTransmission(client);
            log("End of processing request");
        }
Esempio n. 8
0
        private void button1_Click_1(object sender, EventArgs e)
        {
            Stopwatch sw = new Stopwatch();

            sw.Start();
            Bitmap bmp = new Bitmap(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, LSTB_Files.SelectedItem.ToString()));

            Bitmap newImage = new Bitmap(800, 600);

            using (Graphics gr = Graphics.FromImage(newImage))
            {
                gr.SmoothingMode     = SmoothingMode.HighQuality;
                gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
                gr.PixelOffsetMode   = PixelOffsetMode.HighQuality;
                gr.DrawImage(bmp, new Rectangle(0, 0, 800, 600));

                gr.Save();
            }

            GrayScaleConverter.ConvertionMethod method    = (GrayScaleConverter.ConvertionMethod)Enum.Parse(typeof(GrayScaleConverter.ConvertionMethod), CMBX_Method.SelectedItem.ToString());
            GrayScaleConverter.DitheringMethod  dithering = (GrayScaleConverter.DitheringMethod)Enum.Parse(typeof(GrayScaleConverter.DitheringMethod), CMBX_Dithering.SelectedItem.ToString());
            sw.Stop();

            long phase1ms = sw.ElapsedMilliseconds;

            List <Tuple <long, long, long> > timing = new List <Tuple <long, long, long> >();

            for (int i = 0; i < 10; i++)
            {
                sw.Restart();

                byte[] grayData = GrayScaleConverter.ConvertToGrayscale(newImage, method, 8);
                sw.Stop();

                long grayms = sw.ElapsedMilliseconds;

                sw.Restart();

                grayData = GrayScaleConverter.DitherSierraLight(grayData, 8, newImage.Width, newImage.Height);

                sw.Stop();
                long diterms = sw.ElapsedMilliseconds;

                sw.Restart();

                byte[] output = new byte[(int)Math.Ceiling(grayData.Length / 2.0)];

                int counter = 0;

                for (int j = 0; j < grayData.Length; j += 2)
                {
                    output[counter] = (byte)(grayData[j] << 4 | grayData[j + 1]);

                    counter++;
                }

                grayData = output;

                sw.Stop();

                long compressms = sw.ElapsedMilliseconds;



                timing.Add(new Tuple <long, long, long>(grayms, compressms, diterms));
            }

            MessageBox.Show("Phase 1 : " + phase1ms + "ms " + Environment.NewLine +
                            "Phase gray : min : " + timing.Select(item => item.Item1).Min() + "ms | max : " + timing.Select(item => item.Item1).Max() + "ms | avg : " + timing.Select(item => item.Item1).Average() + "ms" + Environment.NewLine +
                            "Phase compress : min : " + timing.Select(item => item.Item2).Min() + "ms | max : " + timing.Select(item => item.Item2).Max() + "ms | avg : " + timing.Select(item => item.Item2).Average() + "ms" + Environment.NewLine +
                            "Phase diter : min : " + timing.Select(item => item.Item3).Min() + "ms | max : " + timing.Select(item => item.Item3).Max() + "ms | avg : " + timing.Select(item => item.Item3).Average() + "ms"


                            );
        }