public void PixelChanged(bool RefreshPinDesc = false)
 {
     if (gridpaint.currot == 0)
     {
         rootcomp.ClearAllPixel();
         int max = 0;
         if (gridpaint.ledsegmentpixel.Count > 0)
         {
             max = gridpaint.ledsegmentpixel.Max() + 1;
             rootcomp.IsOverlay = true;
         }
         else
         {
             rootcomp.IsOverlay = false;
         }
         rootcomp.InitializeLineOverlays(max);
         bool[,] IsCalc = new bool[gridpaint.GridSize, gridpaint.GridSize];
         for (int i = 0; i < gridpaint.pixel.Count; ++i)
         {
             rootcomp.addData(gridpaint.pixel[i]);
         }
         Array.Clear(overlayCalc, 0, 300 * 300);
         HashSet <byte> overlayindices = new HashSet <byte>();
         for (int i = 0; i < gridpaint.ledsegmentpixel.Count; ++i)
         {
             overlayindices.Add(gridpaint.ledsegmentpixel[i]);
             //overlayCalc[gridpaint.ledsegmentpixel_pos[i].X, gridpaint.ledsegmentpixel_pos[i].Y] = gridpaint.ledsegmentpixel[i];
         }
         foreach (byte curindex in overlayindices)
         {
             Array.Clear(overlayCalc, 0, 300 * 300);
             for (int i = 0; i < gridpaint.ledsegmentpixel.Count; ++i)
             {
                 if (gridpaint.ledsegmentpixel[i] == curindex)
                 {
                     overlayCalc[gridpaint.ledsegmentpixel_pos[i].X, gridpaint.ledsegmentpixel_pos[i].Y] = 1;
                 }
             }
             for (int x = 0; x < 300; ++x)
             {
                 for (int y = 0; y < 300; ++y)
                 {
                     if (overlayCalc[x, y] == 1)
                     {
                         int lengthX = 0;
                         for (lengthX = 1; lengthX + x < 300; ++lengthX)
                         {
                             if (overlayCalc[x + lengthX, y] != 1)
                             {
                                 break;
                             }
                         }
                         int lengthY = 0;
                         for (lengthY = 1; lengthY + y < 300; ++lengthY)
                         {
                             if (overlayCalc[x, y + lengthY] != 1)
                             {
                                 break;
                             }
                         }
                         if (lengthX > lengthY)
                         {
                             Line line = new Line(new Point(x, y) - gridpaint.Origin, new Point(x + lengthX - 1, y) - gridpaint.Origin);
                             rootcomp.addOverlayLine(line, 255, curindex);
                             for (int i = 0; i < lengthX; ++i)
                             {
                                 overlayCalc[x + i, y] = 2;
                             }
                         }
                         else
                         {
                             Line line = new Line(new Point(x, y) - gridpaint.Origin, new Point(x, y + lengthY - 1) - gridpaint.Origin);
                             rootcomp.addOverlayLine(line, 255, curindex);
                             for (int i = 0; i < lengthY; ++i)
                             {
                                 overlayCalc[x, y + i] = 2;
                             }
                         }
                     }
                 }
             }
         }
         if (RefreshPinDesc)
         {
             rootcomp.GeneratePinDesc();
             LoadPinDesc();
         }
         rootcomp.Finish();
         //for (int i = 0; i < gridpaint.ledsegmentpixel.Count; ++i)
         //{
         //    Line line = new Line(gridpaint.ledsegmentpixel_pos[i] - gridpaint.Origin, gridpaint.ledsegmentpixel_pos[i] - gridpaint.Origin);
         //    rootcomp.addOverlayLine(line, 255, gridpaint.ledsegmentpixel[i]);
         //}
     }
 }